@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.
@@ -222,7 +224,7 @@ var ConnectorPlugin = class _ConnectorPlugin {
222
224
  /**
223
225
  * Create tools for connections that belong to this connector.
224
226
  * Filters connections by connectorKey internally.
225
- * Returns tools keyed as `${connectorKey}_${toolName}`.
227
+ * Returns tools keyed as `connector_${connectorKey}_${toolName}`.
226
228
  */
227
229
  createTools(connections, config, opts) {
228
230
  const myConnections = connections.filter(
@@ -232,7 +234,7 @@ var ConnectorPlugin = class _ConnectorPlugin {
232
234
  for (const t of Object.values(this.tools)) {
233
235
  const tool = t.createTool(myConnections, config);
234
236
  const originalToModelOutput = tool.toModelOutput;
235
- result[`${this.connectorKey}_${t.name}`] = {
237
+ result[`connector_${this.connectorKey}_${t.name}`] = {
236
238
  ...tool,
237
239
  toModelOutput: async (options) => {
238
240
  if (!originalToModelOutput) {
@@ -288,19 +290,34 @@ async function runSetupFlow(flow, params, ctx, config) {
288
290
  };
289
291
  let state = flow.initialState();
290
292
  let answerIdx = 0;
293
+ const pendingParameterUpdates = [];
291
294
  for (const step of flow.steps) {
292
295
  const ans = ctx.answers[answerIdx];
293
296
  if (ans && ans.questionSlug === step.slug) {
294
297
  state = step.applyAnswer(state, ans.answer);
298
+ if (step.toParameterUpdates) {
299
+ pendingParameterUpdates.push(...step.toParameterUpdates(state));
300
+ }
295
301
  answerIdx += 1;
296
302
  continue;
297
303
  }
304
+ const resolvedAllowFreeText = step.allowFreeText !== void 0 ? step.allowFreeText : true;
298
305
  if (step.type === "text") {
306
+ if (step.fetchOptions) {
307
+ const options2 = await step.fetchOptions(state, runtime);
308
+ if (options2.length === 0) {
309
+ continue;
310
+ }
311
+ }
299
312
  return {
300
313
  type: "nextQuestion",
301
314
  questionSlug: step.slug,
302
315
  question: step.question[ctx.language],
303
- questionType: "text"
316
+ questionType: "text",
317
+ allowFreeText: resolvedAllowFreeText,
318
+ ...pendingParameterUpdates.length > 0 && {
319
+ parameterUpdates: pendingParameterUpdates
320
+ }
304
321
  };
305
322
  }
306
323
  const options = step.fetchOptions ? await step.fetchOptions(state, runtime) : [];
@@ -312,11 +329,21 @@ async function runSetupFlow(flow, params, ctx, config) {
312
329
  questionSlug: step.slug,
313
330
  question: step.question[ctx.language],
314
331
  questionType: step.type,
315
- options
332
+ options,
333
+ allowFreeText: resolvedAllowFreeText,
334
+ ...pendingParameterUpdates.length > 0 && {
335
+ parameterUpdates: pendingParameterUpdates
336
+ }
316
337
  };
317
338
  }
318
339
  const dataInvestigationResult = await flow.finalize(state, runtime);
319
- return { type: "fulfilled", dataInvestigationResult };
340
+ return {
341
+ type: "fulfilled",
342
+ dataInvestigationResult,
343
+ ...pendingParameterUpdates.length > 0 && {
344
+ parameterUpdates: pendingParameterUpdates
345
+ }
346
+ };
320
347
  }
321
348
  async function resolveSetupSelection(params) {
322
349
  const { selected, allSentinel, fetchAll, limit } = params;
@@ -337,12 +364,12 @@ var AUTH_TYPES = {
337
364
  // ../connectors/src/connectors/jira/setup.ts
338
365
  var jiraOnboarding = new ConnectorOnboarding({
339
366
  dataOverviewInstructions: {
340
- en: `1. Call jira-api-key_request with GET project to list all accessible projects
341
- 2. For key projects, call jira-api-key_request with POST search to search issues using JQL (e.g., body: { "jql": "project = PROJ order by created DESC", "maxResults": 5, "fields": ["summary", "status", "assignee", "priority", "created"] })
342
- 3. Call jira-api-key_request with GET issue/{issueKey} to inspect a sample issue's full details`,
343
- ja: `1. jira-api-key_request \u3067 GET project \u3092\u547C\u3073\u51FA\u3057\u3001\u30A2\u30AF\u30BB\u30B9\u53EF\u80FD\u306A\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8\u4E00\u89A7\u3092\u53D6\u5F97
344
- 2. \u4E3B\u8981\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8\u306B\u3064\u3044\u3066 jira-api-key_request \u3067 POST search \u3092\u4F7F\u7528\u3057\u3066JQL\u3067\u30A4\u30B7\u30E5\u30FC\u3092\u691C\u7D22\uFF08\u4F8B: body: { "jql": "project = PROJ order by created DESC", "maxResults": 5, "fields": ["summary", "status", "assignee", "priority", "created"] }\uFF09
345
- 3. jira-api-key_request \u3067 GET issue/{issueKey} \u3092\u547C\u3073\u51FA\u3057\u3001\u30B5\u30F3\u30D7\u30EB\u30A4\u30B7\u30E5\u30FC\u306E\u8A73\u7D30\u3092\u78BA\u8A8D`
367
+ en: `1. Call connector_jira-api-key_request with GET project to list all accessible projects
368
+ 2. For key projects, call connector_jira-api-key_request with POST search to search issues using JQL (e.g., body: { "jql": "project = PROJ order by created DESC", "maxResults": 5, "fields": ["summary", "status", "assignee", "priority", "created"] })
369
+ 3. Call connector_jira-api-key_request with GET issue/{issueKey} to inspect a sample issue's full details`,
370
+ ja: `1. connector_jira-api-key_request \u3067 GET project \u3092\u547C\u3073\u51FA\u3057\u3001\u30A2\u30AF\u30BB\u30B9\u53EF\u80FD\u306A\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8\u4E00\u89A7\u3092\u53D6\u5F97
371
+ 2. \u4E3B\u8981\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8\u306B\u3064\u3044\u3066 connector_jira-api-key_request \u3067 POST search \u3092\u4F7F\u7528\u3057\u3066JQL\u3067\u30A4\u30B7\u30E5\u30FC\u3092\u691C\u7D22\uFF08\u4F8B: body: { "jql": "project = PROJ order by created DESC", "maxResults": 5, "fields": ["summary", "status", "assignee", "priority", "created"] }\uFF09
372
+ 3. connector_jira-api-key_request \u3067 GET issue/{issueKey} \u3092\u547C\u3073\u51FA\u3057\u3001\u30B5\u30F3\u30D7\u30EB\u30A4\u30B7\u30E5\u30FC\u306E\u8A73\u7D30\u3092\u78BA\u8A8D`
346
373
  }
347
374
  });
348
375
 
@@ -404,6 +431,43 @@ async function getProject(params, keyOrId) {
404
431
  }
405
432
  return await res.json();
406
433
  }
434
+ async function fetchProjectIssueCount(params, projectKey) {
435
+ try {
436
+ const jql = encodeURIComponent(`project = ${projectKey}`);
437
+ const res = await apiFetch(
438
+ params,
439
+ `search?jql=${jql}&maxResults=0`
440
+ );
441
+ if (!res.ok) return null;
442
+ const data = await res.json();
443
+ return typeof data.total === "number" ? data.total : null;
444
+ } catch {
445
+ return null;
446
+ }
447
+ }
448
+ async function fetchStatusBreakdown(params, projectKey) {
449
+ try {
450
+ const jql = encodeURIComponent(
451
+ `project = ${projectKey} ORDER BY created DESC`
452
+ );
453
+ const res = await apiFetch(
454
+ params,
455
+ `search?jql=${jql}&maxResults=100&fields=status`
456
+ );
457
+ if (!res.ok) return null;
458
+ const data = await res.json();
459
+ const issues = data.issues ?? [];
460
+ if (issues.length === 0) return null;
461
+ const breakdown = {};
462
+ for (const issue of issues) {
463
+ const category = issue.fields?.status?.statusCategory?.name ?? "Unknown";
464
+ breakdown[category] = (breakdown[category] ?? 0) + 1;
465
+ }
466
+ return breakdown;
467
+ } catch {
468
+ return null;
469
+ }
470
+ }
407
471
  var jiraSetupFlow = {
408
472
  initialState: () => ({}),
409
473
  steps: [
@@ -444,17 +508,37 @@ var jiraSetupFlow = {
444
508
  const sections = ["## Jira", ""];
445
509
  for (const key of targetKeys) {
446
510
  const project = await getProject(rt.params, key);
447
- sections.push(`### Project: ${project.name} (${project.key})`, "");
511
+ const issueCount = await fetchProjectIssueCount(rt.params, key);
512
+ const countLabel = issueCount == null ? "" : ` - ${issueCount.toLocaleString()} issues`;
513
+ sections.push(
514
+ `### Project: ${project.name} (${project.key})${countLabel}`,
515
+ ""
516
+ );
448
517
  const lead = project.lead?.displayName ?? "-";
449
518
  const typeKey = project.projectTypeKey ?? "-";
450
519
  sections.push(`- Lead: ${lead}`);
451
520
  sections.push(`- Project type: ${typeKey}`);
521
+ if (issueCount != null) {
522
+ sections.push(`- Total issues: ${issueCount.toLocaleString()}`);
523
+ }
452
524
  const issueTypes = project.issueTypes ?? [];
453
525
  sections.push(`- Issue types (${issueTypes.length}):`);
454
526
  for (const it of issueTypes) {
455
527
  const suffix = it.subtask ? " (sub-task)" : "";
456
528
  sections.push(` - ${it.name}${suffix}`);
457
529
  }
530
+ const breakdown = await fetchStatusBreakdown(rt.params, key);
531
+ if (breakdown && Object.keys(breakdown).length > 0) {
532
+ sections.push("");
533
+ sections.push("**Status category breakdown (from recent 100 issues):**", "");
534
+ sections.push("| Status category | Count |");
535
+ sections.push("|-----------------|-------|");
536
+ for (const [category, count] of Object.entries(breakdown).sort(
537
+ (a, b) => b[1] - a[1]
538
+ )) {
539
+ sections.push(`| ${category} | ${count} |`);
540
+ }
541
+ }
458
542
  sections.push("");
459
543
  }
460
544
  return sections.join("\n");
@@ -553,7 +637,7 @@ var jiraConnector = new ConnectorPlugin({
553
637
  systemPrompt: {
554
638
  en: `### Tools
555
639
 
556
- - \`jira-api-key_request\`: The only way to call the Jira Cloud REST API (v3). Use it to list projects, search issues with JQL, get issue details, create/update issues, manage transitions, and add comments. Authentication (Basic Auth with email + API token) and instance URL are configured automatically.
640
+ - \`connector_jira-api-key_request\`: The only way to call the Jira Cloud REST API (v3). Use it to list projects, search issues with JQL, get issue details, create/update issues, manage transitions, and add comments. Authentication (Basic Auth with email + API token) and instance URL are configured automatically.
557
641
 
558
642
  ### Business Logic
559
643
 
@@ -623,7 +707,7 @@ await jira.request("/rest/api/3/issue", {
623
707
  - Text search: summary ~ "keyword"`,
624
708
  ja: `### \u30C4\u30FC\u30EB
625
709
 
626
- - \`jira-api-key_request\`: Jira Cloud REST API\uFF08v3\uFF09\u3092\u547C\u3073\u51FA\u3059\u552F\u4E00\u306E\u624B\u6BB5\u3067\u3059\u3002\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8\u4E00\u89A7\u306E\u53D6\u5F97\u3001JQL\u306B\u3088\u308B\u30A4\u30B7\u30E5\u30FC\u691C\u7D22\u3001\u30A4\u30B7\u30E5\u30FC\u8A73\u7D30\u306E\u53D6\u5F97\u3001\u30A4\u30B7\u30E5\u30FC\u306E\u4F5C\u6210\u30FB\u66F4\u65B0\u3001\u30C8\u30E9\u30F3\u30B8\u30B7\u30E7\u30F3\u7BA1\u7406\u3001\u30B3\u30E1\u30F3\u30C8\u8FFD\u52A0\u306B\u4F7F\u7528\u3057\u307E\u3059\u3002\u8A8D\u8A3C\uFF08Basic Auth: \u30E1\u30FC\u30EB + API\u30C8\u30FC\u30AF\u30F3\uFF09\u3068\u30A4\u30F3\u30B9\u30BF\u30F3\u30B9URL\u306F\u81EA\u52D5\u7684\u306B\u8A2D\u5B9A\u3055\u308C\u307E\u3059\u3002
710
+ - \`connector_jira-api-key_request\`: Jira Cloud REST API\uFF08v3\uFF09\u3092\u547C\u3073\u51FA\u3059\u552F\u4E00\u306E\u624B\u6BB5\u3067\u3059\u3002\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8\u4E00\u89A7\u306E\u53D6\u5F97\u3001JQL\u306B\u3088\u308B\u30A4\u30B7\u30E5\u30FC\u691C\u7D22\u3001\u30A4\u30B7\u30E5\u30FC\u8A73\u7D30\u306E\u53D6\u5F97\u3001\u30A4\u30B7\u30E5\u30FC\u306E\u4F5C\u6210\u30FB\u66F4\u65B0\u3001\u30C8\u30E9\u30F3\u30B8\u30B7\u30E7\u30F3\u7BA1\u7406\u3001\u30B3\u30E1\u30F3\u30C8\u8FFD\u52A0\u306B\u4F7F\u7528\u3057\u307E\u3059\u3002\u8A8D\u8A3C\uFF08Basic Auth: \u30E1\u30FC\u30EB + API\u30C8\u30FC\u30AF\u30F3\uFF09\u3068\u30A4\u30F3\u30B9\u30BF\u30F3\u30B9URL\u306F\u81EA\u52D5\u7684\u306B\u8A2D\u5B9A\u3055\u308C\u307E\u3059\u3002
627
711
 
628
712
  ### Business Logic
629
713
 
@@ -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.
@@ -251,7 +253,7 @@ var ConnectorPlugin = class _ConnectorPlugin {
251
253
  /**
252
254
  * Create tools for connections that belong to this connector.
253
255
  * Filters connections by connectorKey internally.
254
- * Returns tools keyed as `${connectorKey}_${toolName}`.
256
+ * Returns tools keyed as `connector_${connectorKey}_${toolName}`.
255
257
  */
256
258
  createTools(connections, config, opts) {
257
259
  const myConnections = connections.filter(
@@ -261,7 +263,7 @@ var ConnectorPlugin = class _ConnectorPlugin {
261
263
  for (const t of Object.values(this.tools)) {
262
264
  const tool = t.createTool(myConnections, config);
263
265
  const originalToModelOutput = tool.toModelOutput;
264
- result[`${this.connectorKey}_${t.name}`] = {
266
+ result[`connector_${this.connectorKey}_${t.name}`] = {
265
267
  ...tool,
266
268
  toModelOutput: async (options) => {
267
269
  if (!originalToModelOutput) {
@@ -317,19 +319,34 @@ async function runSetupFlow(flow, params, ctx, config) {
317
319
  };
318
320
  let state = flow.initialState();
319
321
  let answerIdx = 0;
322
+ const pendingParameterUpdates = [];
320
323
  for (const step of flow.steps) {
321
324
  const ans = ctx.answers[answerIdx];
322
325
  if (ans && ans.questionSlug === step.slug) {
323
326
  state = step.applyAnswer(state, ans.answer);
327
+ if (step.toParameterUpdates) {
328
+ pendingParameterUpdates.push(...step.toParameterUpdates(state));
329
+ }
324
330
  answerIdx += 1;
325
331
  continue;
326
332
  }
333
+ const resolvedAllowFreeText = step.allowFreeText !== void 0 ? step.allowFreeText : true;
327
334
  if (step.type === "text") {
335
+ if (step.fetchOptions) {
336
+ const options2 = await step.fetchOptions(state, runtime);
337
+ if (options2.length === 0) {
338
+ continue;
339
+ }
340
+ }
328
341
  return {
329
342
  type: "nextQuestion",
330
343
  questionSlug: step.slug,
331
344
  question: step.question[ctx.language],
332
- questionType: "text"
345
+ questionType: "text",
346
+ allowFreeText: resolvedAllowFreeText,
347
+ ...pendingParameterUpdates.length > 0 && {
348
+ parameterUpdates: pendingParameterUpdates
349
+ }
333
350
  };
334
351
  }
335
352
  const options = step.fetchOptions ? await step.fetchOptions(state, runtime) : [];
@@ -341,11 +358,21 @@ async function runSetupFlow(flow, params, ctx, config) {
341
358
  questionSlug: step.slug,
342
359
  question: step.question[ctx.language],
343
360
  questionType: step.type,
344
- options
361
+ options,
362
+ allowFreeText: resolvedAllowFreeText,
363
+ ...pendingParameterUpdates.length > 0 && {
364
+ parameterUpdates: pendingParameterUpdates
365
+ }
345
366
  };
346
367
  }
347
368
  const dataInvestigationResult = await flow.finalize(state, runtime);
348
- return { type: "fulfilled", dataInvestigationResult };
369
+ return {
370
+ type: "fulfilled",
371
+ dataInvestigationResult,
372
+ ...pendingParameterUpdates.length > 0 && {
373
+ parameterUpdates: pendingParameterUpdates
374
+ }
375
+ };
349
376
  }
350
377
 
351
378
  // ../connectors/src/auth-types.ts
@@ -363,14 +390,14 @@ var kintoneApiTokenOnboarding = new ConnectorOnboarding({
363
390
  dataOverviewInstructions: {
364
391
  en: `Each connection is scoped to a single kintone app (configured via the "app-id" parameter). The request tool auto-injects the configured app id, so you do NOT need to specify "app=" in paths or "app" in bodies. apps.json is NOT available with API Token auth.
365
392
 
366
- 1. Call kintone-api-key_request with GET app.json to fetch the scoped app's metadata (name, description, creator)
367
- 2. Call kintone-api-key_request with GET app/form/fields.json to get field definitions
368
- 3. Call kintone-api-key_request with GET records.json with query=limit 5 to sample records`,
393
+ 1. Call connector_kintone-api-key_request with GET app.json to fetch the scoped app's metadata (name, description, creator)
394
+ 2. Call connector_kintone-api-key_request with GET app/form/fields.json to get field definitions
395
+ 3. Call connector_kintone-api-key_request with GET records.json with query=limit 5 to sample records`,
369
396
  ja: `\u5404\u63A5\u7D9A\u306F1\u3064\u306Ekintone\u30A2\u30D7\u30EA\u306B\u30B9\u30B3\u30FC\u30D7\u3055\u308C\u3066\u3044\u307E\u3059\uFF08"app-id" \u30D1\u30E9\u30E1\u30FC\u30BF\u3067\u8A2D\u5B9A\uFF09\u3002request \u30C4\u30FC\u30EB\u306F\u8A2D\u5B9A\u3055\u308C\u305F\u30A2\u30D7\u30EAID\u3092\u81EA\u52D5\u6CE8\u5165\u3059\u308B\u305F\u3081\u3001\u30D1\u30B9\u306B "app=" \u3084 body \u306B "app" \u3092\u6307\u5B9A\u3059\u308B\u5FC5\u8981\u306F\u3042\u308A\u307E\u305B\u3093\u3002API Token \u8A8D\u8A3C\u3067\u306F apps.json \u306F\u5229\u7528\u3067\u304D\u307E\u305B\u3093\u3002
370
397
 
371
- 1. kintone-api-key_request \u3067 GET app.json \u3092\u547C\u3073\u51FA\u3057\u3001\u30B9\u30B3\u30FC\u30D7\u5BFE\u8C61\u30A2\u30D7\u30EA\u306E\u30E1\u30BF\u60C5\u5831\uFF08\u30A2\u30D7\u30EA\u540D\u3001\u8AAC\u660E\u3001\u4F5C\u6210\u8005\uFF09\u3092\u53D6\u5F97
372
- 2. kintone-api-key_request \u3067 GET app/form/fields.json \u3092\u547C\u3073\u51FA\u3057\u3001\u30D5\u30A3\u30FC\u30EB\u30C9\u5B9A\u7FA9\u3092\u53D6\u5F97
373
- 3. kintone-api-key_request \u3067 GET records.json \u3092 query=limit 5 \u3067\u547C\u3073\u51FA\u3057\u3001\u30EC\u30B3\u30FC\u30C9\u3092\u30B5\u30F3\u30D7\u30EA\u30F3\u30B0`
398
+ 1. connector_kintone-api-key_request \u3067 GET app.json \u3092\u547C\u3073\u51FA\u3057\u3001\u30B9\u30B3\u30FC\u30D7\u5BFE\u8C61\u30A2\u30D7\u30EA\u306E\u30E1\u30BF\u60C5\u5831\uFF08\u30A2\u30D7\u30EA\u540D\u3001\u8AAC\u660E\u3001\u4F5C\u6210\u8005\uFF09\u3092\u53D6\u5F97
399
+ 2. connector_kintone-api-key_request \u3067 GET app/form/fields.json \u3092\u547C\u3073\u51FA\u3057\u3001\u30D5\u30A3\u30FC\u30EB\u30C9\u5B9A\u7FA9\u3092\u53D6\u5F97
400
+ 3. connector_kintone-api-key_request \u3067 GET records.json \u3092 query=limit 5 \u3067\u547C\u3073\u51FA\u3057\u3001\u30EC\u30B3\u30FC\u30C9\u3092\u30B5\u30F3\u30D7\u30EA\u30F3\u30B0`
374
401
  }
375
402
  });
376
403
 
@@ -394,6 +421,7 @@ async function apiFetch(params, path2, init) {
394
421
  }
395
422
 
396
423
  // ../connectors/src/connectors/kintone-api-token/setup-flow.ts
424
+ var SAMPLE_RECORD_LIMIT = 5;
397
425
  async function getAppMetadata(params, appId) {
398
426
  const res = await apiFetch(
399
427
  params,
@@ -420,15 +448,28 @@ async function getFormFields(params, appId) {
420
448
  }
421
449
  return await res.json();
422
450
  }
451
+ async function getSampleRecords(params, appId) {
452
+ const res = await apiFetch(
453
+ params,
454
+ `records.json?app=${encodeURIComponent(appId)}&query=${encodeURIComponent(`limit ${SAMPLE_RECORD_LIMIT}`)}&totalCount=true`
455
+ );
456
+ if (!res.ok) return { records: [], totalCount: null };
457
+ return await res.json();
458
+ }
459
+ function formatRecordValue(val) {
460
+ if (val == null) return "";
461
+ if (typeof val === "string") return val.length > 50 ? `${val.slice(0, 50)}\u2026` : val;
462
+ if (Array.isArray(val)) return `[${val.length} items]`;
463
+ if (typeof val === "object") return JSON.stringify(val).slice(0, 50);
464
+ return String(val);
465
+ }
423
466
  var kintoneApiTokenSetupFlow = {
424
467
  initialState: () => ({}),
425
468
  steps: [],
426
469
  async finalize(_state, rt) {
427
- const appId = rt.params[parameters.appId.slug];
470
+ const appId = rt.params["app-id"];
428
471
  if (!appId) {
429
- throw new Error(
430
- "kintone-api-token setup: missing app-id parameter on finalize"
431
- );
472
+ return "## kintone\n\n_App ID \u304C\u6307\u5B9A\u3055\u308C\u3066\u3044\u307E\u305B\u3093\u3002_\n";
432
473
  }
433
474
  const sections = ["## kintone", ""];
434
475
  const app = await getAppMetadata(rt.params, appId);
@@ -438,15 +479,39 @@ var kintoneApiTokenSetupFlow = {
438
479
  sections.push(app.description, "");
439
480
  }
440
481
  const fields = await getFormFields(rt.params, appId);
482
+ const fieldEntries = Object.entries(fields.properties ?? {});
483
+ sections.push("#### Fields", "");
441
484
  sections.push("| Field code | Label | Type | Required |");
442
485
  sections.push("|------------|-------|------|----------|");
443
- for (const [code, def] of Object.entries(fields.properties ?? {})) {
486
+ for (const [code, def] of fieldEntries) {
444
487
  const escapedLabel = (def.label ?? "").replace(/\|/g, "\\|");
445
488
  sections.push(
446
489
  `| ${code} | ${escapedLabel || "-"} | ${def.type} | ${def.required ? "yes" : "no"} |`
447
490
  );
448
491
  }
449
492
  sections.push("");
493
+ const sampleData = await getSampleRecords(rt.params, appId);
494
+ const totalCount = sampleData.totalCount ? Number(sampleData.totalCount) : null;
495
+ if (totalCount != null) {
496
+ sections.push(`#### Record count: ${totalCount.toLocaleString()}`, "");
497
+ }
498
+ const records = sampleData.records ?? [];
499
+ if (records.length > 0) {
500
+ const sampleFields = fieldEntries.slice(0, 8).map(([code]) => code);
501
+ if (sampleFields.length > 0) {
502
+ sections.push(`#### Sample records (${records.length})`, "");
503
+ sections.push(`| ${sampleFields.join(" | ")} |`);
504
+ sections.push(`| ${sampleFields.map(() => "---").join(" | ")} |`);
505
+ for (const record of records) {
506
+ const cells = sampleFields.map((code) => {
507
+ const cell = record[code];
508
+ return formatRecordValue(cell?.value).replace(/\|/g, "\\|");
509
+ });
510
+ sections.push(`| ${cells.join(" | ")} |`);
511
+ }
512
+ sections.push("");
513
+ }
514
+ }
450
515
  return sections.join("\n");
451
516
  }
452
517
  };
@@ -569,7 +634,7 @@ var kintoneApiTokenConnector = new ConnectorPlugin({
569
634
  systemPrompt: {
570
635
  en: `### Tools
571
636
 
572
- - \`kintone-api-key_request\`: The only way to call the kintone REST API. Use it to fetch app metadata/field definitions and read/write records. Authentication (API Token), base URL, and the connection's app id are configured automatically. Each connection is scoped to exactly one app (kintone API tokens are per-app).
637
+ - \`connector_kintone-api-key_request\`: The only way to call the kintone REST API. Use it to fetch app metadata/field definitions and read/write records. Authentication (API Token), base URL, and the connection's app id are configured automatically. Each connection is scoped to exactly one app (kintone API tokens are per-app).
573
638
 
574
639
  ### App scoping (important)
575
640
 
@@ -642,7 +707,7 @@ export default async function handler(c: Context) {
642
707
  - String: \`like "partial match"\``,
643
708
  ja: `### \u30C4\u30FC\u30EB
644
709
 
645
- - \`kintone-api-key_request\`: kintone REST API\u3092\u547C\u3073\u51FA\u3059\u552F\u4E00\u306E\u624B\u6BB5\u3067\u3059\u3002\u30A2\u30D7\u30EA\u306E\u30E1\u30BF\u60C5\u5831\u30FB\u30D5\u30A3\u30FC\u30EB\u30C9\u5B9A\u7FA9\u306E\u53D6\u5F97\u3001\u30EC\u30B3\u30FC\u30C9\u306E\u8AAD\u307F\u66F8\u304D\u306B\u4F7F\u7528\u3057\u307E\u3059\u3002\u8A8D\u8A3C\uFF08API\u30C8\u30FC\u30AF\u30F3\uFF09\u3001\u30D9\u30FC\u30B9URL\u3001\u304A\u3088\u3073\u63A5\u7D9A\u306E\u30A2\u30D7\u30EAID\u306F\u81EA\u52D5\u7684\u306B\u8A2D\u5B9A\u3055\u308C\u307E\u3059\u3002\u5404\u63A5\u7D9A\u306F\u3061\u3087\u3046\u30691\u3064\u306E\u30A2\u30D7\u30EA\u306B\u30B9\u30B3\u30FC\u30D7\u3055\u308C\u3066\u3044\u307E\u3059\uFF08kintone API\u30C8\u30FC\u30AF\u30F3\u306F\u30A2\u30D7\u30EA\u5358\u4F4D\u306E\u305F\u3081\uFF09\u3002
710
+ - \`connector_kintone-api-key_request\`: kintone REST API\u3092\u547C\u3073\u51FA\u3059\u552F\u4E00\u306E\u624B\u6BB5\u3067\u3059\u3002\u30A2\u30D7\u30EA\u306E\u30E1\u30BF\u60C5\u5831\u30FB\u30D5\u30A3\u30FC\u30EB\u30C9\u5B9A\u7FA9\u306E\u53D6\u5F97\u3001\u30EC\u30B3\u30FC\u30C9\u306E\u8AAD\u307F\u66F8\u304D\u306B\u4F7F\u7528\u3057\u307E\u3059\u3002\u8A8D\u8A3C\uFF08API\u30C8\u30FC\u30AF\u30F3\uFF09\u3001\u30D9\u30FC\u30B9URL\u3001\u304A\u3088\u3073\u63A5\u7D9A\u306E\u30A2\u30D7\u30EAID\u306F\u81EA\u52D5\u7684\u306B\u8A2D\u5B9A\u3055\u308C\u307E\u3059\u3002\u5404\u63A5\u7D9A\u306F\u3061\u3087\u3046\u30691\u3064\u306E\u30A2\u30D7\u30EA\u306B\u30B9\u30B3\u30FC\u30D7\u3055\u308C\u3066\u3044\u307E\u3059\uFF08kintone API\u30C8\u30FC\u30AF\u30F3\u306F\u30A2\u30D7\u30EA\u5358\u4F4D\u306E\u305F\u3081\uFF09\u3002
646
711
 
647
712
  ### \u30A2\u30D7\u30EA\u30B9\u30B3\u30FC\u30D7\uFF08\u91CD\u8981\uFF09
648
713
 
@@ -720,14 +785,15 @@ export default async function handler(c: Context) {
720
785
  const baseUrl = params[parameters.baseUrl.slug];
721
786
  const apiToken = params[parameters.apiToken.slug];
722
787
  const appId = params[parameters.appId.slug];
723
- if (!baseUrl || !apiToken || !appId) {
788
+ if (!baseUrl || !apiToken) {
724
789
  return {
725
790
  success: false,
726
- error: `Missing required parameters: ${parameters.baseUrl.slug}, ${parameters.apiToken.slug}, and ${parameters.appId.slug}`
791
+ error: `Missing required parameters: ${parameters.baseUrl.slug}, ${parameters.apiToken.slug}`
727
792
  };
728
793
  }
729
794
  try {
730
- const url = `${baseUrl.replace(/\/+$/, "")}/k/v1/app.json?id=${encodeURIComponent(appId)}`;
795
+ const path2 = appId ? `app.json?id=${encodeURIComponent(appId)}` : `app/form/fields.json?app=0`;
796
+ const url = `${baseUrl.replace(/\/+$/, "")}/k/v1/${path2}`;
731
797
  const res = await fetch(url, {
732
798
  method: "GET",
733
799
  headers: {
@@ -735,6 +801,15 @@ export default async function handler(c: Context) {
735
801
  Accept: "application/json"
736
802
  }
737
803
  });
804
+ if (!appId) {
805
+ if (res.status === 401 || res.status === 403) {
806
+ return {
807
+ success: false,
808
+ error: "kintone API failed: invalid API token"
809
+ };
810
+ }
811
+ return { success: true };
812
+ }
738
813
  if (!res.ok) {
739
814
  const data = await res.json().catch(() => null);
740
815
  const message = data?.message ?? `HTTP ${res.status} ${res.statusText}`;
@@ -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.
@@ -260,7 +262,7 @@ var ConnectorPlugin = class _ConnectorPlugin {
260
262
  /**
261
263
  * Create tools for connections that belong to this connector.
262
264
  * Filters connections by connectorKey internally.
263
- * Returns tools keyed as `${connectorKey}_${toolName}`.
265
+ * Returns tools keyed as `connector_${connectorKey}_${toolName}`.
264
266
  */
265
267
  createTools(connections, config, opts) {
266
268
  const myConnections = connections.filter(
@@ -270,7 +272,7 @@ var ConnectorPlugin = class _ConnectorPlugin {
270
272
  for (const t of Object.values(this.tools)) {
271
273
  const tool = t.createTool(myConnections, config);
272
274
  const originalToModelOutput = tool.toModelOutput;
273
- result[`${this.connectorKey}_${t.name}`] = {
275
+ result[`connector_${this.connectorKey}_${t.name}`] = {
274
276
  ...tool,
275
277
  toModelOutput: async (options) => {
276
278
  if (!originalToModelOutput) {
@@ -326,19 +328,34 @@ async function runSetupFlow(flow, params, ctx, config) {
326
328
  };
327
329
  let state = flow.initialState();
328
330
  let answerIdx = 0;
331
+ const pendingParameterUpdates = [];
329
332
  for (const step of flow.steps) {
330
333
  const ans = ctx.answers[answerIdx];
331
334
  if (ans && ans.questionSlug === step.slug) {
332
335
  state = step.applyAnswer(state, ans.answer);
336
+ if (step.toParameterUpdates) {
337
+ pendingParameterUpdates.push(...step.toParameterUpdates(state));
338
+ }
333
339
  answerIdx += 1;
334
340
  continue;
335
341
  }
342
+ const resolvedAllowFreeText = step.allowFreeText !== void 0 ? step.allowFreeText : true;
336
343
  if (step.type === "text") {
344
+ if (step.fetchOptions) {
345
+ const options2 = await step.fetchOptions(state, runtime);
346
+ if (options2.length === 0) {
347
+ continue;
348
+ }
349
+ }
337
350
  return {
338
351
  type: "nextQuestion",
339
352
  questionSlug: step.slug,
340
353
  question: step.question[ctx.language],
341
- questionType: "text"
354
+ questionType: "text",
355
+ allowFreeText: resolvedAllowFreeText,
356
+ ...pendingParameterUpdates.length > 0 && {
357
+ parameterUpdates: pendingParameterUpdates
358
+ }
342
359
  };
343
360
  }
344
361
  const options = step.fetchOptions ? await step.fetchOptions(state, runtime) : [];
@@ -350,11 +367,21 @@ async function runSetupFlow(flow, params, ctx, config) {
350
367
  questionSlug: step.slug,
351
368
  question: step.question[ctx.language],
352
369
  questionType: step.type,
353
- options
370
+ options,
371
+ allowFreeText: resolvedAllowFreeText,
372
+ ...pendingParameterUpdates.length > 0 && {
373
+ parameterUpdates: pendingParameterUpdates
374
+ }
354
375
  };
355
376
  }
356
377
  const dataInvestigationResult = await flow.finalize(state, runtime);
357
- return { type: "fulfilled", dataInvestigationResult };
378
+ return {
379
+ type: "fulfilled",
380
+ dataInvestigationResult,
381
+ ...pendingParameterUpdates.length > 0 && {
382
+ parameterUpdates: pendingParameterUpdates
383
+ }
384
+ };
358
385
  }
359
386
  async function resolveSetupSelection(params) {
360
387
  const { selected, allSentinel, fetchAll, limit } = params;
@@ -375,12 +402,12 @@ var AUTH_TYPES = {
375
402
  // ../connectors/src/connectors/kintone/setup.ts
376
403
  var kintoneOnboarding = new ConnectorOnboarding({
377
404
  dataOverviewInstructions: {
378
- en: `1. Call kintone_request with GET apps.json to list available apps
379
- 2. For key apps, call kintone_request with GET app/form/fields.json?app={appId} to get field definitions
380
- 3. Call kintone_request with GET records.json?app={appId}&query=limit 5 to sample records`,
381
- ja: `1. kintone_request \u3067 GET apps.json \u3092\u547C\u3073\u51FA\u3057\u3001\u5229\u7528\u53EF\u80FD\u306A\u30A2\u30D7\u30EA\u4E00\u89A7\u3092\u53D6\u5F97
382
- 2. \u4E3B\u8981\u30A2\u30D7\u30EA\u306B\u3064\u3044\u3066 kintone_request \u3067 GET app/form/fields.json?app={appId} \u3092\u547C\u3073\u51FA\u3057\u3001\u30D5\u30A3\u30FC\u30EB\u30C9\u5B9A\u7FA9\u3092\u53D6\u5F97
383
- 3. kintone_request \u3067 GET records.json?app={appId}&query=limit 5 \u3092\u547C\u3073\u51FA\u3057\u3001\u30EC\u30B3\u30FC\u30C9\u3092\u30B5\u30F3\u30D7\u30EA\u30F3\u30B0`
405
+ en: `1. Call connector_kintone_request with GET apps.json to list available apps
406
+ 2. For key apps, call connector_kintone_request with GET app/form/fields.json?app={appId} to get field definitions
407
+ 3. Call connector_kintone_request with GET records.json?app={appId}&query=limit 5 to sample records`,
408
+ ja: `1. connector_kintone_request \u3067 GET apps.json \u3092\u547C\u3073\u51FA\u3057\u3001\u5229\u7528\u53EF\u80FD\u306A\u30A2\u30D7\u30EA\u4E00\u89A7\u3092\u53D6\u5F97
409
+ 2. \u4E3B\u8981\u30A2\u30D7\u30EA\u306B\u3064\u3044\u3066 connector_kintone_request \u3067 GET app/form/fields.json?app={appId} \u3092\u547C\u3073\u51FA\u3057\u3001\u30D5\u30A3\u30FC\u30EB\u30C9\u5B9A\u7FA9\u3092\u53D6\u5F97
410
+ 3. connector_kintone_request \u3067 GET records.json?app={appId}&query=limit 5 \u3092\u547C\u3073\u51FA\u3057\u3001\u30EC\u30B3\u30FC\u30C9\u3092\u30B5\u30F3\u30D7\u30EA\u30F3\u30B0`
384
411
  }
385
412
  });
386
413
 
@@ -408,6 +435,7 @@ async function apiFetch(params, path2, init) {
408
435
  // ../connectors/src/connectors/kintone/setup-flow.ts
409
436
  var ALL_APPS = "__ALL_APPS__";
410
437
  var KINTONE_SETUP_MAX_APPS = 20;
438
+ var SAMPLE_RECORD_LIMIT = 5;
411
439
  async function listApps(params) {
412
440
  const results = [];
413
441
  let offset = 0;
@@ -441,6 +469,25 @@ async function getFormFields(params, appId) {
441
469
  }
442
470
  return await res.json();
443
471
  }
472
+ async function getSampleRecords(params, appId) {
473
+ try {
474
+ const res = await apiFetch(
475
+ params,
476
+ `records.json?app=${encodeURIComponent(appId)}&query=${encodeURIComponent(`limit ${SAMPLE_RECORD_LIMIT}`)}&totalCount=true`
477
+ );
478
+ if (!res.ok) return { records: [], totalCount: null };
479
+ return await res.json();
480
+ } catch {
481
+ return { records: [], totalCount: null };
482
+ }
483
+ }
484
+ function formatRecordValue(val) {
485
+ if (val == null) return "";
486
+ if (typeof val === "string") return val.length > 50 ? `${val.slice(0, 50)}\u2026` : val;
487
+ if (Array.isArray(val)) return `[${val.length} items]`;
488
+ if (typeof val === "object") return JSON.stringify(val).slice(0, 50);
489
+ return String(val);
490
+ }
444
491
  var kintoneSetupFlow = {
445
492
  initialState: () => ({}),
446
493
  steps: [
@@ -486,15 +533,38 @@ var kintoneSetupFlow = {
486
533
  sections.push(app.description, "");
487
534
  }
488
535
  const fields = await getFormFields(rt.params, appId);
536
+ const fieldEntries = Object.entries(fields.properties ?? {});
489
537
  sections.push("| Field code | Label | Type | Required |");
490
538
  sections.push("|------------|-------|------|----------|");
491
- for (const [code, def] of Object.entries(fields.properties ?? {})) {
539
+ for (const [code, def] of fieldEntries) {
492
540
  const escapedLabel = (def.label ?? "").replace(/\|/g, "\\|");
493
541
  sections.push(
494
542
  `| ${code} | ${escapedLabel || "-"} | ${def.type} | ${def.required ? "yes" : "no"} |`
495
543
  );
496
544
  }
497
545
  sections.push("");
546
+ const sampleData = await getSampleRecords(rt.params, appId);
547
+ const totalCount = sampleData.totalCount ? Number(sampleData.totalCount) : null;
548
+ if (totalCount != null) {
549
+ sections.push(`#### Record count: ${totalCount.toLocaleString()}`, "");
550
+ }
551
+ const records = sampleData.records ?? [];
552
+ if (records.length > 0) {
553
+ const sampleFields = fieldEntries.slice(0, 8).map(([code]) => code);
554
+ if (sampleFields.length > 0) {
555
+ sections.push(`#### Sample records (${records.length})`, "");
556
+ sections.push(`| ${sampleFields.join(" | ")} |`);
557
+ sections.push(`| ${sampleFields.map(() => "---").join(" | ")} |`);
558
+ for (const record of records) {
559
+ const cells = sampleFields.map((code) => {
560
+ const cell = record[code];
561
+ return formatRecordValue(cell?.value).replace(/\|/g, "\\|");
562
+ });
563
+ sections.push(`| ${cells.join(" | ")} |`);
564
+ }
565
+ sections.push("");
566
+ }
567
+ }
498
568
  }
499
569
  return sections.join("\n");
500
570
  }
@@ -587,7 +657,7 @@ var kintoneConnector = new ConnectorPlugin({
587
657
  systemPrompt: {
588
658
  en: `### Tools
589
659
 
590
- - \`kintone_request\`: The only way to call the kintone REST API. Use it to list apps, fetch field definitions, and read/write records. The base URL (e.g., \`https://example.cybozu.com\`) is automatically resolved. See the kintone REST API Reference below for endpoints and the kintone query syntax.
660
+ - \`connector_kintone_request\`: The only way to call the kintone REST API. Use it to list apps, fetch field definitions, and read/write records. The base URL (e.g., \`https://example.cybozu.com\`) is automatically resolved. See the kintone REST API Reference below for endpoints and the kintone query syntax.
591
661
 
592
662
  ### Business Logic
593
663
 
@@ -654,7 +724,7 @@ export default async function handler(c: Context) {
654
724
  - String: \`like "partial match"\``,
655
725
  ja: `### \u30C4\u30FC\u30EB
656
726
 
657
- - \`kintone_request\`: kintone REST API\u3092\u547C\u3073\u51FA\u3059\u552F\u4E00\u306E\u624B\u6BB5\u3067\u3059\u3002\u30A2\u30D7\u30EA\u4E00\u89A7\u306E\u53D6\u5F97\u3001\u30D5\u30A3\u30FC\u30EB\u30C9\u5B9A\u7FA9\u306E\u53D6\u5F97\u3001\u30EC\u30B3\u30FC\u30C9\u306E\u8AAD\u307F\u66F8\u304D\u306B\u4F7F\u7528\u3057\u307E\u3059\u3002\u30D9\u30FC\u30B9URL\uFF08\u4F8B: \`https://example.cybozu.com\`\uFF09\u306F\u81EA\u52D5\u7684\u306B\u89E3\u6C7A\u3055\u308C\u307E\u3059\u3002\u30A8\u30F3\u30C9\u30DD\u30A4\u30F3\u30C8\u304A\u3088\u3073kintone\u30AF\u30A8\u30EA\u69CB\u6587\u306F\u4E0B\u90E8\u306E\u300Ckintone REST API \u30EA\u30D5\u30A1\u30EC\u30F3\u30B9\u300D\u3092\u53C2\u7167\u3057\u3066\u304F\u3060\u3055\u3044\u3002
727
+ - \`connector_kintone_request\`: kintone REST API\u3092\u547C\u3073\u51FA\u3059\u552F\u4E00\u306E\u624B\u6BB5\u3067\u3059\u3002\u30A2\u30D7\u30EA\u4E00\u89A7\u306E\u53D6\u5F97\u3001\u30D5\u30A3\u30FC\u30EB\u30C9\u5B9A\u7FA9\u306E\u53D6\u5F97\u3001\u30EC\u30B3\u30FC\u30C9\u306E\u8AAD\u307F\u66F8\u304D\u306B\u4F7F\u7528\u3057\u307E\u3059\u3002\u30D9\u30FC\u30B9URL\uFF08\u4F8B: \`https://example.cybozu.com\`\uFF09\u306F\u81EA\u52D5\u7684\u306B\u89E3\u6C7A\u3055\u308C\u307E\u3059\u3002\u30A8\u30F3\u30C9\u30DD\u30A4\u30F3\u30C8\u304A\u3088\u3073kintone\u30AF\u30A8\u30EA\u69CB\u6587\u306F\u4E0B\u90E8\u306E\u300Ckintone REST API \u30EA\u30D5\u30A1\u30EC\u30F3\u30B9\u300D\u3092\u53C2\u7167\u3057\u3066\u304F\u3060\u3055\u3044\u3002
658
728
 
659
729
  ### Business Logic
660
730