@zapier/zapier-sdk-cli 0.64.1 → 0.65.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +1 -1
- package/CHANGELOG.md +19 -0
- package/README.md +5 -5
- package/dist/cli.cjs +986 -823
- package/dist/cli.mjs +987 -824
- package/dist/experimental.cjs +867 -745
- package/dist/experimental.d.mts +2 -1
- package/dist/experimental.d.ts +2 -1
- package/dist/experimental.mjs +870 -748
- package/dist/extensions-GB0w0RUO.d.mts +533 -0
- package/dist/extensions-GB0w0RUO.d.ts +533 -0
- package/dist/index.cjs +843 -745
- package/dist/index.d.mts +2 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.mjs +843 -745
- package/package.json +3 -3
- package/dist/extensions-N27h0wrp.d.mts +0 -568
- package/dist/extensions-N27h0wrp.d.ts +0 -568
package/dist/cli.mjs
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { Command, CommanderError, Option } from 'commander';
|
|
3
|
+
import { getConnectionPlugin, defineMethod, apiPluginRef, resolveCredentialsPluginRef, eventEmissionPluginRef, sdkOptionsPluginRef, declareOptionalProperty, OutputPropertySchema, ZapierBundleError, DEFAULT_CONFIG_PATH, declareMethod, ZapierValidationError, ZapierUnknownError, manifestPluginRef, defineResolver, defineMethodOverride, zapierCoreOptions, injectCliLogin, definePlugin, omitExports, zapierSdkPlugin, BaseSdkOptionsSchema, disposeSdk, isPermanentHttpError, invalidateCachedToken, batch, toSnakeCase, ZapierError, ZapierReleaseTriggerMessageSignal, createSdk as createSdk$1, CORE_OPTIONS_ID as CORE_OPTIONS_ID$1, SDK_OPTIONS_ID as SDK_OPTIONS_ID$1, addPlugin as addPlugin$1, getOrCreateApiClient, isCredentialsObject, ZapierAuthenticationError, ZapierAbortDrainSignal, buildApplicationLifecycleEvent, AuthMechanism, DEPRECATION_NOTICE_EVENT, runWithCallerContext, isPositional, createController, CoreCancelledSignal, resolvePlugin, runWithTelemetryContext, buildCapabilityMessage, formatErrorMessage, getOsInfo, getPlatformVersions, getAgent, getTtyContext, getCiPlatform, isCi, getReleaseId, getCurrentTimestamp, generateEventId, ZapierApprovalError } from '@zapier/zapier-sdk';
|
|
3
4
|
import { z } from 'zod';
|
|
4
|
-
import { definePlugin, createPluginMethod, OutputPropertySchema, ZapierBundleError, DEFAULT_CONFIG_PATH, ZapierValidationError, ZapierUnknownError, ZapierReleaseTriggerMessageSignal, injectCliLogin, BaseSdkOptionsSchema, isPermanentHttpError, invalidateCachedToken, batch, toSnakeCase, ZapierAbortDrainSignal, createZapierSdkStack as createZapierSdkStack$1, createSdk as createSdk$1, defineLegacyMerge as defineLegacyMerge$1, zapierSdkPlugin as zapierSdkPlugin$1, addPlugin as addPlugin$1, ZapierError, getOrCreateApiClient, isCredentialsObject, ZapierAuthenticationError, buildApplicationLifecycleEvent, AuthMechanism, DEPRECATION_NOTICE_EVENT, runWithCallerContext, isPositional, createController, CoreCancelledSignal, runWithTelemetryContext, buildCapabilityMessage, formatErrorMessage, getOsInfo, getPlatformVersions, getAgent, getTtyContext, getCiPlatform, isCi, getReleaseId, getCurrentTimestamp, generateEventId, ZapierApprovalError } from '@zapier/zapier-sdk';
|
|
5
5
|
import inquirer from 'inquirer';
|
|
6
6
|
import search from '@inquirer/search';
|
|
7
7
|
import chalk from 'chalk';
|
|
@@ -30,7 +30,7 @@ import isInstalledGlobally from 'is-installed-globally';
|
|
|
30
30
|
import { execSync, spawn } from 'child_process';
|
|
31
31
|
import Handlebars from 'handlebars';
|
|
32
32
|
import { fileURLToPath } from 'url';
|
|
33
|
-
import { injectCliLogin as injectCliLogin$1,
|
|
33
|
+
import { triggerInboxResolver, DrainTriggerInboxSchema, WatchTriggerInboxSchema, injectCliLogin as injectCliLogin$1, definePlugin as definePlugin$1, omitExports as omitExports$1, zapierExperimentalSdkPlugin, createSdk, CORE_OPTIONS_ID, SDK_OPTIONS_ID, addPlugin } from '@zapier/zapier-sdk/experimental';
|
|
34
34
|
import packageJsonLib, { VersionNotFoundError } from 'package-json';
|
|
35
35
|
import semver from 'semver';
|
|
36
36
|
import React from 'react';
|
|
@@ -1526,8 +1526,41 @@ async function promptText({
|
|
|
1526
1526
|
]);
|
|
1527
1527
|
return value;
|
|
1528
1528
|
}
|
|
1529
|
+
var display = (c) => c.hint ? `${c.label} ${chalk.dim(`(${c.hint})`)}` : c.label;
|
|
1530
|
+
function buildSelectRows(question, term) {
|
|
1531
|
+
const row = (name, action) => ({
|
|
1532
|
+
name,
|
|
1533
|
+
value: { action }
|
|
1534
|
+
});
|
|
1535
|
+
const t = term.trim().toLowerCase();
|
|
1536
|
+
const matched = t ? question.choices.filter(
|
|
1537
|
+
(c) => `${c.label} ${c.hint ?? ""}`.toLowerCase().includes(t)
|
|
1538
|
+
) : question.choices;
|
|
1539
|
+
const matchRows = matched.map((c) => ({
|
|
1540
|
+
name: display(c),
|
|
1541
|
+
value: c.value
|
|
1542
|
+
}));
|
|
1543
|
+
const skipRow = offers(question, "skip") ? [row(chalk.dim("Skip (optional)"), "skip")] : [];
|
|
1544
|
+
const customRow = offers(question, "custom") ? [row(chalk.dim("Enter a value manually\u2026"), "custom")] : [];
|
|
1545
|
+
const committed = !!t || question.search !== void 0;
|
|
1546
|
+
let rows;
|
|
1547
|
+
if (!committed) {
|
|
1548
|
+
rows = [...skipRow, ...customRow, ...matchRows];
|
|
1549
|
+
} else if (matchRows.length > 0) {
|
|
1550
|
+
rows = [...matchRows, ...skipRow, ...customRow];
|
|
1551
|
+
} else {
|
|
1552
|
+
rows = [...customRow, ...skipRow];
|
|
1553
|
+
}
|
|
1554
|
+
if (offers(question, "search"))
|
|
1555
|
+
rows.push(row(chalk.cyan("Search again\u2026"), "search"));
|
|
1556
|
+
if (offers(question, "more")) rows.push(row(chalk.dim("Load more\u2026"), "more"));
|
|
1557
|
+
if (offers(question, "retry")) rows.push(row(chalk.yellow("Retry"), "retry"));
|
|
1558
|
+
if (offers(question, "cancel")) rows.push(row(chalk.dim("Cancel"), "cancel"));
|
|
1559
|
+
for (const note of question.notes ?? [])
|
|
1560
|
+
rows.push({ name: chalk.dim(note), value: note, disabled: true });
|
|
1561
|
+
return rows;
|
|
1562
|
+
}
|
|
1529
1563
|
async function answerSelect(question, field) {
|
|
1530
|
-
const display = (c) => c.hint ? `${c.label} ${chalk.dim(`(${c.hint})`)}` : c.label;
|
|
1531
1564
|
if (question.multiple) {
|
|
1532
1565
|
const choices = [
|
|
1533
1566
|
...question.choices.map((c) => ({ name: display(c), value: c.value })),
|
|
@@ -1553,37 +1586,25 @@ async function answerSelect(question, field) {
|
|
|
1553
1586
|
}
|
|
1554
1587
|
return { type: "choose", value: selected };
|
|
1555
1588
|
}
|
|
1556
|
-
|
|
1557
|
-
|
|
1558
|
-
|
|
1559
|
-
|
|
1589
|
+
if (offers(question, "search") && question.search === void 0) {
|
|
1590
|
+
const optional = offers(question, "skip");
|
|
1591
|
+
const parts = [
|
|
1592
|
+
...optional ? ["optional"] : [],
|
|
1593
|
+
...question.placeholder ? [question.placeholder] : []
|
|
1594
|
+
];
|
|
1595
|
+
const hint = parts.length ? ` (${parts.join(", ")})` : "";
|
|
1596
|
+
while (true) {
|
|
1597
|
+
const term = (await promptText({
|
|
1598
|
+
message: `Enter or search ${field}${hint}:`,
|
|
1599
|
+
password: false
|
|
1600
|
+
})).trim();
|
|
1601
|
+
if (term) return { type: "search", term };
|
|
1602
|
+
if (optional) return { type: "skip" };
|
|
1603
|
+
}
|
|
1604
|
+
}
|
|
1560
1605
|
const value = await search({
|
|
1561
1606
|
message: question.message,
|
|
1562
|
-
source: (term) =>
|
|
1563
|
-
const t = (term ?? "").trim().toLowerCase();
|
|
1564
|
-
const matched = t ? question.choices.filter(
|
|
1565
|
-
(c) => `${c.label} ${c.hint ?? ""}`.toLowerCase().includes(t)
|
|
1566
|
-
) : question.choices;
|
|
1567
|
-
const rows = matched.map((c) => ({
|
|
1568
|
-
name: display(c),
|
|
1569
|
-
value: c.value
|
|
1570
|
-
}));
|
|
1571
|
-
if (offers(question, "search"))
|
|
1572
|
-
rows.push(row(chalk.cyan("Search\u2026"), "search"));
|
|
1573
|
-
if (offers(question, "more"))
|
|
1574
|
-
rows.push(row(chalk.dim("Load more\u2026"), "more"));
|
|
1575
|
-
if (offers(question, "custom"))
|
|
1576
|
-
rows.push(row(chalk.dim("Enter a value manually\u2026"), "custom"));
|
|
1577
|
-
if (offers(question, "retry"))
|
|
1578
|
-
rows.push(row(chalk.yellow("Retry"), "retry"));
|
|
1579
|
-
if (offers(question, "skip"))
|
|
1580
|
-
rows.push(row(chalk.dim("Skip (optional)"), "skip"));
|
|
1581
|
-
if (offers(question, "cancel"))
|
|
1582
|
-
rows.push(row(chalk.dim("Cancel"), "cancel"));
|
|
1583
|
-
for (const note of question.notes ?? [])
|
|
1584
|
-
rows.push({ name: chalk.dim(note), value: note, disabled: true });
|
|
1585
|
-
return rows;
|
|
1586
|
-
}
|
|
1607
|
+
source: (term) => buildSelectRows(question, term ?? "")
|
|
1587
1608
|
});
|
|
1588
1609
|
if (!isActionRow(value)) {
|
|
1589
1610
|
return { type: "choose", value };
|
|
@@ -1614,8 +1635,9 @@ async function answerSelect(question, field) {
|
|
|
1614
1635
|
}
|
|
1615
1636
|
}
|
|
1616
1637
|
async function answerInput(question) {
|
|
1638
|
+
const message = question.placeholder ? question.message.replace(/:?\s*$/, ` (${question.placeholder}):`) : question.message;
|
|
1617
1639
|
const value = await promptText({
|
|
1618
|
-
message
|
|
1640
|
+
message,
|
|
1619
1641
|
password: question.inputType === "password"
|
|
1620
1642
|
});
|
|
1621
1643
|
if (value === "" && offers(question, "skip")) {
|
|
@@ -1627,6 +1649,7 @@ async function answerCollection(question) {
|
|
|
1627
1649
|
if (!offers(question, "done")) {
|
|
1628
1650
|
return { type: "add" };
|
|
1629
1651
|
}
|
|
1652
|
+
if (question.description) console.log(question.description);
|
|
1630
1653
|
const { again } = await inquirer.prompt([
|
|
1631
1654
|
{
|
|
1632
1655
|
type: "confirm",
|
|
@@ -1637,6 +1660,16 @@ async function answerCollection(question) {
|
|
|
1637
1660
|
]);
|
|
1638
1661
|
return again ? { type: "add" } : { type: "done" };
|
|
1639
1662
|
}
|
|
1663
|
+
function withEngineSpinner(answer, spinner) {
|
|
1664
|
+
return async (bag) => {
|
|
1665
|
+
spinner.stop();
|
|
1666
|
+
try {
|
|
1667
|
+
return await answer(bag);
|
|
1668
|
+
} finally {
|
|
1669
|
+
spinner.start();
|
|
1670
|
+
}
|
|
1671
|
+
};
|
|
1672
|
+
}
|
|
1640
1673
|
var answerViaCli = ({ state, result }) => {
|
|
1641
1674
|
if (result.error !== void 0) {
|
|
1642
1675
|
const message = typeof result.error === "string" ? result.error : result.error.message;
|
|
@@ -1684,7 +1717,7 @@ var SHARED_COMMAND_CLI_OPTIONS = [
|
|
|
1684
1717
|
|
|
1685
1718
|
// package.json
|
|
1686
1719
|
var package_default = {
|
|
1687
|
-
version: "0.
|
|
1720
|
+
version: "0.65.0"};
|
|
1688
1721
|
|
|
1689
1722
|
// src/telemetry/builders.ts
|
|
1690
1723
|
function createCliBaseEvent(context = {}) {
|
|
@@ -2147,8 +2180,6 @@ function sanitizeCliArguments(args) {
|
|
|
2147
2180
|
function resolveNonInteractive(options) {
|
|
2148
2181
|
return options.nonInteractive === true || options.skipPrompts === true || !process.stdin.isTTY || !process.stdout.isTTY;
|
|
2149
2182
|
}
|
|
2150
|
-
|
|
2151
|
-
// src/utils/cli-generator.ts
|
|
2152
2183
|
var CLI_COMMAND_EXECUTED_EVENT_SUBJECT = "platform.sdk.CliCommandExecutedEvent";
|
|
2153
2184
|
var PAGINATION_PARAM_NAMES = /* @__PURE__ */ new Set(["maxItems", "pageSize", "cursor"]);
|
|
2154
2185
|
function getNormalizedResult(result, { isListCommand }) {
|
|
@@ -2235,20 +2266,6 @@ ${messageBefore}
|
|
|
2235
2266
|
]);
|
|
2236
2267
|
return { confirmed, messageAfter };
|
|
2237
2268
|
}
|
|
2238
|
-
function emitDeprecationWarning({
|
|
2239
|
-
cliCommandName,
|
|
2240
|
-
deprecation
|
|
2241
|
-
}) {
|
|
2242
|
-
if (!deprecation) {
|
|
2243
|
-
return;
|
|
2244
|
-
}
|
|
2245
|
-
console.warn();
|
|
2246
|
-
console.warn(
|
|
2247
|
-
chalk.yellow.bold("\u26A0\uFE0F DEPRECATION WARNING") + chalk.yellow(` - \`${cliCommandName}\` is deprecated.`)
|
|
2248
|
-
);
|
|
2249
|
-
console.warn(chalk.yellow(` ${deprecation.message}`));
|
|
2250
|
-
console.warn();
|
|
2251
|
-
}
|
|
2252
2269
|
function emitParamDeprecationWarnings({
|
|
2253
2270
|
options,
|
|
2254
2271
|
parameters
|
|
@@ -2279,6 +2296,12 @@ function resolveOutputMode({
|
|
|
2279
2296
|
if (hasUserSpecifiedMaxItems) return "collect";
|
|
2280
2297
|
return "paginate";
|
|
2281
2298
|
}
|
|
2299
|
+
function takesPositionalSlot(param) {
|
|
2300
|
+
return param.required || !!param.isPositional && !param.isDeprecated && !param.isAlias;
|
|
2301
|
+
}
|
|
2302
|
+
var positionalFlagCompat = {
|
|
2303
|
+
[getConnectionPlugin.name]: /* @__PURE__ */ new Set(["connection"])
|
|
2304
|
+
};
|
|
2282
2305
|
function getSchemaMetadata(schema) {
|
|
2283
2306
|
return schema?.meta?.();
|
|
2284
2307
|
}
|
|
@@ -2536,7 +2559,7 @@ function generateCliCommands(program2, sdk) {
|
|
|
2536
2559
|
});
|
|
2537
2560
|
}
|
|
2538
2561
|
function createCommandConfig(cliCommandName, functionInfo, sdk) {
|
|
2539
|
-
const usesInputParameters =
|
|
2562
|
+
const usesInputParameters = !!functionInfo.inputParameters;
|
|
2540
2563
|
const schema = functionInfo.inputSchema;
|
|
2541
2564
|
const parameters = usesInputParameters ? analyzeInputParameters(functionInfo.inputParameters, functionInfo) : analyzeZodSchema(schema, functionInfo);
|
|
2542
2565
|
if (functionInfo.boundResolvers && Object.keys(functionInfo.boundResolvers).length > 0) {
|
|
@@ -2561,14 +2584,11 @@ function createCommandConfig(cliCommandName, functionInfo, sdk) {
|
|
|
2561
2584
|
const commandObj = args[args.length - 1];
|
|
2562
2585
|
const options = commandObj.opts();
|
|
2563
2586
|
const interactiveMode = !options.json;
|
|
2587
|
+
const promptingEnabled = interactiveMode && process.stdin.isTTY === true;
|
|
2564
2588
|
const renderer = interactiveMode ? createInteractiveRenderer({
|
|
2565
2589
|
params: resolvedParams
|
|
2566
2590
|
}) : createJsonRenderer();
|
|
2567
2591
|
try {
|
|
2568
|
-
emitDeprecationWarning({
|
|
2569
|
-
cliCommandName,
|
|
2570
|
-
deprecation: functionInfo.deprecation
|
|
2571
|
-
});
|
|
2572
2592
|
emitParamDeprecationWarnings({ options, parameters });
|
|
2573
2593
|
const isListCommand = functionInfo.type === "list";
|
|
2574
2594
|
const hasPaginationParams = parameters.some(
|
|
@@ -2600,26 +2620,48 @@ function createCommandConfig(cliCommandName, functionInfo, sdk) {
|
|
|
2600
2620
|
Object.entries(rawParams).filter(([, v]) => v !== void 0)
|
|
2601
2621
|
);
|
|
2602
2622
|
const controller = createController(sdk);
|
|
2623
|
+
const spinner = promptingEnabled && !options.debug ? ora({ text: "", spinner: "dots" }) : void 0;
|
|
2603
2624
|
let resolved;
|
|
2604
2625
|
try {
|
|
2626
|
+
const isRegisteredPositional = (name) => {
|
|
2627
|
+
const p = parameters.find((param) => param.name === name);
|
|
2628
|
+
return !!p && takesPositionalSlot(p);
|
|
2629
|
+
};
|
|
2630
|
+
spinner?.start();
|
|
2605
2631
|
resolved = await controller.resolve({
|
|
2606
2632
|
method: functionInfo.name,
|
|
2607
2633
|
input: seedInput,
|
|
2608
|
-
answer:
|
|
2609
|
-
|
|
2610
|
-
|
|
2611
|
-
|
|
2612
|
-
|
|
2634
|
+
answer: spinner ? withEngineSpinner(answerViaCli, spinner) : promptingEnabled ? answerViaCli : ({ state }) => {
|
|
2635
|
+
const missing = /* @__PURE__ */ new Map();
|
|
2636
|
+
missing.set(
|
|
2637
|
+
state.current?.join(".") ?? "value",
|
|
2638
|
+
isRegisteredPositional(String(state.current?.[0] ?? ""))
|
|
2639
|
+
);
|
|
2640
|
+
for (const p of parameters) {
|
|
2641
|
+
if (!p.required || p.isDeprecated || p.isAlias) continue;
|
|
2642
|
+
if (p.name in state.resolved) continue;
|
|
2643
|
+
if (state.settled.includes(p.name)) continue;
|
|
2644
|
+
if (boundResolvers[p.name]?.type === "constant") continue;
|
|
2645
|
+
if (!missing.has(p.name)) {
|
|
2646
|
+
missing.set(p.name, isRegisteredPositional(p.name));
|
|
2613
2647
|
}
|
|
2614
|
-
|
|
2648
|
+
}
|
|
2649
|
+
throw new ZapierCliMissingParametersError(
|
|
2650
|
+
[...missing].map(([name, isPositional3]) => ({
|
|
2651
|
+
name,
|
|
2652
|
+
isPositional: isPositional3
|
|
2653
|
+
}))
|
|
2654
|
+
);
|
|
2615
2655
|
},
|
|
2616
|
-
interactive:
|
|
2656
|
+
interactive: promptingEnabled
|
|
2617
2657
|
});
|
|
2618
2658
|
} catch (err) {
|
|
2619
2659
|
if (err instanceof CoreCancelledSignal) {
|
|
2620
2660
|
throw new ZapierCliUserCancellationError();
|
|
2621
2661
|
}
|
|
2622
2662
|
throw err;
|
|
2663
|
+
} finally {
|
|
2664
|
+
spinner?.stop();
|
|
2623
2665
|
}
|
|
2624
2666
|
Object.assign(resolvedParams, resolved);
|
|
2625
2667
|
} else if (schema && !usesInputParameters) {
|
|
@@ -2752,7 +2794,7 @@ ${confirmMessageAfter}`));
|
|
|
2752
2794
|
selected_api: resolvedParams.app ?? null
|
|
2753
2795
|
}
|
|
2754
2796
|
});
|
|
2755
|
-
sdk.
|
|
2797
|
+
resolvePlugin(sdk, eventEmissionPluginRef).emit(
|
|
2756
2798
|
CLI_COMMAND_EXECUTED_EVENT_SUBJECT,
|
|
2757
2799
|
event
|
|
2758
2800
|
);
|
|
@@ -2768,6 +2810,7 @@ ${confirmMessageAfter}`));
|
|
|
2768
2810
|
};
|
|
2769
2811
|
return {
|
|
2770
2812
|
description,
|
|
2813
|
+
methodName: functionInfo.name,
|
|
2771
2814
|
parameters,
|
|
2772
2815
|
handler: handlerWithCallerContext,
|
|
2773
2816
|
hidden: !!functionInfo.deprecation,
|
|
@@ -2809,7 +2852,7 @@ function addCommand(program2, commandName, config2) {
|
|
|
2809
2852
|
`<${kebabName}>`,
|
|
2810
2853
|
param.description || `${kebabName} parameter`
|
|
2811
2854
|
);
|
|
2812
|
-
} else if (param
|
|
2855
|
+
} else if (takesPositionalSlot(param)) {
|
|
2813
2856
|
command.argument(
|
|
2814
2857
|
`[${kebabName}]`,
|
|
2815
2858
|
param.description || `${kebabName} parameter`
|
|
@@ -2844,6 +2887,9 @@ function addCommand(program2, commandName, config2) {
|
|
|
2844
2887
|
command.addOption(opt);
|
|
2845
2888
|
}
|
|
2846
2889
|
}
|
|
2890
|
+
if (positionalFlagCompat[config2.methodName]?.has(param.name) && takesPositionalSlot(param) && param.type !== "array") {
|
|
2891
|
+
command.addOption(new Option(`--${kebabName} <value>`).hideHelp());
|
|
2892
|
+
}
|
|
2847
2893
|
});
|
|
2848
2894
|
const paramNames = new Set(config2.parameters.map((p) => p.name));
|
|
2849
2895
|
SHARED_COMMAND_CLI_OPTIONS.forEach((opt) => {
|
|
@@ -2857,7 +2903,7 @@ function convertCliArgsToSdkParams(parameters, positionalArgs, options) {
|
|
|
2857
2903
|
const sdkParams = {};
|
|
2858
2904
|
let argIndex = 0;
|
|
2859
2905
|
parameters.forEach((param) => {
|
|
2860
|
-
if ((param
|
|
2906
|
+
if (takesPositionalSlot(param) && argIndex < positionalArgs.length) {
|
|
2861
2907
|
sdkParams[param.name] = convertValue(
|
|
2862
2908
|
positionalArgs[argIndex],
|
|
2863
2909
|
param.type,
|
|
@@ -2870,6 +2916,9 @@ function convertCliArgsToSdkParams(parameters, positionalArgs, options) {
|
|
|
2870
2916
|
const camelKey = key.replace(/-([a-z])/g, (g) => g[1].toUpperCase());
|
|
2871
2917
|
const param = parameters.find((p) => p.name === camelKey);
|
|
2872
2918
|
if (param && value !== void 0) {
|
|
2919
|
+
if (sdkParams[camelKey] !== void 0) {
|
|
2920
|
+
return;
|
|
2921
|
+
}
|
|
2873
2922
|
if (param.type === "array" && Array.isArray(value) && value.length === 0) {
|
|
2874
2923
|
return;
|
|
2875
2924
|
}
|
|
@@ -4857,7 +4906,7 @@ function promptlessLegacyJwtUpgradeError() {
|
|
|
4857
4906
|
);
|
|
4858
4907
|
}
|
|
4859
4908
|
async function clearExistingAuthState({
|
|
4860
|
-
|
|
4909
|
+
imports,
|
|
4861
4910
|
baseUrl: baseUrl2,
|
|
4862
4911
|
interactive,
|
|
4863
4912
|
entryPoint
|
|
@@ -4878,7 +4927,7 @@ Log out and ${getActiveCredentialsAction(entryPoint)}?`
|
|
|
4878
4927
|
}
|
|
4879
4928
|
try {
|
|
4880
4929
|
await revokeCredentials({
|
|
4881
|
-
api:
|
|
4930
|
+
api: imports.api,
|
|
4882
4931
|
credentials: activeCredentials
|
|
4883
4932
|
});
|
|
4884
4933
|
} catch {
|
|
@@ -4943,13 +4992,13 @@ async function saveClientCredentials({
|
|
|
4943
4992
|
return { clientId };
|
|
4944
4993
|
}
|
|
4945
4994
|
function emitAccountAuthSuccess({
|
|
4946
|
-
|
|
4995
|
+
imports,
|
|
4947
4996
|
profile,
|
|
4948
4997
|
clientId,
|
|
4949
4998
|
isNonInteractive,
|
|
4950
4999
|
isHeadless
|
|
4951
5000
|
}) {
|
|
4952
|
-
|
|
5001
|
+
imports.eventEmission.emit(
|
|
4953
5002
|
"platform.sdk.ApplicationLifecycleEvent",
|
|
4954
5003
|
buildApplicationLifecycleEvent(
|
|
4955
5004
|
{
|
|
@@ -4968,11 +5017,11 @@ function emitAccountAuthSuccess({
|
|
|
4968
5017
|
);
|
|
4969
5018
|
}
|
|
4970
5019
|
function emitSignupSuccess({
|
|
4971
|
-
|
|
5020
|
+
imports,
|
|
4972
5021
|
isNonInteractive,
|
|
4973
5022
|
isHeadless
|
|
4974
5023
|
}) {
|
|
4975
|
-
|
|
5024
|
+
imports.eventEmission.emit(
|
|
4976
5025
|
"platform.sdk.ApplicationLifecycleEvent",
|
|
4977
5026
|
buildApplicationLifecycleEvent({
|
|
4978
5027
|
lifecycle_event_type: "signup_success",
|
|
@@ -4991,7 +5040,7 @@ async function runOauthWithRedaction(runOauth) {
|
|
|
4991
5040
|
}
|
|
4992
5041
|
}
|
|
4993
5042
|
async function runOauthForEntryPoint({
|
|
4994
|
-
|
|
5043
|
+
imports,
|
|
4995
5044
|
entryPoint,
|
|
4996
5045
|
timeoutMs,
|
|
4997
5046
|
pkceCredentials,
|
|
@@ -5011,7 +5060,7 @@ async function runOauthForEntryPoint({
|
|
|
5011
5060
|
onProgress: (event) => {
|
|
5012
5061
|
if (event.type === "callback_accepted") {
|
|
5013
5062
|
emitSignupSuccess({
|
|
5014
|
-
|
|
5063
|
+
imports,
|
|
5015
5064
|
isNonInteractive: false,
|
|
5016
5065
|
isHeadless: headless === true
|
|
5017
5066
|
});
|
|
@@ -5032,7 +5081,7 @@ async function runOauthForEntryPoint({
|
|
|
5032
5081
|
);
|
|
5033
5082
|
}
|
|
5034
5083
|
async function provisionAccountCredentials({
|
|
5035
|
-
|
|
5084
|
+
imports,
|
|
5036
5085
|
entryPoint,
|
|
5037
5086
|
accessToken,
|
|
5038
5087
|
credentialsBaseUrl: credentialsBaseUrl2,
|
|
@@ -5045,7 +5094,7 @@ async function provisionAccountCredentials({
|
|
|
5045
5094
|
const scopedApi = getOrCreateApiClient({
|
|
5046
5095
|
credentials: accessToken,
|
|
5047
5096
|
baseUrl: credentialsBaseUrl2,
|
|
5048
|
-
callerPackage:
|
|
5097
|
+
callerPackage: imports.sdkOptions?.callerPackage
|
|
5049
5098
|
});
|
|
5050
5099
|
const profile = await getProfile(scopedApi);
|
|
5051
5100
|
process.stderr.write(`${getProfileMessage(entryPoint, profile.email)}
|
|
@@ -5074,7 +5123,7 @@ async function provisionAccountCredentials({
|
|
|
5074
5123
|
process.stderr.write("\u{1F510} Approvals are enabled for these credentials.\n");
|
|
5075
5124
|
}
|
|
5076
5125
|
emitAccountAuthSuccess({
|
|
5077
|
-
|
|
5126
|
+
imports,
|
|
5078
5127
|
profile,
|
|
5079
5128
|
clientId,
|
|
5080
5129
|
isNonInteractive,
|
|
@@ -5082,7 +5131,7 @@ async function provisionAccountCredentials({
|
|
|
5082
5131
|
});
|
|
5083
5132
|
}
|
|
5084
5133
|
async function runAccountAuth({
|
|
5085
|
-
|
|
5134
|
+
imports,
|
|
5086
5135
|
options,
|
|
5087
5136
|
entryPoint
|
|
5088
5137
|
}) {
|
|
@@ -5114,7 +5163,7 @@ async function runAccountAuth({
|
|
|
5114
5163
|
}
|
|
5115
5164
|
}
|
|
5116
5165
|
if (!await clearExistingAuthState({
|
|
5117
|
-
|
|
5166
|
+
imports,
|
|
5118
5167
|
baseUrl: pending.credentialsBaseUrl,
|
|
5119
5168
|
interactive: false,
|
|
5120
5169
|
entryPoint
|
|
@@ -5128,7 +5177,7 @@ async function runAccountAuth({
|
|
|
5128
5177
|
onProgress: (event) => {
|
|
5129
5178
|
if (entryPoint === "signup" && event.type === "callback_accepted") {
|
|
5130
5179
|
emitSignupSuccess({
|
|
5131
|
-
|
|
5180
|
+
imports,
|
|
5132
5181
|
isNonInteractive: true,
|
|
5133
5182
|
isHeadless: pending.headless
|
|
5134
5183
|
});
|
|
@@ -5137,7 +5186,7 @@ async function runAccountAuth({
|
|
|
5137
5186
|
});
|
|
5138
5187
|
});
|
|
5139
5188
|
await provisionAccountCredentials({
|
|
5140
|
-
|
|
5189
|
+
imports,
|
|
5141
5190
|
entryPoint,
|
|
5142
5191
|
accessToken: accessToken2,
|
|
5143
5192
|
credentialsBaseUrl: pending.credentialsBaseUrl,
|
|
@@ -5151,11 +5200,11 @@ async function runAccountAuth({
|
|
|
5151
5200
|
}
|
|
5152
5201
|
const timeoutSeconds = parseTimeoutSeconds(options.timeout);
|
|
5153
5202
|
const interactive = !resolveNonInteractive(options);
|
|
5154
|
-
const resolvedCredentials = await
|
|
5203
|
+
const resolvedCredentials = await imports.resolveCredentials();
|
|
5155
5204
|
const pkceCredentials = toPkceCredentials(resolvedCredentials);
|
|
5156
5205
|
const headless = options.headless === true;
|
|
5157
5206
|
const credentialsBaseUrl2 = await resolveCredentialsBaseUrl({
|
|
5158
|
-
|
|
5207
|
+
options: imports.sdkOptions,
|
|
5159
5208
|
resolvedCredentials
|
|
5160
5209
|
});
|
|
5161
5210
|
const providedName = options.name !== void 0 ? validateCredentialsName(options.name) : void 0;
|
|
@@ -5170,7 +5219,7 @@ async function runAccountAuth({
|
|
|
5170
5219
|
}
|
|
5171
5220
|
}
|
|
5172
5221
|
if (!await clearExistingAuthState({
|
|
5173
|
-
|
|
5222
|
+
imports,
|
|
5174
5223
|
baseUrl: credentialsBaseUrl2,
|
|
5175
5224
|
interactive,
|
|
5176
5225
|
entryPoint
|
|
@@ -5191,7 +5240,7 @@ async function runAccountAuth({
|
|
|
5191
5240
|
return;
|
|
5192
5241
|
}
|
|
5193
5242
|
const { accessToken } = await runOauthForEntryPoint({
|
|
5194
|
-
|
|
5243
|
+
imports,
|
|
5195
5244
|
entryPoint,
|
|
5196
5245
|
timeoutMs: timeoutSeconds * 1e3,
|
|
5197
5246
|
pkceCredentials,
|
|
@@ -5200,7 +5249,7 @@ async function runAccountAuth({
|
|
|
5200
5249
|
interactive
|
|
5201
5250
|
});
|
|
5202
5251
|
await provisionAccountCredentials({
|
|
5203
|
-
|
|
5252
|
+
imports,
|
|
5204
5253
|
entryPoint,
|
|
5205
5254
|
accessToken,
|
|
5206
5255
|
credentialsBaseUrl: credentialsBaseUrl2,
|
|
@@ -5245,17 +5294,26 @@ var LoginSchema = z.object({
|
|
|
5245
5294
|
});
|
|
5246
5295
|
|
|
5247
5296
|
// src/plugins/login/index.ts
|
|
5248
|
-
var loginPlugin =
|
|
5249
|
-
|
|
5250
|
-
|
|
5251
|
-
|
|
5252
|
-
|
|
5253
|
-
|
|
5254
|
-
|
|
5255
|
-
|
|
5256
|
-
|
|
5257
|
-
|
|
5258
|
-
|
|
5297
|
+
var loginPlugin = defineMethod({
|
|
5298
|
+
name: "login",
|
|
5299
|
+
imports: [
|
|
5300
|
+
apiPluginRef,
|
|
5301
|
+
resolveCredentialsPluginRef,
|
|
5302
|
+
eventEmissionPluginRef,
|
|
5303
|
+
sdkOptionsPluginRef
|
|
5304
|
+
],
|
|
5305
|
+
output: "raw",
|
|
5306
|
+
inputSchema: LoginSchema,
|
|
5307
|
+
categories: ["account"],
|
|
5308
|
+
supportsJsonOutput: false,
|
|
5309
|
+
run: async ({ imports, input }) => {
|
|
5310
|
+
await runAccountAuth({
|
|
5311
|
+
imports,
|
|
5312
|
+
options: input,
|
|
5313
|
+
entryPoint: "login"
|
|
5314
|
+
});
|
|
5315
|
+
}
|
|
5316
|
+
});
|
|
5259
5317
|
var SignupSchema = z.object({
|
|
5260
5318
|
timeout: z.string().optional().describe("Signup timeout in seconds (default: 300)"),
|
|
5261
5319
|
useApprovals: z.boolean().optional().describe(
|
|
@@ -5287,68 +5345,92 @@ var SignupSchema = z.object({
|
|
|
5287
5345
|
});
|
|
5288
5346
|
|
|
5289
5347
|
// src/plugins/signup/index.ts
|
|
5290
|
-
var signupPlugin =
|
|
5291
|
-
|
|
5292
|
-
|
|
5293
|
-
|
|
5294
|
-
|
|
5295
|
-
|
|
5296
|
-
|
|
5297
|
-
|
|
5298
|
-
|
|
5299
|
-
|
|
5300
|
-
|
|
5348
|
+
var signupPlugin = defineMethod({
|
|
5349
|
+
name: "signup",
|
|
5350
|
+
imports: [
|
|
5351
|
+
apiPluginRef,
|
|
5352
|
+
resolveCredentialsPluginRef,
|
|
5353
|
+
eventEmissionPluginRef,
|
|
5354
|
+
sdkOptionsPluginRef
|
|
5355
|
+
],
|
|
5356
|
+
output: "raw",
|
|
5357
|
+
inputSchema: SignupSchema,
|
|
5358
|
+
categories: ["account"],
|
|
5359
|
+
supportsJsonOutput: false,
|
|
5360
|
+
run: async ({ imports, input }) => {
|
|
5361
|
+
await runAccountAuth({
|
|
5362
|
+
imports,
|
|
5363
|
+
options: input,
|
|
5364
|
+
entryPoint: "signup"
|
|
5365
|
+
});
|
|
5366
|
+
}
|
|
5367
|
+
});
|
|
5301
5368
|
var LogoutSchema = z.object({}).describe("Log out of your Zapier account");
|
|
5302
5369
|
|
|
5303
5370
|
// src/plugins/logout/index.ts
|
|
5304
|
-
var logoutPlugin =
|
|
5305
|
-
|
|
5306
|
-
|
|
5307
|
-
|
|
5308
|
-
|
|
5309
|
-
|
|
5310
|
-
|
|
5311
|
-
|
|
5312
|
-
|
|
5313
|
-
|
|
5314
|
-
|
|
5315
|
-
|
|
5316
|
-
|
|
5317
|
-
|
|
5318
|
-
|
|
5319
|
-
|
|
5320
|
-
|
|
5321
|
-
await
|
|
5322
|
-
api: sdk2.context.api,
|
|
5323
|
-
credentials: activeCredentials,
|
|
5324
|
-
onEvent,
|
|
5325
|
-
alwaysClearLocalState: true
|
|
5326
|
-
});
|
|
5371
|
+
var logoutPlugin = defineMethod({
|
|
5372
|
+
name: "logout",
|
|
5373
|
+
imports: [apiPluginRef, resolveCredentialsPluginRef, sdkOptionsPluginRef],
|
|
5374
|
+
output: "raw",
|
|
5375
|
+
inputSchema: LogoutSchema,
|
|
5376
|
+
categories: ["account"],
|
|
5377
|
+
supportsJsonOutput: false,
|
|
5378
|
+
run: async ({ imports }) => {
|
|
5379
|
+
const credentialsBaseUrl2 = await resolveCredentialsBaseUrl({
|
|
5380
|
+
resolveCredentials: imports.resolveCredentials,
|
|
5381
|
+
options: imports.sdkOptions
|
|
5382
|
+
});
|
|
5383
|
+
const activeCredentials = getActiveCredentials({
|
|
5384
|
+
baseUrl: credentialsBaseUrl2
|
|
5385
|
+
});
|
|
5386
|
+
const onEvent = imports.sdkOptions?.onEvent;
|
|
5387
|
+
if (!activeCredentials) {
|
|
5388
|
+
await logout({ onEvent });
|
|
5327
5389
|
console.log("\u2705 Successfully logged out");
|
|
5390
|
+
return;
|
|
5328
5391
|
}
|
|
5329
|
-
|
|
5330
|
-
|
|
5392
|
+
await revokeCredentials({
|
|
5393
|
+
api: imports.api,
|
|
5394
|
+
credentials: activeCredentials,
|
|
5395
|
+
onEvent,
|
|
5396
|
+
alwaysClearLocalState: true
|
|
5397
|
+
});
|
|
5398
|
+
console.log("\u2705 Successfully logged out");
|
|
5399
|
+
}
|
|
5400
|
+
});
|
|
5401
|
+
var CLI_EXTENSIONS_ID = "cli/extensions";
|
|
5402
|
+
var cliExtensionsPluginRef = declareOptionalProperty({
|
|
5403
|
+
id: CLI_EXTENSIONS_ID
|
|
5404
|
+
});
|
|
5405
|
+
var CLI_EXPERIMENTAL_ID = "cli/experimental";
|
|
5406
|
+
var cliExperimentalPluginRef = declareOptionalProperty({
|
|
5407
|
+
id: CLI_EXPERIMENTAL_ID
|
|
5408
|
+
});
|
|
5331
5409
|
var McpSchema = z.object({
|
|
5332
5410
|
port: z.string().optional().describe("Port to listen on (for future HTTP transport)")
|
|
5333
5411
|
}).describe("Start MCP server for Zapier SDK");
|
|
5334
5412
|
|
|
5335
5413
|
// src/plugins/mcp/index.ts
|
|
5336
|
-
var mcpPlugin =
|
|
5337
|
-
|
|
5338
|
-
|
|
5339
|
-
|
|
5340
|
-
|
|
5341
|
-
|
|
5342
|
-
|
|
5343
|
-
|
|
5344
|
-
|
|
5345
|
-
|
|
5346
|
-
|
|
5347
|
-
|
|
5348
|
-
|
|
5349
|
-
|
|
5350
|
-
|
|
5351
|
-
|
|
5414
|
+
var mcpPlugin = defineMethod({
|
|
5415
|
+
name: "mcp",
|
|
5416
|
+
imports: [
|
|
5417
|
+
sdkOptionsPluginRef,
|
|
5418
|
+
cliExtensionsPluginRef,
|
|
5419
|
+
cliExperimentalPluginRef
|
|
5420
|
+
],
|
|
5421
|
+
output: "raw",
|
|
5422
|
+
inputSchema: McpSchema,
|
|
5423
|
+
categories: ["utility"],
|
|
5424
|
+
run: async ({ imports, input }) => {
|
|
5425
|
+
await startMcpServer({
|
|
5426
|
+
...input,
|
|
5427
|
+
debug: imports.sdkOptions?.debug,
|
|
5428
|
+
maxConcurrentRequests: imports.sdkOptions?.maxConcurrentRequests,
|
|
5429
|
+
extensions: imports.extensions,
|
|
5430
|
+
experimental: imports.experimental
|
|
5431
|
+
});
|
|
5432
|
+
}
|
|
5433
|
+
});
|
|
5352
5434
|
var BundleCodeSchema = z.object({
|
|
5353
5435
|
input: z.string().min(1).describe("Input TypeScript file path to bundle"),
|
|
5354
5436
|
output: OutputPropertySchema.optional().describe(
|
|
@@ -5359,15 +5441,16 @@ var BundleCodeSchema = z.object({
|
|
|
5359
5441
|
target: z.string().optional().describe("ECMAScript target version"),
|
|
5360
5442
|
cjs: z.boolean().optional().describe("Output CommonJS format instead of ESM")
|
|
5361
5443
|
}).describe("Bundle TypeScript code into executable JavaScript");
|
|
5362
|
-
var bundleCodePlugin =
|
|
5363
|
-
|
|
5364
|
-
|
|
5365
|
-
|
|
5366
|
-
|
|
5367
|
-
|
|
5368
|
-
|
|
5369
|
-
|
|
5370
|
-
)
|
|
5444
|
+
var bundleCodePlugin = defineMethod({
|
|
5445
|
+
name: "bundleCode",
|
|
5446
|
+
categories: ["utility"],
|
|
5447
|
+
deprecation: { message: "bundleCode is no longer maintained." },
|
|
5448
|
+
inputSchema: BundleCodeSchema,
|
|
5449
|
+
// Returns the bundled code string verbatim — no `{ data }` envelope,
|
|
5450
|
+
// matching legacy.
|
|
5451
|
+
output: "raw",
|
|
5452
|
+
run: async ({ input }) => bundleCode(input)
|
|
5453
|
+
});
|
|
5371
5454
|
async function bundleCode(options) {
|
|
5372
5455
|
const {
|
|
5373
5456
|
input,
|
|
@@ -5424,14 +5507,16 @@ async function bundleCode(options) {
|
|
|
5424
5507
|
}
|
|
5425
5508
|
}
|
|
5426
5509
|
var GetLoginConfigPathSchema = z.object({}).describe("Show the path to the login configuration file");
|
|
5427
|
-
|
|
5428
|
-
|
|
5429
|
-
|
|
5430
|
-
|
|
5431
|
-
|
|
5432
|
-
|
|
5433
|
-
}
|
|
5434
|
-
|
|
5510
|
+
|
|
5511
|
+
// src/plugins/getLoginConfigPath/index.ts
|
|
5512
|
+
var getLoginConfigPathPlugin = defineMethod({
|
|
5513
|
+
name: "getLoginConfigPath",
|
|
5514
|
+
categories: ["utility"],
|
|
5515
|
+
inputSchema: GetLoginConfigPathSchema,
|
|
5516
|
+
// Returns the path string verbatim — no `{ data }` envelope, matching legacy.
|
|
5517
|
+
output: "raw",
|
|
5518
|
+
run: async () => getConfigPath()
|
|
5519
|
+
});
|
|
5435
5520
|
var AddSchema = z.object({
|
|
5436
5521
|
apps: z.array(z.string().min(1, "App key cannot be empty")).min(1, "At least one app key is required").describe(
|
|
5437
5522
|
"One or more app keys to add (e.g., 'slack', 'github', 'trello')"
|
|
@@ -5459,105 +5544,107 @@ async function detectTypesOutputDirectory() {
|
|
|
5459
5544
|
}
|
|
5460
5545
|
return "./zapier/apps/";
|
|
5461
5546
|
}
|
|
5462
|
-
var
|
|
5463
|
-
|
|
5464
|
-
|
|
5465
|
-
|
|
5466
|
-
|
|
5467
|
-
|
|
5468
|
-
|
|
5469
|
-
|
|
5470
|
-
|
|
5471
|
-
|
|
5472
|
-
|
|
5473
|
-
|
|
5474
|
-
|
|
5475
|
-
|
|
5476
|
-
|
|
5477
|
-
|
|
5478
|
-
|
|
5479
|
-
|
|
5480
|
-
|
|
5481
|
-
|
|
5482
|
-
|
|
5483
|
-
|
|
5484
|
-
|
|
5485
|
-
|
|
5486
|
-
|
|
5487
|
-
|
|
5488
|
-
|
|
5489
|
-
|
|
5490
|
-
|
|
5491
|
-
|
|
5492
|
-
|
|
5493
|
-
|
|
5494
|
-
|
|
5495
|
-
|
|
5496
|
-
|
|
5497
|
-
|
|
5498
|
-
|
|
5499
|
-
|
|
5500
|
-
|
|
5501
|
-
|
|
5502
|
-
|
|
5503
|
-
|
|
5504
|
-
|
|
5505
|
-
|
|
5506
|
-
|
|
5507
|
-
|
|
5508
|
-
|
|
5509
|
-
|
|
5510
|
-
|
|
5511
|
-
|
|
5512
|
-
|
|
5513
|
-
|
|
5514
|
-
|
|
5515
|
-
|
|
5516
|
-
|
|
5517
|
-
|
|
5518
|
-
|
|
5519
|
-
|
|
5520
|
-
|
|
5521
|
-
|
|
5522
|
-
|
|
5523
|
-
|
|
5524
|
-
|
|
5525
|
-
|
|
5526
|
-
|
|
5527
|
-
|
|
5528
|
-
|
|
5529
|
-
|
|
5530
|
-
|
|
5531
|
-
|
|
5532
|
-
|
|
5533
|
-
|
|
5534
|
-
|
|
5535
|
-
|
|
5536
|
-
|
|
5537
|
-
|
|
5538
|
-
|
|
5539
|
-
apps: appKeys,
|
|
5540
|
-
skipWrite: false,
|
|
5541
|
-
configPath,
|
|
5542
|
-
onProgress: handleManifestProgress
|
|
5543
|
-
});
|
|
5544
|
-
const typesResult = await sdk2.generateAppTypes({
|
|
5545
|
-
apps: appKeys,
|
|
5546
|
-
connections: connectionIds,
|
|
5547
|
-
skipWrite: false,
|
|
5548
|
-
typesOutputDirectory: resolvedTypesOutput,
|
|
5549
|
-
onProgress: handleTypesProgress
|
|
5550
|
-
});
|
|
5551
|
-
const results = manifestResult.manifest?.apps || {};
|
|
5552
|
-
const successfulApps = Object.keys(results).filter(
|
|
5553
|
-
(manifestKey) => typesResult.writtenFiles?.[manifestKey]
|
|
5554
|
-
);
|
|
5555
|
-
if (successfulApps.length > 0) {
|
|
5556
|
-
console.log(`\u2705 Added ${successfulApps.length} app(s) to manifest`);
|
|
5547
|
+
var buildManifestRef = declareMethod({ id: "buildManifest" });
|
|
5548
|
+
var generateAppTypesRef = declareMethod({ id: "generateAppTypes" });
|
|
5549
|
+
var addAppsPlugin = defineMethod({
|
|
5550
|
+
name: "add",
|
|
5551
|
+
imports: [buildManifestRef, generateAppTypesRef],
|
|
5552
|
+
output: "raw",
|
|
5553
|
+
categories: ["utility"],
|
|
5554
|
+
inputSchema: AddSchema,
|
|
5555
|
+
run: async ({ imports, input }) => {
|
|
5556
|
+
const {
|
|
5557
|
+
apps: appKeys,
|
|
5558
|
+
connections: connectionIds,
|
|
5559
|
+
configPath,
|
|
5560
|
+
typesOutput = await detectTypesOutputDirectory()
|
|
5561
|
+
} = input;
|
|
5562
|
+
const resolvedTypesOutput = resolve(typesOutput);
|
|
5563
|
+
console.log(`\u{1F4E6} Adding ${appKeys.length} app(s)...`);
|
|
5564
|
+
const appSlugAndKeyMap = /* @__PURE__ */ new Map();
|
|
5565
|
+
const handleManifestProgress = (event) => {
|
|
5566
|
+
switch (event.type) {
|
|
5567
|
+
case "apps_lookup_start":
|
|
5568
|
+
console.log(`\u{1F4E6} Looking up ${event.count} app(s)...`);
|
|
5569
|
+
break;
|
|
5570
|
+
case "app_found":
|
|
5571
|
+
const displayName = event.app.slug ? `${event.app.slug} (${event.app.key})` : event.app.key;
|
|
5572
|
+
appSlugAndKeyMap.set(event.app.key, displayName);
|
|
5573
|
+
break;
|
|
5574
|
+
case "apps_lookup_complete":
|
|
5575
|
+
if (event.count === 0) {
|
|
5576
|
+
console.warn("\u26A0\uFE0F No apps found");
|
|
5577
|
+
}
|
|
5578
|
+
break;
|
|
5579
|
+
case "app_processing_start":
|
|
5580
|
+
const appName = event.slug ? `${event.slug} (${event.app})` : event.app;
|
|
5581
|
+
console.log(`\u{1F4E6} Adding ${appName}...`);
|
|
5582
|
+
break;
|
|
5583
|
+
case "manifest_updated":
|
|
5584
|
+
const appDisplay = appSlugAndKeyMap.get(event.app) || event.app;
|
|
5585
|
+
console.log(
|
|
5586
|
+
`\u{1F4DD} Locked ${appDisplay} to ${event.app}@${event.version} using key '${event.manifestKey}'`
|
|
5587
|
+
);
|
|
5588
|
+
break;
|
|
5589
|
+
case "app_processing_error":
|
|
5590
|
+
const errorApp = appSlugAndKeyMap.get(event.app) || event.app;
|
|
5591
|
+
console.warn(`\u26A0\uFE0F ${event.error} for ${errorApp}`);
|
|
5592
|
+
break;
|
|
5593
|
+
}
|
|
5594
|
+
};
|
|
5595
|
+
const handleTypesProgress = (event) => {
|
|
5596
|
+
switch (event.type) {
|
|
5597
|
+
case "connections_lookup_start":
|
|
5598
|
+
console.log(`\u{1F510} Looking up ${event.count} connection(s)...`);
|
|
5599
|
+
break;
|
|
5600
|
+
case "connections_lookup_complete":
|
|
5601
|
+
console.log(`\u{1F510} Found ${event.count} connection(s)`);
|
|
5602
|
+
break;
|
|
5603
|
+
case "connection_matched":
|
|
5604
|
+
const appWithConnection = appSlugAndKeyMap.get(event.app) || event.app;
|
|
5605
|
+
console.log(
|
|
5606
|
+
`\u{1F510} Using connection ${event.connectionId} (${event.connectionTitle}) for ${appWithConnection}`
|
|
5607
|
+
);
|
|
5608
|
+
break;
|
|
5609
|
+
case "connection_not_matched":
|
|
5610
|
+
const appWithoutConnection = appSlugAndKeyMap.get(event.app) || event.app;
|
|
5611
|
+
console.warn(
|
|
5612
|
+
`\u26A0\uFE0F No matching connection found for ${appWithoutConnection}`
|
|
5613
|
+
);
|
|
5614
|
+
break;
|
|
5615
|
+
case "file_written":
|
|
5616
|
+
console.log(
|
|
5617
|
+
`\u{1F527} Generated types for ${event.manifestKey} at ${event.filePath}`
|
|
5618
|
+
);
|
|
5619
|
+
break;
|
|
5620
|
+
case "app_processing_error":
|
|
5621
|
+
const errorApp = appSlugAndKeyMap.get(event.app) || event.app;
|
|
5622
|
+
console.warn(`\u26A0\uFE0F ${event.error} for ${errorApp}`);
|
|
5623
|
+
break;
|
|
5557
5624
|
}
|
|
5625
|
+
};
|
|
5626
|
+
const manifestResult = await imports.buildManifest({
|
|
5627
|
+
apps: appKeys,
|
|
5628
|
+
skipWrite: false,
|
|
5629
|
+
configPath,
|
|
5630
|
+
onProgress: handleManifestProgress
|
|
5631
|
+
});
|
|
5632
|
+
const typesResult = await imports.generateAppTypes({
|
|
5633
|
+
apps: appKeys,
|
|
5634
|
+
connections: connectionIds,
|
|
5635
|
+
skipWrite: false,
|
|
5636
|
+
typesOutputDirectory: resolvedTypesOutput,
|
|
5637
|
+
onProgress: handleTypesProgress
|
|
5638
|
+
});
|
|
5639
|
+
const results = manifestResult.manifest?.apps || {};
|
|
5640
|
+
const successfulApps = Object.keys(results).filter(
|
|
5641
|
+
(manifestKey) => typesResult.writtenFiles?.[manifestKey]
|
|
5642
|
+
);
|
|
5643
|
+
if (successfulApps.length > 0) {
|
|
5644
|
+
console.log(`\u2705 Added ${successfulApps.length} app(s) to manifest`);
|
|
5558
5645
|
}
|
|
5559
|
-
}
|
|
5560
|
-
);
|
|
5646
|
+
}
|
|
5647
|
+
});
|
|
5561
5648
|
var GenerateAppTypesSchema = z.object({
|
|
5562
5649
|
apps: z.array(z.string().min(1, "App key cannot be empty")).min(1, "At least one app key is required").describe(
|
|
5563
5650
|
"One or more app keys to generate types for (e.g., 'slack', 'github', 'trello')"
|
|
@@ -5575,26 +5662,28 @@ var GenerateAppTypesSchema = z.object({
|
|
|
5575
5662
|
"Generate TypeScript type definitions for apps - can optionally write to disk or just return type strings"
|
|
5576
5663
|
);
|
|
5577
5664
|
var AstTypeGenerator = class {
|
|
5578
|
-
constructor() {
|
|
5665
|
+
constructor(options) {
|
|
5579
5666
|
this.factory = ts.factory;
|
|
5580
5667
|
this.printer = ts.createPrinter({
|
|
5581
5668
|
newLine: ts.NewLineKind.LineFeed,
|
|
5582
5669
|
removeComments: false,
|
|
5583
5670
|
omitTrailingSemicolon: false
|
|
5584
5671
|
});
|
|
5672
|
+
this.listActions = options.listActions;
|
|
5673
|
+
this.listActionInputFields = options.listActionInputFields;
|
|
5585
5674
|
}
|
|
5586
5675
|
/**
|
|
5587
5676
|
* Generate TypeScript types using AST for a specific app
|
|
5588
5677
|
*/
|
|
5589
5678
|
async generateTypes(options) {
|
|
5590
|
-
const { app, connectionId
|
|
5591
|
-
const actionsResult = await
|
|
5679
|
+
const { app, connectionId } = options;
|
|
5680
|
+
const actionsResult = await this.listActions({
|
|
5592
5681
|
appKey: app.implementation_id
|
|
5593
5682
|
});
|
|
5594
5683
|
const actions = actionsResult.data;
|
|
5595
5684
|
const actionsWithFields = [];
|
|
5596
5685
|
const inputFieldsTasks = actions.map(
|
|
5597
|
-
(action) => () =>
|
|
5686
|
+
(action) => () => this.listActionInputFields({
|
|
5598
5687
|
appKey: app.implementation_id,
|
|
5599
5688
|
actionKey: action.key,
|
|
5600
5689
|
actionType: action.action_type,
|
|
@@ -6164,133 +6253,147 @@ function createManifestEntry(app) {
|
|
|
6164
6253
|
version: app.version
|
|
6165
6254
|
};
|
|
6166
6255
|
}
|
|
6167
|
-
var
|
|
6168
|
-
|
|
6169
|
-
|
|
6170
|
-
|
|
6171
|
-
|
|
6172
|
-
|
|
6173
|
-
|
|
6174
|
-
|
|
6175
|
-
|
|
6176
|
-
|
|
6177
|
-
|
|
6178
|
-
|
|
6179
|
-
|
|
6180
|
-
|
|
6181
|
-
|
|
6182
|
-
|
|
6183
|
-
|
|
6184
|
-
|
|
6185
|
-
|
|
6186
|
-
|
|
6187
|
-
|
|
6188
|
-
|
|
6189
|
-
|
|
6190
|
-
|
|
6191
|
-
|
|
6192
|
-
|
|
6193
|
-
|
|
6194
|
-
|
|
6195
|
-
|
|
6196
|
-
|
|
6197
|
-
|
|
6198
|
-
|
|
6199
|
-
|
|
6200
|
-
|
|
6201
|
-
|
|
6202
|
-
|
|
6203
|
-
|
|
6204
|
-
|
|
6205
|
-
|
|
6206
|
-
|
|
6207
|
-
|
|
6208
|
-
|
|
6209
|
-
|
|
6210
|
-
|
|
6211
|
-
|
|
6212
|
-
|
|
6213
|
-
|
|
6214
|
-
|
|
6256
|
+
var listAppsRef = declareMethod({ id: "listApps" });
|
|
6257
|
+
var listConnectionsRef = declareMethod({ id: "listConnections" });
|
|
6258
|
+
var listActionsRef = declareMethod({ id: "listActions" });
|
|
6259
|
+
var listActionInputFieldsRef = declareMethod({ id: "listActionInputFields" });
|
|
6260
|
+
var generateAppTypesPlugin = defineMethod({
|
|
6261
|
+
name: "generateAppTypes",
|
|
6262
|
+
imports: [
|
|
6263
|
+
listAppsRef,
|
|
6264
|
+
listConnectionsRef,
|
|
6265
|
+
listActionsRef,
|
|
6266
|
+
listActionInputFieldsRef
|
|
6267
|
+
],
|
|
6268
|
+
output: "raw",
|
|
6269
|
+
categories: ["utility"],
|
|
6270
|
+
// Cast: schema validates JSON fields only; GenerateAppTypesOptions adds the
|
|
6271
|
+
// runtime-only `onProgress` callback, widening the input type for `run`.
|
|
6272
|
+
inputSchema: GenerateAppTypesSchema,
|
|
6273
|
+
// The schema stays for projection (CLI flags / docs); the runtime parse is
|
|
6274
|
+
// skipped because it would strip the runtime-only `onProgress` callback.
|
|
6275
|
+
skipInputValidation: true,
|
|
6276
|
+
run: async ({ imports, input }) => {
|
|
6277
|
+
const {
|
|
6278
|
+
apps: appKeys,
|
|
6279
|
+
connections: connectionIds,
|
|
6280
|
+
skipWrite = false,
|
|
6281
|
+
typesOutputDirectory = await detectTypesOutputDirectory(),
|
|
6282
|
+
onProgress
|
|
6283
|
+
} = input;
|
|
6284
|
+
const resolvedTypesOutput = resolve(typesOutputDirectory);
|
|
6285
|
+
const result = { typeDefinitions: {} };
|
|
6286
|
+
onProgress?.({ type: "apps_lookup_start", count: appKeys.length });
|
|
6287
|
+
const appsIterable = imports.listApps({ apps: appKeys }).items();
|
|
6288
|
+
const apps = [];
|
|
6289
|
+
for await (const app of appsIterable) {
|
|
6290
|
+
apps.push(app);
|
|
6291
|
+
onProgress?.({ type: "app_found", app });
|
|
6292
|
+
}
|
|
6293
|
+
onProgress?.({ type: "apps_lookup_complete", count: apps.length });
|
|
6294
|
+
if (apps.length === 0) {
|
|
6295
|
+
return result;
|
|
6296
|
+
}
|
|
6297
|
+
const connections = [];
|
|
6298
|
+
if (connectionIds && connectionIds.length > 0) {
|
|
6299
|
+
onProgress?.({
|
|
6300
|
+
type: "connections_lookup_start",
|
|
6301
|
+
count: connectionIds.length
|
|
6302
|
+
});
|
|
6303
|
+
const connectionsIterable = imports.listConnections({ connections: connectionIds }).items();
|
|
6304
|
+
for await (const connection of connectionsIterable) {
|
|
6305
|
+
connections.push(connection);
|
|
6215
6306
|
}
|
|
6216
|
-
|
|
6217
|
-
|
|
6218
|
-
|
|
6219
|
-
|
|
6220
|
-
|
|
6221
|
-
|
|
6222
|
-
|
|
6223
|
-
|
|
6224
|
-
|
|
6225
|
-
|
|
6226
|
-
|
|
6227
|
-
|
|
6228
|
-
|
|
6229
|
-
|
|
6230
|
-
|
|
6231
|
-
|
|
6232
|
-
|
|
6233
|
-
|
|
6234
|
-
|
|
6235
|
-
|
|
6236
|
-
}
|
|
6237
|
-
let connectionId;
|
|
6238
|
-
if (connections.length > 0) {
|
|
6239
|
-
const matchingConnection = connections.find(
|
|
6240
|
-
(conn) => conn.app_key === app.key
|
|
6241
|
-
);
|
|
6242
|
-
if (matchingConnection) {
|
|
6243
|
-
connectionId = matchingConnection.id;
|
|
6244
|
-
onProgress?.({
|
|
6245
|
-
type: "connection_matched",
|
|
6246
|
-
app: app.key,
|
|
6247
|
-
connectionId: matchingConnection.id,
|
|
6248
|
-
connectionTitle: matchingConnection.title || ""
|
|
6249
|
-
});
|
|
6250
|
-
} else {
|
|
6251
|
-
onProgress?.({
|
|
6252
|
-
type: "connection_not_matched",
|
|
6253
|
-
app: app.key
|
|
6254
|
-
});
|
|
6255
|
-
}
|
|
6256
|
-
}
|
|
6257
|
-
const manifestKey = getManifestKey(app);
|
|
6258
|
-
const generator = new AstTypeGenerator();
|
|
6259
|
-
const typeDefinitionString = await generator.generateTypes({
|
|
6260
|
-
app,
|
|
6261
|
-
connectionId,
|
|
6262
|
-
sdk: sdk2
|
|
6263
|
-
});
|
|
6264
|
-
result.typeDefinitions[manifestKey] = typeDefinitionString;
|
|
6265
|
-
onProgress?.({
|
|
6266
|
-
type: "type_generated",
|
|
6267
|
-
manifestKey,
|
|
6268
|
-
sizeBytes: typeDefinitionString.length
|
|
6269
|
-
});
|
|
6270
|
-
if (!skipWrite && resolvedTypesOutput && result.writtenFiles) {
|
|
6271
|
-
const filePath = join(resolvedTypesOutput, `${manifestKey}.d.ts`);
|
|
6272
|
-
await writeFile(filePath, typeDefinitionString, "utf8");
|
|
6273
|
-
result.writtenFiles[manifestKey] = filePath;
|
|
6274
|
-
onProgress?.({ type: "file_written", manifestKey, filePath });
|
|
6275
|
-
}
|
|
6276
|
-
onProgress?.({ type: "app_processing_complete", app: app.key });
|
|
6277
|
-
} catch (error) {
|
|
6278
|
-
const errorMessage = `Failed to process app ${app.key}: ${error instanceof Error ? error.message : String(error)}`;
|
|
6307
|
+
onProgress?.({
|
|
6308
|
+
type: "connections_lookup_complete",
|
|
6309
|
+
count: connections.length
|
|
6310
|
+
});
|
|
6311
|
+
}
|
|
6312
|
+
if (!skipWrite && resolvedTypesOutput) {
|
|
6313
|
+
await mkdir(resolvedTypesOutput, { recursive: true });
|
|
6314
|
+
}
|
|
6315
|
+
if (!skipWrite) {
|
|
6316
|
+
result.writtenFiles = {};
|
|
6317
|
+
}
|
|
6318
|
+
for (const app of apps) {
|
|
6319
|
+
onProgress?.({
|
|
6320
|
+
type: "app_processing_start",
|
|
6321
|
+
app: app.key,
|
|
6322
|
+
slug: app.slug
|
|
6323
|
+
});
|
|
6324
|
+
try {
|
|
6325
|
+
if (!app.version) {
|
|
6326
|
+
const errorMessage = `Invalid implementation ID format: ${app.implementation_id}. Expected format: <implementationName>@<version>`;
|
|
6279
6327
|
onProgress?.({
|
|
6280
6328
|
type: "app_processing_error",
|
|
6281
6329
|
app: app.key,
|
|
6282
6330
|
error: errorMessage
|
|
6283
6331
|
});
|
|
6284
|
-
|
|
6285
|
-
|
|
6332
|
+
throw new ZapierValidationError(errorMessage, {
|
|
6333
|
+
details: {
|
|
6334
|
+
appKey: app.key,
|
|
6335
|
+
implementationId: app.implementation_id
|
|
6336
|
+
}
|
|
6337
|
+
});
|
|
6338
|
+
}
|
|
6339
|
+
let connectionId;
|
|
6340
|
+
if (connections.length > 0) {
|
|
6341
|
+
const matchingConnection = connections.find(
|
|
6342
|
+
(conn) => conn.app_key === app.key
|
|
6343
|
+
);
|
|
6344
|
+
if (matchingConnection) {
|
|
6345
|
+
connectionId = matchingConnection.id;
|
|
6346
|
+
onProgress?.({
|
|
6347
|
+
type: "connection_matched",
|
|
6348
|
+
app: app.key,
|
|
6349
|
+
connectionId: matchingConnection.id,
|
|
6350
|
+
connectionTitle: matchingConnection.title || ""
|
|
6351
|
+
});
|
|
6352
|
+
} else {
|
|
6353
|
+
onProgress?.({
|
|
6354
|
+
type: "connection_not_matched",
|
|
6355
|
+
app: app.key
|
|
6356
|
+
});
|
|
6286
6357
|
}
|
|
6287
|
-
throw new ZapierUnknownError(errorMessage, { cause: error });
|
|
6288
6358
|
}
|
|
6359
|
+
const manifestKey = getManifestKey(app);
|
|
6360
|
+
const generator = new AstTypeGenerator({
|
|
6361
|
+
listActions: imports.listActions,
|
|
6362
|
+
listActionInputFields: imports.listActionInputFields
|
|
6363
|
+
});
|
|
6364
|
+
const typeDefinitionString = await generator.generateTypes({
|
|
6365
|
+
app,
|
|
6366
|
+
connectionId
|
|
6367
|
+
});
|
|
6368
|
+
result.typeDefinitions[manifestKey] = typeDefinitionString;
|
|
6369
|
+
onProgress?.({
|
|
6370
|
+
type: "type_generated",
|
|
6371
|
+
manifestKey,
|
|
6372
|
+
sizeBytes: typeDefinitionString.length
|
|
6373
|
+
});
|
|
6374
|
+
if (!skipWrite && resolvedTypesOutput && result.writtenFiles) {
|
|
6375
|
+
const filePath = join(resolvedTypesOutput, `${manifestKey}.d.ts`);
|
|
6376
|
+
await writeFile(filePath, typeDefinitionString, "utf8");
|
|
6377
|
+
result.writtenFiles[manifestKey] = filePath;
|
|
6378
|
+
onProgress?.({ type: "file_written", manifestKey, filePath });
|
|
6379
|
+
}
|
|
6380
|
+
onProgress?.({ type: "app_processing_complete", app: app.key });
|
|
6381
|
+
} catch (error) {
|
|
6382
|
+
const errorMessage = `Failed to process app ${app.key}: ${error instanceof Error ? error.message : String(error)}`;
|
|
6383
|
+
onProgress?.({
|
|
6384
|
+
type: "app_processing_error",
|
|
6385
|
+
app: app.key,
|
|
6386
|
+
error: errorMessage
|
|
6387
|
+
});
|
|
6388
|
+
if (error instanceof ZapierValidationError) {
|
|
6389
|
+
throw error;
|
|
6390
|
+
}
|
|
6391
|
+
throw new ZapierUnknownError(errorMessage, { cause: error });
|
|
6289
6392
|
}
|
|
6290
|
-
return result;
|
|
6291
6393
|
}
|
|
6292
|
-
|
|
6293
|
-
|
|
6394
|
+
return result;
|
|
6395
|
+
}
|
|
6396
|
+
});
|
|
6294
6397
|
var BuildManifestSchema = z.object({
|
|
6295
6398
|
apps: z.array(z.string().min(1, "App key cannot be empty")).min(1, "At least one app key is required").describe(
|
|
6296
6399
|
"One or more app keys to build manifest entries for (e.g., 'slack', 'github', 'trello')"
|
|
@@ -6306,80 +6409,78 @@ var BuildManifestSchema = z.object({
|
|
|
6306
6409
|
);
|
|
6307
6410
|
|
|
6308
6411
|
// src/plugins/buildManifest/index.ts
|
|
6309
|
-
var
|
|
6310
|
-
|
|
6311
|
-
|
|
6312
|
-
|
|
6313
|
-
|
|
6314
|
-
|
|
6315
|
-
|
|
6316
|
-
|
|
6317
|
-
|
|
6318
|
-
|
|
6319
|
-
|
|
6320
|
-
|
|
6321
|
-
|
|
6322
|
-
|
|
6323
|
-
|
|
6324
|
-
|
|
6325
|
-
|
|
6326
|
-
|
|
6327
|
-
|
|
6328
|
-
|
|
6329
|
-
|
|
6330
|
-
|
|
6331
|
-
|
|
6332
|
-
|
|
6333
|
-
|
|
6334
|
-
|
|
6335
|
-
|
|
6336
|
-
|
|
6337
|
-
|
|
6412
|
+
var listAppsRef2 = declareMethod({ id: "listApps" });
|
|
6413
|
+
var buildManifestPlugin = defineMethod({
|
|
6414
|
+
name: "buildManifest",
|
|
6415
|
+
imports: [listAppsRef2, manifestPluginRef],
|
|
6416
|
+
output: "raw",
|
|
6417
|
+
categories: ["utility"],
|
|
6418
|
+
// Cast: BuildManifestSchema validates JSON-serializable fields only.
|
|
6419
|
+
// BuildManifestOptions adds an `onProgress` callback; this widens the input
|
|
6420
|
+
// type so `run` can read it.
|
|
6421
|
+
inputSchema: BuildManifestSchema,
|
|
6422
|
+
// The schema stays for projection (CLI flags / docs); the runtime parse is
|
|
6423
|
+
// skipped because it would strip the runtime-only `onProgress` callback.
|
|
6424
|
+
skipInputValidation: true,
|
|
6425
|
+
run: async ({ imports, input }) => {
|
|
6426
|
+
const { apps: appKeys, skipWrite = false, configPath, onProgress } = input;
|
|
6427
|
+
onProgress?.({ type: "apps_lookup_start", count: appKeys.length });
|
|
6428
|
+
const appsIterable = imports.listApps({ apps: appKeys }).items();
|
|
6429
|
+
const apps = [];
|
|
6430
|
+
for await (const app of appsIterable) {
|
|
6431
|
+
apps.push(app);
|
|
6432
|
+
onProgress?.({ type: "app_found", app });
|
|
6433
|
+
}
|
|
6434
|
+
onProgress?.({ type: "apps_lookup_complete", count: apps.length });
|
|
6435
|
+
if (apps.length === 0) {
|
|
6436
|
+
return {};
|
|
6437
|
+
}
|
|
6438
|
+
let updatedManifest;
|
|
6439
|
+
for (const app of apps) {
|
|
6440
|
+
onProgress?.({
|
|
6441
|
+
type: "app_processing_start",
|
|
6442
|
+
app: app.key,
|
|
6443
|
+
slug: app.slug
|
|
6444
|
+
});
|
|
6445
|
+
try {
|
|
6446
|
+
const manifestEntry = createManifestEntry(app);
|
|
6338
6447
|
onProgress?.({
|
|
6339
|
-
type: "
|
|
6448
|
+
type: "manifest_entry_built",
|
|
6340
6449
|
app: app.key,
|
|
6341
|
-
|
|
6450
|
+
manifestKey: manifestEntry.implementationName,
|
|
6451
|
+
version: manifestEntry.version || ""
|
|
6342
6452
|
});
|
|
6343
|
-
|
|
6344
|
-
|
|
6345
|
-
|
|
6346
|
-
|
|
6347
|
-
|
|
6348
|
-
|
|
6349
|
-
|
|
6350
|
-
|
|
6351
|
-
|
|
6352
|
-
|
|
6353
|
-
|
|
6354
|
-
|
|
6355
|
-
|
|
6356
|
-
|
|
6357
|
-
|
|
6358
|
-
|
|
6359
|
-
|
|
6360
|
-
|
|
6361
|
-
|
|
6362
|
-
|
|
6363
|
-
|
|
6364
|
-
|
|
6365
|
-
|
|
6366
|
-
|
|
6367
|
-
const errorMessage = `Failed to process app ${app.key}: ${error instanceof Error ? error.message : String(error)}`;
|
|
6368
|
-
onProgress?.({
|
|
6369
|
-
type: "app_processing_error",
|
|
6370
|
-
app: app.key,
|
|
6371
|
-
error: errorMessage
|
|
6372
|
-
});
|
|
6373
|
-
if (error instanceof ZapierValidationError) {
|
|
6374
|
-
throw error;
|
|
6375
|
-
}
|
|
6376
|
-
throw new ZapierUnknownError(errorMessage, { cause: error });
|
|
6453
|
+
const { key: updatedManifestKey, manifest } = await imports.manifest.updateManifestEntry({
|
|
6454
|
+
appKey: app.key,
|
|
6455
|
+
entry: manifestEntry,
|
|
6456
|
+
configPath,
|
|
6457
|
+
skipWrite,
|
|
6458
|
+
manifest: updatedManifest
|
|
6459
|
+
});
|
|
6460
|
+
updatedManifest = manifest;
|
|
6461
|
+
onProgress?.({
|
|
6462
|
+
type: "manifest_updated",
|
|
6463
|
+
app: app.key,
|
|
6464
|
+
manifestKey: updatedManifestKey,
|
|
6465
|
+
version: manifestEntry.version || ""
|
|
6466
|
+
});
|
|
6467
|
+
onProgress?.({ type: "app_processing_complete", app: app.key });
|
|
6468
|
+
} catch (error) {
|
|
6469
|
+
const errorMessage = `Failed to process app ${app.key}: ${error instanceof Error ? error.message : String(error)}`;
|
|
6470
|
+
onProgress?.({
|
|
6471
|
+
type: "app_processing_error",
|
|
6472
|
+
app: app.key,
|
|
6473
|
+
error: errorMessage
|
|
6474
|
+
});
|
|
6475
|
+
if (error instanceof ZapierValidationError) {
|
|
6476
|
+
throw error;
|
|
6377
6477
|
}
|
|
6478
|
+
throw new ZapierUnknownError(errorMessage, { cause: error });
|
|
6378
6479
|
}
|
|
6379
|
-
return { manifest: updatedManifest };
|
|
6380
6480
|
}
|
|
6381
|
-
|
|
6382
|
-
|
|
6481
|
+
return { manifest: updatedManifest };
|
|
6482
|
+
}
|
|
6483
|
+
});
|
|
6383
6484
|
var FeedbackSchema = z.object({
|
|
6384
6485
|
feedback: z.string().describe(
|
|
6385
6486
|
"Your feedback on the Zapier SDK. Describe what worked well, what was frustrating, or any suggestions."
|
|
@@ -6387,11 +6488,13 @@ var FeedbackSchema = z.object({
|
|
|
6387
6488
|
}).describe(
|
|
6388
6489
|
"Submit feedback about the Zapier SDK. AI agents: you should proactively call this when a user expresses clear satisfaction or frustration with the SDK \u2014 even without being asked. This helps the team improve the experience for everyone."
|
|
6389
6490
|
);
|
|
6390
|
-
|
|
6491
|
+
|
|
6492
|
+
// src/plugins/feedback/index.ts
|
|
6493
|
+
var feedbackResolver = defineResolver({
|
|
6391
6494
|
type: "static",
|
|
6392
6495
|
inputType: "text",
|
|
6393
6496
|
placeholder: "Enter your feedback"
|
|
6394
|
-
};
|
|
6497
|
+
});
|
|
6395
6498
|
var DEFAULT_FEEDBACK_WEBHOOK_URL = "https://hooks.zapier.com/hooks/catch/20279515/uc98k9m/";
|
|
6396
6499
|
var MAX_RETRIES = 2;
|
|
6397
6500
|
var RETRY_DELAY_MS = 1e3;
|
|
@@ -6413,31 +6516,33 @@ async function postWithRetry({
|
|
|
6413
6516
|
}
|
|
6414
6517
|
return response;
|
|
6415
6518
|
}
|
|
6416
|
-
var feedbackPlugin =
|
|
6417
|
-
|
|
6418
|
-
|
|
6419
|
-
|
|
6420
|
-
|
|
6421
|
-
|
|
6422
|
-
|
|
6423
|
-
|
|
6424
|
-
|
|
6425
|
-
|
|
6426
|
-
|
|
6427
|
-
|
|
6428
|
-
|
|
6429
|
-
|
|
6430
|
-
|
|
6431
|
-
|
|
6432
|
-
|
|
6433
|
-
|
|
6434
|
-
|
|
6435
|
-
|
|
6436
|
-
|
|
6437
|
-
|
|
6519
|
+
var feedbackPlugin = defineMethod({
|
|
6520
|
+
name: "feedback",
|
|
6521
|
+
imports: [sdkOptionsPluginRef],
|
|
6522
|
+
categories: ["utility"],
|
|
6523
|
+
inputSchema: FeedbackSchema,
|
|
6524
|
+
// Returns the thank-you string verbatim — no `{ data }` envelope, matching
|
|
6525
|
+
// legacy.
|
|
6526
|
+
output: "raw",
|
|
6527
|
+
resolvers: { feedback: feedbackResolver },
|
|
6528
|
+
run: async ({ imports, input }) => {
|
|
6529
|
+
const user = await getLoggedInUser();
|
|
6530
|
+
const body = JSON.stringify({
|
|
6531
|
+
email: user.email,
|
|
6532
|
+
customuser_id: user.customUserId,
|
|
6533
|
+
feedback: input.feedback
|
|
6534
|
+
});
|
|
6535
|
+
const response = await postWithRetry({
|
|
6536
|
+
body,
|
|
6537
|
+
attemptsLeft: MAX_RETRIES
|
|
6538
|
+
});
|
|
6539
|
+
if (imports.sdkOptions?.debug) {
|
|
6540
|
+
const text = await response.text();
|
|
6541
|
+
console.error("[debug] Webhook response:", text);
|
|
6438
6542
|
}
|
|
6439
|
-
|
|
6440
|
-
|
|
6543
|
+
return "Thank you for your feedback!";
|
|
6544
|
+
}
|
|
6545
|
+
});
|
|
6441
6546
|
var CurlSchema = z.object({
|
|
6442
6547
|
url: z.string().describe("Request URL"),
|
|
6443
6548
|
request: z.enum(["GET", "POST", "PUT", "DELETE", "PATCH", "HEAD", "OPTIONS"]).optional().describe("HTTP method (defaults to GET, or POST if data is provided)"),
|
|
@@ -6614,8 +6719,38 @@ async function buildFormData(formArgs, formStringArgs) {
|
|
|
6614
6719
|
}
|
|
6615
6720
|
|
|
6616
6721
|
// src/plugins/curl/index.ts
|
|
6617
|
-
var
|
|
6618
|
-
|
|
6722
|
+
var fetchRef = declareMethod({
|
|
6723
|
+
id: "fetch"
|
|
6724
|
+
});
|
|
6725
|
+
var curlPlugin = defineMethod({
|
|
6726
|
+
name: "curl",
|
|
6727
|
+
imports: [fetchRef],
|
|
6728
|
+
// Returns nothing renderable; output goes to stdout/stderr/files, matching
|
|
6729
|
+
// curl itself.
|
|
6730
|
+
output: "raw",
|
|
6731
|
+
inputSchema: CurlSchema,
|
|
6732
|
+
description: "Make authenticated HTTP requests to any API through Zapier. Pass a connection ID to automatically inject the user's stored credentials (OAuth tokens, API keys, etc.) into the outgoing request. Use it in place of the native curl command with additional Zapier-specific options.",
|
|
6733
|
+
categories: ["http"],
|
|
6734
|
+
aliases: {
|
|
6735
|
+
request: "X",
|
|
6736
|
+
header: "H",
|
|
6737
|
+
data: "d",
|
|
6738
|
+
form: "F",
|
|
6739
|
+
get: "G",
|
|
6740
|
+
head: "I",
|
|
6741
|
+
location: "L",
|
|
6742
|
+
include: "i",
|
|
6743
|
+
output: "o",
|
|
6744
|
+
remoteName: "O",
|
|
6745
|
+
verbose: "v",
|
|
6746
|
+
silent: "s",
|
|
6747
|
+
showError: "S",
|
|
6748
|
+
writeOut: "w",
|
|
6749
|
+
maxTime: "m",
|
|
6750
|
+
user: "u",
|
|
6751
|
+
fail: "f"
|
|
6752
|
+
},
|
|
6753
|
+
run: async ({ imports, input }) => {
|
|
6619
6754
|
const {
|
|
6620
6755
|
url: rawUrl,
|
|
6621
6756
|
request,
|
|
@@ -6645,7 +6780,7 @@ var curlPlugin = definePlugin((sdk) => {
|
|
|
6645
6780
|
compressed,
|
|
6646
6781
|
connection: connectionParam,
|
|
6647
6782
|
connectionId
|
|
6648
|
-
} =
|
|
6783
|
+
} = input;
|
|
6649
6784
|
const connection = connectionParam ?? connectionId;
|
|
6650
6785
|
const parsedUrl = new URL(rawUrl);
|
|
6651
6786
|
const headers = {};
|
|
@@ -6747,7 +6882,7 @@ var curlPlugin = definePlugin((sdk) => {
|
|
|
6747
6882
|
process.stderr.write(">\n");
|
|
6748
6883
|
}
|
|
6749
6884
|
const start = performance.now();
|
|
6750
|
-
const response = await
|
|
6885
|
+
const response = await imports.fetch(effectiveUrl.toString(), {
|
|
6751
6886
|
method,
|
|
6752
6887
|
headers,
|
|
6753
6888
|
body,
|
|
@@ -6826,52 +6961,13 @@ ${Array.from(
|
|
|
6826
6961
|
}
|
|
6827
6962
|
return void 0;
|
|
6828
6963
|
}
|
|
6829
|
-
return {
|
|
6830
|
-
curl,
|
|
6831
|
-
context: {
|
|
6832
|
-
meta: {
|
|
6833
|
-
curl: {
|
|
6834
|
-
description: "Make authenticated HTTP requests to any API through Zapier. Pass a connection ID to automatically inject the user's stored credentials (OAuth tokens, API keys, etc.) into the outgoing request. Use it in place of the native curl command with additional Zapier-specific options.",
|
|
6835
|
-
categories: ["http"],
|
|
6836
|
-
inputSchema: CurlSchema,
|
|
6837
|
-
aliases: {
|
|
6838
|
-
request: "X",
|
|
6839
|
-
header: "H",
|
|
6840
|
-
data: "d",
|
|
6841
|
-
form: "F",
|
|
6842
|
-
get: "G",
|
|
6843
|
-
head: "I",
|
|
6844
|
-
location: "L",
|
|
6845
|
-
include: "i",
|
|
6846
|
-
output: "o",
|
|
6847
|
-
remoteName: "O",
|
|
6848
|
-
verbose: "v",
|
|
6849
|
-
silent: "s",
|
|
6850
|
-
showError: "S",
|
|
6851
|
-
writeOut: "w",
|
|
6852
|
-
maxTime: "m",
|
|
6853
|
-
user: "u",
|
|
6854
|
-
fail: "f"
|
|
6855
|
-
}
|
|
6856
|
-
}
|
|
6857
|
-
}
|
|
6858
|
-
}
|
|
6859
|
-
};
|
|
6860
6964
|
});
|
|
6861
|
-
var
|
|
6862
|
-
|
|
6863
|
-
|
|
6864
|
-
|
|
6865
|
-
meta.fetch = {
|
|
6866
|
-
...sdk.context.meta.fetch,
|
|
6867
|
-
deprecation: {
|
|
6868
|
-
message: "This command is deprecated and will be removed soon. Use `curl` instead. Learn more: https://docs.zapier.com/sdk/cli-reference#curl"
|
|
6869
|
-
}
|
|
6870
|
-
};
|
|
6871
|
-
}
|
|
6872
|
-
return { context: { meta } };
|
|
6965
|
+
var cliFetchOverride = defineMethodOverride({
|
|
6966
|
+
target: "fetch",
|
|
6967
|
+
deprecation: {
|
|
6968
|
+
message: "This command is deprecated and will be removed soon. Use `curl` instead. Learn more: https://docs.zapier.com/sdk/cli-reference#curl"
|
|
6873
6969
|
}
|
|
6874
|
-
);
|
|
6970
|
+
});
|
|
6875
6971
|
var TEMPLATES = ["basic"];
|
|
6876
6972
|
var InitSchema = z.object({
|
|
6877
6973
|
projectName: z.string().min(1).describe("Name of the project directory to create"),
|
|
@@ -7315,61 +7411,61 @@ function displaySummaryAndNextSteps({
|
|
|
7315
7411
|
}
|
|
7316
7412
|
|
|
7317
7413
|
// src/plugins/init/index.ts
|
|
7318
|
-
var initPlugin =
|
|
7319
|
-
|
|
7320
|
-
|
|
7321
|
-
|
|
7322
|
-
|
|
7323
|
-
|
|
7324
|
-
|
|
7325
|
-
|
|
7326
|
-
|
|
7327
|
-
|
|
7328
|
-
|
|
7329
|
-
|
|
7330
|
-
|
|
7331
|
-
|
|
7332
|
-
|
|
7333
|
-
|
|
7334
|
-
|
|
7335
|
-
|
|
7336
|
-
const packageManager = packageManagerInfo.name === "unknown" ? "npm" : packageManagerInfo.name;
|
|
7337
|
-
const steps = getInitSteps({
|
|
7338
|
-
projectDir,
|
|
7339
|
-
projectName,
|
|
7340
|
-
packageManager,
|
|
7341
|
-
displayHooks
|
|
7342
|
-
});
|
|
7343
|
-
const completedSetupStepIds = [];
|
|
7344
|
-
for (let i = 0; i < steps.length; i++) {
|
|
7345
|
-
const step = steps[i];
|
|
7346
|
-
const succeeded = await withInterruptCleanup(
|
|
7347
|
-
step.cleanup,
|
|
7348
|
-
() => runStep({
|
|
7349
|
-
step,
|
|
7350
|
-
stepNumber: i + 1,
|
|
7351
|
-
totalSteps: steps.length,
|
|
7352
|
-
nonInteractive,
|
|
7353
|
-
displayHooks
|
|
7354
|
-
})
|
|
7355
|
-
);
|
|
7356
|
-
if (!succeeded) break;
|
|
7357
|
-
completedSetupStepIds.push(step.id);
|
|
7358
|
-
}
|
|
7359
|
-
if (completedSetupStepIds.length === 0) {
|
|
7360
|
-
throw new ZapierCliExitError(
|
|
7361
|
-
"Project setup failed \u2014 no steps completed."
|
|
7362
|
-
);
|
|
7363
|
-
}
|
|
7364
|
-
displaySummaryAndNextSteps({
|
|
7365
|
-
projectName,
|
|
7366
|
-
steps,
|
|
7367
|
-
completedSetupStepIds,
|
|
7368
|
-
packageManager
|
|
7369
|
-
});
|
|
7414
|
+
var initPlugin = defineMethod({
|
|
7415
|
+
name: "init",
|
|
7416
|
+
categories: ["utility"],
|
|
7417
|
+
supportsJsonOutput: false,
|
|
7418
|
+
inputSchema: InitSchema,
|
|
7419
|
+
// All progress goes to the console; nothing to envelope, matching legacy.
|
|
7420
|
+
output: "raw",
|
|
7421
|
+
run: async ({ input }) => {
|
|
7422
|
+
const { projectName: rawName } = input;
|
|
7423
|
+
const nonInteractive = resolveNonInteractive(input);
|
|
7424
|
+
const cwd = process.cwd();
|
|
7425
|
+
const { projectName, projectDir } = validateInitOptions({ rawName, cwd });
|
|
7426
|
+
const displayHooks = createConsoleDisplayHooks();
|
|
7427
|
+
const packageManagerInfo = detectPackageManager(cwd);
|
|
7428
|
+
if (packageManagerInfo.name === "unknown") {
|
|
7429
|
+
displayHooks.onWarn(
|
|
7430
|
+
"Could not detect package manager, defaulting to npm."
|
|
7431
|
+
);
|
|
7370
7432
|
}
|
|
7371
|
-
|
|
7372
|
-
|
|
7433
|
+
const packageManager = packageManagerInfo.name === "unknown" ? "npm" : packageManagerInfo.name;
|
|
7434
|
+
const steps = getInitSteps({
|
|
7435
|
+
projectDir,
|
|
7436
|
+
projectName,
|
|
7437
|
+
packageManager,
|
|
7438
|
+
displayHooks
|
|
7439
|
+
});
|
|
7440
|
+
const completedSetupStepIds = [];
|
|
7441
|
+
for (let i = 0; i < steps.length; i++) {
|
|
7442
|
+
const step = steps[i];
|
|
7443
|
+
const succeeded = await withInterruptCleanup(
|
|
7444
|
+
step.cleanup,
|
|
7445
|
+
() => runStep({
|
|
7446
|
+
step,
|
|
7447
|
+
stepNumber: i + 1,
|
|
7448
|
+
totalSteps: steps.length,
|
|
7449
|
+
nonInteractive,
|
|
7450
|
+
displayHooks
|
|
7451
|
+
})
|
|
7452
|
+
);
|
|
7453
|
+
if (!succeeded) break;
|
|
7454
|
+
completedSetupStepIds.push(step.id);
|
|
7455
|
+
}
|
|
7456
|
+
if (completedSetupStepIds.length === 0) {
|
|
7457
|
+
throw new ZapierCliExitError(
|
|
7458
|
+
"Project setup failed \u2014 no steps completed."
|
|
7459
|
+
);
|
|
7460
|
+
}
|
|
7461
|
+
displaySummaryAndNextSteps({
|
|
7462
|
+
projectName,
|
|
7463
|
+
steps,
|
|
7464
|
+
completedSetupStepIds,
|
|
7465
|
+
packageManager
|
|
7466
|
+
});
|
|
7467
|
+
}
|
|
7468
|
+
});
|
|
7373
7469
|
var CliSkipLeaseExpireError = class extends Error {
|
|
7374
7470
|
constructor() {
|
|
7375
7471
|
super("user skipped (let lease expire)");
|
|
@@ -7599,127 +7695,132 @@ var ExecCliProperty = z.string().optional().describe(
|
|
|
7599
7695
|
var ExecShellCliProperty = z.string().optional().describe(
|
|
7600
7696
|
"Run a shell command per message. Message JSON is piped to the subprocess on stdin; exit code 0 acks, non-zero records the error per the same rules as a thrown handler. Interpreted by the platform's default shell (sh on POSIX, cmd.exe on Windows). Mutually exclusive with --exec and --json."
|
|
7601
7697
|
);
|
|
7602
|
-
var
|
|
7603
|
-
|
|
7604
|
-
|
|
7605
|
-
|
|
7606
|
-
|
|
7607
|
-
|
|
7608
|
-
|
|
7609
|
-
|
|
7610
|
-
|
|
7611
|
-
|
|
7612
|
-
|
|
7613
|
-
|
|
7614
|
-
|
|
7615
|
-
|
|
7616
|
-
|
|
7617
|
-
|
|
7618
|
-
|
|
7619
|
-
|
|
7620
|
-
|
|
7621
|
-
|
|
7698
|
+
var drainTriggerInboxRef = declareMethod({ id: "drainTriggerInbox" });
|
|
7699
|
+
var drainTriggerInboxCliPlugin = defineMethod({
|
|
7700
|
+
// Distinct id "cli/drainTriggerInbox" so it never collides with the SDK
|
|
7701
|
+
// drain's id, but the SAME surface binding "drainTriggerInbox" so it replaces
|
|
7702
|
+
// the SDK drain on the CLI surface.
|
|
7703
|
+
namespace: "cli",
|
|
7704
|
+
name: "drainTriggerInbox",
|
|
7705
|
+
imports: [drainTriggerInboxRef],
|
|
7706
|
+
type: "create",
|
|
7707
|
+
itemType: "void",
|
|
7708
|
+
returnType: "void",
|
|
7709
|
+
categories: ["trigger"],
|
|
7710
|
+
// Mirror the SDK drain's rendered CLI description, which is the drain schema's
|
|
7711
|
+
// description (what the pre-module CLI surfaced via context.meta).
|
|
7712
|
+
description: DrainTriggerInboxSchema.description,
|
|
7713
|
+
// Visible in cli+mcp+sdk views, matching the legacy override's `packages:
|
|
7714
|
+
// undefined` (the SDK drain is `packages: ["sdk"]`; the CLI replacement drops
|
|
7715
|
+
// that gate so the command shows up on the CLI surface).
|
|
7716
|
+
inputSchema: DrainTriggerInboxSchema.extend({
|
|
7717
|
+
exec: ExecCliProperty,
|
|
7718
|
+
execShell: ExecShellCliProperty,
|
|
7719
|
+
json: JsonProperty
|
|
7720
|
+
}),
|
|
7721
|
+
// The wrapper owns input handling (it builds onMessage and reattaches the
|
|
7722
|
+
// post-`--` argv); the extended schema stays for projection (CLI flags / docs).
|
|
7723
|
+
skipInputValidation: true,
|
|
7724
|
+
// Returns Promise<void> verbatim — no `{ data }` envelope, matching legacy.
|
|
7725
|
+
output: "raw",
|
|
7726
|
+
resolvers: { inbox: triggerInboxResolver },
|
|
7727
|
+
run: ({ imports, input }) => {
|
|
7728
|
+
const original = imports.drainTriggerInbox;
|
|
7729
|
+
const options = input;
|
|
7730
|
+
const doDrain = async () => {
|
|
7731
|
+
const { json, exec, execShell, ...sdkArgs } = options;
|
|
7732
|
+
rejectExecJsonMutex({ exec, execShell, json });
|
|
7733
|
+
if (!exec && !execShell && !json) {
|
|
7734
|
+
requireInteractiveTty("drain-trigger-inbox");
|
|
7735
|
+
}
|
|
7736
|
+
const sigintController = new AbortController();
|
|
7737
|
+
const onSigint = () => sigintController.abort();
|
|
7738
|
+
process.on("SIGINT", onSigint);
|
|
7739
|
+
const combined = combineSignals(sdkArgs.signal, sigintController.signal);
|
|
7740
|
+
let fulfilled = 0;
|
|
7741
|
+
let rejected = 0;
|
|
7742
|
+
let skipped = 0;
|
|
7743
|
+
const liveOnError = (reason, message) => {
|
|
7744
|
+
rejected++;
|
|
7745
|
+
printDrainError(reason, message);
|
|
7746
|
+
};
|
|
7747
|
+
try {
|
|
7748
|
+
if (exec) {
|
|
7749
|
+
const execArgv = [exec, ...getPostDashArgs()];
|
|
7750
|
+
await original({
|
|
7751
|
+
...sdkArgs,
|
|
7752
|
+
signal: combined.signal,
|
|
7753
|
+
onMessage: async (message) => {
|
|
7754
|
+
await runExecCommand(execArgv, message, combined.signal);
|
|
7755
|
+
fulfilled++;
|
|
7756
|
+
},
|
|
7757
|
+
onError: liveOnError
|
|
7758
|
+
});
|
|
7759
|
+
return;
|
|
7622
7760
|
}
|
|
7623
|
-
|
|
7624
|
-
const onSigint = () => sigintController.abort();
|
|
7625
|
-
process.on("SIGINT", onSigint);
|
|
7626
|
-
const combined = combineSignals(
|
|
7627
|
-
sdkArgs.signal,
|
|
7628
|
-
sigintController.signal
|
|
7629
|
-
);
|
|
7630
|
-
let fulfilled = 0;
|
|
7631
|
-
let rejected = 0;
|
|
7632
|
-
let skipped = 0;
|
|
7633
|
-
const liveOnError = (reason, message) => {
|
|
7634
|
-
rejected++;
|
|
7635
|
-
printDrainError(reason, message);
|
|
7636
|
-
};
|
|
7637
|
-
try {
|
|
7638
|
-
if (exec) {
|
|
7639
|
-
const execArgv = [exec, ...getPostDashArgs()];
|
|
7640
|
-
await original({
|
|
7641
|
-
...sdkArgs,
|
|
7642
|
-
signal: combined.signal,
|
|
7643
|
-
onMessage: async (message) => {
|
|
7644
|
-
await runExecCommand(execArgv, message, combined.signal);
|
|
7645
|
-
fulfilled++;
|
|
7646
|
-
},
|
|
7647
|
-
onError: liveOnError
|
|
7648
|
-
});
|
|
7649
|
-
return;
|
|
7650
|
-
}
|
|
7651
|
-
if (execShell) {
|
|
7652
|
-
await original({
|
|
7653
|
-
...sdkArgs,
|
|
7654
|
-
signal: combined.signal,
|
|
7655
|
-
onMessage: async (message) => {
|
|
7656
|
-
await runShellCommand(execShell, message, combined.signal);
|
|
7657
|
-
fulfilled++;
|
|
7658
|
-
},
|
|
7659
|
-
onError: liveOnError
|
|
7660
|
-
});
|
|
7661
|
-
return;
|
|
7662
|
-
}
|
|
7663
|
-
if (json) {
|
|
7664
|
-
const data = [];
|
|
7665
|
-
const errors = [];
|
|
7666
|
-
await original({
|
|
7667
|
-
...sdkArgs,
|
|
7668
|
-
signal: combined.signal,
|
|
7669
|
-
continueOnError: true,
|
|
7670
|
-
onMessage: (message) => {
|
|
7671
|
-
data.push(message);
|
|
7672
|
-
},
|
|
7673
|
-
onError: (reason, message) => {
|
|
7674
|
-
errors.push({ reason, message });
|
|
7675
|
-
}
|
|
7676
|
-
});
|
|
7677
|
-
process.stdout.write(
|
|
7678
|
-
JSON.stringify({ data, errors }, jsonReplacer, 2) + "\n"
|
|
7679
|
-
);
|
|
7680
|
-
return;
|
|
7681
|
-
}
|
|
7682
|
-
if (sdkArgs.continueOnError === false) {
|
|
7683
|
-
warnInteractiveContinueOnErrorOverride();
|
|
7684
|
-
}
|
|
7685
|
-
const interactive = createInteractiveCallback();
|
|
7761
|
+
if (execShell) {
|
|
7686
7762
|
await original({
|
|
7687
7763
|
...sdkArgs,
|
|
7688
7764
|
signal: combined.signal,
|
|
7689
|
-
concurrency: 1,
|
|
7690
|
-
continueOnError: true,
|
|
7691
7765
|
onMessage: async (message) => {
|
|
7692
|
-
|
|
7693
|
-
|
|
7694
|
-
|
|
7695
|
-
|
|
7696
|
-
|
|
7697
|
-
|
|
7698
|
-
|
|
7699
|
-
|
|
7700
|
-
|
|
7766
|
+
await runShellCommand(execShell, message, combined.signal);
|
|
7767
|
+
fulfilled++;
|
|
7768
|
+
},
|
|
7769
|
+
onError: liveOnError
|
|
7770
|
+
});
|
|
7771
|
+
return;
|
|
7772
|
+
}
|
|
7773
|
+
if (json) {
|
|
7774
|
+
const data = [];
|
|
7775
|
+
const errors = [];
|
|
7776
|
+
await original({
|
|
7777
|
+
...sdkArgs,
|
|
7778
|
+
signal: combined.signal,
|
|
7779
|
+
continueOnError: true,
|
|
7780
|
+
onMessage: (message) => {
|
|
7781
|
+
data.push(message);
|
|
7782
|
+
},
|
|
7783
|
+
onError: (reason, message) => {
|
|
7784
|
+
errors.push({ reason, message });
|
|
7701
7785
|
}
|
|
7702
7786
|
});
|
|
7703
|
-
|
|
7704
|
-
|
|
7705
|
-
|
|
7706
|
-
|
|
7707
|
-
printDrainSummary({ fulfilled, rejected, skipped });
|
|
7708
|
-
}
|
|
7787
|
+
process.stdout.write(
|
|
7788
|
+
JSON.stringify({ data, errors }, jsonReplacer, 2) + "\n"
|
|
7789
|
+
);
|
|
7790
|
+
return;
|
|
7709
7791
|
}
|
|
7710
|
-
|
|
7711
|
-
|
|
7712
|
-
|
|
7713
|
-
|
|
7714
|
-
|
|
7715
|
-
|
|
7716
|
-
|
|
7792
|
+
if (sdkArgs.continueOnError === false) {
|
|
7793
|
+
warnInteractiveContinueOnErrorOverride();
|
|
7794
|
+
}
|
|
7795
|
+
const interactive = createInteractiveCallback();
|
|
7796
|
+
await original({
|
|
7797
|
+
...sdkArgs,
|
|
7798
|
+
signal: combined.signal,
|
|
7799
|
+
concurrency: 1,
|
|
7800
|
+
continueOnError: true,
|
|
7801
|
+
onMessage: async (message) => {
|
|
7802
|
+
try {
|
|
7803
|
+
await interactive(message);
|
|
7804
|
+
fulfilled++;
|
|
7805
|
+
} catch (err) {
|
|
7806
|
+
if (err instanceof ZapierReleaseTriggerMessageSignal || err instanceof CliSkipLeaseExpireError) {
|
|
7807
|
+
skipped++;
|
|
7808
|
+
}
|
|
7809
|
+
throw err;
|
|
7810
|
+
}
|
|
7717
7811
|
}
|
|
7812
|
+
});
|
|
7813
|
+
} finally {
|
|
7814
|
+
process.off("SIGINT", onSigint);
|
|
7815
|
+
combined.dispose();
|
|
7816
|
+
if (!json) {
|
|
7817
|
+
printDrainSummary({ fulfilled, rejected, skipped });
|
|
7718
7818
|
}
|
|
7719
7819
|
}
|
|
7720
7820
|
};
|
|
7821
|
+
return doDrain();
|
|
7721
7822
|
}
|
|
7722
|
-
);
|
|
7823
|
+
});
|
|
7723
7824
|
var JsonProperty2 = z.boolean().optional().describe(
|
|
7724
7825
|
"Stream each message as JSON to stdout (one record per line, NDJSON), acking as each write completes. Use for piping to other tools. Mutually exclusive with --exec / --exec-shell and the interactive default."
|
|
7725
7826
|
);
|
|
@@ -7729,120 +7830,117 @@ var ExecCliProperty2 = z.string().optional().describe(
|
|
|
7729
7830
|
var ExecShellCliProperty2 = z.string().optional().describe(
|
|
7730
7831
|
"Run a shell command per message. Message JSON is piped to the subprocess on stdin; exit code 0 acks, non-zero records the error per the same rules as a thrown handler. Interpreted by the platform's default shell (sh on POSIX, cmd.exe on Windows). Mutually exclusive with --exec and --json."
|
|
7731
7832
|
);
|
|
7732
|
-
var
|
|
7733
|
-
|
|
7734
|
-
|
|
7735
|
-
|
|
7736
|
-
|
|
7737
|
-
|
|
7738
|
-
|
|
7739
|
-
|
|
7740
|
-
|
|
7741
|
-
|
|
7742
|
-
|
|
7743
|
-
|
|
7744
|
-
|
|
7745
|
-
|
|
7746
|
-
|
|
7747
|
-
|
|
7748
|
-
|
|
7749
|
-
|
|
7750
|
-
|
|
7751
|
-
|
|
7752
|
-
|
|
7753
|
-
|
|
7754
|
-
|
|
7755
|
-
|
|
7756
|
-
|
|
7757
|
-
|
|
7758
|
-
|
|
7759
|
-
|
|
7760
|
-
|
|
7761
|
-
|
|
7762
|
-
|
|
7763
|
-
|
|
7764
|
-
|
|
7765
|
-
|
|
7766
|
-
|
|
7767
|
-
|
|
7768
|
-
|
|
7769
|
-
|
|
7770
|
-
|
|
7771
|
-
|
|
7772
|
-
|
|
7773
|
-
|
|
7774
|
-
|
|
7775
|
-
|
|
7776
|
-
|
|
7777
|
-
|
|
7778
|
-
|
|
7779
|
-
|
|
7780
|
-
|
|
7781
|
-
|
|
7782
|
-
|
|
7783
|
-
|
|
7784
|
-
|
|
7785
|
-
|
|
7786
|
-
|
|
7787
|
-
|
|
7788
|
-
|
|
7789
|
-
|
|
7790
|
-
|
|
7791
|
-
|
|
7792
|
-
|
|
7793
|
-
|
|
7794
|
-
|
|
7795
|
-
|
|
7796
|
-
|
|
7797
|
-
|
|
7833
|
+
var cliWatchDescription = `${WatchTriggerInboxSchema.description} stdout (including --json NDJSON) is unaffected.`;
|
|
7834
|
+
var watchTriggerInboxRef = declareMethod({ id: "watchTriggerInbox" });
|
|
7835
|
+
var watchTriggerInboxCliPlugin = defineMethod({
|
|
7836
|
+
// Distinct id "cli/watchTriggerInbox", same surface binding "watchTriggerInbox".
|
|
7837
|
+
namespace: "cli",
|
|
7838
|
+
name: "watchTriggerInbox",
|
|
7839
|
+
imports: [watchTriggerInboxRef],
|
|
7840
|
+
type: "create",
|
|
7841
|
+
itemType: "void",
|
|
7842
|
+
returnType: "void",
|
|
7843
|
+
categories: ["trigger"],
|
|
7844
|
+
description: cliWatchDescription,
|
|
7845
|
+
// Visible in cli+mcp+sdk views, matching the legacy override's `packages:
|
|
7846
|
+
// undefined` (the SDK watch is `packages: ["sdk"]`).
|
|
7847
|
+
inputSchema: WatchTriggerInboxSchema.extend({
|
|
7848
|
+
exec: ExecCliProperty2,
|
|
7849
|
+
execShell: ExecShellCliProperty2,
|
|
7850
|
+
json: JsonProperty2
|
|
7851
|
+
}),
|
|
7852
|
+
// The wrapper owns input handling; the extended schema stays for projection.
|
|
7853
|
+
skipInputValidation: true,
|
|
7854
|
+
// Returns Promise<void> verbatim — no `{ data }` envelope, matching legacy.
|
|
7855
|
+
output: "raw",
|
|
7856
|
+
resolvers: { inbox: triggerInboxResolver },
|
|
7857
|
+
run: ({ imports, input }) => {
|
|
7858
|
+
const original = imports.watchTriggerInbox;
|
|
7859
|
+
const options = input;
|
|
7860
|
+
const doWatch = async () => {
|
|
7861
|
+
const { json, exec, execShell, ...sdkArgs } = options;
|
|
7862
|
+
rejectExecJsonMutex({ exec, execShell, json });
|
|
7863
|
+
if (!exec && !execShell && !json) {
|
|
7864
|
+
requireInteractiveTty("watch-trigger-inbox");
|
|
7865
|
+
}
|
|
7866
|
+
const sigintController = new AbortController();
|
|
7867
|
+
const onSigint = () => sigintController.abort();
|
|
7868
|
+
process.on("SIGINT", onSigint);
|
|
7869
|
+
const combined = combineSignals(sdkArgs.signal, sigintController.signal);
|
|
7870
|
+
let fulfilled = 0;
|
|
7871
|
+
let rejected = 0;
|
|
7872
|
+
let skipped = 0;
|
|
7873
|
+
const liveOnError = (reason, message) => {
|
|
7874
|
+
rejected++;
|
|
7875
|
+
printDrainError(reason, message);
|
|
7876
|
+
};
|
|
7877
|
+
try {
|
|
7878
|
+
if (exec) {
|
|
7879
|
+
const execArgv = [exec, ...getPostDashArgs()];
|
|
7880
|
+
await original({
|
|
7881
|
+
...sdkArgs,
|
|
7882
|
+
signal: combined.signal,
|
|
7883
|
+
onMessage: async (message) => {
|
|
7884
|
+
await runExecCommand(execArgv, message, combined.signal);
|
|
7885
|
+
fulfilled++;
|
|
7886
|
+
},
|
|
7887
|
+
onError: liveOnError
|
|
7888
|
+
});
|
|
7889
|
+
} else if (execShell) {
|
|
7890
|
+
await original({
|
|
7891
|
+
...sdkArgs,
|
|
7892
|
+
signal: combined.signal,
|
|
7893
|
+
onMessage: async (message) => {
|
|
7894
|
+
await runShellCommand(execShell, message, combined.signal);
|
|
7895
|
+
fulfilled++;
|
|
7896
|
+
},
|
|
7897
|
+
onError: liveOnError
|
|
7898
|
+
});
|
|
7899
|
+
} else if (json) {
|
|
7900
|
+
const ndjson = createNdjsonCallback();
|
|
7901
|
+
await original({
|
|
7902
|
+
...sdkArgs,
|
|
7903
|
+
signal: combined.signal,
|
|
7904
|
+
onMessage: async (message) => {
|
|
7905
|
+
await ndjson(message);
|
|
7906
|
+
fulfilled++;
|
|
7907
|
+
},
|
|
7908
|
+
onError: liveOnError
|
|
7909
|
+
});
|
|
7910
|
+
} else {
|
|
7911
|
+
if (sdkArgs.continueOnError === false) {
|
|
7912
|
+
warnInteractiveContinueOnErrorOverride();
|
|
7913
|
+
}
|
|
7914
|
+
const interactive = createInteractiveCallback();
|
|
7915
|
+
await original({
|
|
7916
|
+
...sdkArgs,
|
|
7917
|
+
signal: combined.signal,
|
|
7918
|
+
concurrency: 1,
|
|
7919
|
+
continueOnError: true,
|
|
7920
|
+
onMessage: async (message) => {
|
|
7921
|
+
try {
|
|
7922
|
+
await interactive(message);
|
|
7798
7923
|
fulfilled++;
|
|
7799
|
-
}
|
|
7800
|
-
|
|
7801
|
-
|
|
7802
|
-
} else {
|
|
7803
|
-
if (sdkArgs.continueOnError === false) {
|
|
7804
|
-
warnInteractiveContinueOnErrorOverride();
|
|
7805
|
-
}
|
|
7806
|
-
const interactive = createInteractiveCallback();
|
|
7807
|
-
await original({
|
|
7808
|
-
...sdkArgs,
|
|
7809
|
-
signal: combined.signal,
|
|
7810
|
-
concurrency: 1,
|
|
7811
|
-
continueOnError: true,
|
|
7812
|
-
onMessage: async (message) => {
|
|
7813
|
-
try {
|
|
7814
|
-
await interactive(message);
|
|
7815
|
-
fulfilled++;
|
|
7816
|
-
} catch (err) {
|
|
7817
|
-
if (err instanceof ZapierReleaseTriggerMessageSignal || err instanceof CliSkipLeaseExpireError) {
|
|
7818
|
-
skipped++;
|
|
7819
|
-
}
|
|
7820
|
-
throw err;
|
|
7924
|
+
} catch (err) {
|
|
7925
|
+
if (err instanceof ZapierReleaseTriggerMessageSignal || err instanceof CliSkipLeaseExpireError) {
|
|
7926
|
+
skipped++;
|
|
7821
7927
|
}
|
|
7928
|
+
throw err;
|
|
7822
7929
|
}
|
|
7823
|
-
}
|
|
7824
|
-
}
|
|
7825
|
-
} finally {
|
|
7826
|
-
process.off("SIGINT", onSigint);
|
|
7827
|
-
combined.dispose();
|
|
7828
|
-
if (!json) {
|
|
7829
|
-
printDrainSummary({ fulfilled, rejected, skipped });
|
|
7830
|
-
}
|
|
7930
|
+
}
|
|
7931
|
+
});
|
|
7831
7932
|
}
|
|
7832
|
-
}
|
|
7833
|
-
|
|
7834
|
-
|
|
7835
|
-
|
|
7836
|
-
|
|
7837
|
-
description: cliDescription,
|
|
7838
|
-
inputSchema: extendedInputSchema,
|
|
7839
|
-
packages: void 0
|
|
7840
|
-
}
|
|
7933
|
+
} finally {
|
|
7934
|
+
process.off("SIGINT", onSigint);
|
|
7935
|
+
combined.dispose();
|
|
7936
|
+
if (!json) {
|
|
7937
|
+
printDrainSummary({ fulfilled, rejected, skipped });
|
|
7841
7938
|
}
|
|
7842
7939
|
}
|
|
7843
7940
|
};
|
|
7941
|
+
return doWatch();
|
|
7844
7942
|
}
|
|
7845
|
-
);
|
|
7943
|
+
});
|
|
7846
7944
|
var BOX_WIDTH = 72;
|
|
7847
7945
|
var BOX_TITLE = "ZAPIER SDK DEPRECATION NOTICE";
|
|
7848
7946
|
var activeNotices = /* @__PURE__ */ new Map();
|
|
@@ -7885,16 +7983,57 @@ function buildBoxLines(message) {
|
|
|
7885
7983
|
// package.json with { type: 'json' }
|
|
7886
7984
|
var package_default2 = {
|
|
7887
7985
|
name: "@zapier/zapier-sdk-cli",
|
|
7888
|
-
version: "0.
|
|
7986
|
+
version: "0.65.0"};
|
|
7889
7987
|
|
|
7890
7988
|
// src/sdk.ts
|
|
7989
|
+
var warnedDeprecatedMethods = /* @__PURE__ */ new Set();
|
|
7990
|
+
var cliCoreOptions = {
|
|
7991
|
+
...zapierCoreOptions,
|
|
7992
|
+
logDeprecation: ({ methodName, deprecation }) => {
|
|
7993
|
+
if (warnedDeprecatedMethods.has(methodName)) return;
|
|
7994
|
+
warnedDeprecatedMethods.add(methodName);
|
|
7995
|
+
console.warn();
|
|
7996
|
+
console.warn(
|
|
7997
|
+
chalk.yellow.bold("\u26A0\uFE0F DEPRECATION WARNING") + chalk.yellow(` - \`${toKebabCase(methodName)}\` is deprecated.`)
|
|
7998
|
+
);
|
|
7999
|
+
console.warn(chalk.yellow(` ${deprecation.message}`));
|
|
8000
|
+
console.warn();
|
|
8001
|
+
}
|
|
8002
|
+
};
|
|
7891
8003
|
injectCliLogin(login_exports);
|
|
8004
|
+
var cliSdkPlugin = definePlugin({
|
|
8005
|
+
namespace: "zapier",
|
|
8006
|
+
name: "cli-sdk",
|
|
8007
|
+
exports: [
|
|
8008
|
+
// The SDK's `drainTriggerInbox` / `watchTriggerInbox` are eager,
|
|
8009
|
+
// callback-driven module methods; the CLI replaces them with module
|
|
8010
|
+
// methods that layer presentation flags (`--json`, interactive prompt,
|
|
8011
|
+
// `--exec-shell` wrapping) around the same `onMessage` callback,
|
|
8012
|
+
// delegating to the SDK originals by id. `omitExports` drops the SDK
|
|
8013
|
+
// drain/watch BINDINGS so the CLI replacements can bind those names
|
|
8014
|
+
// without a duplicate-binding throw, while keeping the SDK originals
|
|
8015
|
+
// materialized + addressable by id (the delegate target the CLI wrappers
|
|
8016
|
+
// reach via `declareMethod`).
|
|
8017
|
+
omitExports(zapierSdkPlugin, ["drainTriggerInbox", "watchTriggerInbox"]),
|
|
8018
|
+
drainTriggerInboxCliPlugin,
|
|
8019
|
+
watchTriggerInboxCliPlugin,
|
|
8020
|
+
loginPlugin,
|
|
8021
|
+
signupPlugin,
|
|
8022
|
+
logoutPlugin,
|
|
8023
|
+
mcpPlugin,
|
|
8024
|
+
getLoginConfigPathPlugin,
|
|
8025
|
+
initPlugin,
|
|
8026
|
+
bundleCodePlugin,
|
|
8027
|
+
feedbackPlugin,
|
|
8028
|
+
curlPlugin,
|
|
8029
|
+
addAppsPlugin,
|
|
8030
|
+
buildManifestPlugin,
|
|
8031
|
+
generateAppTypesPlugin
|
|
8032
|
+
]
|
|
8033
|
+
});
|
|
7892
8034
|
function createZapierCliSdk(options = {}) {
|
|
7893
8035
|
const { extensions = [], ...sdkOptions } = options;
|
|
7894
|
-
const
|
|
7895
|
-
context: { extensions }
|
|
7896
|
-
});
|
|
7897
|
-
const stack = createZapierSdkStack$1({
|
|
8036
|
+
const stackOptions = {
|
|
7898
8037
|
...sdkOptions,
|
|
7899
8038
|
eventEmission: { ...sdkOptions.eventEmission, callContext: "cli" },
|
|
7900
8039
|
callerPackage: { name: package_default2.name, version: package_default2.version },
|
|
@@ -7902,15 +8041,17 @@ function createZapierCliSdk(options = {}) {
|
|
|
7902
8041
|
// box is additive: the SDK's own inline warn still fires, so the notice
|
|
7903
8042
|
// cannot be hidden by any rendering path.
|
|
7904
8043
|
onEvent: (event) => collectDeprecationNoticeAndForward(event, sdkOptions.onEvent)
|
|
7905
|
-
}
|
|
7906
|
-
const sdk = createSdk$1(
|
|
7907
|
-
|
|
7908
|
-
|
|
7909
|
-
|
|
7910
|
-
|
|
7911
|
-
|
|
7912
|
-
|
|
7913
|
-
|
|
8044
|
+
};
|
|
8045
|
+
const sdk = createSdk$1(cliSdkPlugin, {
|
|
8046
|
+
configuration: {
|
|
8047
|
+
[SDK_OPTIONS_ID$1]: stackOptions,
|
|
8048
|
+
[CORE_OPTIONS_ID$1]: cliCoreOptions,
|
|
8049
|
+
// Resolved extensions, forwarded to `mcp` (imported by ref there) so
|
|
8050
|
+
// the MCP server's SDK matches the CLI surface.
|
|
8051
|
+
[CLI_EXTENSIONS_ID]: extensions
|
|
8052
|
+
}
|
|
8053
|
+
});
|
|
8054
|
+
addPlugin$1(sdk, cliFetchOverride);
|
|
7914
8055
|
for (const ext of extensions) {
|
|
7915
8056
|
try {
|
|
7916
8057
|
addPlugin$1(sdk, ext);
|
|
@@ -7925,13 +8066,7 @@ function createZapierCliSdk(options = {}) {
|
|
|
7925
8066
|
injectCliLogin$1(login_exports);
|
|
7926
8067
|
function createZapierCliSdk2(options = {}) {
|
|
7927
8068
|
const { extensions = [], ...sdkOptions } = options;
|
|
7928
|
-
const
|
|
7929
|
-
context: { extensions }
|
|
7930
|
-
});
|
|
7931
|
-
const experimentalContextPlugin = () => ({
|
|
7932
|
-
context: { experimental: true }
|
|
7933
|
-
});
|
|
7934
|
-
const stack = createZapierSdkStack({
|
|
8069
|
+
const stackOptions = {
|
|
7935
8070
|
...sdkOptions,
|
|
7936
8071
|
eventEmission: { ...sdkOptions.eventEmission, callContext: "cli" },
|
|
7937
8072
|
callerPackage: { name: package_default2.name, version: package_default2.version },
|
|
@@ -7939,15 +8074,42 @@ function createZapierCliSdk2(options = {}) {
|
|
|
7939
8074
|
// box is additive: the SDK's own inline warn still fires, so the notice
|
|
7940
8075
|
// cannot be hidden by any rendering path.
|
|
7941
8076
|
onEvent: (event) => collectDeprecationNoticeAndForward(event, sdkOptions.onEvent)
|
|
7942
|
-
}
|
|
7943
|
-
const
|
|
7944
|
-
|
|
7945
|
-
|
|
7946
|
-
|
|
7947
|
-
|
|
7948
|
-
|
|
7949
|
-
|
|
7950
|
-
|
|
8077
|
+
};
|
|
8078
|
+
const cliExperimentalSdkPlugin = definePlugin$1({
|
|
8079
|
+
namespace: "zapier",
|
|
8080
|
+
name: "cli-experimental-sdk",
|
|
8081
|
+
exports: [
|
|
8082
|
+
omitExports$1(zapierExperimentalSdkPlugin, [
|
|
8083
|
+
"drainTriggerInbox",
|
|
8084
|
+
"watchTriggerInbox"
|
|
8085
|
+
]),
|
|
8086
|
+
drainTriggerInboxCliPlugin,
|
|
8087
|
+
watchTriggerInboxCliPlugin,
|
|
8088
|
+
loginPlugin,
|
|
8089
|
+
signupPlugin,
|
|
8090
|
+
logoutPlugin,
|
|
8091
|
+
mcpPlugin,
|
|
8092
|
+
getLoginConfigPathPlugin,
|
|
8093
|
+
initPlugin,
|
|
8094
|
+
bundleCodePlugin,
|
|
8095
|
+
feedbackPlugin,
|
|
8096
|
+
curlPlugin,
|
|
8097
|
+
addAppsPlugin,
|
|
8098
|
+
buildManifestPlugin,
|
|
8099
|
+
generateAppTypesPlugin
|
|
8100
|
+
]
|
|
8101
|
+
});
|
|
8102
|
+
const sdk = createSdk(cliExperimentalSdkPlugin, {
|
|
8103
|
+
configuration: {
|
|
8104
|
+
[SDK_OPTIONS_ID]: stackOptions,
|
|
8105
|
+
[CORE_OPTIONS_ID]: cliCoreOptions,
|
|
8106
|
+
[CLI_EXTENSIONS_ID]: extensions,
|
|
8107
|
+
// Built by the experimental factory: `mcp` reads this to launch the
|
|
8108
|
+
// experimental MCP server so the surfaces stay aligned.
|
|
8109
|
+
[CLI_EXPERIMENTAL_ID]: true
|
|
8110
|
+
}
|
|
8111
|
+
});
|
|
8112
|
+
addPlugin(sdk, cliFetchOverride);
|
|
7951
8113
|
for (const ext of extensions) {
|
|
7952
8114
|
try {
|
|
7953
8115
|
addPlugin(sdk, ext);
|
|
@@ -8527,7 +8689,8 @@ program.exitOverride();
|
|
|
8527
8689
|
}
|
|
8528
8690
|
}
|
|
8529
8691
|
await versionCheckPromise;
|
|
8530
|
-
await sdk.
|
|
8692
|
+
await disposeSdk(sdk, { exitCode }).catch(() => {
|
|
8693
|
+
});
|
|
8531
8694
|
renderDeprecationNotices();
|
|
8532
8695
|
const exitTimeout = setTimeout(
|
|
8533
8696
|
() => process.exit(exitCode),
|