@zapier/zapier-sdk-cli 0.61.0 → 0.61.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,24 @@
1
1
  # @zapier/zapier-sdk-cli
2
2
 
3
+ ## 0.61.2
4
+
5
+ ### Patch Changes
6
+
7
+ - 4fd8dce: _This release contains no user-facing changes._
8
+ - Updated dependencies [4fd8dce]
9
+ - @zapier/zapier-sdk@0.80.1
10
+ - @zapier/zapier-sdk-mcp@0.16.2
11
+
12
+ ## 0.61.1
13
+
14
+ ### Patch Changes
15
+
16
+ - 5e2cf0d: Internal refactoring of interactive parameter resolution. No change to existing commands.
17
+ - Updated dependencies [5e2cf0d]
18
+ - Updated dependencies [5e2cf0d]
19
+ - @zapier/zapier-sdk-mcp@0.16.1
20
+ - @zapier/zapier-sdk@0.80.0
21
+
3
22
  ## 0.61.0
4
23
 
5
24
  ### Minor Changes
package/dist/cli.cjs CHANGED
@@ -1554,6 +1554,148 @@ Optional fields${pathContext}:`));
1554
1554
  return constants;
1555
1555
  }
1556
1556
  };
1557
+ function offers(question, action) {
1558
+ return question.actions.some((a) => a.action === action);
1559
+ }
1560
+ function isActionRow(value) {
1561
+ return typeof value === "object" && value !== null && "action" in value;
1562
+ }
1563
+ async function promptText({
1564
+ message,
1565
+ password
1566
+ }) {
1567
+ const { value } = await inquirer__default.default.prompt([
1568
+ { type: password ? "password" : "input", name: "value", message }
1569
+ ]);
1570
+ return value;
1571
+ }
1572
+ async function answerSelect(question, field) {
1573
+ const display = (c) => c.hint ? `${c.label} ${chalk__default.default.dim(`(${c.hint})`)}` : c.label;
1574
+ if (question.multiple) {
1575
+ const choices = [
1576
+ ...question.choices.map((c) => ({ name: display(c), value: c.value })),
1577
+ ...offers(question, "more") ? [
1578
+ {
1579
+ name: chalk__default.default.dim("Load more\u2026"),
1580
+ value: { action: "more" }
1581
+ }
1582
+ ] : [],
1583
+ ...(question.notes ?? []).map((note) => ({
1584
+ name: chalk__default.default.dim(note),
1585
+ value: note,
1586
+ disabled: true
1587
+ }))
1588
+ ];
1589
+ const { values } = await inquirer__default.default.prompt([
1590
+ { type: "checkbox", name: "values", message: question.message, choices }
1591
+ ]);
1592
+ const selected = values;
1593
+ if (selected.some(isActionRow)) return { type: "more" };
1594
+ if (selected.length === 0 && offers(question, "skip")) {
1595
+ return { type: "skip" };
1596
+ }
1597
+ return { type: "choose", value: selected };
1598
+ }
1599
+ const row = (name, action) => ({
1600
+ name,
1601
+ value: { action }
1602
+ });
1603
+ const value = await search__default.default({
1604
+ message: question.message,
1605
+ source: (term) => {
1606
+ const t = (term ?? "").trim().toLowerCase();
1607
+ const matched = t ? question.choices.filter(
1608
+ (c) => `${c.label} ${c.hint ?? ""}`.toLowerCase().includes(t)
1609
+ ) : question.choices;
1610
+ const rows = matched.map((c) => ({
1611
+ name: display(c),
1612
+ value: c.value
1613
+ }));
1614
+ if (offers(question, "search"))
1615
+ rows.push(row(chalk__default.default.cyan("Search\u2026"), "search"));
1616
+ if (offers(question, "more"))
1617
+ rows.push(row(chalk__default.default.dim("Load more\u2026"), "more"));
1618
+ if (offers(question, "custom"))
1619
+ rows.push(row(chalk__default.default.dim("Enter a value manually\u2026"), "custom"));
1620
+ if (offers(question, "retry"))
1621
+ rows.push(row(chalk__default.default.yellow("Retry"), "retry"));
1622
+ if (offers(question, "skip"))
1623
+ rows.push(row(chalk__default.default.dim("Skip (optional)"), "skip"));
1624
+ if (offers(question, "cancel"))
1625
+ rows.push(row(chalk__default.default.dim("Cancel"), "cancel"));
1626
+ for (const note of question.notes ?? [])
1627
+ rows.push({ name: chalk__default.default.dim(note), value: note, disabled: true });
1628
+ return rows;
1629
+ }
1630
+ });
1631
+ if (!isActionRow(value)) {
1632
+ return { type: "choose", value };
1633
+ }
1634
+ switch (value.action) {
1635
+ case "search": {
1636
+ const term = await promptText({
1637
+ message: `Search ${field}:`,
1638
+ password: false
1639
+ });
1640
+ return { type: "search", term };
1641
+ }
1642
+ case "custom": {
1643
+ const custom = await promptText({
1644
+ message: `Enter ${field}:`,
1645
+ password: false
1646
+ });
1647
+ return { type: "custom", value: custom };
1648
+ }
1649
+ case "more":
1650
+ return { type: "more" };
1651
+ case "retry":
1652
+ return { type: "retry" };
1653
+ case "skip":
1654
+ return { type: "skip" };
1655
+ case "cancel":
1656
+ return { type: "cancel" };
1657
+ }
1658
+ }
1659
+ async function answerInput(question) {
1660
+ const value = await promptText({
1661
+ message: question.message,
1662
+ password: question.inputType === "password"
1663
+ });
1664
+ if (value === "" && offers(question, "skip")) {
1665
+ return { type: "skip" };
1666
+ }
1667
+ return { type: "custom", value };
1668
+ }
1669
+ async function answerCollection(question) {
1670
+ if (!offers(question, "done")) {
1671
+ return { type: "add" };
1672
+ }
1673
+ const { again } = await inquirer__default.default.prompt([
1674
+ {
1675
+ type: "confirm",
1676
+ name: "again",
1677
+ message: question.message,
1678
+ default: false
1679
+ }
1680
+ ]);
1681
+ return again ? { type: "add" } : { type: "done" };
1682
+ }
1683
+ var answerViaCli = ({ state, result }) => {
1684
+ if (result.error !== void 0) {
1685
+ const message = typeof result.error === "string" ? result.error : result.error.message;
1686
+ console.log(chalk__default.default.yellow(`! ${message}`));
1687
+ }
1688
+ const field = state.current?.join(".") ?? "value";
1689
+ const question = result.question;
1690
+ switch (question.type) {
1691
+ case "select":
1692
+ return answerSelect(question, field);
1693
+ case "input":
1694
+ return answerInput(question);
1695
+ case "collection":
1696
+ return answerCollection(question);
1697
+ }
1698
+ };
1557
1699
 
1558
1700
  // src/utils/cli-options.ts
1559
1701
  var RESERVED_CLI_OPTIONS = [
@@ -1585,7 +1727,7 @@ var SHARED_COMMAND_CLI_OPTIONS = [
1585
1727
 
1586
1728
  // package.json
1587
1729
  var package_default = {
1588
- version: "0.61.0"};
1730
+ version: "0.61.2"};
1589
1731
 
1590
1732
  // src/telemetry/builders.ts
1591
1733
  function createCliBaseEvent(context = {}) {
@@ -1660,7 +1802,7 @@ async function formatItemsFromSchema(_functionInfo, items, startingNumber = 0, o
1660
1802
  if (options?.formatter) {
1661
1803
  const formatter = options.formatter;
1662
1804
  const input = options.input ?? {};
1663
- const context = formatter.fetchContext ? await formatter.fetchContext({ items, input }) : void 0;
1805
+ const context = formatter.getContext ? await formatter.getContext({ items, input }) : void 0;
1664
1806
  items.forEach((item, index) => {
1665
1807
  const formatted = formatter.format({ item, input, context });
1666
1808
  formatSingleItem(formatted, startingNumber + index);
@@ -2255,7 +2397,7 @@ function analyzeZodField(name, schema, functionInfo) {
2255
2397
  paramType = "object";
2256
2398
  }
2257
2399
  let paramHasResolver = false;
2258
- if (functionInfo?.resolvers?.[name]) {
2400
+ if (functionInfo?.resolvers?.[name] || functionInfo?.boundResolvers?.[name]) {
2259
2401
  paramHasResolver = true;
2260
2402
  }
2261
2403
  return {
@@ -2414,6 +2556,9 @@ function createCommandConfig(cliCommandName, functionInfo, sdk) {
2414
2556
  const usesInputParameters = !functionInfo.inputSchema && !!functionInfo.inputParameters;
2415
2557
  const schema = functionInfo.inputSchema;
2416
2558
  const parameters = usesInputParameters ? analyzeInputParameters(functionInfo.inputParameters, functionInfo) : analyzeZodSchema(schema, functionInfo);
2559
+ if (functionInfo.boundResolvers && Object.keys(functionInfo.boundResolvers).length > 0) {
2560
+ for (const param of parameters) param.hasResolver = true;
2561
+ }
2417
2562
  const schemaAliases = getSchemaAliases(schema);
2418
2563
  if (schemaAliases) {
2419
2564
  const aliasedNames = new Set(Object.keys(schemaAliases));
@@ -2466,7 +2611,35 @@ function createCommandConfig(cliCommandName, functionInfo, sdk) {
2466
2611
  }
2467
2612
  }
2468
2613
  }
2469
- if (schema && !usesInputParameters) {
2614
+ const boundResolvers = functionInfo.boundResolvers;
2615
+ if (boundResolvers && Object.keys(boundResolvers).length > 0) {
2616
+ const seedInput = Object.fromEntries(
2617
+ Object.entries(rawParams).filter(([, v]) => v !== void 0)
2618
+ );
2619
+ const controller = zapierSdk.createController(sdk);
2620
+ let resolved;
2621
+ try {
2622
+ resolved = await controller.resolve({
2623
+ method: functionInfo.name,
2624
+ input: seedInput,
2625
+ answer: interactiveMode ? answerViaCli : ({ state }) => {
2626
+ throw new ZapierCliMissingParametersError([
2627
+ {
2628
+ name: state.current?.join(".") ?? "value",
2629
+ isPositional: false
2630
+ }
2631
+ ]);
2632
+ },
2633
+ interactive: interactiveMode
2634
+ });
2635
+ } catch (err) {
2636
+ if (err instanceof zapierSdk.CoreCancelledSignal) {
2637
+ throw new ZapierCliUserCancellationError();
2638
+ }
2639
+ throw err;
2640
+ }
2641
+ Object.assign(resolvedParams, resolved);
2642
+ } else if (schema && !usesInputParameters) {
2470
2643
  const resolver = new SchemaParameterResolver();
2471
2644
  const resolved = await resolver.resolveParameters(
2472
2645
  schema,
@@ -2559,7 +2732,7 @@ ${confirmMessageAfter}`));
2559
2732
  }
2560
2733
  }
2561
2734
  } catch (error) {
2562
- success = false;
2735
+ success = error instanceof ZapierCliError ? error.exitCode === 0 : false;
2563
2736
  errorMessage = error instanceof Error ? error.message : String(error);
2564
2737
  if (error instanceof ZapierCliMissingParametersError) {
2565
2738
  renderer.renderError(error);
@@ -4757,7 +4930,8 @@ async function runAccountAuth({
4757
4930
  });
4758
4931
  const scopedApi = zapierSdk.getOrCreateApiClient({
4759
4932
  credentials: accessToken,
4760
- baseUrl: credentialsBaseUrl2
4933
+ baseUrl: credentialsBaseUrl2,
4934
+ callerPackage: sdk.context.options?.callerPackage
4761
4935
  });
4762
4936
  const profile = await getProfile(scopedApi);
4763
4937
  process.stderr.write(`${getProfileMessage(entryPoint, profile.email)}
@@ -7438,7 +7612,7 @@ function buildBoxLines(message) {
7438
7612
  // package.json with { type: 'json' }
7439
7613
  var package_default2 = {
7440
7614
  name: "@zapier/zapier-sdk-cli",
7441
- version: "0.61.0"};
7615
+ version: "0.61.2"};
7442
7616
 
7443
7617
  // src/sdk.ts
7444
7618
  zapierSdk.injectCliLogin(login_exports);
@@ -7515,6 +7689,9 @@ function createZapierCliSdk2(options = {}) {
7515
7689
 
7516
7690
  // src/utils/extensions.ts
7517
7691
  var ENV_VAR = "ZAPIER_SDK_EXTENSIONS";
7692
+ function isModelPlugin(value) {
7693
+ return typeof value === "object" && value !== null && "pluginType" in value && typeof value.pluginType === "string";
7694
+ }
7518
7695
  async function resolveExtensions() {
7519
7696
  const seen = /* @__PURE__ */ new Set();
7520
7697
  const specs = readEnvSpecs().filter((spec) => {
@@ -7547,8 +7724,11 @@ function normalizeExtension(exported) {
7547
7724
  if (typeof exported === "function") {
7548
7725
  return [exported];
7549
7726
  }
7727
+ if (isModelPlugin(exported)) {
7728
+ return [exported];
7729
+ }
7550
7730
  if (Array.isArray(exported)) {
7551
- if (exported.every((e) => typeof e === "function")) {
7731
+ if (exported.every((e) => typeof e === "function" || isModelPlugin(e))) {
7552
7732
  return exported;
7553
7733
  }
7554
7734
  return null;
package/dist/cli.mjs CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import { Command, CommanderError, Option } from 'commander';
3
3
  import { z } from 'zod';
4
- import { definePlugin, createPluginMethod, OutputPropertySchema, ZapierBundleError, DEFAULT_CONFIG_PATH, ZapierValidationError, ZapierUnknownError, ZapierReleaseTriggerMessageSignal, injectCliLogin, BaseSdkOptionsSchema, getOrCreateApiClient, 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, isCredentialsObject, buildApplicationLifecycleEvent, AuthMechanism, ZapierAuthenticationError, DEPRECATION_NOTICE_EVENT, runWithCallerContext, isPositional, runWithTelemetryContext, buildCapabilityMessage, formatErrorMessage, getOsInfo, getPlatformVersions, getAgent, getTtyContext, getCiPlatform, isCi, getReleaseId, getCurrentTimestamp, generateEventId, ZapierApprovalError } from '@zapier/zapier-sdk';
4
+ import { definePlugin, createPluginMethod, OutputPropertySchema, ZapierBundleError, DEFAULT_CONFIG_PATH, ZapierValidationError, ZapierUnknownError, ZapierReleaseTriggerMessageSignal, injectCliLogin, BaseSdkOptionsSchema, getOrCreateApiClient, 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, isCredentialsObject, buildApplicationLifecycleEvent, AuthMechanism, ZapierAuthenticationError, 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';
@@ -1511,6 +1511,148 @@ Optional fields${pathContext}:`));
1511
1511
  return constants;
1512
1512
  }
1513
1513
  };
1514
+ function offers(question, action) {
1515
+ return question.actions.some((a) => a.action === action);
1516
+ }
1517
+ function isActionRow(value) {
1518
+ return typeof value === "object" && value !== null && "action" in value;
1519
+ }
1520
+ async function promptText({
1521
+ message,
1522
+ password
1523
+ }) {
1524
+ const { value } = await inquirer.prompt([
1525
+ { type: password ? "password" : "input", name: "value", message }
1526
+ ]);
1527
+ return value;
1528
+ }
1529
+ async function answerSelect(question, field) {
1530
+ const display = (c) => c.hint ? `${c.label} ${chalk.dim(`(${c.hint})`)}` : c.label;
1531
+ if (question.multiple) {
1532
+ const choices = [
1533
+ ...question.choices.map((c) => ({ name: display(c), value: c.value })),
1534
+ ...offers(question, "more") ? [
1535
+ {
1536
+ name: chalk.dim("Load more\u2026"),
1537
+ value: { action: "more" }
1538
+ }
1539
+ ] : [],
1540
+ ...(question.notes ?? []).map((note) => ({
1541
+ name: chalk.dim(note),
1542
+ value: note,
1543
+ disabled: true
1544
+ }))
1545
+ ];
1546
+ const { values } = await inquirer.prompt([
1547
+ { type: "checkbox", name: "values", message: question.message, choices }
1548
+ ]);
1549
+ const selected = values;
1550
+ if (selected.some(isActionRow)) return { type: "more" };
1551
+ if (selected.length === 0 && offers(question, "skip")) {
1552
+ return { type: "skip" };
1553
+ }
1554
+ return { type: "choose", value: selected };
1555
+ }
1556
+ const row = (name, action) => ({
1557
+ name,
1558
+ value: { action }
1559
+ });
1560
+ const value = await search({
1561
+ 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
+ }
1587
+ });
1588
+ if (!isActionRow(value)) {
1589
+ return { type: "choose", value };
1590
+ }
1591
+ switch (value.action) {
1592
+ case "search": {
1593
+ const term = await promptText({
1594
+ message: `Search ${field}:`,
1595
+ password: false
1596
+ });
1597
+ return { type: "search", term };
1598
+ }
1599
+ case "custom": {
1600
+ const custom = await promptText({
1601
+ message: `Enter ${field}:`,
1602
+ password: false
1603
+ });
1604
+ return { type: "custom", value: custom };
1605
+ }
1606
+ case "more":
1607
+ return { type: "more" };
1608
+ case "retry":
1609
+ return { type: "retry" };
1610
+ case "skip":
1611
+ return { type: "skip" };
1612
+ case "cancel":
1613
+ return { type: "cancel" };
1614
+ }
1615
+ }
1616
+ async function answerInput(question) {
1617
+ const value = await promptText({
1618
+ message: question.message,
1619
+ password: question.inputType === "password"
1620
+ });
1621
+ if (value === "" && offers(question, "skip")) {
1622
+ return { type: "skip" };
1623
+ }
1624
+ return { type: "custom", value };
1625
+ }
1626
+ async function answerCollection(question) {
1627
+ if (!offers(question, "done")) {
1628
+ return { type: "add" };
1629
+ }
1630
+ const { again } = await inquirer.prompt([
1631
+ {
1632
+ type: "confirm",
1633
+ name: "again",
1634
+ message: question.message,
1635
+ default: false
1636
+ }
1637
+ ]);
1638
+ return again ? { type: "add" } : { type: "done" };
1639
+ }
1640
+ var answerViaCli = ({ state, result }) => {
1641
+ if (result.error !== void 0) {
1642
+ const message = typeof result.error === "string" ? result.error : result.error.message;
1643
+ console.log(chalk.yellow(`! ${message}`));
1644
+ }
1645
+ const field = state.current?.join(".") ?? "value";
1646
+ const question = result.question;
1647
+ switch (question.type) {
1648
+ case "select":
1649
+ return answerSelect(question, field);
1650
+ case "input":
1651
+ return answerInput(question);
1652
+ case "collection":
1653
+ return answerCollection(question);
1654
+ }
1655
+ };
1514
1656
 
1515
1657
  // src/utils/cli-options.ts
1516
1658
  var RESERVED_CLI_OPTIONS = [
@@ -1542,7 +1684,7 @@ var SHARED_COMMAND_CLI_OPTIONS = [
1542
1684
 
1543
1685
  // package.json
1544
1686
  var package_default = {
1545
- version: "0.61.0"};
1687
+ version: "0.61.2"};
1546
1688
 
1547
1689
  // src/telemetry/builders.ts
1548
1690
  function createCliBaseEvent(context = {}) {
@@ -1617,7 +1759,7 @@ async function formatItemsFromSchema(_functionInfo, items, startingNumber = 0, o
1617
1759
  if (options?.formatter) {
1618
1760
  const formatter = options.formatter;
1619
1761
  const input = options.input ?? {};
1620
- const context = formatter.fetchContext ? await formatter.fetchContext({ items, input }) : void 0;
1762
+ const context = formatter.getContext ? await formatter.getContext({ items, input }) : void 0;
1621
1763
  items.forEach((item, index) => {
1622
1764
  const formatted = formatter.format({ item, input, context });
1623
1765
  formatSingleItem(formatted, startingNumber + index);
@@ -2212,7 +2354,7 @@ function analyzeZodField(name, schema, functionInfo) {
2212
2354
  paramType = "object";
2213
2355
  }
2214
2356
  let paramHasResolver = false;
2215
- if (functionInfo?.resolvers?.[name]) {
2357
+ if (functionInfo?.resolvers?.[name] || functionInfo?.boundResolvers?.[name]) {
2216
2358
  paramHasResolver = true;
2217
2359
  }
2218
2360
  return {
@@ -2371,6 +2513,9 @@ function createCommandConfig(cliCommandName, functionInfo, sdk) {
2371
2513
  const usesInputParameters = !functionInfo.inputSchema && !!functionInfo.inputParameters;
2372
2514
  const schema = functionInfo.inputSchema;
2373
2515
  const parameters = usesInputParameters ? analyzeInputParameters(functionInfo.inputParameters, functionInfo) : analyzeZodSchema(schema, functionInfo);
2516
+ if (functionInfo.boundResolvers && Object.keys(functionInfo.boundResolvers).length > 0) {
2517
+ for (const param of parameters) param.hasResolver = true;
2518
+ }
2374
2519
  const schemaAliases = getSchemaAliases(schema);
2375
2520
  if (schemaAliases) {
2376
2521
  const aliasedNames = new Set(Object.keys(schemaAliases));
@@ -2423,7 +2568,35 @@ function createCommandConfig(cliCommandName, functionInfo, sdk) {
2423
2568
  }
2424
2569
  }
2425
2570
  }
2426
- if (schema && !usesInputParameters) {
2571
+ const boundResolvers = functionInfo.boundResolvers;
2572
+ if (boundResolvers && Object.keys(boundResolvers).length > 0) {
2573
+ const seedInput = Object.fromEntries(
2574
+ Object.entries(rawParams).filter(([, v]) => v !== void 0)
2575
+ );
2576
+ const controller = createController(sdk);
2577
+ let resolved;
2578
+ try {
2579
+ resolved = await controller.resolve({
2580
+ method: functionInfo.name,
2581
+ input: seedInput,
2582
+ answer: interactiveMode ? answerViaCli : ({ state }) => {
2583
+ throw new ZapierCliMissingParametersError([
2584
+ {
2585
+ name: state.current?.join(".") ?? "value",
2586
+ isPositional: false
2587
+ }
2588
+ ]);
2589
+ },
2590
+ interactive: interactiveMode
2591
+ });
2592
+ } catch (err) {
2593
+ if (err instanceof CoreCancelledSignal) {
2594
+ throw new ZapierCliUserCancellationError();
2595
+ }
2596
+ throw err;
2597
+ }
2598
+ Object.assign(resolvedParams, resolved);
2599
+ } else if (schema && !usesInputParameters) {
2427
2600
  const resolver = new SchemaParameterResolver();
2428
2601
  const resolved = await resolver.resolveParameters(
2429
2602
  schema,
@@ -2516,7 +2689,7 @@ ${confirmMessageAfter}`));
2516
2689
  }
2517
2690
  }
2518
2691
  } catch (error) {
2519
- success = false;
2692
+ success = error instanceof ZapierCliError ? error.exitCode === 0 : false;
2520
2693
  errorMessage = error instanceof Error ? error.message : String(error);
2521
2694
  if (error instanceof ZapierCliMissingParametersError) {
2522
2695
  renderer.renderError(error);
@@ -4714,7 +4887,8 @@ async function runAccountAuth({
4714
4887
  });
4715
4888
  const scopedApi = getOrCreateApiClient({
4716
4889
  credentials: accessToken,
4717
- baseUrl: credentialsBaseUrl2
4890
+ baseUrl: credentialsBaseUrl2,
4891
+ callerPackage: sdk.context.options?.callerPackage
4718
4892
  });
4719
4893
  const profile = await getProfile(scopedApi);
4720
4894
  process.stderr.write(`${getProfileMessage(entryPoint, profile.email)}
@@ -7395,7 +7569,7 @@ function buildBoxLines(message) {
7395
7569
  // package.json with { type: 'json' }
7396
7570
  var package_default2 = {
7397
7571
  name: "@zapier/zapier-sdk-cli",
7398
- version: "0.61.0"};
7572
+ version: "0.61.2"};
7399
7573
 
7400
7574
  // src/sdk.ts
7401
7575
  injectCliLogin(login_exports);
@@ -7472,6 +7646,9 @@ function createZapierCliSdk2(options = {}) {
7472
7646
 
7473
7647
  // src/utils/extensions.ts
7474
7648
  var ENV_VAR = "ZAPIER_SDK_EXTENSIONS";
7649
+ function isModelPlugin(value) {
7650
+ return typeof value === "object" && value !== null && "pluginType" in value && typeof value.pluginType === "string";
7651
+ }
7475
7652
  async function resolveExtensions() {
7476
7653
  const seen = /* @__PURE__ */ new Set();
7477
7654
  const specs = readEnvSpecs().filter((spec) => {
@@ -7504,8 +7681,11 @@ function normalizeExtension(exported) {
7504
7681
  if (typeof exported === "function") {
7505
7682
  return [exported];
7506
7683
  }
7684
+ if (isModelPlugin(exported)) {
7685
+ return [exported];
7686
+ }
7507
7687
  if (Array.isArray(exported)) {
7508
- if (exported.every((e) => typeof e === "function")) {
7688
+ if (exported.every((e) => typeof e === "function" || isModelPlugin(e))) {
7509
7689
  return exported;
7510
7690
  }
7511
7691
  return null;
@@ -2102,7 +2102,8 @@ async function runAccountAuth({
2102
2102
  });
2103
2103
  const scopedApi = zapierSdk.getOrCreateApiClient({
2104
2104
  credentials: accessToken,
2105
- baseUrl: credentialsBaseUrl
2105
+ baseUrl: credentialsBaseUrl,
2106
+ callerPackage: sdk.context.options?.callerPackage
2106
2107
  });
2107
2108
  const profile = await getProfile(scopedApi);
2108
2109
  process.stderr.write(`${getProfileMessage(entryPoint, profile.email)}
@@ -4740,7 +4741,7 @@ function collectDeprecationNoticeAndForward(event, onEvent) {
4740
4741
  // package.json with { type: 'json' }
4741
4742
  var package_default = {
4742
4743
  name: "@zapier/zapier-sdk-cli",
4743
- version: "0.61.0"};
4744
+ version: "0.61.2"};
4744
4745
 
4745
4746
  // src/experimental.ts
4746
4747
  experimental.injectCliLogin(login_exports);
@@ -1,5 +1,5 @@
1
- import { ZapierSdkOptions, Plugin, PluginProvides } from '@zapier/zapier-sdk/experimental';
2
- import { Z as ZapierSdkCli } from './sdk-SOLizjno.mjs';
1
+ import { ZapierSdkOptions } from '@zapier/zapier-sdk/experimental';
2
+ import { E as Extension, Z as ZapierSdkCli } from './extensions-DggdwXJF.mjs';
3
3
  import '@zapier/zapier-sdk';
4
4
  import 'zod';
5
5
 
@@ -27,7 +27,7 @@ interface ZapierCliSdkOptions extends ZapierSdkOptions {
27
27
  * CLI plugins, so its functions appear in `getRegistry({ package: "cli" })`
28
28
  * automatically.
29
29
  */
30
- extensions?: Plugin<unknown, PluginProvides>[];
30
+ extensions?: Extension[];
31
31
  }
32
32
  /**
33
33
  * Create a Zapier CLI SDK with experimental plugins registered. The
@@ -1,5 +1,5 @@
1
- import { ZapierSdkOptions, Plugin, PluginProvides } from '@zapier/zapier-sdk/experimental';
2
- import { Z as ZapierSdkCli } from './sdk-SOLizjno.js';
1
+ import { ZapierSdkOptions } from '@zapier/zapier-sdk/experimental';
2
+ import { E as Extension, Z as ZapierSdkCli } from './extensions-DggdwXJF.js';
3
3
  import '@zapier/zapier-sdk';
4
4
  import 'zod';
5
5
 
@@ -27,7 +27,7 @@ interface ZapierCliSdkOptions extends ZapierSdkOptions {
27
27
  * CLI plugins, so its functions appear in `getRegistry({ package: "cli" })`
28
28
  * automatically.
29
29
  */
30
- extensions?: Plugin<unknown, PluginProvides>[];
30
+ extensions?: Extension[];
31
31
  }
32
32
  /**
33
33
  * Create a Zapier CLI SDK with experimental plugins registered. The
@@ -2066,7 +2066,8 @@ async function runAccountAuth({
2066
2066
  });
2067
2067
  const scopedApi = getOrCreateApiClient({
2068
2068
  credentials: accessToken,
2069
- baseUrl: credentialsBaseUrl
2069
+ baseUrl: credentialsBaseUrl,
2070
+ callerPackage: sdk.context.options?.callerPackage
2070
2071
  });
2071
2072
  const profile = await getProfile(scopedApi);
2072
2073
  process.stderr.write(`${getProfileMessage(entryPoint, profile.email)}
@@ -4704,7 +4705,7 @@ function collectDeprecationNoticeAndForward(event, onEvent) {
4704
4705
  // package.json with { type: 'json' }
4705
4706
  var package_default = {
4706
4707
  name: "@zapier/zapier-sdk-cli",
4707
- version: "0.61.0"};
4708
+ version: "0.61.2"};
4708
4709
 
4709
4710
  // src/experimental.ts
4710
4711
  injectCliLogin(login_exports);
@@ -1,5 +1,5 @@
1
1
  import * as _zapier_zapier_sdk from '@zapier/zapier-sdk';
2
- import { AppItem, Manifest, ResolvedCredentials, ApiClient, ZapierSdk } from '@zapier/zapier-sdk';
2
+ import { AppItem, Manifest, ResolvedCredentials, ApiClient, ZapierSdk, Plugin, PluginProvides } from '@zapier/zapier-sdk';
3
3
  import { z } from 'zod';
4
4
 
5
5
  declare const BuildManifestSchema: z.ZodObject<{
@@ -521,6 +521,10 @@ interface AccountAuthCliContext {
521
521
  options?: {
522
522
  baseUrl?: string;
523
523
  credentials?: unknown;
524
+ callerPackage?: {
525
+ name: string;
526
+ version: string;
527
+ };
524
528
  };
525
529
  }
526
530
 
@@ -551,4 +555,13 @@ type SignupPluginProvides = ReturnType<typeof signupPlugin>;
551
555
 
552
556
  type ZapierSdkCli = ZapierSdk & BuildManifestPluginProvides & FeedbackPluginProvides & GenerateAppTypesPluginProvides & SignupPluginProvides;
553
557
 
554
- export type { ZapierSdkCli as Z };
558
+ /** A new-model plugin descriptor (from `defineMethod` / `definePlugin` /
559
+ * `defineResolver` etc.), identified by its `pluginType` discriminant. */
560
+ interface ModelPlugin {
561
+ readonly pluginType: string;
562
+ }
563
+ /** An extension is either a legacy function plugin or a new-model plugin
564
+ * descriptor; `addPlugin` accepts both. */
565
+ type Extension = Plugin<unknown, PluginProvides> | ModelPlugin;
566
+
567
+ export type { Extension as E, ZapierSdkCli as Z };
@@ -1,5 +1,5 @@
1
1
  import * as _zapier_zapier_sdk from '@zapier/zapier-sdk';
2
- import { AppItem, Manifest, ResolvedCredentials, ApiClient, ZapierSdk } from '@zapier/zapier-sdk';
2
+ import { AppItem, Manifest, ResolvedCredentials, ApiClient, ZapierSdk, Plugin, PluginProvides } from '@zapier/zapier-sdk';
3
3
  import { z } from 'zod';
4
4
 
5
5
  declare const BuildManifestSchema: z.ZodObject<{
@@ -521,6 +521,10 @@ interface AccountAuthCliContext {
521
521
  options?: {
522
522
  baseUrl?: string;
523
523
  credentials?: unknown;
524
+ callerPackage?: {
525
+ name: string;
526
+ version: string;
527
+ };
524
528
  };
525
529
  }
526
530
 
@@ -551,4 +555,13 @@ type SignupPluginProvides = ReturnType<typeof signupPlugin>;
551
555
 
552
556
  type ZapierSdkCli = ZapierSdk & BuildManifestPluginProvides & FeedbackPluginProvides & GenerateAppTypesPluginProvides & SignupPluginProvides;
553
557
 
554
- export type { ZapierSdkCli as Z };
558
+ /** A new-model plugin descriptor (from `defineMethod` / `definePlugin` /
559
+ * `defineResolver` etc.), identified by its `pluginType` discriminant. */
560
+ interface ModelPlugin {
561
+ readonly pluginType: string;
562
+ }
563
+ /** An extension is either a legacy function plugin or a new-model plugin
564
+ * descriptor; `addPlugin` accepts both. */
565
+ type Extension = Plugin<unknown, PluginProvides> | ModelPlugin;
566
+
567
+ export type { Extension as E, ZapierSdkCli as Z };
package/dist/index.cjs CHANGED
@@ -2101,7 +2101,8 @@ async function runAccountAuth({
2101
2101
  });
2102
2102
  const scopedApi = zapierSdk.getOrCreateApiClient({
2103
2103
  credentials: accessToken,
2104
- baseUrl: credentialsBaseUrl
2104
+ baseUrl: credentialsBaseUrl,
2105
+ callerPackage: sdk.context.options?.callerPackage
2105
2106
  });
2106
2107
  const profile = await getProfile(scopedApi);
2107
2108
  process.stderr.write(`${getProfileMessage(entryPoint, profile.email)}
@@ -4739,7 +4740,7 @@ function collectDeprecationNoticeAndForward(event, onEvent) {
4739
4740
  // package.json with { type: 'json' }
4740
4741
  var package_default = {
4741
4742
  name: "@zapier/zapier-sdk-cli",
4742
- version: "0.61.0"};
4743
+ version: "0.61.2"};
4743
4744
 
4744
4745
  // src/sdk.ts
4745
4746
  zapierSdk.injectCliLogin(login_exports);
@@ -4779,7 +4780,7 @@ function createZapierCliSdk(options = {}) {
4779
4780
 
4780
4781
  // package.json
4781
4782
  var package_default2 = {
4782
- version: "0.61.0"};
4783
+ version: "0.61.2"};
4783
4784
 
4784
4785
  // src/telemetry/builders.ts
4785
4786
  function createCliBaseEvent(context = {}) {
package/dist/index.d.mts CHANGED
@@ -1,5 +1,5 @@
1
- import { ZapierSdkOptions, Plugin, PluginProvides, BaseEvent } from '@zapier/zapier-sdk';
2
- import { Z as ZapierSdkCli } from './sdk-SOLizjno.mjs';
1
+ import { ZapierSdkOptions, BaseEvent } from '@zapier/zapier-sdk';
2
+ import { E as Extension, Z as ZapierSdkCli } from './extensions-DggdwXJF.mjs';
3
3
  import 'zod';
4
4
 
5
5
  interface ZapierCliSdkOptions extends ZapierSdkOptions {
@@ -10,7 +10,7 @@ interface ZapierCliSdkOptions extends ZapierSdkOptions {
10
10
  * CLI plugins, so its functions appear in `getRegistry({ package: "cli" })`
11
11
  * automatically.
12
12
  */
13
- extensions?: Plugin<unknown, PluginProvides>[];
13
+ extensions?: Extension[];
14
14
  }
15
15
  /**
16
16
  * Create a Zapier SDK instance configured specifically for the CLI
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { ZapierSdkOptions, Plugin, PluginProvides, BaseEvent } from '@zapier/zapier-sdk';
2
- import { Z as ZapierSdkCli } from './sdk-SOLizjno.js';
1
+ import { ZapierSdkOptions, BaseEvent } from '@zapier/zapier-sdk';
2
+ import { E as Extension, Z as ZapierSdkCli } from './extensions-DggdwXJF.js';
3
3
  import 'zod';
4
4
 
5
5
  interface ZapierCliSdkOptions extends ZapierSdkOptions {
@@ -10,7 +10,7 @@ interface ZapierCliSdkOptions extends ZapierSdkOptions {
10
10
  * CLI plugins, so its functions appear in `getRegistry({ package: "cli" })`
11
11
  * automatically.
12
12
  */
13
- extensions?: Plugin<unknown, PluginProvides>[];
13
+ extensions?: Extension[];
14
14
  }
15
15
  /**
16
16
  * Create a Zapier SDK instance configured specifically for the CLI
package/dist/index.mjs CHANGED
@@ -2065,7 +2065,8 @@ async function runAccountAuth({
2065
2065
  });
2066
2066
  const scopedApi = getOrCreateApiClient({
2067
2067
  credentials: accessToken,
2068
- baseUrl: credentialsBaseUrl
2068
+ baseUrl: credentialsBaseUrl,
2069
+ callerPackage: sdk.context.options?.callerPackage
2069
2070
  });
2070
2071
  const profile = await getProfile(scopedApi);
2071
2072
  process.stderr.write(`${getProfileMessage(entryPoint, profile.email)}
@@ -4703,7 +4704,7 @@ function collectDeprecationNoticeAndForward(event, onEvent) {
4703
4704
  // package.json with { type: 'json' }
4704
4705
  var package_default = {
4705
4706
  name: "@zapier/zapier-sdk-cli",
4706
- version: "0.61.0"};
4707
+ version: "0.61.2"};
4707
4708
 
4708
4709
  // src/sdk.ts
4709
4710
  injectCliLogin(login_exports);
@@ -4743,7 +4744,7 @@ function createZapierCliSdk(options = {}) {
4743
4744
 
4744
4745
  // package.json
4745
4746
  var package_default2 = {
4746
- version: "0.61.0"};
4747
+ version: "0.61.2"};
4747
4748
 
4748
4749
  // src/telemetry/builders.ts
4749
4750
  function createCliBaseEvent(context = {}) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zapier/zapier-sdk-cli",
3
- "version": "0.61.0",
3
+ "version": "0.61.2",
4
4
  "description": "Command line interface for Zapier SDK",
5
5
  "main": "dist/index.cjs",
6
6
  "module": "dist/index.mjs",
@@ -95,8 +95,8 @@
95
95
  "typescript": "^5.8.3",
96
96
  "wrap-ansi": "^10.0.0",
97
97
  "zod": "4.3.6",
98
- "@zapier/zapier-sdk": "0.79.0",
99
- "@zapier/zapier-sdk-mcp": "0.16.0"
98
+ "@zapier/zapier-sdk": "0.80.1",
99
+ "@zapier/zapier-sdk-mcp": "0.16.2"
100
100
  },
101
101
  "devDependencies": {
102
102
  "@types/express": "^5.0.3",