@vm0/cli 9.221.4 → 9.221.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/{agent-SRJW4DJV.js → agent-DYWIJQ2R.js} +4 -4
- package/{automation-THUDKXQR.js → automation-CZYPQV3U.js} +7 -9
- package/{automation-THUDKXQR.js.map → automation-CZYPQV3U.js.map} +1 -1
- package/{banking-ED4LTRY3.js → banking-NLYZOBEM.js} +2 -2
- package/{chat-WMXIEDEY.js → chat-5UZFU2YR.js} +2 -2
- package/{chunk-AYR37FIN.js → chunk-463VKP2V.js} +3 -3
- package/{chunk-3NMCKGNJ.js → chunk-65CYJRLA.js} +2 -2
- package/{chunk-J7RLLIWI.js → chunk-HQFETCZ6.js} +26 -2
- package/chunk-HQFETCZ6.js.map +1 -0
- package/{chunk-2K5GNYND.js → chunk-IFA2V7EW.js} +2 -2
- package/{chunk-RR5CO7IT.js → chunk-IMZDXXSW.js} +2 -2
- package/{chunk-4YUV2CMK.js → chunk-PB7YKTIG.js} +3 -3
- package/{chunk-QV73BJ3B.js → chunk-PCBM5SRN.js} +320 -134
- package/chunk-PCBM5SRN.js.map +1 -0
- package/{chunk-QCYPFXRV.js → chunk-PX6FH3KT.js} +2 -2
- package/{chunk-M5MXYLLZ.js → chunk-UZJLZXGK.js} +123 -291
- package/chunk-UZJLZXGK.js.map +1 -0
- package/{chunk-DAC5OAWI.js → chunk-ZQYA5M55.js} +3 -64
- package/{chunk-DAC5OAWI.js.map → chunk-ZQYA5M55.js.map} +1 -1
- package/{computer-use-WINYVPQS.js → computer-use-JWVNMBIM.js} +2 -2
- package/{connector-WBM4EKRR.js → connector-YJX3MZGN.js} +382 -395
- package/connector-YJX3MZGN.js.map +1 -0
- package/{credit-KJRMNSQ2.js → credit-FHOJ736M.js} +2 -2
- package/{developer-support-DMUPPQB2.js → developer-support-BJVUM5OZ.js} +2 -2
- package/{doctor-VGQ6YI6G.js → doctor-BDSKVS5W.js} +5 -5
- package/{generate-STQVPQZO.js → generate-EA5ZRXFE.js} +60 -81
- package/generate-EA5ZRXFE.js.map +1 -0
- package/{github-LSFYZXO3.js → github-NU7VA3WB.js} +2 -2
- package/{goal-BNN7NM52.js → goal-4H4GUEMC.js} +2 -2
- package/{host-4MVX223U.js → host-SCI3ZPFT.js} +2 -2
- package/index.js +13 -13
- package/{logs-2VYXOUSW.js → logs-EOG3DCHM.js} +6 -6
- package/{maps-AMT7SMTH.js → maps-E5GVYSKP.js} +2 -2
- package/{model-HRRTGQQW.js → model-XP7ACN22.js} +3 -3
- package/{model-provider-HRK3C42K.js → model-provider-TAGWSIEW.js} +3 -3
- package/{org-M6Z5HXLU.js → org-4CMXX52G.js} +2 -2
- package/package.json +1 -1
- package/{phone-XM2DDX3C.js → phone-T7VLFMEU.js} +2 -2
- package/{preference-OQ3NRFCT.js → preference-Q4ZCLD2L.js} +2 -2
- package/{resource-NR6R2I6J.js → resource-QKFJESUB.js} +2 -2
- package/{search-RVTPT6N3.js → search-5QGCMW7I.js} +6 -6
- package/{secret-JPLOSNN3.js → secret-LMPIFKPU.js} +3 -3
- package/{slack-ETMPZQYC.js → slack-FKENH3DZ.js} +2 -2
- package/{telegram-IOHI44M5.js → telegram-ZG24OBRU.js} +2 -2
- package/{variable-URYGYI2W.js → variable-BOATQUX3.js} +2 -2
- package/{web-OAVP3LA4.js → web-3ASTXCH7.js} +2 -2
- package/{whoami-5RMEOJGY.js → whoami-DHCS6YIJ.js} +4 -4
- package/{workflow-JJXIMM3C.js → workflow-T2TTFE6C.js} +4 -6
- package/{workflow-JJXIMM3C.js.map → workflow-T2TTFE6C.js.map} +1 -1
- package/zero.js +31 -31
- package/chunk-J7RLLIWI.js.map +0 -1
- package/chunk-M5MXYLLZ.js.map +0 -1
- package/chunk-QV73BJ3B.js.map +0 -1
- package/chunk-RGP625TN.js +0 -47
- package/chunk-RGP625TN.js.map +0 -1
- package/connector-WBM4EKRR.js.map +0 -1
- package/generate-STQVPQZO.js.map +0 -1
- /package/{agent-SRJW4DJV.js.map → agent-DYWIJQ2R.js.map} +0 -0
- /package/{banking-ED4LTRY3.js.map → banking-NLYZOBEM.js.map} +0 -0
- /package/{chat-WMXIEDEY.js.map → chat-5UZFU2YR.js.map} +0 -0
- /package/{chunk-AYR37FIN.js.map → chunk-463VKP2V.js.map} +0 -0
- /package/{chunk-3NMCKGNJ.js.map → chunk-65CYJRLA.js.map} +0 -0
- /package/{chunk-2K5GNYND.js.map → chunk-IFA2V7EW.js.map} +0 -0
- /package/{chunk-RR5CO7IT.js.map → chunk-IMZDXXSW.js.map} +0 -0
- /package/{chunk-4YUV2CMK.js.map → chunk-PB7YKTIG.js.map} +0 -0
- /package/{chunk-QCYPFXRV.js.map → chunk-PX6FH3KT.js.map} +0 -0
- /package/{computer-use-WINYVPQS.js.map → computer-use-JWVNMBIM.js.map} +0 -0
- /package/{credit-KJRMNSQ2.js.map → credit-FHOJ736M.js.map} +0 -0
- /package/{developer-support-DMUPPQB2.js.map → developer-support-BJVUM5OZ.js.map} +0 -0
- /package/{doctor-VGQ6YI6G.js.map → doctor-BDSKVS5W.js.map} +0 -0
- /package/{github-LSFYZXO3.js.map → github-NU7VA3WB.js.map} +0 -0
- /package/{goal-BNN7NM52.js.map → goal-4H4GUEMC.js.map} +0 -0
- /package/{host-4MVX223U.js.map → host-SCI3ZPFT.js.map} +0 -0
- /package/{logs-2VYXOUSW.js.map → logs-EOG3DCHM.js.map} +0 -0
- /package/{maps-AMT7SMTH.js.map → maps-E5GVYSKP.js.map} +0 -0
- /package/{model-HRRTGQQW.js.map → model-XP7ACN22.js.map} +0 -0
- /package/{model-provider-HRK3C42K.js.map → model-provider-TAGWSIEW.js.map} +0 -0
- /package/{org-M6Z5HXLU.js.map → org-4CMXX52G.js.map} +0 -0
- /package/{phone-XM2DDX3C.js.map → phone-T7VLFMEU.js.map} +0 -0
- /package/{preference-OQ3NRFCT.js.map → preference-Q4ZCLD2L.js.map} +0 -0
- /package/{resource-NR6R2I6J.js.map → resource-QKFJESUB.js.map} +0 -0
- /package/{search-RVTPT6N3.js.map → search-5QGCMW7I.js.map} +0 -0
- /package/{secret-JPLOSNN3.js.map → secret-LMPIFKPU.js.map} +0 -0
- /package/{slack-ETMPZQYC.js.map → slack-FKENH3DZ.js.map} +0 -0
- /package/{telegram-IOHI44M5.js.map → telegram-ZG24OBRU.js.map} +0 -0
- /package/{variable-URYGYI2W.js.map → variable-BOATQUX3.js.map} +0 -0
- /package/{web-OAVP3LA4.js.map → web-3ASTXCH7.js.map} +0 -0
- /package/{whoami-5RMEOJGY.js.map → whoami-DHCS6YIJ.js.map} +0 -0
package/chunk-RGP625TN.js
DELETED
|
@@ -1,47 +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
|
-
init_esm_shims
|
|
6
|
-
} from "./chunk-DIRAZ3YX.js";
|
|
7
|
-
|
|
8
|
-
// src/lib/domain/schedule-utils.ts
|
|
9
|
-
init_esm_shims();
|
|
10
|
-
function formatRelativeTime(dateStr) {
|
|
11
|
-
if (!dateStr) return "-";
|
|
12
|
-
const date = new Date(dateStr);
|
|
13
|
-
const now = /* @__PURE__ */ new Date();
|
|
14
|
-
const diffMs = date.getTime() - now.getTime();
|
|
15
|
-
const diffAbs = Math.abs(diffMs);
|
|
16
|
-
const minutes = Math.floor(diffAbs / (1e3 * 60));
|
|
17
|
-
const hours = Math.floor(diffAbs / (1e3 * 60 * 60));
|
|
18
|
-
const days = Math.floor(diffAbs / (1e3 * 60 * 60 * 24));
|
|
19
|
-
const isPast = diffMs < 0;
|
|
20
|
-
if (days > 0) {
|
|
21
|
-
return isPast ? `${days}d ago` : `in ${days}d`;
|
|
22
|
-
} else if (hours > 0) {
|
|
23
|
-
return isPast ? `${hours}h ago` : `in ${hours}h`;
|
|
24
|
-
} else if (minutes > 0) {
|
|
25
|
-
return isPast ? `${minutes}m ago` : `in ${minutes}m`;
|
|
26
|
-
} else {
|
|
27
|
-
return isPast ? "just now" : "soon";
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
function formatDateTime(dateStr) {
|
|
31
|
-
if (!dateStr) return "-";
|
|
32
|
-
const date = new Date(dateStr);
|
|
33
|
-
const year = date.getFullYear();
|
|
34
|
-
const month = String(date.getMonth() + 1).padStart(2, "0");
|
|
35
|
-
const day = String(date.getDate()).padStart(2, "0");
|
|
36
|
-
const hours = String(date.getHours()).padStart(2, "0");
|
|
37
|
-
const minutes = String(date.getMinutes()).padStart(2, "0");
|
|
38
|
-
const formatted = `${year}-${month}-${day} ${hours}:${minutes}`;
|
|
39
|
-
const relative = formatRelativeTime(dateStr);
|
|
40
|
-
return `${formatted} (${relative})`;
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
export {
|
|
44
|
-
formatRelativeTime,
|
|
45
|
-
formatDateTime
|
|
46
|
-
};
|
|
47
|
-
//# sourceMappingURL=chunk-RGP625TN.js.map
|
package/chunk-RGP625TN.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/lib/domain/schedule-utils.ts"],"sourcesContent":["/**\n * Format a date string as relative time (e.g., \"in 2h\", \"3d ago\")\n */\nexport function formatRelativeTime(dateStr: string | null): string {\n if (!dateStr) return \"-\";\n\n const date = new Date(dateStr);\n const now = new Date();\n const diffMs = date.getTime() - now.getTime();\n const diffAbs = Math.abs(diffMs);\n\n const minutes = Math.floor(diffAbs / (1000 * 60));\n const hours = Math.floor(diffAbs / (1000 * 60 * 60));\n const days = Math.floor(diffAbs / (1000 * 60 * 60 * 24));\n\n const isPast = diffMs < 0;\n\n if (days > 0) {\n return isPast ? `${days}d ago` : `in ${days}d`;\n } else if (hours > 0) {\n return isPast ? `${hours}h ago` : `in ${hours}h`;\n } else if (minutes > 0) {\n return isPast ? `${minutes}m ago` : `in ${minutes}m`;\n } else {\n return isPast ? \"just now\" : \"soon\";\n }\n}\n\n/**\n * Format a date string with both absolute and relative time\n * e.g., \"2025-01-14 09:00 (in 2h)\"\n * Uses local timezone, but doesn't include timezone in output (shown separately)\n */\nexport function formatDateTime(dateStr: string | null): string {\n if (!dateStr) return \"-\";\n\n const date = new Date(dateStr);\n\n // Format: YYYY-MM-DD HH:MM (no seconds, no timezone - shown separately)\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, \"0\");\n const day = String(date.getDate()).padStart(2, \"0\");\n const hours = String(date.getHours()).padStart(2, \"0\");\n const minutes = String(date.getMinutes()).padStart(2, \"0\");\n\n const formatted = `${year}-${month}-${day} ${hours}:${minutes}`;\n const relative = formatRelativeTime(dateStr);\n\n return `${formatted} (${relative})`;\n}\n"],"mappings":";;;;;;;;AAAA;AAGO,SAAS,mBAAmB,SAAgC;AACjE,MAAI,CAAC,QAAS,QAAO;AAErB,QAAM,OAAO,IAAI,KAAK,OAAO;AAC7B,QAAM,MAAM,oBAAI,KAAK;AACrB,QAAM,SAAS,KAAK,QAAQ,IAAI,IAAI,QAAQ;AAC5C,QAAM,UAAU,KAAK,IAAI,MAAM;AAE/B,QAAM,UAAU,KAAK,MAAM,WAAW,MAAO,GAAG;AAChD,QAAM,QAAQ,KAAK,MAAM,WAAW,MAAO,KAAK,GAAG;AACnD,QAAM,OAAO,KAAK,MAAM,WAAW,MAAO,KAAK,KAAK,GAAG;AAEvD,QAAM,SAAS,SAAS;AAExB,MAAI,OAAO,GAAG;AACZ,WAAO,SAAS,GAAG,IAAI,UAAU,MAAM,IAAI;AAAA,EAC7C,WAAW,QAAQ,GAAG;AACpB,WAAO,SAAS,GAAG,KAAK,UAAU,MAAM,KAAK;AAAA,EAC/C,WAAW,UAAU,GAAG;AACtB,WAAO,SAAS,GAAG,OAAO,UAAU,MAAM,OAAO;AAAA,EACnD,OAAO;AACL,WAAO,SAAS,aAAa;AAAA,EAC/B;AACF;AAOO,SAAS,eAAe,SAAgC;AAC7D,MAAI,CAAC,QAAS,QAAO;AAErB,QAAM,OAAO,IAAI,KAAK,OAAO;AAG7B,QAAM,OAAO,KAAK,YAAY;AAC9B,QAAM,QAAQ,OAAO,KAAK,SAAS,IAAI,CAAC,EAAE,SAAS,GAAG,GAAG;AACzD,QAAM,MAAM,OAAO,KAAK,QAAQ,CAAC,EAAE,SAAS,GAAG,GAAG;AAClD,QAAM,QAAQ,OAAO,KAAK,SAAS,CAAC,EAAE,SAAS,GAAG,GAAG;AACrD,QAAM,UAAU,OAAO,KAAK,WAAW,CAAC,EAAE,SAAS,GAAG,GAAG;AAEzD,QAAM,YAAY,GAAG,IAAI,IAAI,KAAK,IAAI,GAAG,IAAI,KAAK,IAAI,OAAO;AAC7D,QAAM,WAAW,mBAAmB,OAAO;AAE3C,SAAO,GAAG,SAAS,KAAK,QAAQ;AAClC;","names":[]}
|
|
@@ -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/agent-context.ts","../src/commands/zero/connector/connected-as.ts","../src/commands/zero/connector/search.ts","../../../packages/connectors/src/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 CONNECTOR_TYPE_KEYS,\n CONNECTOR_TYPES,\n connectorTypeSchema,\n type ConnectorAuthMethodId,\n type ConnectorType,\n} from \"@vm0/connectors/connectors\";\nimport {\n getConfiguredConnectorAuthMethodIds,\n getConnectorAuthMethod,\n} from \"@vm0/connectors/connector-utils\";\nimport { connectZeroConnectorManualGrant } from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\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 ZENDESK_API_TOKEN=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\nfunction parseConnectorType(type: string): ConnectorType {\n const parsed = connectorTypeSchema.safeParse(type);\n if (parsed.success) {\n return parsed.data;\n }\n\n throw new Error(`Unknown connector type: ${type}`, {\n cause: new Error(`Available connectors: ${CONNECTOR_TYPE_KEYS.join(\", \")}`),\n });\n}\n\nfunction parseConfiguredAuthMethod(\n type: ConnectorType,\n rawAuthMethod: string,\n): ConnectorAuthMethodId {\n const configuredAuthMethodIds = getConfiguredConnectorAuthMethodIds(type);\n const authMethod = configuredAuthMethodIds.find((method) => {\n return method === rawAuthMethod;\n });\n if (authMethod) {\n return authMethod;\n }\n\n throw new Error(\n `${type} connector does not have ${rawAuthMethod} auth method`,\n {\n cause: new Error(\n `Available auth methods: ${configuredAuthMethodIds.join(\", \")}`,\n ),\n },\n );\n}\n\nfunction getManualGrantAuthMethods(\n type: ConnectorType,\n): ConnectorAuthMethodId[] {\n return getConfiguredConnectorAuthMethodIds(type).filter((authMethod) => {\n return getConnectorAuthMethod(type, authMethod)?.grant.kind === \"manual\";\n });\n}\n\nfunction parseManualGrantAuthMethod(\n type: ConnectorType,\n rawAuthMethod: string | undefined,\n): ConnectorAuthMethodId {\n if (rawAuthMethod) {\n const authMethod = parseConfiguredAuthMethod(type, rawAuthMethod);\n if (getConnectorAuthMethod(type, authMethod)?.grant.kind === \"manual\") {\n return authMethod;\n }\n\n throw new Error(\n `${type} ${authMethod} auth method does not use a manual grant`,\n );\n }\n\n const authMethods = getManualGrantAuthMethods(type);\n const authMethod = authMethods[0];\n if (authMethods.length === 1 && authMethod) {\n return authMethod;\n }\n\n if (authMethods.length === 0) {\n throw new Error(`${type} connector does not use a manual grant`);\n }\n\n throw new Error(`${type} connector has multiple manual grant auth methods`, {\n cause: new Error(`Pass --auth-method ${authMethods.join(\"|\")}`),\n });\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 connectorType = parseConnectorType(type);\n const authMethod = parseManualGrantAuthMethod(\n connectorType,\n options.authMethod,\n );\n const connector = await connectZeroConnectorManualGrant(\n connectorType,\n authMethod,\n parseConnectorValues(options.value),\n );\n\n if (options.json) {\n console.log(JSON.stringify(connector, null, 2));\n return;\n }\n\n console.log(\n chalk.green(`✓ ${CONNECTOR_TYPES[connectorType].label} connected`),\n );\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 {\n CONNECTOR_TYPES,\n type ConnectorType,\n} from \"@vm0/connectors/connectors\";\nimport { listZeroConnectors, searchZeroConnectors } from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\nimport { resolveAgentContext } from \"./agent-context\";\nimport { padEndAnsi, renderConnectedAsCell, stripAnsi } from \"./connected-as\";\n\nfunction isConnectorType(type: string): type is ConnectorType {\n return type in CONNECTOR_TYPES;\n}\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 }, availableCatalog, agentCtx] = await Promise.all([\n listZeroConnectors(),\n searchZeroConnectors(),\n resolveAgentContext(options.agent),\n ]);\n const connectedMap = new Map(\n connectors.map((c) => {\n return [c.type, c];\n }),\n );\n\n const allTypes = availableCatalog.connectors\n .map((connector) => {\n return connector.id;\n })\n .filter(isConnectorType);\n\n const typeWidth = Math.max(\n 4,\n ...allTypes.map((t) => {\n return t.length;\n }),\n );\n\n const connectedAsHeader = \"CONNECTED AS\";\n const connectedCells = allTypes.map((type) => {\n return renderConnectedAsCell(connectedMap.get(type));\n });\n const connectedAsWidth = Math.max(\n connectedAsHeader.length,\n ...connectedCells.map((c) => {\n return stripAnsi(c).length;\n }),\n );\n\n const authorizedHeader = agentCtx\n ? `AUTHORIZED FOR ${agentCtx.displayName}`\n : null;\n\n // Print header\n const headerParts = [\n \"TYPE\".padEnd(typeWidth),\n connectedAsHeader.padEnd(connectedAsWidth),\n ];\n if (authorizedHeader) headerParts.push(authorizedHeader);\n console.log(chalk.dim(headerParts.join(\" \")));\n\n // Print rows\n for (let i = 0; i < allTypes.length; i++) {\n const type = allTypes[i]!;\n const connectedCell = padEndAnsi(connectedCells[i]!, connectedAsWidth);\n const parts = [type.padEnd(typeWidth), connectedCell];\n if (agentCtx) {\n parts.push(\n agentCtx.authorizedTypes.has(type)\n ? chalk.green(\"✓\")\n : chalk.dim(\"-\"),\n );\n }\n console.log(parts.join(\" \"));\n }\n }),\n );\n","import { getZeroAgent, getZeroAgentUserConnectors } from \"../../../lib/api\";\n\ninterface AgentContext {\n agentId: string;\n displayName: string;\n authorizedTypes: Set<string>;\n}\n\nexport async function resolveAgentContext(\n flagAgentId: string | undefined,\n): Promise<AgentContext | null> {\n const agentId = flagAgentId ?? process.env.ZERO_AGENT_ID;\n if (!agentId) return null;\n\n const [agent, enabledTypes] = await Promise.all([\n getZeroAgent(agentId),\n getZeroAgentUserConnectors(agentId),\n ]);\n\n return {\n agentId: agent.agentId,\n displayName: agent.displayName ?? agent.agentId,\n authorizedTypes: new Set(enabledTypes),\n };\n}\n","import chalk from \"chalk\";\nimport { hasRequiredConnectorAuthMethodScopes } from \"@vm0/connectors/connector-utils\";\nimport type { ConnectorListResponse } from \"@vm0/api-contracts/contracts/connector-schemas\";\n\ntype Connector = ConnectorListResponse[\"connectors\"][number];\n\nfunction renderIdentity(connector: Connector): string {\n if (connector.externalUsername) return `@${connector.externalUsername}`;\n if (connector.externalEmail) return connector.externalEmail;\n return \"-\";\n}\n\nexport function renderConnectedAsCell(\n connector: Connector | undefined,\n): string {\n if (!connector) return chalk.dim(\"(not connected)\");\n const identity = renderIdentity(connector);\n if (connector.connectionStatus === \"reconnect-required\") {\n return chalk.yellow(`${identity} (reconnect needed)`);\n }\n const scopeMismatch = !hasRequiredConnectorAuthMethodScopes(\n connector.type,\n connector.authMethod,\n connector.oauthScopes,\n );\n if (scopeMismatch) {\n return chalk.yellow(`${identity} (permissions update available)`);\n }\n return identity;\n}\n\nconst ESC = \"\\u001b\";\nconst ANSI_PATTERN = new RegExp(`${ESC}\\\\[[0-9;]*m`, \"g\");\n\nexport function stripAnsi(s: string): string {\n return s.replace(ANSI_PATTERN, \"\");\n}\n\nexport function padEndAnsi(s: string, width: number): string {\n const visible = stripAnsi(s).length;\n return s + \" \".repeat(Math.max(0, width - visible));\n}\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport {\n CONNECTOR_TYPES,\n type ConnectorType,\n} from \"@vm0/connectors/connectors\";\nimport { searchConnectors } from \"@vm0/connectors/connector-search\";\nimport { listZeroConnectors, searchZeroConnectors } from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\nimport { resolveAgentContext } from \"./agent-context\";\nimport { padEndAnsi, renderConnectedAsCell, stripAnsi } from \"./connected-as\";\n\nconst DEFAULT_LIMIT = 5;\nconst EXACT_MATCH_THRESHOLD = 80;\n\nfunction isConnectorType(type: string): type is ConnectorType {\n return type in CONNECTOR_TYPES;\n}\n\nfunction parseLimit(raw: string): number {\n const n = Number.parseInt(raw, 10);\n if (!Number.isFinite(n) || n <= 0) {\n throw new Error(`--limit must be a positive integer, got \"${raw}\".`);\n }\n return n;\n}\n\nexport const searchCommand = new Command()\n .name(\"search\")\n .description(\n \"Search connectors by type, label, environment name, secret, 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 }, availableCatalog, agentCtx] = await Promise.all([\n listZeroConnectors(),\n searchZeroConnectors(),\n resolveAgentContext(options.agent),\n ]);\n const connectedMap = new Map(\n connectors.map((c) => {\n return [c.type, c];\n }),\n );\n\n const availableTypes = new Set(\n availableCatalog.connectors\n .map((connector) => {\n return connector.id;\n })\n .filter(isConnectorType),\n );\n\n const { results, total } = searchConnectors(\n trimmed,\n options.limit,\n (type) => {\n return availableTypes.has(type);\n },\n );\n\n if (results.length === 0) {\n console.log(\"No matches found.\");\n return;\n }\n\n const topScore = results[0]!.score;\n if (topScore < EXACT_MATCH_THRESHOLD) {\n console.log(\"No exact match. Showing closest:\");\n }\n if (total > options.limit) {\n console.log(`Too many results (top ${options.limit} of ${total}):`);\n }\n\n const typeHeader = \"TYPE\";\n const connectedAsHeader = \"CONNECTED AS\";\n\n const connectedCells = results.map((r) => {\n return renderConnectedAsCell(connectedMap.get(r.type));\n });\n\n const typeWidth = Math.max(\n typeHeader.length,\n ...results.map((r) => {\n return r.type.length;\n }),\n );\n const connectedAsWidth = Math.max(\n connectedAsHeader.length,\n ...connectedCells.map((c) => {\n return stripAnsi(c).length;\n }),\n );\n\n const headerParts = [\n typeHeader.padEnd(typeWidth),\n connectedAsHeader.padEnd(connectedAsWidth),\n ];\n if (agentCtx) {\n headerParts.push(`AUTHORIZED FOR ${agentCtx.displayName}`);\n }\n console.log(chalk.dim(headerParts.join(\" \")));\n\n for (let i = 0; i < results.length; i++) {\n const result = results[i]!;\n const parts = [\n result.type.padEnd(typeWidth),\n padEndAnsi(connectedCells[i]!, connectedAsWidth),\n ];\n if (agentCtx) {\n parts.push(\n agentCtx.authorizedTypes.has(result.type)\n ? chalk.green(\"✓\")\n : chalk.dim(\"-\"),\n );\n }\n console.log(parts.join(\" \"));\n }\n },\n ),\n );\n","import {\n CONNECTOR_TYPE_KEYS,\n CONNECTOR_TYPES,\n type ConnectorAccessConfig,\n type ConnectorAuthMethodConfig,\n type ConnectorConfig,\n type ConnectorEnvBindingValue,\n type ConnectorType,\n} from \"./connectors\";\nimport { getConnectorEnvBindingEntries } from \"./connector-utils\";\n\n/**\n * Result of a connector search hit, one per matched connector type.\n */\nexport interface ConnectorSearchResult {\n readonly type: ConnectorType;\n readonly score: number;\n /** Short label describing the matched field (e.g. \"type\", \"env:GH_TOKEN\", \"tag:vcs\", \"token:gh\"). */\n readonly matchedField: string;\n}\n\nexport interface ConnectorSearchOutput {\n /** Results sorted by score desc then type asc, already capped at `limit`. */\n readonly results: readonly ConnectorSearchResult[];\n /** Total candidates above the minimum threshold, before applying `limit`. */\n readonly total: number;\n}\n\nconst TOKEN_BOUNDARY = /[_\\-\\s]+/;\nconst CASE_BOUNDARY = /(?<=[a-z])(?=[A-Z])|(?<=[A-Z])(?=[A-Z][a-z])/;\nconst MIN_SCORE = 10;\n\n/**\n * Split a string into lowercase tokens on `_`, `-`, whitespace, and\n * camel/Pascal case boundaries. Digits stay attached to the preceding letters\n * (e.g. `v2`). Empty tokens are dropped and duplicates deduped.\n */\nfunction tokenize(input: string): Set<string> {\n const tokens = new Set<string>();\n for (const chunk of input.split(TOKEN_BOUNDARY)) {\n if (!chunk) continue;\n for (const sub of chunk.split(CASE_BOUNDARY)) {\n const lower = sub.toLowerCase();\n if (lower) tokens.add(lower);\n }\n }\n return tokens;\n}\n\nfunction connectorAccessEnvBindings(\n access: ConnectorAccessConfig,\n): Record<string, ConnectorEnvBindingValue> {\n switch (access.kind) {\n case \"static\":\n case \"refresh-token\":\n return access.envBindings;\n case \"none\":\n return {};\n }\n}\n\nfunction getManualGrantFields(\n method: ConnectorAuthMethodConfig,\n): Record<string, unknown> | undefined {\n return method.grant.kind === \"manual\" ? method.grant.fields : undefined;\n}\n\nfunction connectorEnvBindingValueRef(value: ConnectorEnvBindingValue): string {\n return typeof value === \"string\" ? value : value.valueRef;\n}\n\nfunction listSecretNames(config: ConnectorConfig): string[] {\n const names: string[] = [];\n for (const method of Object.values(config.authMethods)) {\n for (const name of Object.keys(getManualGrantFields(method) ?? {})) {\n names.push(name);\n }\n for (const valueRef of Object.values(\n connectorAccessEnvBindings(method.access),\n )) {\n const ref = connectorEnvBindingValueRef(valueRef);\n if (ref.startsWith(\"$secrets.\")) {\n names.push(ref.slice(\"$secrets.\".length));\n }\n }\n }\n return names;\n}\n\ntype ScoreHit = { score: number; matchedField: string };\n\nfunction listEnvNames(type: ConnectorType): string[] {\n return [\n ...new Set(\n getConnectorEnvBindingEntries(type).map(({ envName }) => {\n return envName;\n }),\n ),\n ];\n}\n\nfunction findExactMatch(\n keywordLower: string,\n type: ConnectorType,\n config: ConnectorConfig,\n): ScoreHit | null {\n if (type.toLowerCase() === keywordLower) {\n return { score: 100, matchedField: \"type\" };\n }\n for (const envName of listEnvNames(type)) {\n if (envName.toLowerCase() === keywordLower) {\n return { score: 90, matchedField: `env:${envName}` };\n }\n }\n if (config.label.toLowerCase() === keywordLower) {\n return { score: 80, matchedField: \"label\" };\n }\n const tags = config.tags ?? [];\n for (const tag of tags) {\n if (tag === keywordLower) {\n return { score: 70, matchedField: `tag:${tag}` };\n }\n }\n return null;\n}\n\nfunction findSubstringMatch(\n keywordLower: string,\n type: ConnectorType,\n config: ConnectorConfig,\n): ScoreHit | null {\n if (type.toLowerCase().includes(keywordLower)) {\n return { score: 50, matchedField: \"type\" };\n }\n if (config.label.toLowerCase().includes(keywordLower)) {\n return { score: 50, matchedField: \"label\" };\n }\n for (const envName of listEnvNames(type)) {\n if (envName.toLowerCase().includes(keywordLower)) {\n return { score: 40, matchedField: `env:${envName}` };\n }\n }\n for (const name of listSecretNames(config)) {\n if (name.toLowerCase().includes(keywordLower)) {\n return { score: 30, matchedField: `secret:${name}` };\n }\n }\n const tags = config.tags ?? [];\n for (const tag of tags) {\n if (tag.includes(keywordLower)) {\n return { score: 25, matchedField: `tag:${tag}` };\n }\n }\n return null;\n}\n\nfunction collectCandidateTokens(\n type: ConnectorType,\n config: ConnectorConfig,\n): Set<string> {\n const tokens = new Set<string>();\n const sources = [\n type,\n config.label,\n ...listEnvNames(type),\n ...listSecretNames(config),\n ...(config.tags ?? []),\n ];\n for (const source of sources) {\n for (const token of tokenize(source)) {\n tokens.add(token);\n }\n }\n return tokens;\n}\n\nfunction findTokenIntersection(\n keywordTokens: Set<string>,\n type: ConnectorType,\n config: ConnectorConfig,\n): ScoreHit | null {\n const candidateTokens = collectCandidateTokens(type, config);\n let intersection = 0;\n let firstCommon = \"\";\n for (const token of keywordTokens) {\n if (candidateTokens.has(token)) {\n intersection++;\n if (!firstCommon) firstCommon = token;\n }\n }\n if (intersection === 0) return null;\n return { score: 10 * intersection, matchedField: `token:${firstCommon}` };\n}\n\nfunction scoreConnector(\n keywordLower: string,\n keywordTokens: Set<string>,\n type: ConnectorType,\n config: ConnectorConfig,\n): ScoreHit | null {\n const exact = findExactMatch(keywordLower, type, config);\n if (exact) return exact;\n\n const candidates: ScoreHit[] = [];\n const substring = findSubstringMatch(keywordLower, type, config);\n if (substring) candidates.push(substring);\n const token = findTokenIntersection(keywordTokens, type, config);\n if (token) candidates.push(token);\n\n if (candidates.length === 0) return null;\n const best = candidates.reduce((a, b) => {\n return a.score >= b.score ? a : b;\n });\n if (best.score < MIN_SCORE) return null;\n return best;\n}\n\n/**\n * Search the connector catalog by weighted multi-field ranking.\n *\n * Matches the keyword against type keys, labels, environment names, secret names,\n * and `tags`. Score is the max over matched rules (never a sum). Results with\n * score below the minimum threshold are dropped. Sort order: score desc, then\n * type asc.\n */\nexport function searchConnectors(\n keyword: string,\n limit: number,\n filter?: (type: ConnectorType) => boolean,\n): ConnectorSearchOutput {\n const trimmed = keyword.trim();\n if (!trimmed) return { results: [], total: 0 };\n\n const keywordLower = trimmed.toLowerCase();\n const keywordTokens = tokenize(trimmed);\n\n const hits: ConnectorSearchResult[] = [];\n for (const type of CONNECTOR_TYPE_KEYS) {\n if (filter && !filter(type)) continue;\n const config = CONNECTOR_TYPES[type];\n const hit = scoreConnector(keywordLower, keywordTokens, type, config);\n if (!hit) continue;\n hits.push({ type, score: hit.score, matchedField: hit.matchedField });\n }\n\n hits.sort((a, b) => {\n if (b.score !== a.score) return b.score - a.score;\n return a.type.localeCompare(b.type);\n });\n\n const capped = limit > 0 ? hits.slice(0, limit) : hits;\n return { results: capped, total: hits.length };\n}\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport {\n CONNECTOR_TYPE_KEYS,\n CONNECTOR_TYPES,\n type ConnectorType,\n connectorTypeSchema,\n} from \"@vm0/connectors/connectors\";\nimport {\n getConnectorAuthMethodScopeDiff,\n hasRequiredConnectorAuthMethodScopes,\n} from \"@vm0/connectors/connector-utils\";\nimport { getZeroConnector, searchZeroConnectors } from \"../../../lib/api\";\nimport { formatDateTime } from \"../../../lib/domain/schedule-utils\";\nimport { withErrorHandler } from \"../../../lib/command\";\nimport { resolveAgentContext } from \"./agent-context\";\nimport { getPlatformOrigin } from \"../doctor/platform-url\";\n\nconst LABEL_WIDTH = 16;\n\ntype Connector = NonNullable<Awaited<ReturnType<typeof getZeroConnector>>>;\ntype AgentContext = NonNullable<\n Awaited<ReturnType<typeof resolveAgentContext>>\n>;\n\nfunction isConnectorType(type: string): type is ConnectorType {\n return type in CONNECTOR_TYPES;\n}\n\nasync function availableConnectorTypes(): Promise<Set<ConnectorType>> {\n const catalog = await searchZeroConnectors();\n return new Set(\n catalog.connectors\n .map((connector) => {\n return connector.id;\n })\n .filter(isConnectorType),\n );\n}\n\nfunction printConnectorDetails(\n type: ConnectorType,\n connector: Connector | null,\n): void {\n if (connector) {\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 console.log(\n `${\"Account:\".padEnd(LABEL_WIDTH)}@${connector.externalUsername}`,\n );\n console.log(`${\"Auth Method:\".padEnd(LABEL_WIDTH)}${connector.authMethod}`);\n\n if (connector.oauthScopes && connector.oauthScopes.length > 0) {\n console.log(\n `${\"OAuth Scopes:\".padEnd(LABEL_WIDTH)}${connector.oauthScopes.join(\", \")}`,\n );\n }\n\n if (\n !hasRequiredConnectorAuthMethodScopes(\n type,\n connector.authMethod,\n connector.oauthScopes,\n )\n ) {\n const diff = getConnectorAuthMethodScopeDiff(\n type,\n connector.authMethod,\n connector.oauthScopes,\n );\n console.log(\n `${\"Permissions:\".padEnd(LABEL_WIDTH)}${chalk.yellow(\"update available\")}`,\n );\n if (diff.addedScopes.length > 0) {\n console.log(\n `${\" Added:\".padEnd(LABEL_WIDTH)}${diff.addedScopes.join(\", \")}`,\n );\n }\n if (diff.removedScopes.length > 0) {\n console.log(\n `${\" Removed:\".padEnd(LABEL_WIDTH)}${diff.removedScopes.join(\", \")}`,\n );\n }\n }\n\n console.log(\n `${\"Connected:\".padEnd(LABEL_WIDTH)}${formatDateTime(connector.createdAt)}`,\n );\n\n if (connector.updatedAt !== connector.createdAt) {\n console.log(\n `${\"Last Updated:\".padEnd(LABEL_WIDTH)}${formatDateTime(connector.updatedAt)}`,\n );\n }\n } else {\n console.log(\n `${\"Status:\".padEnd(LABEL_WIDTH)}${chalk.dim(\"not connected\")}`,\n );\n }\n}\n\nasync function printAgentAction(\n type: ConnectorType,\n connector: Connector | null,\n agentCtx: AgentContext,\n): Promise<void> {\n const authorized = agentCtx.authorizedTypes.has(type);\n const isConnected = connector !== null;\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 ${type} connector is connected but needs to be reconnected before agent ${agentLabel} can use it.`,\n );\n console.log(`Reconnect it at: [Reconnect ${type}](${url})`);\n } else if (authorized && !isConnected) {\n const origin = await getPlatformOrigin();\n const url = `${origin}/connectors/${type}/connect?agentId=${agentCtx.agentId}`;\n console.log(\n `The ${type} connector is authorized for agent ${agentLabel}, but it is not connected.`,\n );\n console.log(`Connect it at: [Connect ${type}](${url})`);\n } else if (authorized) {\n console.log(`The ${type} connector is authorized for agent ${agentLabel}.`);\n } else if (!isConnected) {\n const origin = await getPlatformOrigin();\n const url = `${origin}/connectors/${type}/connect?agentId=${agentCtx.agentId}`;\n console.log(\n `The ${type} connector is not connected. Once connected, it will be authorized for agent ${agentLabel}.`,\n );\n console.log(`Connect and authorize it at: [Connect ${type}](${url})`);\n } else {\n const origin = await getPlatformOrigin();\n const url = `${origin}/connectors/${type}/authorize?agentId=${agentCtx.agentId}`;\n console.log(\n `The ${type} connector is not authorized for agent ${agentLabel}.`,\n );\n console.log(`Authorize it at: [Authorize ${type}](${url})`);\n }\n}\n\nasync function printStandaloneAction(\n type: ConnectorType,\n connector: Connector | null,\n): Promise<void> {\n if (connector?.connectionStatus === \"connected\") return;\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 ${type} connector is connected but needs to be reconnected.`,\n );\n console.log(`Reconnect it at: [Reconnect ${type}](${url})`);\n } else {\n const url = `${origin}/connectors/${type}/connect`;\n console.log(`Connect it at: [Connect ${type}](${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 parseResult = connectorTypeSchema.safeParse(type);\n if (!parseResult.success) {\n const available = CONNECTOR_TYPE_KEYS.join(\", \");\n throw new Error(`Unknown connector type: ${type}`, {\n cause: new Error(`Available connectors: ${available}`),\n });\n }\n\n const [connector, availableTypes, agentCtx] = await Promise.all([\n getZeroConnector(parseResult.data),\n availableConnectorTypes(),\n resolveAgentContext(options.agent),\n ]);\n const available = availableTypes.has(parseResult.data);\n\n console.log(`Connector: ${chalk.cyan(type)}`);\n console.log();\n\n printConnectorDetails(parseResult.data, connector);\n if (!available) {\n console.log();\n console.log(`The ${type} connector is not available for this account.`);\n return;\n }\n\n if (agentCtx) {\n await printAgentAction(parseResult.data, connector, agentCtx);\n } else {\n await printStandaloneAction(parseResult.data, 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":["authMethod","isConnectorType","isConnectorType","available","LABEL_WIDTH","listCommand","statusCommand"]}
|