@squadbase/vite-server 0.1.17-dev.24af54e → 0.1.17-dev.423ee34

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (77) hide show
  1. package/dist/cli/index.js +4873 -1073
  2. package/dist/connectors/airtable-oauth.js +78 -11
  3. package/dist/connectors/airtable.js +74 -11
  4. package/dist/connectors/amplitude.js +38 -11
  5. package/dist/connectors/anthropic.js +4 -2
  6. package/dist/connectors/asana.js +67 -13
  7. package/dist/connectors/attio.js +60 -16
  8. package/dist/connectors/aws-billing.js +38 -11
  9. package/dist/connectors/azure-sql.js +64 -13
  10. package/dist/connectors/backlog-api-key.js +70 -18
  11. package/dist/connectors/clickup.js +80 -13
  12. package/dist/connectors/cosmosdb.js +42 -15
  13. package/dist/connectors/customerio.js +39 -12
  14. package/dist/connectors/dbt.js +716 -28
  15. package/dist/connectors/freshdesk.js +112 -11
  16. package/dist/connectors/freshsales.js +38 -11
  17. package/dist/connectors/freshservice.js +38 -11
  18. package/dist/connectors/gamma.js +47 -20
  19. package/dist/connectors/gemini.js +4 -2
  20. package/dist/connectors/github.js +42 -15
  21. package/dist/connectors/gmail-oauth.js +38 -13
  22. package/dist/connectors/gmail.js +34 -7
  23. package/dist/connectors/google-ads.js +38 -11
  24. package/dist/connectors/google-analytics-oauth.js +182 -28
  25. package/dist/connectors/google-analytics.js +653 -104
  26. package/dist/connectors/google-audit-log.js +34 -7
  27. package/dist/connectors/google-calendar-oauth.js +91 -18
  28. package/dist/connectors/google-calendar.js +91 -14
  29. package/dist/connectors/google-docs.js +38 -13
  30. package/dist/connectors/google-drive.js +60 -13
  31. package/dist/connectors/google-search-console-oauth.js +156 -20
  32. package/dist/connectors/google-sheets.js +36 -9
  33. package/dist/connectors/google-slides.js +38 -13
  34. package/dist/connectors/grafana.js +75 -13
  35. package/dist/connectors/hubspot-oauth.js +69 -12
  36. package/dist/connectors/hubspot.js +55 -12
  37. package/dist/connectors/influxdb.js +38 -11
  38. package/dist/connectors/intercom-oauth.js +100 -15
  39. package/dist/connectors/intercom.js +42 -15
  40. package/dist/connectors/jdbc.js +36 -9
  41. package/dist/connectors/jira-api-key.js +98 -14
  42. package/dist/connectors/kintone-api-token.js +96 -21
  43. package/dist/connectors/kintone.js +84 -14
  44. package/dist/connectors/linear.js +84 -15
  45. package/dist/connectors/linkedin-ads.js +71 -17
  46. package/dist/connectors/mailchimp-oauth.js +36 -9
  47. package/dist/connectors/mailchimp.js +36 -9
  48. package/dist/connectors/meta-ads-oauth.js +63 -17
  49. package/dist/connectors/meta-ads.js +65 -17
  50. package/dist/connectors/mixpanel.js +38 -11
  51. package/dist/connectors/monday.js +39 -12
  52. package/dist/connectors/mongodb.js +38 -11
  53. package/dist/connectors/notion-oauth.js +88 -14
  54. package/dist/connectors/notion.js +90 -14
  55. package/dist/connectors/openai.js +4 -2
  56. package/dist/connectors/oracle.js +78 -20
  57. package/dist/connectors/outlook-oauth.js +48 -23
  58. package/dist/connectors/powerbi-oauth.js +321 -49
  59. package/dist/connectors/salesforce.js +72 -12
  60. package/dist/connectors/semrush.js +374 -52
  61. package/dist/connectors/sentry.js +66 -13
  62. package/dist/connectors/shopify-oauth.js +71 -13
  63. package/dist/connectors/shopify.js +38 -11
  64. package/dist/connectors/sqlserver.js +64 -13
  65. package/dist/connectors/stripe-api-key.js +96 -18
  66. package/dist/connectors/stripe-oauth.js +98 -22
  67. package/dist/connectors/supabase.js +55 -11
  68. package/dist/connectors/tableau.js +262 -92
  69. package/dist/connectors/tiktok-ads.js +67 -19
  70. package/dist/connectors/wix-store.js +38 -11
  71. package/dist/connectors/zendesk-oauth.js +83 -15
  72. package/dist/connectors/zendesk.js +42 -15
  73. package/dist/index.d.ts +1 -0
  74. package/dist/index.js +4902 -1077
  75. package/dist/main.js +4891 -1071
  76. package/dist/vite-plugin.js +4871 -1071
  77. package/package.json +1 -1
@@ -16,6 +16,7 @@ var init_parameter_definition = __esm({
16
16
  type;
17
17
  secret;
18
18
  required;
19
+ isDeprecated;
19
20
  constructor(config) {
20
21
  this.slug = config.slug;
21
22
  this.name = config.name;
@@ -24,6 +25,7 @@ var init_parameter_definition = __esm({
24
25
  this.type = config.type;
25
26
  this.secret = config.secret;
26
27
  this.required = config.required;
28
+ this.isDeprecated = config.isDeprecated ?? false;
27
29
  }
28
30
  /**
29
31
  * Get the parameter value from a ConnectorConnectionObject.
@@ -266,7 +268,7 @@ var ConnectorPlugin = class _ConnectorPlugin {
266
268
  /**
267
269
  * Create tools for connections that belong to this connector.
268
270
  * Filters connections by connectorKey internally.
269
- * Returns tools keyed as `${connectorKey}_${toolName}`.
271
+ * Returns tools keyed as `connector_${connectorKey}_${toolName}`.
270
272
  */
271
273
  createTools(connections, config, opts) {
272
274
  const myConnections = connections.filter(
@@ -276,7 +278,7 @@ var ConnectorPlugin = class _ConnectorPlugin {
276
278
  for (const t of Object.values(this.tools)) {
277
279
  const tool = t.createTool(myConnections, config);
278
280
  const originalToModelOutput = tool.toModelOutput;
279
- result[`${this.connectorKey}_${t.name}`] = {
281
+ result[`connector_${this.connectorKey}_${t.name}`] = {
280
282
  ...tool,
281
283
  toModelOutput: async (options) => {
282
284
  if (!originalToModelOutput) {
@@ -332,19 +334,34 @@ async function runSetupFlow(flow, params, ctx, config) {
332
334
  };
333
335
  let state = flow.initialState();
334
336
  let answerIdx = 0;
337
+ const pendingParameterUpdates = [];
335
338
  for (const step of flow.steps) {
336
339
  const ans = ctx.answers[answerIdx];
337
340
  if (ans && ans.questionSlug === step.slug) {
338
341
  state = step.applyAnswer(state, ans.answer);
342
+ if (step.toParameterUpdates) {
343
+ pendingParameterUpdates.push(...step.toParameterUpdates(state));
344
+ }
339
345
  answerIdx += 1;
340
346
  continue;
341
347
  }
348
+ const resolvedAllowFreeText = step.allowFreeText !== void 0 ? step.allowFreeText : true;
342
349
  if (step.type === "text") {
350
+ if (step.fetchOptions) {
351
+ const options2 = await step.fetchOptions(state, runtime);
352
+ if (options2.length === 0) {
353
+ continue;
354
+ }
355
+ }
343
356
  return {
344
357
  type: "nextQuestion",
345
358
  questionSlug: step.slug,
346
359
  question: step.question[ctx.language],
347
- questionType: "text"
360
+ questionType: "text",
361
+ allowFreeText: resolvedAllowFreeText,
362
+ ...pendingParameterUpdates.length > 0 && {
363
+ parameterUpdates: pendingParameterUpdates
364
+ }
348
365
  };
349
366
  }
350
367
  const options = step.fetchOptions ? await step.fetchOptions(state, runtime) : [];
@@ -356,11 +373,21 @@ async function runSetupFlow(flow, params, ctx, config) {
356
373
  questionSlug: step.slug,
357
374
  question: step.question[ctx.language],
358
375
  questionType: step.type,
359
- options
376
+ options,
377
+ allowFreeText: resolvedAllowFreeText,
378
+ ...pendingParameterUpdates.length > 0 && {
379
+ parameterUpdates: pendingParameterUpdates
380
+ }
360
381
  };
361
382
  }
362
383
  const dataInvestigationResult = await flow.finalize(state, runtime);
363
- return { type: "fulfilled", dataInvestigationResult };
384
+ return {
385
+ type: "fulfilled",
386
+ dataInvestigationResult,
387
+ ...pendingParameterUpdates.length > 0 && {
388
+ parameterUpdates: pendingParameterUpdates
389
+ }
390
+ };
364
391
  }
365
392
  async function resolveSetupSelection(params) {
366
393
  const { selected, allSentinel, fetchAll, limit } = params;
@@ -381,15 +408,15 @@ var AUTH_TYPES = {
381
408
  // ../connectors/src/connectors/linear/setup.ts
382
409
  var linearOnboarding = new ConnectorOnboarding({
383
410
  dataOverviewInstructions: {
384
- en: `1. Call linear_request with query \`{ teams { nodes { id name } } }\` to list all teams
385
- 2. Call linear_request with query \`{ workflowStates { nodes { id name type } } }\` to list workflow states
386
- 3. Call linear_request with query \`{ issues(first: 5, orderBy: updatedAt) { nodes { id identifier title state { name } assignee { name } priority } } }\` to sample recent issues
387
- 4. Call linear_request with query \`{ projects(first: 5) { nodes { id name state } } }\` to list projects
411
+ en: `1. Call connector_linear_request with query \`{ teams { nodes { id name } } }\` to list all teams
412
+ 2. Call connector_linear_request with query \`{ workflowStates { nodes { id name type } } }\` to list workflow states
413
+ 3. Call connector_linear_request with query \`{ issues(first: 5, orderBy: updatedAt) { nodes { id identifier title state { name } assignee { name } priority } } }\` to sample recent issues
414
+ 4. Call connector_linear_request with query \`{ projects(first: 5) { nodes { id name state } } }\` to list projects
388
415
  5. Explore other resources (cycles, labels, users) as needed`,
389
- ja: `1. linear_request \u3067\u30AF\u30A8\u30EA \`{ teams { nodes { id name } } }\` \u3092\u547C\u3073\u51FA\u3057\u3001\u30C1\u30FC\u30E0\u4E00\u89A7\u3092\u53D6\u5F97
390
- 2. linear_request \u3067\u30AF\u30A8\u30EA \`{ workflowStates { nodes { id name type } } }\` \u3092\u547C\u3073\u51FA\u3057\u3001\u30EF\u30FC\u30AF\u30D5\u30ED\u30FC\u72B6\u614B\u4E00\u89A7\u3092\u53D6\u5F97
391
- 3. linear_request \u3067\u30AF\u30A8\u30EA \`{ issues(first: 5, orderBy: updatedAt) { nodes { id identifier title state { name } assignee { name } priority } } }\` \u3092\u547C\u3073\u51FA\u3057\u3001\u6700\u8FD1\u306EIssue\u3092\u30B5\u30F3\u30D7\u30EA\u30F3\u30B0
392
- 4. linear_request \u3067\u30AF\u30A8\u30EA \`{ projects(first: 5) { nodes { id name state } } }\` \u3092\u547C\u3073\u51FA\u3057\u3001\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8\u4E00\u89A7\u3092\u53D6\u5F97
416
+ ja: `1. connector_linear_request \u3067\u30AF\u30A8\u30EA \`{ teams { nodes { id name } } }\` \u3092\u547C\u3073\u51FA\u3057\u3001\u30C1\u30FC\u30E0\u4E00\u89A7\u3092\u53D6\u5F97
417
+ 2. connector_linear_request \u3067\u30AF\u30A8\u30EA \`{ workflowStates { nodes { id name type } } }\` \u3092\u547C\u3073\u51FA\u3057\u3001\u30EF\u30FC\u30AF\u30D5\u30ED\u30FC\u72B6\u614B\u4E00\u89A7\u3092\u53D6\u5F97
418
+ 3. connector_linear_request \u3067\u30AF\u30A8\u30EA \`{ issues(first: 5, orderBy: updatedAt) { nodes { id identifier title state { name } assignee { name } priority } } }\` \u3092\u547C\u3073\u51FA\u3057\u3001\u6700\u8FD1\u306EIssue\u3092\u30B5\u30F3\u30D7\u30EA\u30F3\u30B0
419
+ 4. connector_linear_request \u3067\u30AF\u30A8\u30EA \`{ projects(first: 5) { nodes { id name state } } }\` \u3092\u547C\u3073\u51FA\u3057\u3001\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8\u4E00\u89A7\u3092\u53D6\u5F97
393
420
  5. \u5FC5\u8981\u306B\u5FDC\u3058\u3066\u4ED6\u306E\u30EA\u30BD\u30FC\u30B9\uFF08cycles\u3001labels\u3001users\uFF09\u3092\u63A2\u7D22`
394
421
  }
395
422
  });
@@ -446,6 +473,35 @@ async function getTeamDetail(params, teamId) {
446
473
  );
447
474
  return data.team ?? null;
448
475
  }
476
+ async function getIssueBreakdown(params, teamId) {
477
+ try {
478
+ const data = await gqlFetch(
479
+ params,
480
+ `query($id: String!) {
481
+ team(id: $id) {
482
+ issues(first: 250) { nodes { state { name type } } }
483
+ }
484
+ }`,
485
+ { id: teamId }
486
+ );
487
+ const nodes = data.team?.issues?.nodes ?? [];
488
+ const counts = /* @__PURE__ */ new Map();
489
+ for (const n of nodes) {
490
+ const key = `${n.state?.name ?? "Unknown"}|${n.state?.type ?? "unknown"}`;
491
+ const existing = counts.get(key);
492
+ if (existing) existing.count++;
493
+ else
494
+ counts.set(key, {
495
+ stateName: n.state?.name ?? "Unknown",
496
+ stateType: n.state?.type ?? "unknown",
497
+ count: 1
498
+ });
499
+ }
500
+ return { total: nodes.length, byState: Array.from(counts.values()) };
501
+ } catch {
502
+ return null;
503
+ }
504
+ }
449
505
  var linearSetupFlow = {
450
506
  initialState: () => ({}),
451
507
  steps: [
@@ -502,6 +558,19 @@ var linearSetupFlow = {
502
558
  sections.push(` - ${s.name} (${s.type})`);
503
559
  }
504
560
  sections.push("");
561
+ const breakdown = await getIssueBreakdown(rt.params, teamId);
562
+ if (breakdown && breakdown.byState.length > 0) {
563
+ sections.push(
564
+ `#### Issues (${breakdown.total}${breakdown.total === 250 ? "+" : ""})`,
565
+ ""
566
+ );
567
+ sections.push("| State | Type | Count |");
568
+ sections.push("|-------|------|-------|");
569
+ for (const b of breakdown.byState) {
570
+ sections.push(`| ${b.stateName} | ${b.stateType} | ${b.count} |`);
571
+ }
572
+ sections.push("");
573
+ }
505
574
  }
506
575
  return sections.join("\n");
507
576
  }
@@ -612,7 +681,7 @@ var linearConnector = new ConnectorPlugin({
612
681
  systemPrompt: {
613
682
  en: `### Tools
614
683
 
615
- - \`linear_request\`: The only way to call the Linear GraphQL API. Use it to query and mutate all Linear resources: issues, projects, teams, cycles, users, labels, workflow states, and comments. Authentication is configured automatically. Linear's API is GraphQL-only \u2014 send a query string and optional variables. Pagination uses Relay-style cursors with \`first\`/\`after\` and \`last\`/\`before\` arguments. Archived resources are hidden by default; pass \`includeArchived: true\` to include them.
684
+ - \`connector_linear_request\`: The only way to call the Linear GraphQL API. Use it to query and mutate all Linear resources: issues, projects, teams, cycles, users, labels, workflow states, and comments. Authentication is configured automatically. Linear's API is GraphQL-only \u2014 send a query string and optional variables. Pagination uses Relay-style cursors with \`first\`/\`after\` and \`last\`/\`before\` arguments. Archived resources are hidden by default; pass \`includeArchived: true\` to include them.
616
685
 
617
686
  ### Business Logic
618
687
 
@@ -673,7 +742,7 @@ export default async function handler(c: Context) {
673
742
  - \`mutation { commentCreate(input: { issueId: "...", body: "..." }) { success comment { id body } } }\` \u2014 add comment`,
674
743
  ja: `### \u30C4\u30FC\u30EB
675
744
 
676
- - \`linear_request\`: Linear GraphQL API\u3092\u547C\u3073\u51FA\u3059\u552F\u4E00\u306E\u624B\u6BB5\u3067\u3059\u3002Issue\u3001\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8\u3001\u30C1\u30FC\u30E0\u3001\u30B5\u30A4\u30AF\u30EB\u3001\u30E6\u30FC\u30B6\u30FC\u3001\u30E9\u30D9\u30EB\u3001\u30EF\u30FC\u30AF\u30D5\u30ED\u30FC\u72B6\u614B\u3001\u30B3\u30E1\u30F3\u30C8\u306A\u3069\u3059\u3079\u3066\u306ELinear\u30EA\u30BD\u30FC\u30B9\u306E\u30AF\u30A8\u30EA\u3068\u30DF\u30E5\u30FC\u30C6\u30FC\u30B7\u30E7\u30F3\u306B\u4F7F\u7528\u3057\u307E\u3059\u3002\u8A8D\u8A3C\u306F\u81EA\u52D5\u7684\u306B\u8A2D\u5B9A\u3055\u308C\u307E\u3059\u3002Linear\u306EAPI\u306FGraphQL\u306E\u307F\u3067\u3059\u3002\u30AF\u30A8\u30EA\u6587\u5B57\u5217\u3068\u30AA\u30D7\u30B7\u30E7\u30F3\u306E\u5909\u6570\u3092\u9001\u4FE1\u3057\u307E\u3059\u3002\u30DA\u30FC\u30B8\u30CD\u30FC\u30B7\u30E7\u30F3\u306FRelay\u5F62\u5F0F\u306E\u30AB\u30FC\u30BD\u30EB\u30D9\u30FC\u30B9\u3067\u3001\`first\`/\`after\`\u304A\u3088\u3073\`last\`/\`before\`\u5F15\u6570\u3092\u4F7F\u7528\u3057\u307E\u3059\u3002\u30A2\u30FC\u30AB\u30A4\u30D6\u3055\u308C\u305F\u30EA\u30BD\u30FC\u30B9\u306F\u30C7\u30D5\u30A9\u30EB\u30C8\u3067\u975E\u8868\u793A\u3067\u3059\u3002\`includeArchived: true\`\u3092\u6E21\u3059\u3068\u542B\u3081\u3089\u308C\u307E\u3059\u3002
745
+ - \`connector_linear_request\`: Linear GraphQL API\u3092\u547C\u3073\u51FA\u3059\u552F\u4E00\u306E\u624B\u6BB5\u3067\u3059\u3002Issue\u3001\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8\u3001\u30C1\u30FC\u30E0\u3001\u30B5\u30A4\u30AF\u30EB\u3001\u30E6\u30FC\u30B6\u30FC\u3001\u30E9\u30D9\u30EB\u3001\u30EF\u30FC\u30AF\u30D5\u30ED\u30FC\u72B6\u614B\u3001\u30B3\u30E1\u30F3\u30C8\u306A\u3069\u3059\u3079\u3066\u306ELinear\u30EA\u30BD\u30FC\u30B9\u306E\u30AF\u30A8\u30EA\u3068\u30DF\u30E5\u30FC\u30C6\u30FC\u30B7\u30E7\u30F3\u306B\u4F7F\u7528\u3057\u307E\u3059\u3002\u8A8D\u8A3C\u306F\u81EA\u52D5\u7684\u306B\u8A2D\u5B9A\u3055\u308C\u307E\u3059\u3002Linear\u306EAPI\u306FGraphQL\u306E\u307F\u3067\u3059\u3002\u30AF\u30A8\u30EA\u6587\u5B57\u5217\u3068\u30AA\u30D7\u30B7\u30E7\u30F3\u306E\u5909\u6570\u3092\u9001\u4FE1\u3057\u307E\u3059\u3002\u30DA\u30FC\u30B8\u30CD\u30FC\u30B7\u30E7\u30F3\u306FRelay\u5F62\u5F0F\u306E\u30AB\u30FC\u30BD\u30EB\u30D9\u30FC\u30B9\u3067\u3001\`first\`/\`after\`\u304A\u3088\u3073\`last\`/\`before\`\u5F15\u6570\u3092\u4F7F\u7528\u3057\u307E\u3059\u3002\u30A2\u30FC\u30AB\u30A4\u30D6\u3055\u308C\u305F\u30EA\u30BD\u30FC\u30B9\u306F\u30C7\u30D5\u30A9\u30EB\u30C8\u3067\u975E\u8868\u793A\u3067\u3059\u3002\`includeArchived: true\`\u3092\u6E21\u3059\u3068\u542B\u3081\u3089\u308C\u307E\u3059\u3002
677
746
 
678
747
  ### Business Logic
679
748
 
@@ -16,6 +16,7 @@ var init_parameter_definition = __esm({
16
16
  type;
17
17
  secret;
18
18
  required;
19
+ isDeprecated;
19
20
  constructor(config) {
20
21
  this.slug = config.slug;
21
22
  this.name = config.name;
@@ -24,6 +25,7 @@ var init_parameter_definition = __esm({
24
25
  this.type = config.type;
25
26
  this.secret = config.secret;
26
27
  this.required = config.required;
28
+ this.isDeprecated = config.isDeprecated ?? false;
27
29
  }
28
30
  /**
29
31
  * Get the parameter value from a ConnectorConnectionObject.
@@ -169,7 +171,7 @@ var ConnectorPlugin = class _ConnectorPlugin {
169
171
  /**
170
172
  * Create tools for connections that belong to this connector.
171
173
  * Filters connections by connectorKey internally.
172
- * Returns tools keyed as `${connectorKey}_${toolName}`.
174
+ * Returns tools keyed as `connector_${connectorKey}_${toolName}`.
173
175
  */
174
176
  createTools(connections, config, opts) {
175
177
  const myConnections = connections.filter(
@@ -179,7 +181,7 @@ var ConnectorPlugin = class _ConnectorPlugin {
179
181
  for (const t of Object.values(this.tools)) {
180
182
  const tool = t.createTool(myConnections, config);
181
183
  const originalToModelOutput = tool.toModelOutput;
182
- result[`${this.connectorKey}_${t.name}`] = {
184
+ result[`connector_${this.connectorKey}_${t.name}`] = {
183
185
  ...tool,
184
186
  toModelOutput: async (options) => {
185
187
  if (!originalToModelOutput) {
@@ -235,19 +237,34 @@ async function runSetupFlow(flow, params, ctx, config) {
235
237
  };
236
238
  let state = flow.initialState();
237
239
  let answerIdx = 0;
240
+ const pendingParameterUpdates = [];
238
241
  for (const step of flow.steps) {
239
242
  const ans = ctx.answers[answerIdx];
240
243
  if (ans && ans.questionSlug === step.slug) {
241
244
  state = step.applyAnswer(state, ans.answer);
245
+ if (step.toParameterUpdates) {
246
+ pendingParameterUpdates.push(...step.toParameterUpdates(state));
247
+ }
242
248
  answerIdx += 1;
243
249
  continue;
244
250
  }
251
+ const resolvedAllowFreeText = step.allowFreeText !== void 0 ? step.allowFreeText : true;
245
252
  if (step.type === "text") {
253
+ if (step.fetchOptions) {
254
+ const options2 = await step.fetchOptions(state, runtime);
255
+ if (options2.length === 0) {
256
+ continue;
257
+ }
258
+ }
246
259
  return {
247
260
  type: "nextQuestion",
248
261
  questionSlug: step.slug,
249
262
  question: step.question[ctx.language],
250
- questionType: "text"
263
+ questionType: "text",
264
+ allowFreeText: resolvedAllowFreeText,
265
+ ...pendingParameterUpdates.length > 0 && {
266
+ parameterUpdates: pendingParameterUpdates
267
+ }
251
268
  };
252
269
  }
253
270
  const options = step.fetchOptions ? await step.fetchOptions(state, runtime) : [];
@@ -259,11 +276,21 @@ async function runSetupFlow(flow, params, ctx, config) {
259
276
  questionSlug: step.slug,
260
277
  question: step.question[ctx.language],
261
278
  questionType: step.type,
262
- options
279
+ options,
280
+ allowFreeText: resolvedAllowFreeText,
281
+ ...pendingParameterUpdates.length > 0 && {
282
+ parameterUpdates: pendingParameterUpdates
283
+ }
263
284
  };
264
285
  }
265
286
  const dataInvestigationResult = await flow.finalize(state, runtime);
266
- return { type: "fulfilled", dataInvestigationResult };
287
+ return {
288
+ type: "fulfilled",
289
+ dataInvestigationResult,
290
+ ...pendingParameterUpdates.length > 0 && {
291
+ parameterUpdates: pendingParameterUpdates
292
+ }
293
+ };
267
294
  }
268
295
  async function resolveSetupSelection(params) {
269
296
  const { selected, allSentinel, fetchAll, limit } = params;
@@ -426,11 +453,11 @@ var linkedinAdsOnboarding = new ConnectorOnboarding({
426
453
  - Write only 1 sentence between tool calls, then immediately call the next tool. Skip unnecessary explanations and proceed efficiently`
427
454
  },
428
455
  dataOverviewInstructions: {
429
- en: `1. Call linkedin-ads_request with GET adAccounts/{adAccountId}/adCampaigns?q=search&search=(status:(values:List(ACTIVE)))&pageSize=10 to explore campaigns
430
- 2. Call linkedin-ads_request with GET adAnalytics?q=analytics&pivot=CAMPAIGN&timeGranularity=MONTHLY&dateRange=(start:(year:2025,month:1,day:1))&accounts=List(urn%3Ali%3AsponsoredAccount%3A{adAccountId})&fields=impressions,clicks,costInLocalCurrency,dateRange,pivotValues to check recent performance
456
+ en: `1. Call connector_linkedin-ads_request with GET adAccounts/{adAccountId}/adCampaigns?q=search&search=(status:(values:List(ACTIVE)))&pageSize=10 to explore campaigns
457
+ 2. Call connector_linkedin-ads_request with GET adAnalytics?q=analytics&pivot=CAMPAIGN&timeGranularity=MONTHLY&dateRange=(start:(year:2025,month:1,day:1))&accounts=List(urn%3Ali%3AsponsoredAccount%3A{adAccountId})&fields=impressions,clicks,costInLocalCurrency,dateRange,pivotValues to check recent performance
431
458
  3. Explore campaign groups and creatives as needed to understand the data structure`,
432
- ja: `1. linkedin-ads_request \u3067 GET adAccounts/{adAccountId}/adCampaigns?q=search&search=(status:(values:List(ACTIVE)))&pageSize=10 \u3092\u547C\u3073\u51FA\u3057\u3066\u30AD\u30E3\u30F3\u30DA\u30FC\u30F3\u30C7\u30FC\u30BF\u3092\u63A2\u7D22
433
- 2. linkedin-ads_request \u3067 GET adAnalytics?q=analytics&pivot=CAMPAIGN&timeGranularity=MONTHLY&dateRange=(start:(year:2025,month:1,day:1))&accounts=List(urn%3Ali%3AsponsoredAccount%3A{adAccountId})&fields=impressions,clicks,costInLocalCurrency,dateRange,pivotValues \u3092\u547C\u3073\u51FA\u3057\u3066\u76F4\u8FD1\u306E\u30D1\u30D5\u30A9\u30FC\u30DE\u30F3\u30B9\u3092\u78BA\u8A8D
459
+ ja: `1. connector_linkedin-ads_request \u3067 GET adAccounts/{adAccountId}/adCampaigns?q=search&search=(status:(values:List(ACTIVE)))&pageSize=10 \u3092\u547C\u3073\u51FA\u3057\u3066\u30AD\u30E3\u30F3\u30DA\u30FC\u30F3\u30C7\u30FC\u30BF\u3092\u63A2\u7D22
460
+ 2. connector_linkedin-ads_request \u3067 GET adAnalytics?q=analytics&pivot=CAMPAIGN&timeGranularity=MONTHLY&dateRange=(start:(year:2025,month:1,day:1))&accounts=List(urn%3Ali%3AsponsoredAccount%3A{adAccountId})&fields=impressions,clicks,costInLocalCurrency,dateRange,pivotValues \u3092\u547C\u3073\u51FA\u3057\u3066\u76F4\u8FD1\u306E\u30D1\u30D5\u30A9\u30FC\u30DE\u30F3\u30B9\u3092\u78BA\u8A8D
434
461
  3. \u5FC5\u8981\u306B\u5FDC\u3058\u3066\u30AD\u30E3\u30F3\u30DA\u30FC\u30F3\u30B0\u30EB\u30FC\u30D7\u3084\u30AF\u30EA\u30A8\u30A4\u30C6\u30A3\u30D6\u3092\u63A2\u7D22\u3057\u3001\u30C7\u30FC\u30BF\u69CB\u9020\u3092\u628A\u63E1`
435
462
  }
436
463
  });
@@ -475,6 +502,24 @@ async function listAdAccounts(proxyFetch) {
475
502
  const data = await res.json();
476
503
  return data.elements ?? [];
477
504
  }
505
+ async function fetchCampaignCount(proxyFetch, accountId) {
506
+ try {
507
+ const account = encodeURIComponent(
508
+ `urn:li:sponsoredAccount:${accountId}`
509
+ );
510
+ const url = `${BASE_URL3}/adCampaigns?q=search&search.account.values[0]=${account}&count=1`;
511
+ const res = await proxyFetch(url, {
512
+ method: "GET",
513
+ headers: defaultHeaders()
514
+ });
515
+ if (!res.ok) return null;
516
+ const data = await res.json();
517
+ const total = data.paging?.total;
518
+ return typeof total === "number" ? total : null;
519
+ } catch {
520
+ return null;
521
+ }
522
+ }
478
523
  var linkedinAdsSetupFlow = {
479
524
  initialState: () => ({}),
480
525
  steps: [
@@ -522,16 +567,25 @@ var linkedinAdsSetupFlow = {
522
567
  sections.push("_No ad accounts selected._", "");
523
568
  return sections.join("\n");
524
569
  }
525
- sections.push("| Ad Account ID | Name | Currency | Type | Status |");
526
- sections.push("|---------------|------|----------|------|--------|");
527
- for (const id of targetIds) {
570
+ sections.push(
571
+ "| Ad Account ID | Name | Currency | Type | Status | Campaigns |"
572
+ );
573
+ sections.push(
574
+ "|---------------|------|----------|------|--------|-----------|"
575
+ );
576
+ const campaignCounts = await Promise.all(
577
+ targetIds.map((id) => fetchCampaignCount(rt.config.proxyFetch, id))
578
+ );
579
+ for (let i = 0; i < targetIds.length; i++) {
580
+ const id = targetIds[i];
528
581
  const account = byId.get(id);
529
582
  const name = (account?.name ?? "-").replace(/\|/g, "\\|");
530
583
  const currency = account?.currency ?? "-";
531
584
  const type = account?.type ?? "-";
532
585
  const status = account?.status ?? "-";
586
+ const campaigns = campaignCounts[i] == null ? "-" : String(campaignCounts[i]);
533
587
  sections.push(
534
- `| ${id} | ${name} | ${currency} | ${type} | ${status} |`
588
+ `| ${id} | ${name} | ${currency} | ${type} | ${status} | ${campaigns} |`
535
589
  );
536
590
  }
537
591
  sections.push("");
@@ -699,8 +753,8 @@ var linkedinAdsConnector = new ConnectorPlugin({
699
753
  systemPrompt: {
700
754
  en: `### Tools
701
755
 
702
- - \`linkedin-ads_request\`: Send authenticated requests to the LinkedIn Marketing API (REST). The {adAccountId} placeholder in paths is automatically replaced. Authentication is handled automatically via OAuth proxy. Required headers (LinkedIn-Version, X-Restli-Protocol-Version) are set automatically.
703
- - \`linkedin-ads_listAdAccounts\`: List accessible LinkedIn ad accounts. Use this during setup to discover available accounts.
756
+ - \`connector_linkedin-ads_request\`: Send authenticated requests to the LinkedIn Marketing API (REST). The {adAccountId} placeholder in paths is automatically replaced. Authentication is handled automatically via OAuth proxy. Required headers (LinkedIn-Version, X-Restli-Protocol-Version) are set automatically.
757
+ - \`connector_linkedin-ads_listAdAccounts\`: List accessible LinkedIn ad accounts. Use this during setup to discover available accounts.
704
758
 
705
759
  ### LinkedIn Marketing API Reference
706
760
 
@@ -792,8 +846,8 @@ const data = await res.json();
792
846
  \`\`\``,
793
847
  ja: `### \u30C4\u30FC\u30EB
794
848
 
795
- - \`linkedin-ads_request\`: LinkedIn Marketing API\uFF08REST\uFF09\u3078\u8A8D\u8A3C\u6E08\u307F\u30EA\u30AF\u30A8\u30B9\u30C8\u3092\u9001\u4FE1\u3057\u307E\u3059\u3002\u30D1\u30B9\u5185\u306E{adAccountId}\u30D7\u30EC\u30FC\u30B9\u30DB\u30EB\u30C0\u30FC\u306F\u81EA\u52D5\u7684\u306B\u7F6E\u63DB\u3055\u308C\u307E\u3059\u3002\u8A8D\u8A3C\u306FOAuth\u30D7\u30ED\u30AD\u30B7\u7D4C\u7531\u3067\u81EA\u52D5\u7684\u306B\u51E6\u7406\u3055\u308C\u307E\u3059\u3002\u5FC5\u9808\u30D8\u30C3\u30C0\u30FC\uFF08LinkedIn-Version\u3001X-Restli-Protocol-Version\uFF09\u306F\u81EA\u52D5\u8A2D\u5B9A\u3055\u308C\u307E\u3059\u3002
796
- - \`linkedin-ads_listAdAccounts\`: \u30A2\u30AF\u30BB\u30B9\u53EF\u80FD\u306ALinkedIn\u5E83\u544A\u30A2\u30AB\u30A6\u30F3\u30C8\u306E\u4E00\u89A7\u3092\u53D6\u5F97\u3057\u307E\u3059\u3002\u30BB\u30C3\u30C8\u30A2\u30C3\u30D7\u6642\u306B\u5229\u7528\u53EF\u80FD\u306A\u30A2\u30AB\u30A6\u30F3\u30C8\u3092\u78BA\u8A8D\u3059\u308B\u305F\u3081\u306B\u4F7F\u7528\u3057\u307E\u3059\u3002
849
+ - \`connector_linkedin-ads_request\`: LinkedIn Marketing API\uFF08REST\uFF09\u3078\u8A8D\u8A3C\u6E08\u307F\u30EA\u30AF\u30A8\u30B9\u30C8\u3092\u9001\u4FE1\u3057\u307E\u3059\u3002\u30D1\u30B9\u5185\u306E{adAccountId}\u30D7\u30EC\u30FC\u30B9\u30DB\u30EB\u30C0\u30FC\u306F\u81EA\u52D5\u7684\u306B\u7F6E\u63DB\u3055\u308C\u307E\u3059\u3002\u8A8D\u8A3C\u306FOAuth\u30D7\u30ED\u30AD\u30B7\u7D4C\u7531\u3067\u81EA\u52D5\u7684\u306B\u51E6\u7406\u3055\u308C\u307E\u3059\u3002\u5FC5\u9808\u30D8\u30C3\u30C0\u30FC\uFF08LinkedIn-Version\u3001X-Restli-Protocol-Version\uFF09\u306F\u81EA\u52D5\u8A2D\u5B9A\u3055\u308C\u307E\u3059\u3002
850
+ - \`connector_linkedin-ads_listAdAccounts\`: \u30A2\u30AF\u30BB\u30B9\u53EF\u80FD\u306ALinkedIn\u5E83\u544A\u30A2\u30AB\u30A6\u30F3\u30C8\u306E\u4E00\u89A7\u3092\u53D6\u5F97\u3057\u307E\u3059\u3002\u30BB\u30C3\u30C8\u30A2\u30C3\u30D7\u6642\u306B\u5229\u7528\u53EF\u80FD\u306A\u30A2\u30AB\u30A6\u30F3\u30C8\u3092\u78BA\u8A8D\u3059\u308B\u305F\u3081\u306B\u4F7F\u7528\u3057\u307E\u3059\u3002
797
851
 
798
852
  ### LinkedIn Marketing API \u30EA\u30D5\u30A1\u30EC\u30F3\u30B9
799
853
 
@@ -16,6 +16,7 @@ var init_parameter_definition = __esm({
16
16
  type;
17
17
  secret;
18
18
  required;
19
+ isDeprecated;
19
20
  constructor(config) {
20
21
  this.slug = config.slug;
21
22
  this.name = config.name;
@@ -24,6 +25,7 @@ var init_parameter_definition = __esm({
24
25
  this.type = config.type;
25
26
  this.secret = config.secret;
26
27
  this.required = config.required;
28
+ this.isDeprecated = config.isDeprecated ?? false;
27
29
  }
28
30
  /**
29
31
  * Get the parameter value from a ConnectorConnectionObject.
@@ -175,7 +177,7 @@ var ConnectorPlugin = class _ConnectorPlugin {
175
177
  /**
176
178
  * Create tools for connections that belong to this connector.
177
179
  * Filters connections by connectorKey internally.
178
- * Returns tools keyed as `${connectorKey}_${toolName}`.
180
+ * Returns tools keyed as `connector_${connectorKey}_${toolName}`.
179
181
  */
180
182
  createTools(connections, config, opts) {
181
183
  const myConnections = connections.filter(
@@ -185,7 +187,7 @@ var ConnectorPlugin = class _ConnectorPlugin {
185
187
  for (const t of Object.values(this.tools)) {
186
188
  const tool = t.createTool(myConnections, config);
187
189
  const originalToModelOutput = tool.toModelOutput;
188
- result[`${this.connectorKey}_${t.name}`] = {
190
+ result[`connector_${this.connectorKey}_${t.name}`] = {
189
191
  ...tool,
190
192
  toModelOutput: async (options) => {
191
193
  if (!originalToModelOutput) {
@@ -241,19 +243,34 @@ async function runSetupFlow(flow, params, ctx, config) {
241
243
  };
242
244
  let state = flow.initialState();
243
245
  let answerIdx = 0;
246
+ const pendingParameterUpdates = [];
244
247
  for (const step of flow.steps) {
245
248
  const ans = ctx.answers[answerIdx];
246
249
  if (ans && ans.questionSlug === step.slug) {
247
250
  state = step.applyAnswer(state, ans.answer);
251
+ if (step.toParameterUpdates) {
252
+ pendingParameterUpdates.push(...step.toParameterUpdates(state));
253
+ }
248
254
  answerIdx += 1;
249
255
  continue;
250
256
  }
257
+ const resolvedAllowFreeText = step.allowFreeText !== void 0 ? step.allowFreeText : true;
251
258
  if (step.type === "text") {
259
+ if (step.fetchOptions) {
260
+ const options2 = await step.fetchOptions(state, runtime);
261
+ if (options2.length === 0) {
262
+ continue;
263
+ }
264
+ }
252
265
  return {
253
266
  type: "nextQuestion",
254
267
  questionSlug: step.slug,
255
268
  question: step.question[ctx.language],
256
- questionType: "text"
269
+ questionType: "text",
270
+ allowFreeText: resolvedAllowFreeText,
271
+ ...pendingParameterUpdates.length > 0 && {
272
+ parameterUpdates: pendingParameterUpdates
273
+ }
257
274
  };
258
275
  }
259
276
  const options = step.fetchOptions ? await step.fetchOptions(state, runtime) : [];
@@ -265,11 +282,21 @@ async function runSetupFlow(flow, params, ctx, config) {
265
282
  questionSlug: step.slug,
266
283
  question: step.question[ctx.language],
267
284
  questionType: step.type,
268
- options
285
+ options,
286
+ allowFreeText: resolvedAllowFreeText,
287
+ ...pendingParameterUpdates.length > 0 && {
288
+ parameterUpdates: pendingParameterUpdates
289
+ }
269
290
  };
270
291
  }
271
292
  const dataInvestigationResult = await flow.finalize(state, runtime);
272
- return { type: "fulfilled", dataInvestigationResult };
293
+ return {
294
+ type: "fulfilled",
295
+ dataInvestigationResult,
296
+ ...pendingParameterUpdates.length > 0 && {
297
+ parameterUpdates: pendingParameterUpdates
298
+ }
299
+ };
273
300
  }
274
301
  async function resolveSetupSelection(params) {
275
302
  const { selected, allSentinel, fetchAll, limit } = params;
@@ -290,11 +317,11 @@ var AUTH_TYPES = {
290
317
  // ../connectors/src/connectors/mailchimp-oauth/setup.ts
291
318
  var mailchimpOauthOnboarding = new ConnectorOnboarding({
292
319
  dataOverviewInstructions: {
293
- en: `1. Call mailchimp-oauth_request with GET /lists to list all audiences
320
+ en: `1. Call connector_mailchimp-oauth_request with GET /lists to list all audiences
294
321
  2. Pick an audience and call GET /lists/{list_id}/members?count=5 to sample members
295
322
  3. Call GET /campaigns?count=5 to list recent campaigns
296
323
  4. Call GET /reports?count=5 to view campaign reports`,
297
- ja: `1. mailchimp-oauth_request \u3067 GET /lists \u3092\u547C\u3073\u51FA\u3057\u3001\u5168\u30AA\u30FC\u30C7\u30A3\u30A8\u30F3\u30B9\u4E00\u89A7\u3092\u53D6\u5F97
324
+ ja: `1. connector_mailchimp-oauth_request \u3067 GET /lists \u3092\u547C\u3073\u51FA\u3057\u3001\u5168\u30AA\u30FC\u30C7\u30A3\u30A8\u30F3\u30B9\u4E00\u89A7\u3092\u53D6\u5F97
298
325
  2. \u30AA\u30FC\u30C7\u30A3\u30A8\u30F3\u30B9\u3092\u9078\u629E\u3057 GET /lists/{list_id}/members?count=5 \u3067\u30E1\u30F3\u30D0\u30FC\u3092\u30B5\u30F3\u30D7\u30EA\u30F3\u30B0
299
326
  3. GET /campaigns?count=5 \u3067\u6700\u8FD1\u306E\u30AD\u30E3\u30F3\u30DA\u30FC\u30F3\u4E00\u89A7\u3092\u53D6\u5F97
300
327
  4. GET /reports?count=5 \u3067\u30AD\u30E3\u30F3\u30DA\u30FC\u30F3\u30EC\u30DD\u30FC\u30C8\u3092\u8868\u793A`
@@ -549,7 +576,7 @@ var mailchimpOauthConnector = new ConnectorPlugin({
549
576
  systemPrompt: {
550
577
  en: `### Tools
551
578
 
552
- - \`mailchimp-oauth_request\`: The only way to call the Mailchimp Marketing API v3. Use it to manage audiences/lists, subscribers/members, campaigns, templates, automations, and reports. Authentication is configured automatically via OAuth.
579
+ - \`connector_mailchimp-oauth_request\`: The only way to call the Mailchimp Marketing API v3. Use it to manage audiences/lists, subscribers/members, campaigns, templates, automations, and reports. Authentication is configured automatically via OAuth.
553
580
 
554
581
  ### Mailchimp Marketing API v3 Reference
555
582
 
@@ -607,7 +634,7 @@ const data = await res.json();
607
634
  \`\`\``,
608
635
  ja: `### \u30C4\u30FC\u30EB
609
636
 
610
- - \`mailchimp-oauth_request\`: Mailchimp Marketing API v3\u3092\u547C\u3073\u51FA\u3059\u552F\u4E00\u306E\u624B\u6BB5\u3067\u3059\u3002\u30AA\u30FC\u30C7\u30A3\u30A8\u30F3\u30B9/\u30EA\u30B9\u30C8\u3001\u30B5\u30D6\u30B9\u30AF\u30E9\u30A4\u30D0\u30FC/\u30E1\u30F3\u30D0\u30FC\u3001\u30AD\u30E3\u30F3\u30DA\u30FC\u30F3\u3001\u30C6\u30F3\u30D7\u30EC\u30FC\u30C8\u3001\u30AA\u30FC\u30C8\u30E1\u30FC\u30B7\u30E7\u30F3\u3001\u30EC\u30DD\u30FC\u30C8\u306E\u7BA1\u7406\u306B\u4F7F\u7528\u3057\u307E\u3059\u3002OAuth\u7D4C\u7531\u3067\u8A8D\u8A3C\u306F\u81EA\u52D5\u8A2D\u5B9A\u3055\u308C\u307E\u3059\u3002
637
+ - \`connector_mailchimp-oauth_request\`: Mailchimp Marketing API v3\u3092\u547C\u3073\u51FA\u3059\u552F\u4E00\u306E\u624B\u6BB5\u3067\u3059\u3002\u30AA\u30FC\u30C7\u30A3\u30A8\u30F3\u30B9/\u30EA\u30B9\u30C8\u3001\u30B5\u30D6\u30B9\u30AF\u30E9\u30A4\u30D0\u30FC/\u30E1\u30F3\u30D0\u30FC\u3001\u30AD\u30E3\u30F3\u30DA\u30FC\u30F3\u3001\u30C6\u30F3\u30D7\u30EC\u30FC\u30C8\u3001\u30AA\u30FC\u30C8\u30E1\u30FC\u30B7\u30E7\u30F3\u3001\u30EC\u30DD\u30FC\u30C8\u306E\u7BA1\u7406\u306B\u4F7F\u7528\u3057\u307E\u3059\u3002OAuth\u7D4C\u7531\u3067\u8A8D\u8A3C\u306F\u81EA\u52D5\u8A2D\u5B9A\u3055\u308C\u307E\u3059\u3002
611
638
 
612
639
  ### Mailchimp Marketing API v3 \u30EA\u30D5\u30A1\u30EC\u30F3\u30B9
613
640
 
@@ -16,6 +16,7 @@ var init_parameter_definition = __esm({
16
16
  type;
17
17
  secret;
18
18
  required;
19
+ isDeprecated;
19
20
  constructor(config) {
20
21
  this.slug = config.slug;
21
22
  this.name = config.name;
@@ -24,6 +25,7 @@ var init_parameter_definition = __esm({
24
25
  this.type = config.type;
25
26
  this.secret = config.secret;
26
27
  this.required = config.required;
28
+ this.isDeprecated = config.isDeprecated ?? false;
27
29
  }
28
30
  /**
29
31
  * Get the parameter value from a ConnectorConnectionObject.
@@ -280,7 +282,7 @@ var ConnectorPlugin = class _ConnectorPlugin {
280
282
  /**
281
283
  * Create tools for connections that belong to this connector.
282
284
  * Filters connections by connectorKey internally.
283
- * Returns tools keyed as `${connectorKey}_${toolName}`.
285
+ * Returns tools keyed as `connector_${connectorKey}_${toolName}`.
284
286
  */
285
287
  createTools(connections, config, opts) {
286
288
  const myConnections = connections.filter(
@@ -290,7 +292,7 @@ var ConnectorPlugin = class _ConnectorPlugin {
290
292
  for (const t of Object.values(this.tools)) {
291
293
  const tool = t.createTool(myConnections, config);
292
294
  const originalToModelOutput = tool.toModelOutput;
293
- result[`${this.connectorKey}_${t.name}`] = {
295
+ result[`connector_${this.connectorKey}_${t.name}`] = {
294
296
  ...tool,
295
297
  toModelOutput: async (options) => {
296
298
  if (!originalToModelOutput) {
@@ -346,19 +348,34 @@ async function runSetupFlow(flow, params, ctx, config) {
346
348
  };
347
349
  let state = flow.initialState();
348
350
  let answerIdx = 0;
351
+ const pendingParameterUpdates = [];
349
352
  for (const step of flow.steps) {
350
353
  const ans = ctx.answers[answerIdx];
351
354
  if (ans && ans.questionSlug === step.slug) {
352
355
  state = step.applyAnswer(state, ans.answer);
356
+ if (step.toParameterUpdates) {
357
+ pendingParameterUpdates.push(...step.toParameterUpdates(state));
358
+ }
353
359
  answerIdx += 1;
354
360
  continue;
355
361
  }
362
+ const resolvedAllowFreeText = step.allowFreeText !== void 0 ? step.allowFreeText : true;
356
363
  if (step.type === "text") {
364
+ if (step.fetchOptions) {
365
+ const options2 = await step.fetchOptions(state, runtime);
366
+ if (options2.length === 0) {
367
+ continue;
368
+ }
369
+ }
357
370
  return {
358
371
  type: "nextQuestion",
359
372
  questionSlug: step.slug,
360
373
  question: step.question[ctx.language],
361
- questionType: "text"
374
+ questionType: "text",
375
+ allowFreeText: resolvedAllowFreeText,
376
+ ...pendingParameterUpdates.length > 0 && {
377
+ parameterUpdates: pendingParameterUpdates
378
+ }
362
379
  };
363
380
  }
364
381
  const options = step.fetchOptions ? await step.fetchOptions(state, runtime) : [];
@@ -370,11 +387,21 @@ async function runSetupFlow(flow, params, ctx, config) {
370
387
  questionSlug: step.slug,
371
388
  question: step.question[ctx.language],
372
389
  questionType: step.type,
373
- options
390
+ options,
391
+ allowFreeText: resolvedAllowFreeText,
392
+ ...pendingParameterUpdates.length > 0 && {
393
+ parameterUpdates: pendingParameterUpdates
394
+ }
374
395
  };
375
396
  }
376
397
  const dataInvestigationResult = await flow.finalize(state, runtime);
377
- return { type: "fulfilled", dataInvestigationResult };
398
+ return {
399
+ type: "fulfilled",
400
+ dataInvestigationResult,
401
+ ...pendingParameterUpdates.length > 0 && {
402
+ parameterUpdates: pendingParameterUpdates
403
+ }
404
+ };
378
405
  }
379
406
  async function resolveSetupSelection(params) {
380
407
  const { selected, allSentinel, fetchAll, limit } = params;
@@ -395,11 +422,11 @@ var AUTH_TYPES = {
395
422
  // ../connectors/src/connectors/mailchimp/setup.ts
396
423
  var mailchimpOnboarding = new ConnectorOnboarding({
397
424
  dataOverviewInstructions: {
398
- en: `1. Call mailchimp_request with GET /lists to list all audiences
425
+ en: `1. Call connector_mailchimp_request with GET /lists to list all audiences
399
426
  2. Pick an audience and call GET /lists/{list_id}/members?count=5 to sample members
400
427
  3. Call GET /campaigns?count=5 to list recent campaigns
401
428
  4. Call GET /reports?count=5 to view campaign reports`,
402
- ja: `1. mailchimp_request \u3067 GET /lists \u3092\u547C\u3073\u51FA\u3057\u3001\u5168\u30AA\u30FC\u30C7\u30A3\u30A8\u30F3\u30B9\u4E00\u89A7\u3092\u53D6\u5F97
429
+ ja: `1. connector_mailchimp_request \u3067 GET /lists \u3092\u547C\u3073\u51FA\u3057\u3001\u5168\u30AA\u30FC\u30C7\u30A3\u30A8\u30F3\u30B9\u4E00\u89A7\u3092\u53D6\u5F97
403
430
  2. \u30AA\u30FC\u30C7\u30A3\u30A8\u30F3\u30B9\u3092\u9078\u629E\u3057 GET /lists/{list_id}/members?count=5 \u3067\u30E1\u30F3\u30D0\u30FC\u3092\u30B5\u30F3\u30D7\u30EA\u30F3\u30B0
404
431
  3. GET /campaigns?count=5 \u3067\u6700\u8FD1\u306E\u30AD\u30E3\u30F3\u30DA\u30FC\u30F3\u4E00\u89A7\u3092\u53D6\u5F97
405
432
  4. GET /reports?count=5 \u3067\u30AD\u30E3\u30F3\u30DA\u30FC\u30F3\u30EC\u30DD\u30FC\u30C8\u3092\u8868\u793A`
@@ -620,7 +647,7 @@ var mailchimpConnector = new ConnectorPlugin({
620
647
  systemPrompt: {
621
648
  en: `### Tools
622
649
 
623
- - \`mailchimp_request\`: The only way to call the Mailchimp Marketing API v3. Use it to manage audiences/lists, subscribers/members, campaigns, templates, automations, and reports. Authentication (Basic Auth with API key) is configured automatically. The datacenter is extracted from the API key suffix.
650
+ - \`connector_mailchimp_request\`: The only way to call the Mailchimp Marketing API v3. Use it to manage audiences/lists, subscribers/members, campaigns, templates, automations, and reports. Authentication (Basic Auth with API key) is configured automatically. The datacenter is extracted from the API key suffix.
624
651
 
625
652
  ### Business Logic
626
653
 
@@ -717,7 +744,7 @@ export default async function handler(c: Context) {
717
744
  - Errors return \`type\`, \`title\`, \`status\`, \`detail\`, and \`instance\` fields`,
718
745
  ja: `### \u30C4\u30FC\u30EB
719
746
 
720
- - \`mailchimp_request\`: Mailchimp Marketing API v3\u3092\u547C\u3073\u51FA\u3059\u552F\u4E00\u306E\u624B\u6BB5\u3067\u3059\u3002\u30AA\u30FC\u30C7\u30A3\u30A8\u30F3\u30B9/\u30EA\u30B9\u30C8\u3001\u30B5\u30D6\u30B9\u30AF\u30E9\u30A4\u30D0\u30FC/\u30E1\u30F3\u30D0\u30FC\u3001\u30AD\u30E3\u30F3\u30DA\u30FC\u30F3\u3001\u30C6\u30F3\u30D7\u30EC\u30FC\u30C8\u3001\u30AA\u30FC\u30C8\u30E1\u30FC\u30B7\u30E7\u30F3\u3001\u30EC\u30DD\u30FC\u30C8\u306E\u7BA1\u7406\u306B\u4F7F\u7528\u3057\u307E\u3059\u3002\u8A8D\u8A3C\uFF08API\u30AD\u30FC\u306B\u3088\u308BBasic Auth\uFF09\u306F\u81EA\u52D5\u7684\u306B\u8A2D\u5B9A\u3055\u308C\u307E\u3059\u3002\u30C7\u30FC\u30BF\u30BB\u30F3\u30BF\u30FC\u306FAPI\u30AD\u30FC\u306E\u30B5\u30D5\u30A3\u30C3\u30AF\u30B9\u304B\u3089\u81EA\u52D5\u691C\u51FA\u3055\u308C\u307E\u3059\u3002
747
+ - \`connector_mailchimp_request\`: Mailchimp Marketing API v3\u3092\u547C\u3073\u51FA\u3059\u552F\u4E00\u306E\u624B\u6BB5\u3067\u3059\u3002\u30AA\u30FC\u30C7\u30A3\u30A8\u30F3\u30B9/\u30EA\u30B9\u30C8\u3001\u30B5\u30D6\u30B9\u30AF\u30E9\u30A4\u30D0\u30FC/\u30E1\u30F3\u30D0\u30FC\u3001\u30AD\u30E3\u30F3\u30DA\u30FC\u30F3\u3001\u30C6\u30F3\u30D7\u30EC\u30FC\u30C8\u3001\u30AA\u30FC\u30C8\u30E1\u30FC\u30B7\u30E7\u30F3\u3001\u30EC\u30DD\u30FC\u30C8\u306E\u7BA1\u7406\u306B\u4F7F\u7528\u3057\u307E\u3059\u3002\u8A8D\u8A3C\uFF08API\u30AD\u30FC\u306B\u3088\u308BBasic Auth\uFF09\u306F\u81EA\u52D5\u7684\u306B\u8A2D\u5B9A\u3055\u308C\u307E\u3059\u3002\u30C7\u30FC\u30BF\u30BB\u30F3\u30BF\u30FC\u306FAPI\u30AD\u30FC\u306E\u30B5\u30D5\u30A3\u30C3\u30AF\u30B9\u304B\u3089\u81EA\u52D5\u691C\u51FA\u3055\u308C\u307E\u3059\u3002
721
748
 
722
749
  ### Business Logic
723
750