@squadbase/vite-server 0.1.17-dev.a9ddcfa → 0.1.17-dev.e4768d1

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 (80) hide show
  1. package/dist/cli/index.js +8941 -3700
  2. package/dist/connectors/airtable-oauth.js +87 -23
  3. package/dist/connectors/airtable.js +130 -23
  4. package/dist/connectors/amplitude.js +47 -23
  5. package/dist/connectors/anthropic.js +41 -17
  6. package/dist/connectors/asana.js +76 -25
  7. package/dist/connectors/attio.js +69 -28
  8. package/dist/connectors/aws-billing.js +47 -23
  9. package/dist/connectors/azure-sql.js +322 -25
  10. package/dist/connectors/backlog-api-key.js +79 -30
  11. package/dist/connectors/clickup.js +89 -25
  12. package/dist/connectors/cosmosdb.js +51 -27
  13. package/dist/connectors/customerio.js +47 -23
  14. package/dist/connectors/dbt.js +725 -40
  15. package/dist/connectors/freshdesk.js +121 -23
  16. package/dist/connectors/freshsales.js +47 -23
  17. package/dist/connectors/freshservice.js +47 -23
  18. package/dist/connectors/gamma.js +54 -30
  19. package/dist/connectors/gemini.js +41 -17
  20. package/dist/connectors/github.js +51 -27
  21. package/dist/connectors/gmail-oauth.js +42 -23
  22. package/dist/connectors/gmail.js +43 -19
  23. package/dist/connectors/google-ads.js +47 -23
  24. package/dist/connectors/google-analytics-oauth.js +191 -40
  25. package/dist/connectors/google-analytics.js +529 -111
  26. package/dist/connectors/google-audit-log.js +43 -19
  27. package/dist/connectors/google-calendar-oauth.js +100 -30
  28. package/dist/connectors/google-calendar.js +100 -26
  29. package/dist/connectors/google-docs.js +42 -23
  30. package/dist/connectors/google-drive.js +64 -23
  31. package/dist/connectors/google-search-console-oauth.js +165 -32
  32. package/dist/connectors/google-sheets.js +142 -199
  33. package/dist/connectors/google-slides.js +42 -23
  34. package/dist/connectors/grafana.js +84 -25
  35. package/dist/connectors/hackernews.d.ts +5 -0
  36. package/dist/connectors/hackernews.js +909 -0
  37. package/dist/connectors/hubspot-oauth.js +73 -22
  38. package/dist/connectors/hubspot.js +64 -24
  39. package/dist/connectors/influxdb.js +47 -23
  40. package/dist/connectors/intercom-oauth.js +104 -25
  41. package/dist/connectors/intercom.js +51 -27
  42. package/dist/connectors/jdbc.js +76 -25
  43. package/dist/connectors/jira-api-key.js +107 -26
  44. package/dist/connectors/kintone-api-token.js +105 -33
  45. package/dist/connectors/kintone.js +182 -26
  46. package/dist/connectors/linear.js +93 -27
  47. package/dist/connectors/linkedin-ads.js +80 -29
  48. package/dist/connectors/mailchimp-oauth.js +45 -21
  49. package/dist/connectors/mailchimp.js +45 -21
  50. package/dist/connectors/meta-ads-oauth.js +72 -29
  51. package/dist/connectors/meta-ads.js +74 -29
  52. package/dist/connectors/mixpanel.js +47 -23
  53. package/dist/connectors/monday.js +48 -24
  54. package/dist/connectors/mongodb.js +47 -23
  55. package/dist/connectors/notion-oauth.js +92 -24
  56. package/dist/connectors/notion.js +144 -26
  57. package/dist/connectors/openai.js +41 -17
  58. package/dist/connectors/oracle.js +316 -26
  59. package/dist/connectors/outlook-oauth.js +53 -34
  60. package/dist/connectors/powerbi-oauth.js +45 -26
  61. package/dist/connectors/salesforce.js +150 -24
  62. package/dist/connectors/semrush.js +45 -21
  63. package/dist/connectors/sentry.js +75 -25
  64. package/dist/connectors/shopify-oauth.js +75 -23
  65. package/dist/connectors/shopify.js +47 -23
  66. package/dist/connectors/sqlserver.js +322 -25
  67. package/dist/connectors/stripe-api-key.js +105 -30
  68. package/dist/connectors/stripe-oauth.js +102 -32
  69. package/dist/connectors/supabase.js +315 -21
  70. package/dist/connectors/tableau.js +54 -30
  71. package/dist/connectors/tiktok-ads.js +76 -31
  72. package/dist/connectors/wix-store.js +47 -23
  73. package/dist/connectors/x.d.ts +5 -0
  74. package/dist/connectors/x.js +951 -0
  75. package/dist/connectors/zendesk-oauth.js +87 -25
  76. package/dist/connectors/zendesk.js +51 -27
  77. package/dist/index.js +9005 -3709
  78. package/dist/main.js +9005 -3709
  79. package/dist/vite-plugin.js +8939 -3698
  80. package/package.json +12 -4
@@ -75,6 +75,15 @@ var ConnectorPlugin = class _ConnectorPlugin {
75
75
  * `runSetupFlow` from `setup-flow.ts`.
76
76
  */
77
77
  setup;
78
+ /**
79
+ * 統一 introspection。SQL DB の `information_schema` / `SHOW` / `DESCRIBE` や SaaS の
80
+ * メタデータ API といった取得経路の差を吸収し、tables / columns / PK / FK を共通型
81
+ * {@link IntrospectedSchema} へ正規化して返す。取得経路は {@link IntrospectContext} で
82
+ * 抽象化され、SQL DB は `ctx.query`、SaaS は `ctx.proxyFetch` + `ctx.params` を使う。
83
+ * `ctx.profile === true` のときは L2 プロファイル(行数・NULL 率等)も best-effort で埋める。
84
+ * coding-agent の `DataContextIndex` がデータ地図を構築する際に使う。
85
+ */
86
+ introspect;
78
87
  /**
79
88
  * Opt-out of the default "verify before save" behavior on connection
80
89
  * creation. The backend invokes `checkConnection` synchronously while
@@ -89,6 +98,14 @@ var ConnectorPlugin = class _ConnectorPlugin {
89
98
  * the default verify-on-create behavior without opt-in.
90
99
  */
91
100
  skipConnectionCheckOnCreate;
101
+ /**
102
+ * 決定論的な「立ち上げ survey」レシピ(ルールベース prewarm 基盤)。実装した connector は、LLM を使わずに
103
+ * read-only で自分を survey する probe 列(テーブル/列メタデータ → 小サンプル)を宣言する。coding-agent の
104
+ * recon driver がこれを読み、connector ツールの `execute` を直接呼んで結果を seed にする。未実装の connector は
105
+ * driver 側で safely skip される(その connection は listConnections のみ seed)。標準 `information_schema` を
106
+ * 持つ SQL connector は `makeStandardSqlSurveyProbes` を使える。**probe は必ず read-only**。
107
+ */
108
+ surveyProbes;
92
109
  constructor(config) {
93
110
  this.slug = config.slug;
94
111
  this.authType = config.authType;
@@ -106,7 +123,9 @@ var ConnectorPlugin = class _ConnectorPlugin {
106
123
  this.query = config.query;
107
124
  this.checkConnection = config.checkConnection;
108
125
  this.setup = config.setup;
126
+ this.introspect = config.introspect;
109
127
  this.skipConnectionCheckOnCreate = config.skipConnectionCheckOnCreate;
128
+ this.surveyProbes = config.surveyProbes;
110
129
  }
111
130
  get connectorKey() {
112
131
  return _ConnectorPlugin.deriveKey(this.slug, this.authType);
@@ -114,7 +133,7 @@ var ConnectorPlugin = class _ConnectorPlugin {
114
133
  /**
115
134
  * Create tools for connections that belong to this connector.
116
135
  * Filters connections by connectorKey internally.
117
- * Returns tools keyed as `${connectorKey}_${toolName}`.
136
+ * Returns tools keyed as `connector_${connectorKey}_${toolName}`.
118
137
  */
119
138
  createTools(connections, config, opts) {
120
139
  const myConnections = connections.filter(
@@ -124,7 +143,7 @@ var ConnectorPlugin = class _ConnectorPlugin {
124
143
  for (const t of Object.values(this.tools)) {
125
144
  const tool = t.createTool(myConnections, config);
126
145
  const originalToModelOutput = tool.toModelOutput;
127
- result[`${this.connectorKey}_${t.name}`] = {
146
+ result[`connector_${this.connectorKey}_${t.name}`] = {
128
147
  ...tool,
129
148
  toModelOutput: async (options) => {
130
149
  if (!originalToModelOutput) {
@@ -144,25 +163,25 @@ var ConnectorPlugin = class _ConnectorPlugin {
144
163
  if (authType) return `${slug}-${authType}`;
145
164
  const LEGACY_NULL_AUTH_TYPE_MAP = {
146
165
  // user-password
147
- "postgresql": "user-password",
148
- "mysql": "user-password",
149
- "clickhouse": "user-password",
150
- "kintone": "user-password",
166
+ postgresql: "user-password",
167
+ mysql: "user-password",
168
+ clickhouse: "user-password",
169
+ kintone: "user-password",
151
170
  "squadbase-db": "user-password",
152
171
  // service-account
153
- "snowflake": "service-account",
154
- "bigquery": "service-account",
172
+ snowflake: "service-account",
173
+ bigquery: "service-account",
155
174
  "google-analytics": "service-account",
156
175
  "google-calendar": "service-account",
157
176
  "aws-athena": "service-account",
158
- "redshift": "service-account",
177
+ redshift: "service-account",
159
178
  // api-key
160
- "databricks": "api-key",
161
- "dbt": "api-key",
162
- "airtable": "api-key",
163
- "openai": "api-key",
164
- "gemini": "api-key",
165
- "anthropic": "api-key",
179
+ databricks: "api-key",
180
+ dbt: "api-key",
181
+ airtable: "api-key",
182
+ openai: "api-key",
183
+ gemini: "api-key",
184
+ anthropic: "api-key",
166
185
  "wix-store": "api-key"
167
186
  };
168
187
  const fallbackAuthType = LEGACY_NULL_AUTH_TYPE_MAP[slug];
@@ -397,14 +416,14 @@ var intercomOauthOnboarding = new ConnectorOnboarding({
397
416
  - \u30C4\u30FC\u30EB\u9593\u306F1\u6587\u3060\u3051\u66F8\u3044\u3066\u5373\u6B21\u306E\u30C4\u30FC\u30EB\u547C\u3073\u51FA\u3057\u3002\u4E0D\u8981\u306A\u8AAC\u660E\u306F\u7701\u7565\u3057\u3001\u52B9\u7387\u7684\u306B\u9032\u3081\u308B`
398
417
  },
399
418
  dataOverviewInstructions: {
400
- en: `1. Call intercom-oauth_request with GET /contacts?per_page=5 to explore contacts structure
401
- 2. Call intercom-oauth_request with GET /conversations?per_page=5 to explore conversations structure
402
- 3. Call intercom-oauth_request with GET /data_attributes?model=contact to list contact data attributes
403
- 4. Call intercom-oauth_request with GET /companies?per_page=5 to explore company structure`,
404
- ja: `1. intercom-oauth_request \u3067 GET /contacts?per_page=5 \u3092\u547C\u3073\u51FA\u3057\u3001\u30B3\u30F3\u30BF\u30AF\u30C8\u306E\u69CB\u9020\u3092\u78BA\u8A8D
405
- 2. intercom-oauth_request \u3067 GET /conversations?per_page=5 \u3092\u547C\u3073\u51FA\u3057\u3001\u4F1A\u8A71\u306E\u69CB\u9020\u3092\u78BA\u8A8D
406
- 3. intercom-oauth_request \u3067 GET /data_attributes?model=contact \u3092\u547C\u3073\u51FA\u3057\u3001\u30B3\u30F3\u30BF\u30AF\u30C8\u306E\u30C7\u30FC\u30BF\u5C5E\u6027\u3092\u78BA\u8A8D
407
- 4. intercom-oauth_request \u3067 GET /companies?per_page=5 \u3092\u547C\u3073\u51FA\u3057\u3001\u4F01\u696D\u306E\u69CB\u9020\u3092\u78BA\u8A8D`
419
+ en: `1. Call connector_intercom-oauth_request with GET /contacts?per_page=5 to explore contacts structure
420
+ 2. Call connector_intercom-oauth_request with GET /conversations?per_page=5 to explore conversations structure
421
+ 3. Call connector_intercom-oauth_request with GET /data_attributes?model=contact to list contact data attributes
422
+ 4. Call connector_intercom-oauth_request with GET /companies?per_page=5 to explore company structure`,
423
+ ja: `1. connector_intercom-oauth_request \u3067 GET /contacts?per_page=5 \u3092\u547C\u3073\u51FA\u3057\u3001\u30B3\u30F3\u30BF\u30AF\u30C8\u306E\u69CB\u9020\u3092\u78BA\u8A8D
424
+ 2. connector_intercom-oauth_request \u3067 GET /conversations?per_page=5 \u3092\u547C\u3073\u51FA\u3057\u3001\u4F1A\u8A71\u306E\u69CB\u9020\u3092\u78BA\u8A8D
425
+ 3. connector_intercom-oauth_request \u3067 GET /data_attributes?model=contact \u3092\u547C\u3073\u51FA\u3057\u3001\u30B3\u30F3\u30BF\u30AF\u30C8\u306E\u30C7\u30FC\u30BF\u5C5E\u6027\u3092\u78BA\u8A8D
426
+ 4. connector_intercom-oauth_request \u3067 GET /companies?per_page=5 \u3092\u547C\u3073\u51FA\u3057\u3001\u4F01\u696D\u306E\u69CB\u9020\u3092\u78BA\u8A8D`
408
427
  }
409
428
  });
410
429
 
@@ -493,6 +512,66 @@ var intercomOauthSetupFlow = {
493
512
  );
494
513
  }
495
514
  sections.push("");
515
+ if (targetScopes.includes("conversations")) {
516
+ try {
517
+ const convRes = await apiFetch(
518
+ rt.config.proxyFetch,
519
+ "/conversations?per_page=5&order=desc&sort=updated_at"
520
+ );
521
+ if (convRes.ok) {
522
+ const convData = await convRes.json();
523
+ const conversations = convData.conversations ?? [];
524
+ if (conversations.length > 0) {
525
+ sections.push("### Recent conversations (sample)", "");
526
+ sections.push("| ID | State | Subject | Created |");
527
+ sections.push("|----|-------|---------|---------|");
528
+ for (const c of conversations.slice(0, 5)) {
529
+ const id = c.id ?? "-";
530
+ const state2 = c.state ?? (c.open ? "open" : "closed");
531
+ const subject = (c.source?.subject ?? "-").replace(/\|/g, "\\|").slice(0, 50);
532
+ const created = typeof c.created_at === "number" ? new Date(c.created_at * 1e3).toISOString().slice(0, 10) : "-";
533
+ sections.push(
534
+ `| ${id} | ${state2} | ${subject} | ${created} |`
535
+ );
536
+ }
537
+ sections.push("");
538
+ }
539
+ }
540
+ } catch {
541
+ }
542
+ }
543
+ if (targetScopes.includes("contacts")) {
544
+ try {
545
+ const contactRes = await apiFetch(
546
+ rt.config.proxyFetch,
547
+ "/contacts?per_page=50"
548
+ );
549
+ if (contactRes.ok) {
550
+ const contactData = await contactRes.json();
551
+ const contacts = contactData.data ?? [];
552
+ if (contacts.length > 0) {
553
+ const roleCounts = {};
554
+ for (const c of contacts) {
555
+ const role = c.role ?? "unknown";
556
+ roleCounts[role] = (roleCounts[role] ?? 0) + 1;
557
+ }
558
+ sections.push(
559
+ "### Contact type breakdown (from recent contacts)",
560
+ ""
561
+ );
562
+ sections.push("| Role | Count |");
563
+ sections.push("|------|-------|");
564
+ for (const [role, cnt] of Object.entries(roleCounts).sort(
565
+ (a, b) => b[1] - a[1]
566
+ )) {
567
+ sections.push(`| ${role} | ${cnt} |`);
568
+ }
569
+ sections.push("");
570
+ }
571
+ }
572
+ } catch {
573
+ }
574
+ }
496
575
  return sections.join("\n");
497
576
  }
498
577
  };
@@ -524,7 +603,7 @@ var intercomOauthConnector = new ConnectorPlugin({
524
603
  systemPrompt: {
525
604
  en: `### Tools
526
605
 
527
- - \`intercom-oauth_request\`: The only way to call the Intercom API. Use it to query contacts, conversations, companies, articles, tags, segments, and more. Authentication is configured automatically via OAuth. The Intercom-Version header is set automatically. Intercom uses cursor-based pagination with the \`starting_after\` parameter from \`pages.next.starting_after\` in the response.
606
+ - \`connector_intercom-oauth_request\`: The only way to call the Intercom API. Use it to query contacts, conversations, companies, articles, tags, segments, and more. Authentication is configured automatically via OAuth. The Intercom-Version header is set automatically. Intercom uses cursor-based pagination with the \`starting_after\` parameter from \`pages.next.starting_after\` in the response.
528
607
 
529
608
  ### Intercom API Reference
530
609
 
@@ -582,7 +661,7 @@ const data = await res.json();
582
661
  \`\`\``,
583
662
  ja: `### \u30C4\u30FC\u30EB
584
663
 
585
- - \`intercom-oauth_request\`: Intercom API\u3092\u547C\u3073\u51FA\u3059\u552F\u4E00\u306E\u624B\u6BB5\u3067\u3059\u3002\u30B3\u30F3\u30BF\u30AF\u30C8\u3001\u4F1A\u8A71\u3001\u4F01\u696D\u3001\u8A18\u4E8B\u3001\u30BF\u30B0\u3001\u30BB\u30B0\u30E1\u30F3\u30C8\u306A\u3069\u306E\u30AF\u30A8\u30EA\u306B\u4F7F\u7528\u3057\u307E\u3059\u3002OAuth\u7D4C\u7531\u3067\u8A8D\u8A3C\u306F\u81EA\u52D5\u8A2D\u5B9A\u3055\u308C\u307E\u3059\u3002Intercom-Version\u30D8\u30C3\u30C0\u30FC\u3082\u81EA\u52D5\u8A2D\u5B9A\u3055\u308C\u307E\u3059\u3002Intercom\u306F\u30EC\u30B9\u30DD\u30F3\u30B9\u306E \`pages.next.starting_after\` \u304B\u3089\u306E \`starting_after\` \u30D1\u30E9\u30E1\u30FC\u30BF\u306B\u3088\u308B\u30AB\u30FC\u30BD\u30EB\u30D9\u30FC\u30B9\u306E\u30DA\u30FC\u30B8\u30CD\u30FC\u30B7\u30E7\u30F3\u3092\u4F7F\u7528\u3057\u307E\u3059\u3002
664
+ - \`connector_intercom-oauth_request\`: Intercom API\u3092\u547C\u3073\u51FA\u3059\u552F\u4E00\u306E\u624B\u6BB5\u3067\u3059\u3002\u30B3\u30F3\u30BF\u30AF\u30C8\u3001\u4F1A\u8A71\u3001\u4F01\u696D\u3001\u8A18\u4E8B\u3001\u30BF\u30B0\u3001\u30BB\u30B0\u30E1\u30F3\u30C8\u306A\u3069\u306E\u30AF\u30A8\u30EA\u306B\u4F7F\u7528\u3057\u307E\u3059\u3002OAuth\u7D4C\u7531\u3067\u8A8D\u8A3C\u306F\u81EA\u52D5\u8A2D\u5B9A\u3055\u308C\u307E\u3059\u3002Intercom-Version\u30D8\u30C3\u30C0\u30FC\u3082\u81EA\u52D5\u8A2D\u5B9A\u3055\u308C\u307E\u3059\u3002Intercom\u306F\u30EC\u30B9\u30DD\u30F3\u30B9\u306E \`pages.next.starting_after\` \u304B\u3089\u306E \`starting_after\` \u30D1\u30E9\u30E1\u30FC\u30BF\u306B\u3088\u308B\u30AB\u30FC\u30BD\u30EB\u30D9\u30FC\u30B9\u306E\u30DA\u30FC\u30B8\u30CD\u30FC\u30B7\u30E7\u30F3\u3092\u4F7F\u7528\u3057\u307E\u3059\u3002
586
665
 
587
666
  ### Intercom API \u30EA\u30D5\u30A1\u30EC\u30F3\u30B9
588
667
 
@@ -1,6 +1,11 @@
1
1
  var __getOwnPropNames = Object.getOwnPropertyNames;
2
- var __esm = (fn, res) => function __init() {
3
- return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
2
+ var __esm = (fn, res, err) => function __init() {
3
+ if (err) throw err[0];
4
+ try {
5
+ return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
6
+ } catch (e) {
7
+ throw err = [e], e;
8
+ }
4
9
  };
5
10
 
6
11
  // ../connectors/src/parameter-definition.ts
@@ -236,6 +241,15 @@ var ConnectorPlugin = class _ConnectorPlugin {
236
241
  * `runSetupFlow` from `setup-flow.ts`.
237
242
  */
238
243
  setup;
244
+ /**
245
+ * 統一 introspection。SQL DB の `information_schema` / `SHOW` / `DESCRIBE` や SaaS の
246
+ * メタデータ API といった取得経路の差を吸収し、tables / columns / PK / FK を共通型
247
+ * {@link IntrospectedSchema} へ正規化して返す。取得経路は {@link IntrospectContext} で
248
+ * 抽象化され、SQL DB は `ctx.query`、SaaS は `ctx.proxyFetch` + `ctx.params` を使う。
249
+ * `ctx.profile === true` のときは L2 プロファイル(行数・NULL 率等)も best-effort で埋める。
250
+ * coding-agent の `DataContextIndex` がデータ地図を構築する際に使う。
251
+ */
252
+ introspect;
239
253
  /**
240
254
  * Opt-out of the default "verify before save" behavior on connection
241
255
  * creation. The backend invokes `checkConnection` synchronously while
@@ -250,6 +264,14 @@ var ConnectorPlugin = class _ConnectorPlugin {
250
264
  * the default verify-on-create behavior without opt-in.
251
265
  */
252
266
  skipConnectionCheckOnCreate;
267
+ /**
268
+ * 決定論的な「立ち上げ survey」レシピ(ルールベース prewarm 基盤)。実装した connector は、LLM を使わずに
269
+ * read-only で自分を survey する probe 列(テーブル/列メタデータ → 小サンプル)を宣言する。coding-agent の
270
+ * recon driver がこれを読み、connector ツールの `execute` を直接呼んで結果を seed にする。未実装の connector は
271
+ * driver 側で safely skip される(その connection は listConnections のみ seed)。標準 `information_schema` を
272
+ * 持つ SQL connector は `makeStandardSqlSurveyProbes` を使える。**probe は必ず read-only**。
273
+ */
274
+ surveyProbes;
253
275
  constructor(config) {
254
276
  this.slug = config.slug;
255
277
  this.authType = config.authType;
@@ -267,7 +289,9 @@ var ConnectorPlugin = class _ConnectorPlugin {
267
289
  this.query = config.query;
268
290
  this.checkConnection = config.checkConnection;
269
291
  this.setup = config.setup;
292
+ this.introspect = config.introspect;
270
293
  this.skipConnectionCheckOnCreate = config.skipConnectionCheckOnCreate;
294
+ this.surveyProbes = config.surveyProbes;
271
295
  }
272
296
  get connectorKey() {
273
297
  return _ConnectorPlugin.deriveKey(this.slug, this.authType);
@@ -275,7 +299,7 @@ var ConnectorPlugin = class _ConnectorPlugin {
275
299
  /**
276
300
  * Create tools for connections that belong to this connector.
277
301
  * Filters connections by connectorKey internally.
278
- * Returns tools keyed as `${connectorKey}_${toolName}`.
302
+ * Returns tools keyed as `connector_${connectorKey}_${toolName}`.
279
303
  */
280
304
  createTools(connections, config, opts) {
281
305
  const myConnections = connections.filter(
@@ -285,7 +309,7 @@ var ConnectorPlugin = class _ConnectorPlugin {
285
309
  for (const t of Object.values(this.tools)) {
286
310
  const tool = t.createTool(myConnections, config);
287
311
  const originalToModelOutput = tool.toModelOutput;
288
- result[`${this.connectorKey}_${t.name}`] = {
312
+ result[`connector_${this.connectorKey}_${t.name}`] = {
289
313
  ...tool,
290
314
  toModelOutput: async (options) => {
291
315
  if (!originalToModelOutput) {
@@ -305,25 +329,25 @@ var ConnectorPlugin = class _ConnectorPlugin {
305
329
  if (authType) return `${slug}-${authType}`;
306
330
  const LEGACY_NULL_AUTH_TYPE_MAP = {
307
331
  // user-password
308
- "postgresql": "user-password",
309
- "mysql": "user-password",
310
- "clickhouse": "user-password",
311
- "kintone": "user-password",
332
+ postgresql: "user-password",
333
+ mysql: "user-password",
334
+ clickhouse: "user-password",
335
+ kintone: "user-password",
312
336
  "squadbase-db": "user-password",
313
337
  // service-account
314
- "snowflake": "service-account",
315
- "bigquery": "service-account",
338
+ snowflake: "service-account",
339
+ bigquery: "service-account",
316
340
  "google-analytics": "service-account",
317
341
  "google-calendar": "service-account",
318
342
  "aws-athena": "service-account",
319
- "redshift": "service-account",
343
+ redshift: "service-account",
320
344
  // api-key
321
- "databricks": "api-key",
322
- "dbt": "api-key",
323
- "airtable": "api-key",
324
- "openai": "api-key",
325
- "gemini": "api-key",
326
- "anthropic": "api-key",
345
+ databricks: "api-key",
346
+ dbt: "api-key",
347
+ airtable: "api-key",
348
+ openai: "api-key",
349
+ gemini: "api-key",
350
+ anthropic: "api-key",
327
351
  "wix-store": "api-key"
328
352
  };
329
353
  const fallbackAuthType = LEGACY_NULL_AUTH_TYPE_MAP[slug];
@@ -415,14 +439,14 @@ var AUTH_TYPES = {
415
439
  // ../connectors/src/connectors/intercom/setup.ts
416
440
  var intercomOnboarding = new ConnectorOnboarding({
417
441
  dataOverviewInstructions: {
418
- en: `1. Call intercom_request with GET /contacts?per_page=5 to explore contacts structure
419
- 2. Call intercom_request with GET /conversations?per_page=5 to explore conversations structure
420
- 3. Call intercom_request with GET /data_attributes?model=contact to list contact data attributes
421
- 4. Call intercom_request with GET /companies?per_page=5 to explore company structure`,
422
- ja: `1. intercom_request \u3067 GET /contacts?per_page=5 \u3092\u547C\u3073\u51FA\u3057\u3001\u30B3\u30F3\u30BF\u30AF\u30C8\u306E\u69CB\u9020\u3092\u78BA\u8A8D
423
- 2. intercom_request \u3067 GET /conversations?per_page=5 \u3092\u547C\u3073\u51FA\u3057\u3001\u4F1A\u8A71\u306E\u69CB\u9020\u3092\u78BA\u8A8D
424
- 3. intercom_request \u3067 GET /data_attributes?model=contact \u3092\u547C\u3073\u51FA\u3057\u3001\u30B3\u30F3\u30BF\u30AF\u30C8\u306E\u30C7\u30FC\u30BF\u5C5E\u6027\u3092\u78BA\u8A8D
425
- 4. intercom_request \u3067 GET /companies?per_page=5 \u3092\u547C\u3073\u51FA\u3057\u3001\u4F01\u696D\u306E\u69CB\u9020\u3092\u78BA\u8A8D`
442
+ en: `1. Call connector_intercom_request with GET /contacts?per_page=5 to explore contacts structure
443
+ 2. Call connector_intercom_request with GET /conversations?per_page=5 to explore conversations structure
444
+ 3. Call connector_intercom_request with GET /data_attributes?model=contact to list contact data attributes
445
+ 4. Call connector_intercom_request with GET /companies?per_page=5 to explore company structure`,
446
+ ja: `1. connector_intercom_request \u3067 GET /contacts?per_page=5 \u3092\u547C\u3073\u51FA\u3057\u3001\u30B3\u30F3\u30BF\u30AF\u30C8\u306E\u69CB\u9020\u3092\u78BA\u8A8D
447
+ 2. connector_intercom_request \u3067 GET /conversations?per_page=5 \u3092\u547C\u3073\u51FA\u3057\u3001\u4F1A\u8A71\u306E\u69CB\u9020\u3092\u78BA\u8A8D
448
+ 3. connector_intercom_request \u3067 GET /data_attributes?model=contact \u3092\u547C\u3073\u51FA\u3057\u3001\u30B3\u30F3\u30BF\u30AF\u30C8\u306E\u30C7\u30FC\u30BF\u5C5E\u6027\u3092\u78BA\u8A8D
449
+ 4. connector_intercom_request \u3067 GET /companies?per_page=5 \u3092\u547C\u3073\u51FA\u3057\u3001\u4F01\u696D\u306E\u69CB\u9020\u3092\u78BA\u8A8D`
426
450
  }
427
451
  });
428
452
 
@@ -619,7 +643,7 @@ var intercomConnector = new ConnectorPlugin({
619
643
  systemPrompt: {
620
644
  en: `### Tools
621
645
 
622
- - \`intercom_request\`: The only way to call the Intercom API. Use it to query contacts, conversations, companies, articles, tags, segments, and more. Authentication (Bearer token) and API version header (Intercom-Version: 2.11) are configured automatically. Intercom uses cursor-based pagination with the \`starting_after\` parameter from \`pages.next.starting_after\` in the response. Use search endpoints (POST) for complex queries with filters.
646
+ - \`connector_intercom_request\`: The only way to call the Intercom API. Use it to query contacts, conversations, companies, articles, tags, segments, and more. Authentication (Bearer token) and API version header (Intercom-Version: 2.11) are configured automatically. Intercom uses cursor-based pagination with the \`starting_after\` parameter from \`pages.next.starting_after\` in the response. Use search endpoints (POST) for complex queries with filters.
623
647
 
624
648
  ### Business Logic
625
649
 
@@ -715,7 +739,7 @@ export default async function handler(c: Context) {
715
739
  - Date fields use Unix timestamps`,
716
740
  ja: `### \u30C4\u30FC\u30EB
717
741
 
718
- - \`intercom_request\`: Intercom API\u3092\u547C\u3073\u51FA\u3059\u552F\u4E00\u306E\u624B\u6BB5\u3067\u3059\u3002\u30B3\u30F3\u30BF\u30AF\u30C8\u3001\u4F1A\u8A71\u3001\u4F01\u696D\u3001\u8A18\u4E8B\u3001\u30BF\u30B0\u3001\u30BB\u30B0\u30E1\u30F3\u30C8\u306A\u3069\u306E\u30AF\u30A8\u30EA\u306B\u4F7F\u7528\u3057\u307E\u3059\u3002\u8A8D\u8A3C\uFF08Bearer\u30C8\u30FC\u30AF\u30F3\uFF09\u3068API\u30D0\u30FC\u30B8\u30E7\u30F3\u30D8\u30C3\u30C0\u30FC\uFF08Intercom-Version: 2.11\uFF09\u306F\u81EA\u52D5\u7684\u306B\u8A2D\u5B9A\u3055\u308C\u307E\u3059\u3002Intercom\u306F\u30EC\u30B9\u30DD\u30F3\u30B9\u306E \`pages.next.starting_after\` \u304B\u3089\u306E \`starting_after\` \u30D1\u30E9\u30E1\u30FC\u30BF\u306B\u3088\u308B\u30AB\u30FC\u30BD\u30EB\u30D9\u30FC\u30B9\u306E\u30DA\u30FC\u30B8\u30CD\u30FC\u30B7\u30E7\u30F3\u3092\u4F7F\u7528\u3057\u307E\u3059\u3002\u8907\u96D1\u306A\u30AF\u30A8\u30EA\u306B\u306Fsearch\u30A8\u30F3\u30C9\u30DD\u30A4\u30F3\u30C8\uFF08POST\uFF09\u3092\u4F7F\u7528\u3057\u307E\u3059\u3002
742
+ - \`connector_intercom_request\`: Intercom API\u3092\u547C\u3073\u51FA\u3059\u552F\u4E00\u306E\u624B\u6BB5\u3067\u3059\u3002\u30B3\u30F3\u30BF\u30AF\u30C8\u3001\u4F1A\u8A71\u3001\u4F01\u696D\u3001\u8A18\u4E8B\u3001\u30BF\u30B0\u3001\u30BB\u30B0\u30E1\u30F3\u30C8\u306A\u3069\u306E\u30AF\u30A8\u30EA\u306B\u4F7F\u7528\u3057\u307E\u3059\u3002\u8A8D\u8A3C\uFF08Bearer\u30C8\u30FC\u30AF\u30F3\uFF09\u3068API\u30D0\u30FC\u30B8\u30E7\u30F3\u30D8\u30C3\u30C0\u30FC\uFF08Intercom-Version: 2.11\uFF09\u306F\u81EA\u52D5\u7684\u306B\u8A2D\u5B9A\u3055\u308C\u307E\u3059\u3002Intercom\u306F\u30EC\u30B9\u30DD\u30F3\u30B9\u306E \`pages.next.starting_after\` \u304B\u3089\u306E \`starting_after\` \u30D1\u30E9\u30E1\u30FC\u30BF\u306B\u3088\u308B\u30AB\u30FC\u30BD\u30EB\u30D9\u30FC\u30B9\u306E\u30DA\u30FC\u30B8\u30CD\u30FC\u30B7\u30E7\u30F3\u3092\u4F7F\u7528\u3057\u307E\u3059\u3002\u8907\u96D1\u306A\u30AF\u30A8\u30EA\u306B\u306Fsearch\u30A8\u30F3\u30C9\u30DD\u30A4\u30F3\u30C8\uFF08POST\uFF09\u3092\u4F7F\u7528\u3057\u307E\u3059\u3002
719
743
 
720
744
  ### Business Logic
721
745
 
@@ -1,7 +1,12 @@
1
1
  var __defProp = Object.defineProperty;
2
2
  var __getOwnPropNames = Object.getOwnPropertyNames;
3
- var __esm = (fn, res) => function __init() {
4
- return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
3
+ var __esm = (fn, res, err) => function __init() {
4
+ if (err) throw err[0];
5
+ try {
6
+ return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
7
+ } catch (e) {
8
+ throw err = [e], e;
9
+ }
5
10
  };
6
11
  var __export = (target, all) => {
7
12
  for (var name in all)
@@ -341,7 +346,7 @@ async function runMssqlQuery(parsed, sql, options = {}) {
341
346
  try {
342
347
  const result = await pool.request().query(sql);
343
348
  const recordset = result.recordset ?? [];
344
- return { rows: recordset };
349
+ return { rows: recordset, rowsAffected: result.rowsAffected ?? [] };
345
350
  } finally {
346
351
  await pool.close();
347
352
  }
@@ -526,10 +531,16 @@ async function runOracleQuery(parsed, sql, options = {}) {
526
531
  outFormat: oracledb.OUT_FORMAT_OBJECT,
527
532
  // Bound by the connector's own row cap, but keep the driver from
528
533
  // streaming arbitrarily large result sets.
529
- maxRows: 5e3
534
+ maxRows: 5e3,
535
+ // oracledb defaults to autoCommit=false, which silently rolls back
536
+ // DML when the connection closes.
537
+ autoCommit: true
530
538
  }
531
539
  );
532
- return { rows: result.rows ?? [] };
540
+ return {
541
+ rows: result.rows ?? [],
542
+ rowsAffected: result.rowsAffected
543
+ };
533
544
  } finally {
534
545
  try {
535
546
  await connection2.close();
@@ -984,6 +995,15 @@ var ConnectorPlugin = class _ConnectorPlugin {
984
995
  * `runSetupFlow` from `setup-flow.ts`.
985
996
  */
986
997
  setup;
998
+ /**
999
+ * 統一 introspection。SQL DB の `information_schema` / `SHOW` / `DESCRIBE` や SaaS の
1000
+ * メタデータ API といった取得経路の差を吸収し、tables / columns / PK / FK を共通型
1001
+ * {@link IntrospectedSchema} へ正規化して返す。取得経路は {@link IntrospectContext} で
1002
+ * 抽象化され、SQL DB は `ctx.query`、SaaS は `ctx.proxyFetch` + `ctx.params` を使う。
1003
+ * `ctx.profile === true` のときは L2 プロファイル(行数・NULL 率等)も best-effort で埋める。
1004
+ * coding-agent の `DataContextIndex` がデータ地図を構築する際に使う。
1005
+ */
1006
+ introspect;
987
1007
  /**
988
1008
  * Opt-out of the default "verify before save" behavior on connection
989
1009
  * creation. The backend invokes `checkConnection` synchronously while
@@ -998,6 +1018,14 @@ var ConnectorPlugin = class _ConnectorPlugin {
998
1018
  * the default verify-on-create behavior without opt-in.
999
1019
  */
1000
1020
  skipConnectionCheckOnCreate;
1021
+ /**
1022
+ * 決定論的な「立ち上げ survey」レシピ(ルールベース prewarm 基盤)。実装した connector は、LLM を使わずに
1023
+ * read-only で自分を survey する probe 列(テーブル/列メタデータ → 小サンプル)を宣言する。coding-agent の
1024
+ * recon driver がこれを読み、connector ツールの `execute` を直接呼んで結果を seed にする。未実装の connector は
1025
+ * driver 側で safely skip される(その connection は listConnections のみ seed)。標準 `information_schema` を
1026
+ * 持つ SQL connector は `makeStandardSqlSurveyProbes` を使える。**probe は必ず read-only**。
1027
+ */
1028
+ surveyProbes;
1001
1029
  constructor(config) {
1002
1030
  this.slug = config.slug;
1003
1031
  this.authType = config.authType;
@@ -1015,7 +1043,9 @@ var ConnectorPlugin = class _ConnectorPlugin {
1015
1043
  this.query = config.query;
1016
1044
  this.checkConnection = config.checkConnection;
1017
1045
  this.setup = config.setup;
1046
+ this.introspect = config.introspect;
1018
1047
  this.skipConnectionCheckOnCreate = config.skipConnectionCheckOnCreate;
1048
+ this.surveyProbes = config.surveyProbes;
1019
1049
  }
1020
1050
  get connectorKey() {
1021
1051
  return _ConnectorPlugin.deriveKey(this.slug, this.authType);
@@ -1023,7 +1053,7 @@ var ConnectorPlugin = class _ConnectorPlugin {
1023
1053
  /**
1024
1054
  * Create tools for connections that belong to this connector.
1025
1055
  * Filters connections by connectorKey internally.
1026
- * Returns tools keyed as `${connectorKey}_${toolName}`.
1056
+ * Returns tools keyed as `connector_${connectorKey}_${toolName}`.
1027
1057
  */
1028
1058
  createTools(connections, config, opts) {
1029
1059
  const myConnections = connections.filter(
@@ -1033,7 +1063,7 @@ var ConnectorPlugin = class _ConnectorPlugin {
1033
1063
  for (const t of Object.values(this.tools)) {
1034
1064
  const tool = t.createTool(myConnections, config);
1035
1065
  const originalToModelOutput = tool.toModelOutput;
1036
- result[`${this.connectorKey}_${t.name}`] = {
1066
+ result[`connector_${this.connectorKey}_${t.name}`] = {
1037
1067
  ...tool,
1038
1068
  toModelOutput: async (options) => {
1039
1069
  if (!originalToModelOutput) {
@@ -1053,25 +1083,25 @@ var ConnectorPlugin = class _ConnectorPlugin {
1053
1083
  if (authType) return `${slug}-${authType}`;
1054
1084
  const LEGACY_NULL_AUTH_TYPE_MAP = {
1055
1085
  // user-password
1056
- "postgresql": "user-password",
1057
- "mysql": "user-password",
1058
- "clickhouse": "user-password",
1059
- "kintone": "user-password",
1086
+ postgresql: "user-password",
1087
+ mysql: "user-password",
1088
+ clickhouse: "user-password",
1089
+ kintone: "user-password",
1060
1090
  "squadbase-db": "user-password",
1061
1091
  // service-account
1062
- "snowflake": "service-account",
1063
- "bigquery": "service-account",
1092
+ snowflake: "service-account",
1093
+ bigquery: "service-account",
1064
1094
  "google-analytics": "service-account",
1065
1095
  "google-calendar": "service-account",
1066
1096
  "aws-athena": "service-account",
1067
- "redshift": "service-account",
1097
+ redshift: "service-account",
1068
1098
  // api-key
1069
- "databricks": "api-key",
1070
- "dbt": "api-key",
1071
- "airtable": "api-key",
1072
- "openai": "api-key",
1073
- "gemini": "api-key",
1074
- "anthropic": "api-key",
1099
+ databricks: "api-key",
1100
+ dbt: "api-key",
1101
+ airtable: "api-key",
1102
+ openai: "api-key",
1103
+ gemini: "api-key",
1104
+ anthropic: "api-key",
1075
1105
  "wix-store": "api-key"
1076
1106
  };
1077
1107
  const fallbackAuthType = LEGACY_NULL_AUTH_TYPE_MAP[slug];
@@ -1160,6 +1190,12 @@ var AUTH_TYPES = {
1160
1190
  USER_PASSWORD: "user-password"
1161
1191
  };
1162
1192
 
1193
+ // ../connectors/src/lib/sql-dml.ts
1194
+ function isDmlStatement(sql) {
1195
+ const stripped = sql.replace(/^(\s*(--[^\n]*\n|\/\*[\s\S]*?\*\/))+/, "").trimStart();
1196
+ return /^(insert|update|delete|merge)\b/i.test(stripped);
1197
+ }
1198
+
1163
1199
  // ../connectors/src/connectors/jdbc/index.ts
1164
1200
  init_pg_pool();
1165
1201
  init_ssh_tunnel();
@@ -1171,13 +1207,13 @@ init_utils2();
1171
1207
  // ../connectors/src/connectors/jdbc/setup.ts
1172
1208
  var jdbcOnboarding = new ConnectorOnboarding({
1173
1209
  dataOverviewInstructions: {
1174
- en: `1. Use \`jdbc_executeQuery\` to detect the database flavor: \`SELECT version()\` (works on PostgreSQL/MySQL/MariaDB)
1210
+ en: `1. Use \`connector_jdbc_executeQuery\` to detect the database flavor: \`SELECT version()\` (works on PostgreSQL/MySQL/MariaDB)
1175
1211
  2. List tables:
1176
1212
  - PostgreSQL: \`SELECT table_name FROM information_schema.tables WHERE table_schema = 'public'\`
1177
1213
  - MySQL/MariaDB: \`SELECT TABLE_NAME FROM information_schema.TABLES WHERE TABLE_SCHEMA = DATABASE()\`
1178
1214
  3. For key tables, fetch column info from \`information_schema.columns\`
1179
1215
  4. Sample up to 3 tables with \`SELECT * FROM <table_name> LIMIT 5\` if column info alone is insufficient`,
1180
- ja: `1. \`jdbc_executeQuery\` \u3067DB\u30D5\u30EC\u30FC\u30D0\u30FC\u3092\u5224\u5B9A: \`SELECT version()\` (PostgreSQL/MySQL/MariaDB \u3067\u52D5\u4F5C)
1216
+ ja: `1. \`connector_jdbc_executeQuery\` \u3067DB\u30D5\u30EC\u30FC\u30D0\u30FC\u3092\u5224\u5B9A: \`SELECT version()\` (PostgreSQL/MySQL/MariaDB \u3067\u52D5\u4F5C)
1181
1217
  2. \u30C6\u30FC\u30D6\u30EB\u4E00\u89A7\u3092\u53D6\u5F97:
1182
1218
  - PostgreSQL: \`SELECT table_name FROM information_schema.tables WHERE table_schema = 'public'\`
1183
1219
  - MySQL/MariaDB: \`SELECT TABLE_NAME FROM information_schema.TABLES WHERE TABLE_SCHEMA = DATABASE()\`
@@ -1522,6 +1558,9 @@ var outputSchema = z.discriminatedUnion("success", [
1522
1558
  z.object({
1523
1559
  success: z.literal(true),
1524
1560
  rowCount: z.number(),
1561
+ rowsAffected: z.number().optional().describe(
1562
+ "Affected rows for INSERT/UPDATE/DELETE; undefined for SELECT"
1563
+ ),
1525
1564
  truncated: z.boolean(),
1526
1565
  rows: z.array(z.record(z.string(), z.unknown()))
1527
1566
  }),
@@ -1536,7 +1575,8 @@ var executeQueryTool = new ConnectorTool({
1536
1575
  Use for: schema exploration via \`information_schema\` (or USER_TABLES on Oracle), data sampling, analytical queries.
1537
1576
  The connector dispatches by JDBC URL prefix to the matching driver
1538
1577
  (PostgreSQL / Redshift / MySQL / MariaDB / SQL Server / Oracle), so use the dialect that matches the connection.
1539
- Always bound results: LIMIT for PG/MySQL/Redshift, TOP for SQL Server, FETCH FIRST for Oracle.`,
1578
+ Always bound results: LIMIT for PG/MySQL/Redshift, TOP for SQL Server, FETCH FIRST for Oracle.
1579
+ For INSERT/UPDATE/DELETE, \`rowCount\` is 0 and \`rows\` is empty (rowCount counts returned rows, not affected rows) \u2014 this is normal, not a failure; check \`rowsAffected\` for the number of affected rows.`,
1540
1580
  inputSchema,
1541
1581
  outputSchema,
1542
1582
  async execute({ connectionId, sql }, connections) {
@@ -1574,6 +1614,9 @@ Always bound results: LIMIT for PG/MySQL/Redshift, TOP for SQL Server, FETCH FIR
1574
1614
  return {
1575
1615
  success: true,
1576
1616
  rowCount: Math.min(rows.length, MAX_ROWS),
1617
+ // tedious counts SELECT result rows in rowsAffected too, so only
1618
+ // report it for DML. Multi-statement batches are summed.
1619
+ rowsAffected: isDmlStatement(sql) ? result.rowsAffected.reduce((sum, n) => sum + n, 0) : void 0,
1577
1620
  truncated: rows.length > MAX_ROWS,
1578
1621
  rows: rows.slice(0, MAX_ROWS)
1579
1622
  };
@@ -1591,6 +1634,8 @@ Always bound results: LIMIT for PG/MySQL/Redshift, TOP for SQL Server, FETCH FIR
1591
1634
  return {
1592
1635
  success: true,
1593
1636
  rowCount: Math.min(rows.length, MAX_ROWS),
1637
+ // oracledb sets rowsAffected only for DML; undefined for SELECT.
1638
+ rowsAffected: result.rowsAffected,
1594
1639
  truncated: rows.length > MAX_ROWS,
1595
1640
  rows: rows.slice(0, MAX_ROWS)
1596
1641
  };
@@ -1617,9 +1662,13 @@ Always bound results: LIMIT for PG/MySQL/Redshift, TOP for SQL Server, FETCH FIR
1617
1662
  );
1618
1663
  const rows = result.rows;
1619
1664
  const truncated = rows.length > MAX_ROWS;
1665
+ const isDml = ["INSERT", "UPDATE", "DELETE", "MERGE"].includes(
1666
+ result.command
1667
+ );
1620
1668
  return {
1621
1669
  success: true,
1622
1670
  rowCount: Math.min(rows.length, MAX_ROWS),
1671
+ rowsAffected: isDml ? result.rowCount ?? 0 : void 0,
1623
1672
  truncated,
1624
1673
  rows: rows.slice(0, MAX_ROWS)
1625
1674
  };
@@ -1643,9 +1692,11 @@ Always bound results: LIMIT for PG/MySQL/Redshift, TOP for SQL Server, FETCH FIR
1643
1692
  const [rows] = await Promise.race([queryPromise, timeoutPromise]);
1644
1693
  const resultRows = Array.isArray(rows) ? rows : [];
1645
1694
  const truncated = resultRows.length > MAX_ROWS;
1695
+ const rowsAffected = !Array.isArray(rows) && rows !== null && typeof rows === "object" && "affectedRows" in rows && typeof rows.affectedRows === "number" ? rows.affectedRows : void 0;
1646
1696
  return {
1647
1697
  success: true,
1648
1698
  rowCount: Math.min(resultRows.length, MAX_ROWS),
1699
+ rowsAffected,
1649
1700
  truncated,
1650
1701
  rows: resultRows.slice(0, MAX_ROWS)
1651
1702
  };
@@ -1697,7 +1748,7 @@ var jdbcConnector = new ConnectorPlugin({
1697
1748
  systemPrompt: {
1698
1749
  en: `### Tools
1699
1750
 
1700
- - \`jdbc_executeQuery\`: Executes a SQL query through a JDBC URL and returns rows. The connector dispatches by URL prefix to the matching native driver, so use the dialect that matches the connection. Use this for schema exploration via \`information_schema\` (or vendor equivalent) and for sampling data. See the SQL Reference below.
1751
+ - \`connector_jdbc_executeQuery\`: Executes a SQL query through a JDBC URL and returns rows. The connector dispatches by URL prefix to the matching native driver, so use the dialect that matches the connection. Use this for schema exploration via \`information_schema\` (or vendor equivalent) and for sampling data. See the SQL Reference below.
1701
1752
 
1702
1753
  ### Business Logic
1703
1754
 
@@ -1729,7 +1780,7 @@ Explicitly **not** supported via this connector \u2014 use the dedicated connect
1729
1780
  The platform's server-logic schema inference may wrap your query as \`SELECT * FROM (<inner>) AS _sq LIMIT N\` (PostgreSQL/MySQL syntax). For PostgreSQL / Redshift / MySQL routes this executes natively. For \`jdbc:sqlserver://\` and \`jdbc:oracle:thin:\` routes, the connector detects this exact wrapper at \`query()\` time, executes \`<inner>\` directly via the dialect-specific driver, and slices the first N rows in JS. You do not need to handle this \u2014 but in queries **you author**, do not use \`LIMIT\` for the SQL Server / Oracle routes; use \`TOP\` / \`FETCH FIRST\` as listed above.`,
1730
1781
  ja: `### \u30C4\u30FC\u30EB
1731
1782
 
1732
- - \`jdbc_executeQuery\`: JDBC URL \u7D4C\u7531\u3067 SQL \u30AF\u30A8\u30EA\u3092\u5B9F\u884C\u3057\u3001\u884C\u30C7\u30FC\u30BF\u3092\u8FD4\u3057\u307E\u3059\u3002\u30B3\u30CD\u30AF\u30BF\u306F URL \u30D7\u30EC\u30D5\u30A3\u30C3\u30AF\u30B9\u304B\u3089\u5BFE\u5FDC\u3059\u308B\u30CD\u30A4\u30C6\u30A3\u30D6\u30C9\u30E9\u30A4\u30D0\u3078\u632F\u308A\u5206\u3051\u308B\u305F\u3081\u3001\u63A5\u7D9A\u5148\u306B\u5408\u3063\u305F\u65B9\u8A00\u3092\u4F7F\u7528\u3057\u3066\u304F\u3060\u3055\u3044\u3002\`information_schema\`\uFF08\u307E\u305F\u306F\u5404 DB \u306E\u540C\u7B49\u306E\u30E1\u30BF\u30C7\u30FC\u30BF\u30D3\u30E5\u30FC\uFF09\u3092\u4F7F\u3063\u305F\u30B9\u30AD\u30FC\u30DE\u63A2\u7D22\u3084\u30C7\u30FC\u30BF\u306E\u30B5\u30F3\u30D7\u30EA\u30F3\u30B0\u306B\u4F7F\u3044\u307E\u3059\u3002\u4E0B\u90E8\u306E\u300CSQL \u30EA\u30D5\u30A1\u30EC\u30F3\u30B9\u300D\u3092\u53C2\u7167\u3057\u3066\u304F\u3060\u3055\u3044\u3002
1783
+ - \`connector_jdbc_executeQuery\`: JDBC URL \u7D4C\u7531\u3067 SQL \u30AF\u30A8\u30EA\u3092\u5B9F\u884C\u3057\u3001\u884C\u30C7\u30FC\u30BF\u3092\u8FD4\u3057\u307E\u3059\u3002\u30B3\u30CD\u30AF\u30BF\u306F URL \u30D7\u30EC\u30D5\u30A3\u30C3\u30AF\u30B9\u304B\u3089\u5BFE\u5FDC\u3059\u308B\u30CD\u30A4\u30C6\u30A3\u30D6\u30C9\u30E9\u30A4\u30D0\u3078\u632F\u308A\u5206\u3051\u308B\u305F\u3081\u3001\u63A5\u7D9A\u5148\u306B\u5408\u3063\u305F\u65B9\u8A00\u3092\u4F7F\u7528\u3057\u3066\u304F\u3060\u3055\u3044\u3002\`information_schema\`\uFF08\u307E\u305F\u306F\u5404 DB \u306E\u540C\u7B49\u306E\u30E1\u30BF\u30C7\u30FC\u30BF\u30D3\u30E5\u30FC\uFF09\u3092\u4F7F\u3063\u305F\u30B9\u30AD\u30FC\u30DE\u63A2\u7D22\u3084\u30C7\u30FC\u30BF\u306E\u30B5\u30F3\u30D7\u30EA\u30F3\u30B0\u306B\u4F7F\u3044\u307E\u3059\u3002\u4E0B\u90E8\u306E\u300CSQL \u30EA\u30D5\u30A1\u30EC\u30F3\u30B9\u300D\u3092\u53C2\u7167\u3057\u3066\u304F\u3060\u3055\u3044\u3002
1733
1784
 
1734
1785
  ### Business Logic
1735
1786