@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
@@ -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
@@ -132,6 +137,15 @@ var ConnectorPlugin = class _ConnectorPlugin {
132
137
  * `runSetupFlow` from `setup-flow.ts`.
133
138
  */
134
139
  setup;
140
+ /**
141
+ * 統一 introspection。SQL DB の `information_schema` / `SHOW` / `DESCRIBE` や SaaS の
142
+ * メタデータ API といった取得経路の差を吸収し、tables / columns / PK / FK を共通型
143
+ * {@link IntrospectedSchema} へ正規化して返す。取得経路は {@link IntrospectContext} で
144
+ * 抽象化され、SQL DB は `ctx.query`、SaaS は `ctx.proxyFetch` + `ctx.params` を使う。
145
+ * `ctx.profile === true` のときは L2 プロファイル(行数・NULL 率等)も best-effort で埋める。
146
+ * coding-agent の `DataContextIndex` がデータ地図を構築する際に使う。
147
+ */
148
+ introspect;
135
149
  /**
136
150
  * Opt-out of the default "verify before save" behavior on connection
137
151
  * creation. The backend invokes `checkConnection` synchronously while
@@ -146,6 +160,14 @@ var ConnectorPlugin = class _ConnectorPlugin {
146
160
  * the default verify-on-create behavior without opt-in.
147
161
  */
148
162
  skipConnectionCheckOnCreate;
163
+ /**
164
+ * 決定論的な「立ち上げ survey」レシピ(ルールベース prewarm 基盤)。実装した connector は、LLM を使わずに
165
+ * read-only で自分を survey する probe 列(テーブル/列メタデータ → 小サンプル)を宣言する。coding-agent の
166
+ * recon driver がこれを読み、connector ツールの `execute` を直接呼んで結果を seed にする。未実装の connector は
167
+ * driver 側で safely skip される(その connection は listConnections のみ seed)。標準 `information_schema` を
168
+ * 持つ SQL connector は `makeStandardSqlSurveyProbes` を使える。**probe は必ず read-only**。
169
+ */
170
+ surveyProbes;
149
171
  constructor(config) {
150
172
  this.slug = config.slug;
151
173
  this.authType = config.authType;
@@ -163,7 +185,9 @@ var ConnectorPlugin = class _ConnectorPlugin {
163
185
  this.query = config.query;
164
186
  this.checkConnection = config.checkConnection;
165
187
  this.setup = config.setup;
188
+ this.introspect = config.introspect;
166
189
  this.skipConnectionCheckOnCreate = config.skipConnectionCheckOnCreate;
190
+ this.surveyProbes = config.surveyProbes;
167
191
  }
168
192
  get connectorKey() {
169
193
  return _ConnectorPlugin.deriveKey(this.slug, this.authType);
@@ -171,7 +195,7 @@ var ConnectorPlugin = class _ConnectorPlugin {
171
195
  /**
172
196
  * Create tools for connections that belong to this connector.
173
197
  * Filters connections by connectorKey internally.
174
- * Returns tools keyed as `${connectorKey}_${toolName}`.
198
+ * Returns tools keyed as `connector_${connectorKey}_${toolName}`.
175
199
  */
176
200
  createTools(connections, config, opts) {
177
201
  const myConnections = connections.filter(
@@ -181,7 +205,7 @@ var ConnectorPlugin = class _ConnectorPlugin {
181
205
  for (const t of Object.values(this.tools)) {
182
206
  const tool = t.createTool(myConnections, config);
183
207
  const originalToModelOutput = tool.toModelOutput;
184
- result[`${this.connectorKey}_${t.name}`] = {
208
+ result[`connector_${this.connectorKey}_${t.name}`] = {
185
209
  ...tool,
186
210
  toModelOutput: async (options) => {
187
211
  if (!originalToModelOutput) {
@@ -201,25 +225,25 @@ var ConnectorPlugin = class _ConnectorPlugin {
201
225
  if (authType) return `${slug}-${authType}`;
202
226
  const LEGACY_NULL_AUTH_TYPE_MAP = {
203
227
  // user-password
204
- "postgresql": "user-password",
205
- "mysql": "user-password",
206
- "clickhouse": "user-password",
207
- "kintone": "user-password",
228
+ postgresql: "user-password",
229
+ mysql: "user-password",
230
+ clickhouse: "user-password",
231
+ kintone: "user-password",
208
232
  "squadbase-db": "user-password",
209
233
  // service-account
210
- "snowflake": "service-account",
211
- "bigquery": "service-account",
234
+ snowflake: "service-account",
235
+ bigquery: "service-account",
212
236
  "google-analytics": "service-account",
213
237
  "google-calendar": "service-account",
214
238
  "aws-athena": "service-account",
215
- "redshift": "service-account",
239
+ redshift: "service-account",
216
240
  // api-key
217
- "databricks": "api-key",
218
- "dbt": "api-key",
219
- "airtable": "api-key",
220
- "openai": "api-key",
221
- "gemini": "api-key",
222
- "anthropic": "api-key",
241
+ databricks: "api-key",
242
+ dbt: "api-key",
243
+ airtable: "api-key",
244
+ openai: "api-key",
245
+ gemini: "api-key",
246
+ anthropic: "api-key",
223
247
  "wix-store": "api-key"
224
248
  };
225
249
  const fallbackAuthType = LEGACY_NULL_AUTH_TYPE_MAP[slug];
@@ -453,11 +477,11 @@ var linkedinAdsOnboarding = new ConnectorOnboarding({
453
477
  - Write only 1 sentence between tool calls, then immediately call the next tool. Skip unnecessary explanations and proceed efficiently`
454
478
  },
455
479
  dataOverviewInstructions: {
456
- en: `1. Call linkedin-ads_request with GET adAccounts/{adAccountId}/adCampaigns?q=search&search=(status:(values:List(ACTIVE)))&pageSize=10 to explore campaigns
457
- 2. Call linkedin-ads_request with GET adAnalytics?q=analytics&pivot=CAMPAIGN&timeGranularity=MONTHLY&dateRange=(start:(year:2025,month:1,day:1))&accounts=List(urn%3Ali%3AsponsoredAccount%3A{adAccountId})&fields=impressions,clicks,costInLocalCurrency,dateRange,pivotValues to check recent performance
480
+ en: `1. Call connector_linkedin-ads_request with GET adAccounts/{adAccountId}/adCampaigns?q=search&search=(status:(values:List(ACTIVE)))&pageSize=10 to explore campaigns
481
+ 2. Call connector_linkedin-ads_request with GET adAnalytics?q=analytics&pivot=CAMPAIGN&timeGranularity=MONTHLY&dateRange=(start:(year:2025,month:1,day:1))&accounts=List(urn%3Ali%3AsponsoredAccount%3A{adAccountId})&fields=impressions,clicks,costInLocalCurrency,dateRange,pivotValues to check recent performance
458
482
  3. Explore campaign groups and creatives as needed to understand the data structure`,
459
- ja: `1. linkedin-ads_request \u3067 GET adAccounts/{adAccountId}/adCampaigns?q=search&search=(status:(values:List(ACTIVE)))&pageSize=10 \u3092\u547C\u3073\u51FA\u3057\u3066\u30AD\u30E3\u30F3\u30DA\u30FC\u30F3\u30C7\u30FC\u30BF\u3092\u63A2\u7D22
460
- 2. linkedin-ads_request \u3067 GET adAnalytics?q=analytics&pivot=CAMPAIGN&timeGranularity=MONTHLY&dateRange=(start:(year:2025,month:1,day:1))&accounts=List(urn%3Ali%3AsponsoredAccount%3A{adAccountId})&fields=impressions,clicks,costInLocalCurrency,dateRange,pivotValues \u3092\u547C\u3073\u51FA\u3057\u3066\u76F4\u8FD1\u306E\u30D1\u30D5\u30A9\u30FC\u30DE\u30F3\u30B9\u3092\u78BA\u8A8D
483
+ ja: `1. connector_linkedin-ads_request \u3067 GET adAccounts/{adAccountId}/adCampaigns?q=search&search=(status:(values:List(ACTIVE)))&pageSize=10 \u3092\u547C\u3073\u51FA\u3057\u3066\u30AD\u30E3\u30F3\u30DA\u30FC\u30F3\u30C7\u30FC\u30BF\u3092\u63A2\u7D22
484
+ 2. connector_linkedin-ads_request \u3067 GET adAnalytics?q=analytics&pivot=CAMPAIGN&timeGranularity=MONTHLY&dateRange=(start:(year:2025,month:1,day:1))&accounts=List(urn%3Ali%3AsponsoredAccount%3A{adAccountId})&fields=impressions,clicks,costInLocalCurrency,dateRange,pivotValues \u3092\u547C\u3073\u51FA\u3057\u3066\u76F4\u8FD1\u306E\u30D1\u30D5\u30A9\u30FC\u30DE\u30F3\u30B9\u3092\u78BA\u8A8D
461
485
  3. \u5FC5\u8981\u306B\u5FDC\u3058\u3066\u30AD\u30E3\u30F3\u30DA\u30FC\u30F3\u30B0\u30EB\u30FC\u30D7\u3084\u30AF\u30EA\u30A8\u30A4\u30C6\u30A3\u30D6\u3092\u63A2\u7D22\u3057\u3001\u30C7\u30FC\u30BF\u69CB\u9020\u3092\u628A\u63E1`
462
486
  }
463
487
  });
@@ -502,6 +526,24 @@ async function listAdAccounts(proxyFetch) {
502
526
  const data = await res.json();
503
527
  return data.elements ?? [];
504
528
  }
529
+ async function fetchCampaignCount(proxyFetch, accountId) {
530
+ try {
531
+ const account = encodeURIComponent(
532
+ `urn:li:sponsoredAccount:${accountId}`
533
+ );
534
+ const url = `${BASE_URL3}/adCampaigns?q=search&search.account.values[0]=${account}&count=1`;
535
+ const res = await proxyFetch(url, {
536
+ method: "GET",
537
+ headers: defaultHeaders()
538
+ });
539
+ if (!res.ok) return null;
540
+ const data = await res.json();
541
+ const total = data.paging?.total;
542
+ return typeof total === "number" ? total : null;
543
+ } catch {
544
+ return null;
545
+ }
546
+ }
505
547
  var linkedinAdsSetupFlow = {
506
548
  initialState: () => ({}),
507
549
  steps: [
@@ -549,16 +591,25 @@ var linkedinAdsSetupFlow = {
549
591
  sections.push("_No ad accounts selected._", "");
550
592
  return sections.join("\n");
551
593
  }
552
- sections.push("| Ad Account ID | Name | Currency | Type | Status |");
553
- sections.push("|---------------|------|----------|------|--------|");
554
- for (const id of targetIds) {
594
+ sections.push(
595
+ "| Ad Account ID | Name | Currency | Type | Status | Campaigns |"
596
+ );
597
+ sections.push(
598
+ "|---------------|------|----------|------|--------|-----------|"
599
+ );
600
+ const campaignCounts = await Promise.all(
601
+ targetIds.map((id) => fetchCampaignCount(rt.config.proxyFetch, id))
602
+ );
603
+ for (let i = 0; i < targetIds.length; i++) {
604
+ const id = targetIds[i];
555
605
  const account = byId.get(id);
556
606
  const name = (account?.name ?? "-").replace(/\|/g, "\\|");
557
607
  const currency = account?.currency ?? "-";
558
608
  const type = account?.type ?? "-";
559
609
  const status = account?.status ?? "-";
610
+ const campaigns = campaignCounts[i] == null ? "-" : String(campaignCounts[i]);
560
611
  sections.push(
561
- `| ${id} | ${name} | ${currency} | ${type} | ${status} |`
612
+ `| ${id} | ${name} | ${currency} | ${type} | ${status} | ${campaigns} |`
562
613
  );
563
614
  }
564
615
  sections.push("");
@@ -726,8 +777,8 @@ var linkedinAdsConnector = new ConnectorPlugin({
726
777
  systemPrompt: {
727
778
  en: `### Tools
728
779
 
729
- - \`linkedin-ads_request\`: Send authenticated requests to the LinkedIn Marketing API (REST). The {adAccountId} placeholder in paths is automatically replaced. Authentication is handled automatically via OAuth proxy. Required headers (LinkedIn-Version, X-Restli-Protocol-Version) are set automatically.
730
- - \`linkedin-ads_listAdAccounts\`: List accessible LinkedIn ad accounts. Use this during setup to discover available accounts.
780
+ - \`connector_linkedin-ads_request\`: Send authenticated requests to the LinkedIn Marketing API (REST). The {adAccountId} placeholder in paths is automatically replaced. Authentication is handled automatically via OAuth proxy. Required headers (LinkedIn-Version, X-Restli-Protocol-Version) are set automatically.
781
+ - \`connector_linkedin-ads_listAdAccounts\`: List accessible LinkedIn ad accounts. Use this during setup to discover available accounts.
731
782
 
732
783
  ### LinkedIn Marketing API Reference
733
784
 
@@ -819,8 +870,8 @@ const data = await res.json();
819
870
  \`\`\``,
820
871
  ja: `### \u30C4\u30FC\u30EB
821
872
 
822
- - \`linkedin-ads_request\`: LinkedIn Marketing API\uFF08REST\uFF09\u3078\u8A8D\u8A3C\u6E08\u307F\u30EA\u30AF\u30A8\u30B9\u30C8\u3092\u9001\u4FE1\u3057\u307E\u3059\u3002\u30D1\u30B9\u5185\u306E{adAccountId}\u30D7\u30EC\u30FC\u30B9\u30DB\u30EB\u30C0\u30FC\u306F\u81EA\u52D5\u7684\u306B\u7F6E\u63DB\u3055\u308C\u307E\u3059\u3002\u8A8D\u8A3C\u306FOAuth\u30D7\u30ED\u30AD\u30B7\u7D4C\u7531\u3067\u81EA\u52D5\u7684\u306B\u51E6\u7406\u3055\u308C\u307E\u3059\u3002\u5FC5\u9808\u30D8\u30C3\u30C0\u30FC\uFF08LinkedIn-Version\u3001X-Restli-Protocol-Version\uFF09\u306F\u81EA\u52D5\u8A2D\u5B9A\u3055\u308C\u307E\u3059\u3002
823
- - \`linkedin-ads_listAdAccounts\`: \u30A2\u30AF\u30BB\u30B9\u53EF\u80FD\u306ALinkedIn\u5E83\u544A\u30A2\u30AB\u30A6\u30F3\u30C8\u306E\u4E00\u89A7\u3092\u53D6\u5F97\u3057\u307E\u3059\u3002\u30BB\u30C3\u30C8\u30A2\u30C3\u30D7\u6642\u306B\u5229\u7528\u53EF\u80FD\u306A\u30A2\u30AB\u30A6\u30F3\u30C8\u3092\u78BA\u8A8D\u3059\u308B\u305F\u3081\u306B\u4F7F\u7528\u3057\u307E\u3059\u3002
873
+ - \`connector_linkedin-ads_request\`: LinkedIn Marketing API\uFF08REST\uFF09\u3078\u8A8D\u8A3C\u6E08\u307F\u30EA\u30AF\u30A8\u30B9\u30C8\u3092\u9001\u4FE1\u3057\u307E\u3059\u3002\u30D1\u30B9\u5185\u306E{adAccountId}\u30D7\u30EC\u30FC\u30B9\u30DB\u30EB\u30C0\u30FC\u306F\u81EA\u52D5\u7684\u306B\u7F6E\u63DB\u3055\u308C\u307E\u3059\u3002\u8A8D\u8A3C\u306FOAuth\u30D7\u30ED\u30AD\u30B7\u7D4C\u7531\u3067\u81EA\u52D5\u7684\u306B\u51E6\u7406\u3055\u308C\u307E\u3059\u3002\u5FC5\u9808\u30D8\u30C3\u30C0\u30FC\uFF08LinkedIn-Version\u3001X-Restli-Protocol-Version\uFF09\u306F\u81EA\u52D5\u8A2D\u5B9A\u3055\u308C\u307E\u3059\u3002
874
+ - \`connector_linkedin-ads_listAdAccounts\`: \u30A2\u30AF\u30BB\u30B9\u53EF\u80FD\u306ALinkedIn\u5E83\u544A\u30A2\u30AB\u30A6\u30F3\u30C8\u306E\u4E00\u89A7\u3092\u53D6\u5F97\u3057\u307E\u3059\u3002\u30BB\u30C3\u30C8\u30A2\u30C3\u30D7\u6642\u306B\u5229\u7528\u53EF\u80FD\u306A\u30A2\u30AB\u30A6\u30F3\u30C8\u3092\u78BA\u8A8D\u3059\u308B\u305F\u3081\u306B\u4F7F\u7528\u3057\u307E\u3059\u3002
824
875
 
825
876
  ### LinkedIn Marketing API \u30EA\u30D5\u30A1\u30EC\u30F3\u30B9
826
877
 
@@ -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
@@ -138,6 +143,15 @@ var ConnectorPlugin = class _ConnectorPlugin {
138
143
  * `runSetupFlow` from `setup-flow.ts`.
139
144
  */
140
145
  setup;
146
+ /**
147
+ * 統一 introspection。SQL DB の `information_schema` / `SHOW` / `DESCRIBE` や SaaS の
148
+ * メタデータ API といった取得経路の差を吸収し、tables / columns / PK / FK を共通型
149
+ * {@link IntrospectedSchema} へ正規化して返す。取得経路は {@link IntrospectContext} で
150
+ * 抽象化され、SQL DB は `ctx.query`、SaaS は `ctx.proxyFetch` + `ctx.params` を使う。
151
+ * `ctx.profile === true` のときは L2 プロファイル(行数・NULL 率等)も best-effort で埋める。
152
+ * coding-agent の `DataContextIndex` がデータ地図を構築する際に使う。
153
+ */
154
+ introspect;
141
155
  /**
142
156
  * Opt-out of the default "verify before save" behavior on connection
143
157
  * creation. The backend invokes `checkConnection` synchronously while
@@ -152,6 +166,14 @@ var ConnectorPlugin = class _ConnectorPlugin {
152
166
  * the default verify-on-create behavior without opt-in.
153
167
  */
154
168
  skipConnectionCheckOnCreate;
169
+ /**
170
+ * 決定論的な「立ち上げ survey」レシピ(ルールベース prewarm 基盤)。実装した connector は、LLM を使わずに
171
+ * read-only で自分を survey する probe 列(テーブル/列メタデータ → 小サンプル)を宣言する。coding-agent の
172
+ * recon driver がこれを読み、connector ツールの `execute` を直接呼んで結果を seed にする。未実装の connector は
173
+ * driver 側で safely skip される(その connection は listConnections のみ seed)。標準 `information_schema` を
174
+ * 持つ SQL connector は `makeStandardSqlSurveyProbes` を使える。**probe は必ず read-only**。
175
+ */
176
+ surveyProbes;
155
177
  constructor(config) {
156
178
  this.slug = config.slug;
157
179
  this.authType = config.authType;
@@ -169,7 +191,9 @@ var ConnectorPlugin = class _ConnectorPlugin {
169
191
  this.query = config.query;
170
192
  this.checkConnection = config.checkConnection;
171
193
  this.setup = config.setup;
194
+ this.introspect = config.introspect;
172
195
  this.skipConnectionCheckOnCreate = config.skipConnectionCheckOnCreate;
196
+ this.surveyProbes = config.surveyProbes;
173
197
  }
174
198
  get connectorKey() {
175
199
  return _ConnectorPlugin.deriveKey(this.slug, this.authType);
@@ -177,7 +201,7 @@ var ConnectorPlugin = class _ConnectorPlugin {
177
201
  /**
178
202
  * Create tools for connections that belong to this connector.
179
203
  * Filters connections by connectorKey internally.
180
- * Returns tools keyed as `${connectorKey}_${toolName}`.
204
+ * Returns tools keyed as `connector_${connectorKey}_${toolName}`.
181
205
  */
182
206
  createTools(connections, config, opts) {
183
207
  const myConnections = connections.filter(
@@ -187,7 +211,7 @@ var ConnectorPlugin = class _ConnectorPlugin {
187
211
  for (const t of Object.values(this.tools)) {
188
212
  const tool = t.createTool(myConnections, config);
189
213
  const originalToModelOutput = tool.toModelOutput;
190
- result[`${this.connectorKey}_${t.name}`] = {
214
+ result[`connector_${this.connectorKey}_${t.name}`] = {
191
215
  ...tool,
192
216
  toModelOutput: async (options) => {
193
217
  if (!originalToModelOutput) {
@@ -207,25 +231,25 @@ var ConnectorPlugin = class _ConnectorPlugin {
207
231
  if (authType) return `${slug}-${authType}`;
208
232
  const LEGACY_NULL_AUTH_TYPE_MAP = {
209
233
  // user-password
210
- "postgresql": "user-password",
211
- "mysql": "user-password",
212
- "clickhouse": "user-password",
213
- "kintone": "user-password",
234
+ postgresql: "user-password",
235
+ mysql: "user-password",
236
+ clickhouse: "user-password",
237
+ kintone: "user-password",
214
238
  "squadbase-db": "user-password",
215
239
  // service-account
216
- "snowflake": "service-account",
217
- "bigquery": "service-account",
240
+ snowflake: "service-account",
241
+ bigquery: "service-account",
218
242
  "google-analytics": "service-account",
219
243
  "google-calendar": "service-account",
220
244
  "aws-athena": "service-account",
221
- "redshift": "service-account",
245
+ redshift: "service-account",
222
246
  // api-key
223
- "databricks": "api-key",
224
- "dbt": "api-key",
225
- "airtable": "api-key",
226
- "openai": "api-key",
227
- "gemini": "api-key",
228
- "anthropic": "api-key",
247
+ databricks: "api-key",
248
+ dbt: "api-key",
249
+ airtable: "api-key",
250
+ openai: "api-key",
251
+ gemini: "api-key",
252
+ anthropic: "api-key",
229
253
  "wix-store": "api-key"
230
254
  };
231
255
  const fallbackAuthType = LEGACY_NULL_AUTH_TYPE_MAP[slug];
@@ -317,11 +341,11 @@ var AUTH_TYPES = {
317
341
  // ../connectors/src/connectors/mailchimp-oauth/setup.ts
318
342
  var mailchimpOauthOnboarding = new ConnectorOnboarding({
319
343
  dataOverviewInstructions: {
320
- en: `1. Call mailchimp-oauth_request with GET /lists to list all audiences
344
+ en: `1. Call connector_mailchimp-oauth_request with GET /lists to list all audiences
321
345
  2. Pick an audience and call GET /lists/{list_id}/members?count=5 to sample members
322
346
  3. Call GET /campaigns?count=5 to list recent campaigns
323
347
  4. Call GET /reports?count=5 to view campaign reports`,
324
- ja: `1. mailchimp-oauth_request \u3067 GET /lists \u3092\u547C\u3073\u51FA\u3057\u3001\u5168\u30AA\u30FC\u30C7\u30A3\u30A8\u30F3\u30B9\u4E00\u89A7\u3092\u53D6\u5F97
348
+ ja: `1. connector_mailchimp-oauth_request \u3067 GET /lists \u3092\u547C\u3073\u51FA\u3057\u3001\u5168\u30AA\u30FC\u30C7\u30A3\u30A8\u30F3\u30B9\u4E00\u89A7\u3092\u53D6\u5F97
325
349
  2. \u30AA\u30FC\u30C7\u30A3\u30A8\u30F3\u30B9\u3092\u9078\u629E\u3057 GET /lists/{list_id}/members?count=5 \u3067\u30E1\u30F3\u30D0\u30FC\u3092\u30B5\u30F3\u30D7\u30EA\u30F3\u30B0
326
350
  3. GET /campaigns?count=5 \u3067\u6700\u8FD1\u306E\u30AD\u30E3\u30F3\u30DA\u30FC\u30F3\u4E00\u89A7\u3092\u53D6\u5F97
327
351
  4. GET /reports?count=5 \u3067\u30AD\u30E3\u30F3\u30DA\u30FC\u30F3\u30EC\u30DD\u30FC\u30C8\u3092\u8868\u793A`
@@ -576,7 +600,7 @@ var mailchimpOauthConnector = new ConnectorPlugin({
576
600
  systemPrompt: {
577
601
  en: `### Tools
578
602
 
579
- - \`mailchimp-oauth_request\`: The only way to call the Mailchimp Marketing API v3. Use it to manage audiences/lists, subscribers/members, campaigns, templates, automations, and reports. Authentication is configured automatically via OAuth.
603
+ - \`connector_mailchimp-oauth_request\`: The only way to call the Mailchimp Marketing API v3. Use it to manage audiences/lists, subscribers/members, campaigns, templates, automations, and reports. Authentication is configured automatically via OAuth.
580
604
 
581
605
  ### Mailchimp Marketing API v3 Reference
582
606
 
@@ -634,7 +658,7 @@ const data = await res.json();
634
658
  \`\`\``,
635
659
  ja: `### \u30C4\u30FC\u30EB
636
660
 
637
- - \`mailchimp-oauth_request\`: Mailchimp Marketing API v3\u3092\u547C\u3073\u51FA\u3059\u552F\u4E00\u306E\u624B\u6BB5\u3067\u3059\u3002\u30AA\u30FC\u30C7\u30A3\u30A8\u30F3\u30B9/\u30EA\u30B9\u30C8\u3001\u30B5\u30D6\u30B9\u30AF\u30E9\u30A4\u30D0\u30FC/\u30E1\u30F3\u30D0\u30FC\u3001\u30AD\u30E3\u30F3\u30DA\u30FC\u30F3\u3001\u30C6\u30F3\u30D7\u30EC\u30FC\u30C8\u3001\u30AA\u30FC\u30C8\u30E1\u30FC\u30B7\u30E7\u30F3\u3001\u30EC\u30DD\u30FC\u30C8\u306E\u7BA1\u7406\u306B\u4F7F\u7528\u3057\u307E\u3059\u3002OAuth\u7D4C\u7531\u3067\u8A8D\u8A3C\u306F\u81EA\u52D5\u8A2D\u5B9A\u3055\u308C\u307E\u3059\u3002
661
+ - \`connector_mailchimp-oauth_request\`: Mailchimp Marketing API v3\u3092\u547C\u3073\u51FA\u3059\u552F\u4E00\u306E\u624B\u6BB5\u3067\u3059\u3002\u30AA\u30FC\u30C7\u30A3\u30A8\u30F3\u30B9/\u30EA\u30B9\u30C8\u3001\u30B5\u30D6\u30B9\u30AF\u30E9\u30A4\u30D0\u30FC/\u30E1\u30F3\u30D0\u30FC\u3001\u30AD\u30E3\u30F3\u30DA\u30FC\u30F3\u3001\u30C6\u30F3\u30D7\u30EC\u30FC\u30C8\u3001\u30AA\u30FC\u30C8\u30E1\u30FC\u30B7\u30E7\u30F3\u3001\u30EC\u30DD\u30FC\u30C8\u306E\u7BA1\u7406\u306B\u4F7F\u7528\u3057\u307E\u3059\u3002OAuth\u7D4C\u7531\u3067\u8A8D\u8A3C\u306F\u81EA\u52D5\u8A2D\u5B9A\u3055\u308C\u307E\u3059\u3002
638
662
 
639
663
  ### Mailchimp Marketing API v3 \u30EA\u30D5\u30A1\u30EC\u30F3\u30B9
640
664
 
@@ -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
@@ -243,6 +248,15 @@ var ConnectorPlugin = class _ConnectorPlugin {
243
248
  * `runSetupFlow` from `setup-flow.ts`.
244
249
  */
245
250
  setup;
251
+ /**
252
+ * 統一 introspection。SQL DB の `information_schema` / `SHOW` / `DESCRIBE` や SaaS の
253
+ * メタデータ API といった取得経路の差を吸収し、tables / columns / PK / FK を共通型
254
+ * {@link IntrospectedSchema} へ正規化して返す。取得経路は {@link IntrospectContext} で
255
+ * 抽象化され、SQL DB は `ctx.query`、SaaS は `ctx.proxyFetch` + `ctx.params` を使う。
256
+ * `ctx.profile === true` のときは L2 プロファイル(行数・NULL 率等)も best-effort で埋める。
257
+ * coding-agent の `DataContextIndex` がデータ地図を構築する際に使う。
258
+ */
259
+ introspect;
246
260
  /**
247
261
  * Opt-out of the default "verify before save" behavior on connection
248
262
  * creation. The backend invokes `checkConnection` synchronously while
@@ -257,6 +271,14 @@ var ConnectorPlugin = class _ConnectorPlugin {
257
271
  * the default verify-on-create behavior without opt-in.
258
272
  */
259
273
  skipConnectionCheckOnCreate;
274
+ /**
275
+ * 決定論的な「立ち上げ survey」レシピ(ルールベース prewarm 基盤)。実装した connector は、LLM を使わずに
276
+ * read-only で自分を survey する probe 列(テーブル/列メタデータ → 小サンプル)を宣言する。coding-agent の
277
+ * recon driver がこれを読み、connector ツールの `execute` を直接呼んで結果を seed にする。未実装の connector は
278
+ * driver 側で safely skip される(その connection は listConnections のみ seed)。標準 `information_schema` を
279
+ * 持つ SQL connector は `makeStandardSqlSurveyProbes` を使える。**probe は必ず read-only**。
280
+ */
281
+ surveyProbes;
260
282
  constructor(config) {
261
283
  this.slug = config.slug;
262
284
  this.authType = config.authType;
@@ -274,7 +296,9 @@ var ConnectorPlugin = class _ConnectorPlugin {
274
296
  this.query = config.query;
275
297
  this.checkConnection = config.checkConnection;
276
298
  this.setup = config.setup;
299
+ this.introspect = config.introspect;
277
300
  this.skipConnectionCheckOnCreate = config.skipConnectionCheckOnCreate;
301
+ this.surveyProbes = config.surveyProbes;
278
302
  }
279
303
  get connectorKey() {
280
304
  return _ConnectorPlugin.deriveKey(this.slug, this.authType);
@@ -282,7 +306,7 @@ var ConnectorPlugin = class _ConnectorPlugin {
282
306
  /**
283
307
  * Create tools for connections that belong to this connector.
284
308
  * Filters connections by connectorKey internally.
285
- * Returns tools keyed as `${connectorKey}_${toolName}`.
309
+ * Returns tools keyed as `connector_${connectorKey}_${toolName}`.
286
310
  */
287
311
  createTools(connections, config, opts) {
288
312
  const myConnections = connections.filter(
@@ -292,7 +316,7 @@ var ConnectorPlugin = class _ConnectorPlugin {
292
316
  for (const t of Object.values(this.tools)) {
293
317
  const tool = t.createTool(myConnections, config);
294
318
  const originalToModelOutput = tool.toModelOutput;
295
- result[`${this.connectorKey}_${t.name}`] = {
319
+ result[`connector_${this.connectorKey}_${t.name}`] = {
296
320
  ...tool,
297
321
  toModelOutput: async (options) => {
298
322
  if (!originalToModelOutput) {
@@ -312,25 +336,25 @@ var ConnectorPlugin = class _ConnectorPlugin {
312
336
  if (authType) return `${slug}-${authType}`;
313
337
  const LEGACY_NULL_AUTH_TYPE_MAP = {
314
338
  // user-password
315
- "postgresql": "user-password",
316
- "mysql": "user-password",
317
- "clickhouse": "user-password",
318
- "kintone": "user-password",
339
+ postgresql: "user-password",
340
+ mysql: "user-password",
341
+ clickhouse: "user-password",
342
+ kintone: "user-password",
319
343
  "squadbase-db": "user-password",
320
344
  // service-account
321
- "snowflake": "service-account",
322
- "bigquery": "service-account",
345
+ snowflake: "service-account",
346
+ bigquery: "service-account",
323
347
  "google-analytics": "service-account",
324
348
  "google-calendar": "service-account",
325
349
  "aws-athena": "service-account",
326
- "redshift": "service-account",
350
+ redshift: "service-account",
327
351
  // api-key
328
- "databricks": "api-key",
329
- "dbt": "api-key",
330
- "airtable": "api-key",
331
- "openai": "api-key",
332
- "gemini": "api-key",
333
- "anthropic": "api-key",
352
+ databricks: "api-key",
353
+ dbt: "api-key",
354
+ airtable: "api-key",
355
+ openai: "api-key",
356
+ gemini: "api-key",
357
+ anthropic: "api-key",
334
358
  "wix-store": "api-key"
335
359
  };
336
360
  const fallbackAuthType = LEGACY_NULL_AUTH_TYPE_MAP[slug];
@@ -422,11 +446,11 @@ var AUTH_TYPES = {
422
446
  // ../connectors/src/connectors/mailchimp/setup.ts
423
447
  var mailchimpOnboarding = new ConnectorOnboarding({
424
448
  dataOverviewInstructions: {
425
- en: `1. Call mailchimp_request with GET /lists to list all audiences
449
+ en: `1. Call connector_mailchimp_request with GET /lists to list all audiences
426
450
  2. Pick an audience and call GET /lists/{list_id}/members?count=5 to sample members
427
451
  3. Call GET /campaigns?count=5 to list recent campaigns
428
452
  4. Call GET /reports?count=5 to view campaign reports`,
429
- ja: `1. mailchimp_request \u3067 GET /lists \u3092\u547C\u3073\u51FA\u3057\u3001\u5168\u30AA\u30FC\u30C7\u30A3\u30A8\u30F3\u30B9\u4E00\u89A7\u3092\u53D6\u5F97
453
+ ja: `1. connector_mailchimp_request \u3067 GET /lists \u3092\u547C\u3073\u51FA\u3057\u3001\u5168\u30AA\u30FC\u30C7\u30A3\u30A8\u30F3\u30B9\u4E00\u89A7\u3092\u53D6\u5F97
430
454
  2. \u30AA\u30FC\u30C7\u30A3\u30A8\u30F3\u30B9\u3092\u9078\u629E\u3057 GET /lists/{list_id}/members?count=5 \u3067\u30E1\u30F3\u30D0\u30FC\u3092\u30B5\u30F3\u30D7\u30EA\u30F3\u30B0
431
455
  3. GET /campaigns?count=5 \u3067\u6700\u8FD1\u306E\u30AD\u30E3\u30F3\u30DA\u30FC\u30F3\u4E00\u89A7\u3092\u53D6\u5F97
432
456
  4. GET /reports?count=5 \u3067\u30AD\u30E3\u30F3\u30DA\u30FC\u30F3\u30EC\u30DD\u30FC\u30C8\u3092\u8868\u793A`
@@ -647,7 +671,7 @@ var mailchimpConnector = new ConnectorPlugin({
647
671
  systemPrompt: {
648
672
  en: `### Tools
649
673
 
650
- - \`mailchimp_request\`: The only way to call the Mailchimp Marketing API v3. Use it to manage audiences/lists, subscribers/members, campaigns, templates, automations, and reports. Authentication (Basic Auth with API key) is configured automatically. The datacenter is extracted from the API key suffix.
674
+ - \`connector_mailchimp_request\`: The only way to call the Mailchimp Marketing API v3. Use it to manage audiences/lists, subscribers/members, campaigns, templates, automations, and reports. Authentication (Basic Auth with API key) is configured automatically. The datacenter is extracted from the API key suffix.
651
675
 
652
676
  ### Business Logic
653
677
 
@@ -744,7 +768,7 @@ export default async function handler(c: Context) {
744
768
  - Errors return \`type\`, \`title\`, \`status\`, \`detail\`, and \`instance\` fields`,
745
769
  ja: `### \u30C4\u30FC\u30EB
746
770
 
747
- - \`mailchimp_request\`: Mailchimp Marketing API v3\u3092\u547C\u3073\u51FA\u3059\u552F\u4E00\u306E\u624B\u6BB5\u3067\u3059\u3002\u30AA\u30FC\u30C7\u30A3\u30A8\u30F3\u30B9/\u30EA\u30B9\u30C8\u3001\u30B5\u30D6\u30B9\u30AF\u30E9\u30A4\u30D0\u30FC/\u30E1\u30F3\u30D0\u30FC\u3001\u30AD\u30E3\u30F3\u30DA\u30FC\u30F3\u3001\u30C6\u30F3\u30D7\u30EC\u30FC\u30C8\u3001\u30AA\u30FC\u30C8\u30E1\u30FC\u30B7\u30E7\u30F3\u3001\u30EC\u30DD\u30FC\u30C8\u306E\u7BA1\u7406\u306B\u4F7F\u7528\u3057\u307E\u3059\u3002\u8A8D\u8A3C\uFF08API\u30AD\u30FC\u306B\u3088\u308BBasic Auth\uFF09\u306F\u81EA\u52D5\u7684\u306B\u8A2D\u5B9A\u3055\u308C\u307E\u3059\u3002\u30C7\u30FC\u30BF\u30BB\u30F3\u30BF\u30FC\u306FAPI\u30AD\u30FC\u306E\u30B5\u30D5\u30A3\u30C3\u30AF\u30B9\u304B\u3089\u81EA\u52D5\u691C\u51FA\u3055\u308C\u307E\u3059\u3002
771
+ - \`connector_mailchimp_request\`: Mailchimp Marketing API v3\u3092\u547C\u3073\u51FA\u3059\u552F\u4E00\u306E\u624B\u6BB5\u3067\u3059\u3002\u30AA\u30FC\u30C7\u30A3\u30A8\u30F3\u30B9/\u30EA\u30B9\u30C8\u3001\u30B5\u30D6\u30B9\u30AF\u30E9\u30A4\u30D0\u30FC/\u30E1\u30F3\u30D0\u30FC\u3001\u30AD\u30E3\u30F3\u30DA\u30FC\u30F3\u3001\u30C6\u30F3\u30D7\u30EC\u30FC\u30C8\u3001\u30AA\u30FC\u30C8\u30E1\u30FC\u30B7\u30E7\u30F3\u3001\u30EC\u30DD\u30FC\u30C8\u306E\u7BA1\u7406\u306B\u4F7F\u7528\u3057\u307E\u3059\u3002\u8A8D\u8A3C\uFF08API\u30AD\u30FC\u306B\u3088\u308BBasic Auth\uFF09\u306F\u81EA\u52D5\u7684\u306B\u8A2D\u5B9A\u3055\u308C\u307E\u3059\u3002\u30C7\u30FC\u30BF\u30BB\u30F3\u30BF\u30FC\u306FAPI\u30AD\u30FC\u306E\u30B5\u30D5\u30A3\u30C3\u30AF\u30B9\u304B\u3089\u81EA\u52D5\u691C\u51FA\u3055\u308C\u307E\u3059\u3002
748
772
 
749
773
  ### Business Logic
750
774