@vm0/cli 9.241.9 → 9.241.11

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 (98) hide show
  1. package/{agent-YCTYPYF7.js → agent-5TLH3FMD.js} +5 -5
  2. package/{banking-RWPXPGOY.js → banking-NEAT4R24.js} +3 -3
  3. package/{chat-XWVVRA3Q.js → chat-F5Y4Y6W5.js} +4 -4
  4. package/{chunk-HYARATBX.js → chunk-6IPI5G2W.js} +2 -2
  5. package/{chunk-N55TLKMY.js → chunk-7D6TPEG2.js} +4 -4
  6. package/{chunk-G2NMGFMS.js → chunk-ICKIMZYL.js} +4 -4
  7. package/{chunk-XG3T3KKC.js → chunk-IEMQM5BQ.js} +3 -3
  8. package/chunk-IEMQM5BQ.js.map +1 -0
  9. package/{chunk-GJ2YK4RB.js → chunk-JRH7ZD2I.js} +2 -2
  10. package/{chunk-43Q6LJ4M.js → chunk-NTHQBG2C.js} +2 -2
  11. package/{chunk-D7WBYCFZ.js → chunk-PAGGGOFZ.js} +2 -2
  12. package/{chunk-JZD2ALHL.js → chunk-SP77SLW3.js} +3 -3
  13. package/{chunk-DCY7MYWI.js → chunk-XMPEXKMZ.js} +7 -7
  14. package/chunk-XMPEXKMZ.js.map +1 -0
  15. package/{chunk-PM36DYSC.js → chunk-YWMCF6SQ.js} +168 -312
  16. package/chunk-YWMCF6SQ.js.map +1 -0
  17. package/{computer-use-AJ4LM52W.js → computer-use-FEAAE6TT.js} +3 -3
  18. package/{doctor-PGH6KBWK.js → connector-CM3CYVJ2.js} +605 -382
  19. package/connector-CM3CYVJ2.js.map +1 -0
  20. package/{credit-QS7QUF3Q.js → credit-W2JFXIEE.js} +4 -4
  21. package/{developer-support-QIN7JTGZ.js → developer-support-3SNDQLPM.js} +3 -3
  22. package/doctor-JZIBQ63P.js +99 -0
  23. package/doctor-JZIBQ63P.js.map +1 -0
  24. package/{generate-VGPYBDHG.js → generate-VMDERMRQ.js} +4 -4
  25. package/{github-DBVCDROM.js → github-IAAPK3LA.js} +3 -3
  26. package/{goal-VZEI2OD2.js → goal-IYAHG7OD.js} +3 -3
  27. package/{host-35I2D3WT.js → host-Y6II7XUE.js} +3 -3
  28. package/index.js +12 -12
  29. package/index.js.map +1 -1
  30. package/{logs-SW5VAI54.js → logs-BPDKBOIG.js} +5 -5
  31. package/{mail-YYSSPGP2.js → mail-O6HOSHJN.js} +5 -5
  32. package/{maps-DIQSL73V.js → maps-N3INUZF2.js} +3 -3
  33. package/{model-ZFYWBWJ3.js → model-NOMWYJFY.js} +4 -4
  34. package/{model-provider-7MXIPGCL.js → model-provider-RZDEASD3.js} +4 -4
  35. package/{org-E2T6M6MN.js → org-47E2LF2E.js} +3 -3
  36. package/package.json +1 -1
  37. package/{phone-KKPDS6J3.js → phone-EZSBFUQY.js} +3 -3
  38. package/{preference-MUE7N3MZ.js → preference-3U5KKXQ5.js} +3 -3
  39. package/{resource-3HUMK4UE.js → resource-FHIP3W3L.js} +3 -3
  40. package/{scrape-HH5G742T.js → scrape-5LAKGGQN.js} +3 -3
  41. package/{search-JSTRJBHA.js → search-3TJZAERR.js} +6 -6
  42. package/search-3TJZAERR.js.map +1 -0
  43. package/{secret-PH5S7HXR.js → secret-CZE2VOBQ.js} +3 -3
  44. package/{slack-5HWY6WME.js → slack-XG2XYZD4.js} +3 -3
  45. package/{teams-DJVOFNO6.js → teams-SHZAOOYC.js} +3 -3
  46. package/{telegram-3IPXE4FT.js → telegram-5APDUFXW.js} +3 -3
  47. package/{variable-XC2BRIE4.js → variable-CJIIWMIX.js} +3 -3
  48. package/{video-SAEKMO5Q.js → video-BFST4YFU.js} +2 -2
  49. package/{web-GEEMEX3J.js → web-6H5BRLZF.js} +3 -3
  50. package/{web-search-DLAG55F2.js → web-search-WTPWZGHE.js} +3 -3
  51. package/{whoami-EPCOG5DN.js → whoami-KY2VJFW7.js} +5 -5
  52. package/{workflow-VS75PBYU.js → workflow-L5Z6BS5N.js} +3 -3
  53. package/zero.js +36 -36
  54. package/zero.js.map +1 -1
  55. package/chunk-DCY7MYWI.js.map +0 -1
  56. package/chunk-PM36DYSC.js.map +0 -1
  57. package/chunk-XG3T3KKC.js.map +0 -1
  58. package/connector-RBJZ3XJO.js +0 -559
  59. package/connector-RBJZ3XJO.js.map +0 -1
  60. package/doctor-PGH6KBWK.js.map +0 -1
  61. package/search-JSTRJBHA.js.map +0 -1
  62. /package/{agent-YCTYPYF7.js.map → agent-5TLH3FMD.js.map} +0 -0
  63. /package/{banking-RWPXPGOY.js.map → banking-NEAT4R24.js.map} +0 -0
  64. /package/{chat-XWVVRA3Q.js.map → chat-F5Y4Y6W5.js.map} +0 -0
  65. /package/{chunk-HYARATBX.js.map → chunk-6IPI5G2W.js.map} +0 -0
  66. /package/{chunk-N55TLKMY.js.map → chunk-7D6TPEG2.js.map} +0 -0
  67. /package/{chunk-G2NMGFMS.js.map → chunk-ICKIMZYL.js.map} +0 -0
  68. /package/{chunk-GJ2YK4RB.js.map → chunk-JRH7ZD2I.js.map} +0 -0
  69. /package/{chunk-43Q6LJ4M.js.map → chunk-NTHQBG2C.js.map} +0 -0
  70. /package/{chunk-D7WBYCFZ.js.map → chunk-PAGGGOFZ.js.map} +0 -0
  71. /package/{chunk-JZD2ALHL.js.map → chunk-SP77SLW3.js.map} +0 -0
  72. /package/{computer-use-AJ4LM52W.js.map → computer-use-FEAAE6TT.js.map} +0 -0
  73. /package/{credit-QS7QUF3Q.js.map → credit-W2JFXIEE.js.map} +0 -0
  74. /package/{developer-support-QIN7JTGZ.js.map → developer-support-3SNDQLPM.js.map} +0 -0
  75. /package/{generate-VGPYBDHG.js.map → generate-VMDERMRQ.js.map} +0 -0
  76. /package/{github-DBVCDROM.js.map → github-IAAPK3LA.js.map} +0 -0
  77. /package/{goal-VZEI2OD2.js.map → goal-IYAHG7OD.js.map} +0 -0
  78. /package/{host-35I2D3WT.js.map → host-Y6II7XUE.js.map} +0 -0
  79. /package/{logs-SW5VAI54.js.map → logs-BPDKBOIG.js.map} +0 -0
  80. /package/{mail-YYSSPGP2.js.map → mail-O6HOSHJN.js.map} +0 -0
  81. /package/{maps-DIQSL73V.js.map → maps-N3INUZF2.js.map} +0 -0
  82. /package/{model-ZFYWBWJ3.js.map → model-NOMWYJFY.js.map} +0 -0
  83. /package/{model-provider-7MXIPGCL.js.map → model-provider-RZDEASD3.js.map} +0 -0
  84. /package/{org-E2T6M6MN.js.map → org-47E2LF2E.js.map} +0 -0
  85. /package/{phone-KKPDS6J3.js.map → phone-EZSBFUQY.js.map} +0 -0
  86. /package/{preference-MUE7N3MZ.js.map → preference-3U5KKXQ5.js.map} +0 -0
  87. /package/{resource-3HUMK4UE.js.map → resource-FHIP3W3L.js.map} +0 -0
  88. /package/{scrape-HH5G742T.js.map → scrape-5LAKGGQN.js.map} +0 -0
  89. /package/{secret-PH5S7HXR.js.map → secret-CZE2VOBQ.js.map} +0 -0
  90. /package/{slack-5HWY6WME.js.map → slack-XG2XYZD4.js.map} +0 -0
  91. /package/{teams-DJVOFNO6.js.map → teams-SHZAOOYC.js.map} +0 -0
  92. /package/{telegram-3IPXE4FT.js.map → telegram-5APDUFXW.js.map} +0 -0
  93. /package/{variable-XC2BRIE4.js.map → variable-CJIIWMIX.js.map} +0 -0
  94. /package/{video-SAEKMO5Q.js.map → video-BFST4YFU.js.map} +0 -0
  95. /package/{web-GEEMEX3J.js.map → web-6H5BRLZF.js.map} +0 -0
  96. /package/{web-search-DLAG55F2.js.map → web-search-WTPWZGHE.js.map} +0 -0
  97. /package/{whoami-EPCOG5DN.js.map → whoami-KY2VJFW7.js.map} +0 -0
  98. /package/{workflow-VS75PBYU.js.map → workflow-L5Z6BS5N.js.map} +0 -0
@@ -1,559 +0,0 @@
1
- #!/usr/bin/env node
2
- import { createRequire as __createRequire } from "node:module";
3
- const require = __createRequire(import.meta.url);
4
- import {
5
- availableConnectorRefs,
6
- findConnectorStatusItem,
7
- resolveAgentContext,
8
- resolveManualGrantAuthMethod,
9
- searchPublicConnectorCatalog
10
- } from "./chunk-GJ2YK4RB.js";
11
- import {
12
- getPlatformOrigin
13
- } from "./chunk-D7WBYCFZ.js";
14
- import {
15
- connectZeroConnectorManualGrant,
16
- customConnectorProposalSchema,
17
- getZeroAgent,
18
- getZeroAgentCustomConnectors,
19
- getZeroCustomConnector,
20
- listZeroConnectorCatalogStatus,
21
- listZeroCustomConnectors
22
- } from "./chunk-PM36DYSC.js";
23
- import "./chunk-LTDQISD7.js";
24
- import {
25
- source_default,
26
- withErrorHandler
27
- } from "./chunk-XG3T3KKC.js";
28
- import "./chunk-LRHXR7JT.js";
29
- import {
30
- Command
31
- } from "./chunk-B3W2RUBP.js";
32
- import {
33
- init_esm_shims
34
- } from "./chunk-DIRAZ3YX.js";
35
-
36
- // src/commands/zero/connector/index.ts
37
- init_esm_shims();
38
-
39
- // src/commands/zero/connector/connect.ts
40
- init_esm_shims();
41
- function collectValue(value, previous) {
42
- return [...previous, value];
43
- }
44
- function parseConnectorValues(rawValues) {
45
- if (!rawValues || rawValues.length === 0) {
46
- throw new Error("At least one --value NAME=VALUE is required", {
47
- cause: new Error(
48
- "Example: zero connector connect zendesk --value apiToken=token"
49
- )
50
- });
51
- }
52
- const values = {};
53
- for (const rawValue of rawValues) {
54
- const separatorIndex = rawValue.indexOf("=");
55
- if (separatorIndex <= 0) {
56
- throw new Error("Invalid --value format", {
57
- cause: new Error("Use --value NAME=VALUE")
58
- });
59
- }
60
- const name = rawValue.slice(0, separatorIndex);
61
- if (!name.trim()) {
62
- throw new Error("Invalid --value format", {
63
- cause: new Error("Field name cannot be empty")
64
- });
65
- }
66
- values[name] = rawValue.slice(separatorIndex + 1);
67
- }
68
- return values;
69
- }
70
- var connectCommand = new Command().name("connect").description("Connect a connector with manual grant values").argument("<type>", "Connector type (e.g., zendesk)").option("--auth-method <method>", "Connector auth method to use").option(
71
- "--value <name=value>",
72
- "Connector field value; repeat for multiple fields",
73
- collectValue,
74
- []
75
- ).option("--json", "Print the connector response as JSON").action(
76
- withErrorHandler(async (type, options) => {
77
- const values = parseConnectorValues(options.value);
78
- const catalog = await listZeroConnectorCatalogStatus();
79
- const connectorMetadata = findConnectorStatusItem(
80
- catalog.connectors,
81
- type
82
- );
83
- if (!connectorMetadata) {
84
- throw new Error(`Unknown or unavailable connector: ${type}`, {
85
- cause: new Error(
86
- `Available connectors: ${availableConnectorRefs(catalog.connectors)}`
87
- )
88
- });
89
- }
90
- const authMethod = resolveManualGrantAuthMethod(
91
- connectorMetadata,
92
- options.authMethod
93
- );
94
- const connector = await connectZeroConnectorManualGrant(
95
- connectorMetadata.connectorRef,
96
- authMethod.id,
97
- values
98
- );
99
- if (options.json) {
100
- console.log(JSON.stringify(connector, null, 2));
101
- return;
102
- }
103
- console.log(source_default.green(`\u2713 ${connectorMetadata.label} connected`));
104
- console.log(source_default.dim(` Type: ${connector.type}`));
105
- console.log(source_default.dim(` Auth Method: ${connector.authMethod}`));
106
- console.log(source_default.dim(` Run: zero connector status ${connector.type}`));
107
- })
108
- );
109
-
110
- // src/commands/zero/connector/list.ts
111
- init_esm_shims();
112
-
113
- // src/commands/zero/connector/connected-as.ts
114
- init_esm_shims();
115
- function renderIdentity(connector) {
116
- if (connector.connection?.externalUsername) {
117
- return `@${connector.connection.externalUsername}`;
118
- }
119
- if (connector.connection?.externalEmail)
120
- return connector.connection.externalEmail;
121
- return "-";
122
- }
123
- function renderConnectedAsCell(connector) {
124
- if (!connector || connector.connectionStatus === "not-connected") {
125
- return source_default.dim("(not connected)");
126
- }
127
- const identity = renderIdentity(connector);
128
- if (connector.connectionStatus === "reconnect-required") {
129
- return source_default.yellow(`${identity} (reconnect needed)`);
130
- }
131
- if (connector.scopeMismatch || connector.connectionStatus === "scope-mismatch") {
132
- return source_default.yellow(`${identity} (permissions update available)`);
133
- }
134
- return identity;
135
- }
136
- var ESC = "\x1B";
137
- var ANSI_PATTERN = new RegExp(`${ESC}\\[[0-9;]*m`, "g");
138
- function stripAnsi(s) {
139
- return s.replace(ANSI_PATTERN, "");
140
- }
141
- function padEndAnsi(s, width) {
142
- const visible = stripAnsi(s).length;
143
- return s + " ".repeat(Math.max(0, width - visible));
144
- }
145
-
146
- // src/commands/zero/connector/list.ts
147
- var listCommand = new Command().name("list").alias("ls").description("List all connectors and their status").option("--agent <id>", "Show per-agent authorization column").action(
148
- withErrorHandler(async (options) => {
149
- const [{ connectors }, agentCtx] = await Promise.all([
150
- listZeroConnectorCatalogStatus(),
151
- resolveAgentContext(options.agent)
152
- ]);
153
- const allTypes = connectors.map((connector) => {
154
- return connector.connectorRef;
155
- });
156
- const typeWidth = Math.max(
157
- 4,
158
- ...allTypes.map((t) => {
159
- return t.length;
160
- })
161
- );
162
- const connectedAsHeader = "CONNECTED AS";
163
- const connectedCells = connectors.map((connector) => {
164
- return renderConnectedAsCell(connector);
165
- });
166
- const connectedAsWidth = Math.max(
167
- connectedAsHeader.length,
168
- ...connectedCells.map((c) => {
169
- return stripAnsi(c).length;
170
- })
171
- );
172
- const authorizedHeader = agentCtx ? `AUTHORIZED FOR ${agentCtx.displayName}` : null;
173
- const headerParts = [
174
- "TYPE".padEnd(typeWidth),
175
- connectedAsHeader.padEnd(connectedAsWidth)
176
- ];
177
- if (authorizedHeader) headerParts.push(authorizedHeader);
178
- console.log(source_default.dim(headerParts.join(" ")));
179
- for (let i = 0; i < allTypes.length; i++) {
180
- const type = allTypes[i];
181
- const connectedCell = padEndAnsi(connectedCells[i], connectedAsWidth);
182
- const parts = [type.padEnd(typeWidth), connectedCell];
183
- if (agentCtx) {
184
- parts.push(
185
- agentCtx.authorizedTypes.has(type) ? source_default.green("\u2713") : source_default.dim("-")
186
- );
187
- }
188
- console.log(parts.join(" "));
189
- }
190
- })
191
- );
192
-
193
- // src/commands/zero/connector/search.ts
194
- init_esm_shims();
195
- var DEFAULT_LIMIT = 5;
196
- var EXACT_MATCH_THRESHOLD = 80;
197
- function parseLimit(raw) {
198
- const trimmed = raw.trim();
199
- const n = Number(trimmed);
200
- if (!/^\d+$/.test(trimmed) || !Number.isSafeInteger(n) || n <= 0) {
201
- throw new Error(`--limit must be a positive integer, got "${raw}".`);
202
- }
203
- return n;
204
- }
205
- var searchCommand = new Command().name("search").description(
206
- "Search connectors by type, label, category, generation type, or tag"
207
- ).argument("<keyword>", "Search keyword (case-insensitive)").option("--agent <id>", "Show per-agent authorization column").option(
208
- "--limit <n>",
209
- `Maximum number of results to display (default ${DEFAULT_LIMIT})`,
210
- parseLimit,
211
- DEFAULT_LIMIT
212
- ).action(
213
- withErrorHandler(
214
- async (keyword, options) => {
215
- const trimmed = keyword.trim();
216
- if (!trimmed) {
217
- throw new Error("Keyword cannot be empty.");
218
- }
219
- const [{ connectors }, agentCtx] = await Promise.all([
220
- listZeroConnectorCatalogStatus(),
221
- resolveAgentContext(options.agent)
222
- ]);
223
- const { results, total } = searchPublicConnectorCatalog(
224
- connectors,
225
- trimmed,
226
- options.limit
227
- );
228
- if (results.length === 0) {
229
- console.log("No matches found.");
230
- return;
231
- }
232
- const topScore = results[0].score;
233
- if (topScore < EXACT_MATCH_THRESHOLD) {
234
- console.log("No exact match. Showing closest:");
235
- }
236
- if (total > options.limit) {
237
- console.log(`Too many results (top ${options.limit} of ${total}):`);
238
- }
239
- const typeHeader = "TYPE";
240
- const connectedAsHeader = "CONNECTED AS";
241
- const connectedCells = results.map((r) => {
242
- return renderConnectedAsCell(r.connector);
243
- });
244
- const typeWidth = Math.max(
245
- typeHeader.length,
246
- ...results.map((r) => {
247
- return r.connector.connectorRef.length;
248
- })
249
- );
250
- const connectedAsWidth = Math.max(
251
- connectedAsHeader.length,
252
- ...connectedCells.map((c) => {
253
- return stripAnsi(c).length;
254
- })
255
- );
256
- const headerParts = [
257
- typeHeader.padEnd(typeWidth),
258
- connectedAsHeader.padEnd(connectedAsWidth)
259
- ];
260
- if (agentCtx) {
261
- headerParts.push(`AUTHORIZED FOR ${agentCtx.displayName}`);
262
- }
263
- console.log(source_default.dim(headerParts.join(" ")));
264
- for (let i = 0; i < results.length; i++) {
265
- const result = results[i];
266
- const parts = [
267
- result.connector.connectorRef.padEnd(typeWidth),
268
- padEndAnsi(connectedCells[i], connectedAsWidth)
269
- ];
270
- if (agentCtx) {
271
- parts.push(
272
- agentCtx.authorizedTypes.has(result.connector.connectorRef) ? source_default.green("\u2713") : source_default.dim("-")
273
- );
274
- }
275
- console.log(parts.join(" "));
276
- }
277
- }
278
- )
279
- );
280
-
281
- // src/commands/zero/connector/status.ts
282
- init_esm_shims();
283
- var LABEL_WIDTH = 16;
284
- function printConnectorDetails(connector) {
285
- if (connector.connectionStatus === "not-connected") {
286
- console.log(
287
- `${"Status:".padEnd(LABEL_WIDTH)}${source_default.dim("not connected")}`
288
- );
289
- return;
290
- }
291
- console.log(
292
- `${"Status:".padEnd(LABEL_WIDTH)}${connector.connectionStatus === "reconnect-required" ? source_default.yellow("reconnect needed") : source_default.green("connected")}`
293
- );
294
- if (connector.connection?.externalUsername) {
295
- console.log(
296
- `${"Account:".padEnd(LABEL_WIDTH)}@${connector.connection.externalUsername}`
297
- );
298
- } else if (connector.connection?.externalEmail) {
299
- console.log(
300
- `${"Account:".padEnd(LABEL_WIDTH)}${connector.connection.externalEmail}`
301
- );
302
- }
303
- if (connector.connection?.authMethod) {
304
- console.log(
305
- `${"Auth Method:".padEnd(LABEL_WIDTH)}${connector.connection.authMethod}`
306
- );
307
- }
308
- if (connector.scopeMismatch) {
309
- console.log(
310
- `${"Permissions:".padEnd(LABEL_WIDTH)}${source_default.yellow("update available")}`
311
- );
312
- }
313
- if (connector.tokenExpiresAt) {
314
- console.log(
315
- `${"Token Expires:".padEnd(LABEL_WIDTH)}${connector.tokenExpiresAt}`
316
- );
317
- }
318
- }
319
- async function printAgentAction(connector, agentCtx) {
320
- const connectorRef = connector.connectorRef;
321
- const authorized = agentCtx.authorizedTypes.has(connectorRef);
322
- const isConnected = connector.connected;
323
- const needsReconnect = connector.connectionStatus === "reconnect-required";
324
- const agentLabel = agentCtx.displayName === agentCtx.agentId ? agentCtx.agentId : `${agentCtx.displayName} (${agentCtx.agentId})`;
325
- console.log();
326
- if (needsReconnect) {
327
- const origin = await getPlatformOrigin();
328
- const url = `${origin}/connectors`;
329
- console.log(
330
- `The ${connectorRef} connector is connected but needs to be reconnected before agent ${agentLabel} can use it.`
331
- );
332
- console.log(`Reconnect it at: [Reconnect ${connectorRef}](${url})`);
333
- } else if (authorized && !isConnected) {
334
- const origin = await getPlatformOrigin();
335
- const url = `${origin}/connectors/${connectorRef}/connect?agentId=${agentCtx.agentId}`;
336
- console.log(
337
- `The ${connectorRef} connector is authorized for agent ${agentLabel}, but it is not connected.`
338
- );
339
- console.log(`Connect it at: [Connect ${connectorRef}](${url})`);
340
- } else if (authorized) {
341
- console.log(
342
- `The ${connectorRef} connector is authorized for agent ${agentLabel}.`
343
- );
344
- } else if (!isConnected) {
345
- const origin = await getPlatformOrigin();
346
- const url = `${origin}/connectors/${connectorRef}/connect?agentId=${agentCtx.agentId}`;
347
- console.log(
348
- `The ${connectorRef} connector is not connected. Once connected, it will be authorized for agent ${agentLabel}.`
349
- );
350
- console.log(
351
- `Connect and authorize it at: [Connect ${connectorRef}](${url})`
352
- );
353
- } else {
354
- const origin = await getPlatformOrigin();
355
- const url = `${origin}/connectors/${connectorRef}/authorize?agentId=${agentCtx.agentId}`;
356
- console.log(
357
- `The ${connectorRef} connector is not authorized for agent ${agentLabel}.`
358
- );
359
- console.log(`Authorize it at: [Authorize ${connectorRef}](${url})`);
360
- }
361
- }
362
- async function printStandaloneAction(connector) {
363
- const connectorRef = connector.connectorRef;
364
- if (connector.connectionStatus === "connected" || connector.connectionStatus === "scope-mismatch") {
365
- return;
366
- }
367
- const origin = await getPlatformOrigin();
368
- console.log();
369
- if (connector.connectionStatus === "reconnect-required") {
370
- const url = `${origin}/connectors`;
371
- console.log(
372
- `The ${connectorRef} connector is connected but needs to be reconnected.`
373
- );
374
- console.log(`Reconnect it at: [Reconnect ${connectorRef}](${url})`);
375
- } else {
376
- const url = `${origin}/connectors/${connectorRef}/connect`;
377
- console.log(`Connect it at: [Connect ${connectorRef}](${url})`);
378
- }
379
- }
380
- var statusCommand = new Command().name("status").description("Show detailed status of a connector").argument("<type>", "Connector type (e.g., github)").option("--agent <id>", "Show authorization state for the given agent").action(
381
- withErrorHandler(async (type, options) => {
382
- const [catalog, agentCtx] = await Promise.all([
383
- listZeroConnectorCatalogStatus(),
384
- resolveAgentContext(options.agent)
385
- ]);
386
- const connector = findConnectorStatusItem(catalog.connectors, type);
387
- if (!connector) {
388
- throw new Error(`Unknown or unavailable connector: ${type}`, {
389
- cause: new Error(
390
- `Available connectors: ${availableConnectorRefs(catalog.connectors)}`
391
- )
392
- });
393
- }
394
- console.log(`Connector: ${source_default.cyan(connector.connectorRef)}`);
395
- console.log();
396
- printConnectorDetails(connector);
397
- if (agentCtx) {
398
- await printAgentAction(connector, agentCtx);
399
- } else {
400
- await printStandaloneAction(connector);
401
- }
402
- })
403
- );
404
-
405
- // src/commands/zero/connector/custom/index.ts
406
- init_esm_shims();
407
- import { readFile } from "fs/promises";
408
- var LABEL_WIDTH2 = 18;
409
- function renderConnected(connector) {
410
- if (connector.connected) {
411
- return source_default.green("connected");
412
- }
413
- if (connector.missingRequiredFields.length === 0) {
414
- return source_default.dim("not connected");
415
- }
416
- return source_default.yellow(`missing ${connector.missingRequiredFields.join(", ")}`);
417
- }
418
- function encodeBase64UrlJson(value) {
419
- return Buffer.from(JSON.stringify(value), "utf8").toString("base64url");
420
- }
421
- function isJsonObject(value) {
422
- return typeof value === "object" && value !== null && !Array.isArray(value);
423
- }
424
- async function resolveCustomAgentContext(agentId) {
425
- const resolvedAgentId = agentId ?? process.env.ZERO_AGENT_ID;
426
- if (!resolvedAgentId) {
427
- return null;
428
- }
429
- const [agent, enabledIds] = await Promise.all([
430
- getZeroAgent(resolvedAgentId),
431
- getZeroAgentCustomConnectors(resolvedAgentId)
432
- ]);
433
- return {
434
- agentId: agent.agentId,
435
- displayName: agent.displayName ?? agent.agentId,
436
- authorizedIds: new Set(enabledIds)
437
- };
438
- }
439
- var listCommand2 = new Command().name("list").alias("ls").description("List org custom connectors").option("--agent <id>", "Show per-agent authorization column").action(
440
- withErrorHandler(async (options) => {
441
- const [connectors, agentCtx] = await Promise.all([
442
- listZeroCustomConnectors(),
443
- resolveCustomAgentContext(options.agent)
444
- ]);
445
- const idWidth = Math.max(
446
- 2,
447
- ...connectors.map((connector) => {
448
- return connector.id.length;
449
- })
450
- );
451
- const nameWidth = Math.max(
452
- 4,
453
- ...connectors.map((connector) => {
454
- return connector.displayName.length;
455
- })
456
- );
457
- const header = ["ID".padEnd(idWidth), "NAME".padEnd(nameWidth), "STATUS"];
458
- if (agentCtx) {
459
- header.push(`AUTHORIZED FOR ${agentCtx.displayName}`);
460
- }
461
- console.log(source_default.dim(header.join(" ")));
462
- for (const connector of connectors) {
463
- const row = [
464
- connector.id.padEnd(idWidth),
465
- connector.displayName.padEnd(nameWidth),
466
- renderConnected(connector)
467
- ];
468
- if (agentCtx) {
469
- row.push(
470
- agentCtx.authorizedIds.has(connector.id) ? source_default.green("\u2713") : source_default.dim("-")
471
- );
472
- }
473
- console.log(row.join(" "));
474
- }
475
- })
476
- );
477
- var statusCommand2 = new Command().name("status").description("Show detailed status of a custom connector").argument("<connector-id>", "Custom connector id").option("--agent <id>", "Show authorization state for the given agent").action(
478
- withErrorHandler(
479
- async (connectorId, options) => {
480
- const [connector, agentCtx] = await Promise.all([
481
- getZeroCustomConnector(connectorId),
482
- resolveCustomAgentContext(options.agent)
483
- ]);
484
- if (!connector) {
485
- throw new Error(`Custom connector not found: ${connectorId}`);
486
- }
487
- console.log(`Custom connector: ${source_default.cyan(connector.displayName)}`);
488
- console.log();
489
- console.log(`${"ID:".padEnd(LABEL_WIDTH2)}${connector.id}`);
490
- console.log(
491
- `${"Status:".padEnd(LABEL_WIDTH2)}${renderConnected(connector)}`
492
- );
493
- console.log(
494
- `${"Prefixes:".padEnd(LABEL_WIDTH2)}${connector.prefixTemplates.join(", ")}`
495
- );
496
- console.log(
497
- `${"Fields:".padEnd(LABEL_WIDTH2)}${connector.fields.map((field) => {
498
- return `${field.kind}:${field.key}${field.required ? "" : "?"}`;
499
- }).join(", ")}`
500
- );
501
- if (connector.headerInjections.length > 0) {
502
- console.log(
503
- `${"Headers:".padEnd(LABEL_WIDTH2)}${connector.headerInjections.map((header) => {
504
- return header.name;
505
- }).join(", ")}`
506
- );
507
- }
508
- if (connector.queryInjections.length > 0) {
509
- console.log(
510
- `${"Query params:".padEnd(LABEL_WIDTH2)}${connector.queryInjections.map((query) => {
511
- return query.name;
512
- }).join(", ")}`
513
- );
514
- }
515
- if (agentCtx) {
516
- console.log(
517
- `${"Authorized:".padEnd(LABEL_WIDTH2)}${agentCtx.authorizedIds.has(connector.id) ? source_default.green("yes") : source_default.yellow("no")}`
518
- );
519
- }
520
- }
521
- )
522
- );
523
- var proposeCommand = new Command().name("propose").description("Create a browser save link for a custom connector proposal").requiredOption("--proposal-file <path>", "JSON proposal file").option("--connector-id <id>", "Override connector id for update proposals").option("--agent <id>", "Authorize this agent when the proposal is saved").action(
524
- withErrorHandler(
525
- async (options) => {
526
- const raw = await readFile(options.proposalFile, "utf8");
527
- const proposalJson = JSON.parse(raw);
528
- if (!isJsonObject(proposalJson)) {
529
- throw new Error("Proposal file must contain a JSON object");
530
- }
531
- const parsed = customConnectorProposalSchema.parse({
532
- ...proposalJson,
533
- ...options.connectorId ? { connectorId: options.connectorId } : {}
534
- });
535
- const origin = await getPlatformOrigin();
536
- const params = new URLSearchParams({
537
- p: encodeBase64UrlJson(parsed)
538
- });
539
- const agentId = options.agent ?? process.env.ZERO_AGENT_ID;
540
- if (agentId) {
541
- params.set("agentId", agentId);
542
- }
543
- const url = `${origin}/connectors/custom/proposal?${params.toString()}`;
544
- console.log(`[Configure ${parsed.displayName}](${url})`);
545
- console.log();
546
- console.log(
547
- "Open this link to review, save values, and authorize the connector."
548
- );
549
- }
550
- )
551
- );
552
- var customConnectorCommand = new Command().name("custom").description("Inspect and propose org custom connectors").addCommand(listCommand2).addCommand(statusCommand2).addCommand(proposeCommand);
553
-
554
- // src/commands/zero/connector/index.ts
555
- var zeroConnectorCommand = new Command().name("connector").description("Check third-party service connections (GitHub, Slack, etc.)").addCommand(customConnectorCommand).addCommand(connectCommand).addCommand(listCommand).addCommand(searchCommand).addCommand(statusCommand);
556
- export {
557
- zeroConnectorCommand
558
- };
559
- //# sourceMappingURL=connector-RBJZ3XJO.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/commands/zero/connector/index.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"],"sourcesContent":["import { Command } from \"commander\";\nimport { connectCommand } from \"./connect\";\nimport { listCommand } from \"./list\";\nimport { searchCommand } from \"./search\";\nimport { statusCommand } from \"./status\";\nimport { customConnectorCommand } from \"./custom\";\n\nexport const zeroConnectorCommand = new Command()\n .name(\"connector\")\n .description(\"Check third-party service connections (GitHub, Slack, etc.)\")\n .addCommand(customConnectorCommand)\n .addCommand(connectCommand)\n .addCommand(listCommand)\n .addCommand(searchCommand)\n .addCommand(statusCommand);\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\";\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 = `${origin}/connectors`;\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 } else if (authorized && !isConnected) {\n const origin = await getPlatformOrigin();\n const url = `${origin}/connectors/${connectorRef}/connect?agentId=${agentCtx.agentId}`;\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 } 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 = `${origin}/connectors/${connectorRef}/connect?agentId=${agentCtx.agentId}`;\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 } else {\n const origin = await getPlatformOrigin();\n const url = `${origin}/connectors/${connectorRef}/authorize?agentId=${agentCtx.agentId}`;\n console.log(\n `The ${connectorRef} connector is not authorized for agent ${agentLabel}.`,\n );\n console.log(`Authorize it at: [Authorize ${connectorRef}](${url})`);\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"],"mappings":"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","names":["LABEL_WIDTH","listCommand","statusCommand"]}