@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.
- package/dist/cli/index.js +8941 -3700
- package/dist/connectors/airtable-oauth.js +87 -23
- package/dist/connectors/airtable.js +130 -23
- package/dist/connectors/amplitude.js +47 -23
- package/dist/connectors/anthropic.js +41 -17
- package/dist/connectors/asana.js +76 -25
- package/dist/connectors/attio.js +69 -28
- package/dist/connectors/aws-billing.js +47 -23
- package/dist/connectors/azure-sql.js +322 -25
- package/dist/connectors/backlog-api-key.js +79 -30
- package/dist/connectors/clickup.js +89 -25
- package/dist/connectors/cosmosdb.js +51 -27
- package/dist/connectors/customerio.js +47 -23
- package/dist/connectors/dbt.js +725 -40
- package/dist/connectors/freshdesk.js +121 -23
- package/dist/connectors/freshsales.js +47 -23
- package/dist/connectors/freshservice.js +47 -23
- package/dist/connectors/gamma.js +54 -30
- package/dist/connectors/gemini.js +41 -17
- package/dist/connectors/github.js +51 -27
- package/dist/connectors/gmail-oauth.js +42 -23
- package/dist/connectors/gmail.js +43 -19
- package/dist/connectors/google-ads.js +47 -23
- package/dist/connectors/google-analytics-oauth.js +191 -40
- package/dist/connectors/google-analytics.js +529 -111
- package/dist/connectors/google-audit-log.js +43 -19
- package/dist/connectors/google-calendar-oauth.js +100 -30
- package/dist/connectors/google-calendar.js +100 -26
- package/dist/connectors/google-docs.js +42 -23
- package/dist/connectors/google-drive.js +64 -23
- package/dist/connectors/google-search-console-oauth.js +165 -32
- package/dist/connectors/google-sheets.js +142 -199
- package/dist/connectors/google-slides.js +42 -23
- package/dist/connectors/grafana.js +84 -25
- package/dist/connectors/hackernews.d.ts +5 -0
- package/dist/connectors/hackernews.js +909 -0
- package/dist/connectors/hubspot-oauth.js +73 -22
- package/dist/connectors/hubspot.js +64 -24
- package/dist/connectors/influxdb.js +47 -23
- package/dist/connectors/intercom-oauth.js +104 -25
- package/dist/connectors/intercom.js +51 -27
- package/dist/connectors/jdbc.js +76 -25
- package/dist/connectors/jira-api-key.js +107 -26
- package/dist/connectors/kintone-api-token.js +105 -33
- package/dist/connectors/kintone.js +182 -26
- package/dist/connectors/linear.js +93 -27
- package/dist/connectors/linkedin-ads.js +80 -29
- package/dist/connectors/mailchimp-oauth.js +45 -21
- package/dist/connectors/mailchimp.js +45 -21
- package/dist/connectors/meta-ads-oauth.js +72 -29
- package/dist/connectors/meta-ads.js +74 -29
- package/dist/connectors/mixpanel.js +47 -23
- package/dist/connectors/monday.js +48 -24
- package/dist/connectors/mongodb.js +47 -23
- package/dist/connectors/notion-oauth.js +92 -24
- package/dist/connectors/notion.js +144 -26
- package/dist/connectors/openai.js +41 -17
- package/dist/connectors/oracle.js +316 -26
- package/dist/connectors/outlook-oauth.js +53 -34
- package/dist/connectors/powerbi-oauth.js +45 -26
- package/dist/connectors/salesforce.js +150 -24
- package/dist/connectors/semrush.js +45 -21
- package/dist/connectors/sentry.js +75 -25
- package/dist/connectors/shopify-oauth.js +75 -23
- package/dist/connectors/shopify.js +47 -23
- package/dist/connectors/sqlserver.js +322 -25
- package/dist/connectors/stripe-api-key.js +105 -30
- package/dist/connectors/stripe-oauth.js +102 -32
- package/dist/connectors/supabase.js +315 -21
- package/dist/connectors/tableau.js +54 -30
- package/dist/connectors/tiktok-ads.js +76 -31
- package/dist/connectors/wix-store.js +47 -23
- package/dist/connectors/x.d.ts +5 -0
- package/dist/connectors/x.js +951 -0
- package/dist/connectors/zendesk-oauth.js +87 -25
- package/dist/connectors/zendesk.js +51 -27
- package/dist/index.js +9005 -3709
- package/dist/main.js +9005 -3709
- package/dist/vite-plugin.js +8939 -3698
- 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
|
|
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[
|
|
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
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
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
|
-
|
|
154
|
-
|
|
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
|
-
|
|
177
|
+
redshift: "service-account",
|
|
159
178
|
// api-key
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
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
|
|
401
|
-
2. Call
|
|
402
|
-
3. Call
|
|
403
|
-
4. Call
|
|
404
|
-
ja: `1.
|
|
405
|
-
2.
|
|
406
|
-
3.
|
|
407
|
-
4.
|
|
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
|
-
- \`
|
|
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
|
-
- \`
|
|
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
|
-
|
|
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
|
|
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[
|
|
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
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
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
|
-
|
|
315
|
-
|
|
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
|
-
|
|
343
|
+
redshift: "service-account",
|
|
320
344
|
// api-key
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
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
|
|
419
|
-
2. Call
|
|
420
|
-
3. Call
|
|
421
|
-
4. Call
|
|
422
|
-
ja: `1.
|
|
423
|
-
2.
|
|
424
|
-
3.
|
|
425
|
-
4.
|
|
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
|
-
- \`
|
|
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
|
-
- \`
|
|
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
|
|
package/dist/connectors/jdbc.js
CHANGED
|
@@ -1,7 +1,12 @@
|
|
|
1
1
|
var __defProp = Object.defineProperty;
|
|
2
2
|
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
3
|
-
var __esm = (fn, res) => function __init() {
|
|
4
|
-
|
|
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 {
|
|
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
|
|
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[
|
|
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
|
-
|
|
1057
|
-
|
|
1058
|
-
|
|
1059
|
-
|
|
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
|
-
|
|
1063
|
-
|
|
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
|
-
|
|
1097
|
+
redshift: "service-account",
|
|
1068
1098
|
// api-key
|
|
1069
|
-
|
|
1070
|
-
|
|
1071
|
-
|
|
1072
|
-
|
|
1073
|
-
|
|
1074
|
-
|
|
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 \`
|
|
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. \`
|
|
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
|
-
- \`
|
|
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
|
-
- \`
|
|
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
|
|