@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
@@ -173,6 +178,15 @@ var ConnectorPlugin = class _ConnectorPlugin {
173
178
  * `runSetupFlow` from `setup-flow.ts`.
174
179
  */
175
180
  setup;
181
+ /**
182
+ * 統一 introspection。SQL DB の `information_schema` / `SHOW` / `DESCRIBE` や SaaS の
183
+ * メタデータ API といった取得経路の差を吸収し、tables / columns / PK / FK を共通型
184
+ * {@link IntrospectedSchema} へ正規化して返す。取得経路は {@link IntrospectContext} で
185
+ * 抽象化され、SQL DB は `ctx.query`、SaaS は `ctx.proxyFetch` + `ctx.params` を使う。
186
+ * `ctx.profile === true` のときは L2 プロファイル(行数・NULL 率等)も best-effort で埋める。
187
+ * coding-agent の `DataContextIndex` がデータ地図を構築する際に使う。
188
+ */
189
+ introspect;
176
190
  /**
177
191
  * Opt-out of the default "verify before save" behavior on connection
178
192
  * creation. The backend invokes `checkConnection` synchronously while
@@ -187,6 +201,14 @@ var ConnectorPlugin = class _ConnectorPlugin {
187
201
  * the default verify-on-create behavior without opt-in.
188
202
  */
189
203
  skipConnectionCheckOnCreate;
204
+ /**
205
+ * 決定論的な「立ち上げ survey」レシピ(ルールベース prewarm 基盤)。実装した connector は、LLM を使わずに
206
+ * read-only で自分を survey する probe 列(テーブル/列メタデータ → 小サンプル)を宣言する。coding-agent の
207
+ * recon driver がこれを読み、connector ツールの `execute` を直接呼んで結果を seed にする。未実装の connector は
208
+ * driver 側で safely skip される(その connection は listConnections のみ seed)。標準 `information_schema` を
209
+ * 持つ SQL connector は `makeStandardSqlSurveyProbes` を使える。**probe は必ず read-only**。
210
+ */
211
+ surveyProbes;
190
212
  constructor(config) {
191
213
  this.slug = config.slug;
192
214
  this.authType = config.authType;
@@ -204,7 +226,9 @@ var ConnectorPlugin = class _ConnectorPlugin {
204
226
  this.query = config.query;
205
227
  this.checkConnection = config.checkConnection;
206
228
  this.setup = config.setup;
229
+ this.introspect = config.introspect;
207
230
  this.skipConnectionCheckOnCreate = config.skipConnectionCheckOnCreate;
231
+ this.surveyProbes = config.surveyProbes;
208
232
  }
209
233
  get connectorKey() {
210
234
  return _ConnectorPlugin.deriveKey(this.slug, this.authType);
@@ -212,7 +236,7 @@ var ConnectorPlugin = class _ConnectorPlugin {
212
236
  /**
213
237
  * Create tools for connections that belong to this connector.
214
238
  * Filters connections by connectorKey internally.
215
- * Returns tools keyed as `${connectorKey}_${toolName}`.
239
+ * Returns tools keyed as `connector_${connectorKey}_${toolName}`.
216
240
  */
217
241
  createTools(connections, config, opts) {
218
242
  const myConnections = connections.filter(
@@ -222,7 +246,7 @@ var ConnectorPlugin = class _ConnectorPlugin {
222
246
  for (const t of Object.values(this.tools)) {
223
247
  const tool = t.createTool(myConnections, config);
224
248
  const originalToModelOutput = tool.toModelOutput;
225
- result[`${this.connectorKey}_${t.name}`] = {
249
+ result[`connector_${this.connectorKey}_${t.name}`] = {
226
250
  ...tool,
227
251
  toModelOutput: async (options) => {
228
252
  if (!originalToModelOutput) {
@@ -242,25 +266,25 @@ var ConnectorPlugin = class _ConnectorPlugin {
242
266
  if (authType) return `${slug}-${authType}`;
243
267
  const LEGACY_NULL_AUTH_TYPE_MAP = {
244
268
  // user-password
245
- "postgresql": "user-password",
246
- "mysql": "user-password",
247
- "clickhouse": "user-password",
248
- "kintone": "user-password",
269
+ postgresql: "user-password",
270
+ mysql: "user-password",
271
+ clickhouse: "user-password",
272
+ kintone: "user-password",
249
273
  "squadbase-db": "user-password",
250
274
  // service-account
251
- "snowflake": "service-account",
252
- "bigquery": "service-account",
275
+ snowflake: "service-account",
276
+ bigquery: "service-account",
253
277
  "google-analytics": "service-account",
254
278
  "google-calendar": "service-account",
255
279
  "aws-athena": "service-account",
256
- "redshift": "service-account",
280
+ redshift: "service-account",
257
281
  // api-key
258
- "databricks": "api-key",
259
- "dbt": "api-key",
260
- "airtable": "api-key",
261
- "openai": "api-key",
262
- "gemini": "api-key",
263
- "anthropic": "api-key",
282
+ databricks: "api-key",
283
+ dbt: "api-key",
284
+ airtable: "api-key",
285
+ openai: "api-key",
286
+ gemini: "api-key",
287
+ anthropic: "api-key",
264
288
  "wix-store": "api-key"
265
289
  };
266
290
  const fallbackAuthType = LEGACY_NULL_AUTH_TYPE_MAP[slug];
@@ -352,14 +376,14 @@ var AUTH_TYPES = {
352
376
  // ../connectors/src/connectors/backlog/setup.ts
353
377
  var backlogOnboarding = new ConnectorOnboarding({
354
378
  dataOverviewInstructions: {
355
- en: `1. Call backlog-api-key_request with GET space to verify the connection and get space information
356
- 2. Call backlog-api-key_request with GET projects to list all accessible projects
357
- 3. For key projects, call backlog-api-key_request with GET issues?projectId[]={projectId}&count=5&order=desc to retrieve recent issues
358
- 4. Call backlog-api-key_request with GET projects/{projectIdOrKey}/statuses to understand the workflow statuses`,
359
- ja: `1. backlog-api-key_request \u3067 GET space \u3092\u547C\u3073\u51FA\u3057\u3001\u63A5\u7D9A\u78BA\u8A8D\u3068\u30B9\u30DA\u30FC\u30B9\u60C5\u5831\u3092\u53D6\u5F97
360
- 2. backlog-api-key_request \u3067 GET projects \u3092\u547C\u3073\u51FA\u3057\u3001\u30A2\u30AF\u30BB\u30B9\u53EF\u80FD\u306A\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8\u4E00\u89A7\u3092\u53D6\u5F97
361
- 3. \u4E3B\u8981\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8\u306B\u3064\u3044\u3066 backlog-api-key_request \u3067 GET issues?projectId[]={projectId}&count=5&order=desc \u3092\u547C\u3073\u51FA\u3057\u3001\u6700\u8FD1\u306E\u8AB2\u984C\u3092\u53D6\u5F97
362
- 4. backlog-api-key_request \u3067 GET projects/{projectIdOrKey}/statuses \u3092\u547C\u3073\u51FA\u3057\u3001\u30EF\u30FC\u30AF\u30D5\u30ED\u30FC\u306E\u30B9\u30C6\u30FC\u30BF\u30B9\u3092\u78BA\u8A8D`
379
+ en: `1. Call connector_backlog-api-key_request with GET space to verify the connection and get space information
380
+ 2. Call connector_backlog-api-key_request with GET projects to list all accessible projects
381
+ 3. For key projects, call connector_backlog-api-key_request with GET issues?projectId[]={projectId}&count=5&order=desc to retrieve recent issues
382
+ 4. Call connector_backlog-api-key_request with GET projects/{projectIdOrKey}/statuses to understand the workflow statuses`,
383
+ ja: `1. connector_backlog-api-key_request \u3067 GET space \u3092\u547C\u3073\u51FA\u3057\u3001\u63A5\u7D9A\u78BA\u8A8D\u3068\u30B9\u30DA\u30FC\u30B9\u60C5\u5831\u3092\u53D6\u5F97
384
+ 2. connector_backlog-api-key_request \u3067 GET projects \u3092\u547C\u3073\u51FA\u3057\u3001\u30A2\u30AF\u30BB\u30B9\u53EF\u80FD\u306A\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8\u4E00\u89A7\u3092\u53D6\u5F97
385
+ 3. \u4E3B\u8981\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8\u306B\u3064\u3044\u3066 connector_backlog-api-key_request \u3067 GET issues?projectId[]={projectId}&count=5&order=desc \u3092\u547C\u3073\u51FA\u3057\u3001\u6700\u8FD1\u306E\u8AB2\u984C\u3092\u53D6\u5F97
386
+ 4. connector_backlog-api-key_request \u3067 GET projects/{projectIdOrKey}/statuses \u3092\u547C\u3073\u51FA\u3057\u3001\u30EF\u30FC\u30AF\u30D5\u30ED\u30FC\u306E\u30B9\u30C6\u30FC\u30BF\u30B9\u3092\u78BA\u8A8D`
363
387
  }
364
388
  });
365
389
 
@@ -408,6 +432,20 @@ async function listStatuses(params, projectIdOrKey) {
408
432
  if (!res.ok) return [];
409
433
  return await res.json();
410
434
  }
435
+ async function countIssues(params, projectId, statusId) {
436
+ try {
437
+ const statusParam = statusId ? `&statusId[]=${statusId}` : "";
438
+ const res = await apiFetch(
439
+ params,
440
+ `issues/count?projectId[]=${encodeURIComponent(projectId)}${statusParam}`
441
+ );
442
+ if (!res.ok) return null;
443
+ const data = await res.json();
444
+ return typeof data.count === "number" ? data.count : null;
445
+ } catch {
446
+ return null;
447
+ }
448
+ }
411
449
  var backlogSetupFlow = {
412
450
  initialState: () => ({}),
413
451
  steps: [
@@ -457,14 +495,25 @@ var backlogSetupFlow = {
457
495
  continue;
458
496
  }
459
497
  sections.push(`### Project: ${project.name} (${project.projectKey})`, "");
460
- const [issueTypes, statuses] = await Promise.all([
498
+ const [issueTypes, statuses, totalIssues] = await Promise.all([
461
499
  listIssueTypes(rt.params, id),
462
- listStatuses(rt.params, id)
500
+ listStatuses(rt.params, id),
501
+ countIssues(rt.params, id)
463
502
  ]);
503
+ if (totalIssues != null) {
504
+ sections.push(`- Total issues: ${totalIssues.toLocaleString()}`);
505
+ }
464
506
  sections.push(`- Issue types (${issueTypes.length}):`);
465
507
  for (const t of issueTypes) sections.push(` - ${t.name}`);
508
+ const statusCounts = await Promise.all(
509
+ statuses.map((s) => countIssues(rt.params, id, s.id))
510
+ );
466
511
  sections.push(`- Statuses (${statuses.length}):`);
467
- for (const s of statuses) sections.push(` - ${s.name}`);
512
+ for (let i = 0; i < statuses.length; i++) {
513
+ const c = statusCounts[i];
514
+ const cStr = c != null ? `: ${c.toLocaleString()} issues` : "";
515
+ sections.push(` - ${statuses[i].name}${cStr}`);
516
+ }
468
517
  sections.push("");
469
518
  }
470
519
  return sections.join("\n");
@@ -563,7 +612,7 @@ var backlogConnector = new ConnectorPlugin({
563
612
  systemPrompt: {
564
613
  en: `### Tools
565
614
 
566
- - \`backlog-api-key_request\`: The only way to call the Backlog REST API (v2). Use it to list projects, search issues, get issue details, create/update issues, manage wikis, and retrieve users. Authentication (API key as query parameter) and space URL are configured automatically.
615
+ - \`connector_backlog-api-key_request\`: The only way to call the Backlog REST API (v2). Use it to list projects, search issues, get issue details, create/update issues, manage wikis, and retrieve users. Authentication (API key as query parameter) and space URL are configured automatically.
567
616
 
568
617
  ### Business Logic
569
618
 
@@ -635,7 +684,7 @@ await backlog.request("/api/v2/issues", {
635
684
  - order: "asc" or "desc"`,
636
685
  ja: `### \u30C4\u30FC\u30EB
637
686
 
638
- - \`backlog-api-key_request\`: Backlog REST API\uFF08v2\uFF09\u3092\u547C\u3073\u51FA\u3059\u552F\u4E00\u306E\u624B\u6BB5\u3067\u3059\u3002\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8\u4E00\u89A7\u306E\u53D6\u5F97\u3001\u8AB2\u984C\u306E\u691C\u7D22\u3001\u8AB2\u984C\u8A73\u7D30\u306E\u53D6\u5F97\u3001\u8AB2\u984C\u306E\u4F5C\u6210\u30FB\u66F4\u65B0\u3001Wiki\u7BA1\u7406\u3001\u30E6\u30FC\u30B6\u30FC\u53D6\u5F97\u306B\u4F7F\u7528\u3057\u307E\u3059\u3002\u8A8D\u8A3C\uFF08API\u30AD\u30FC\u3092\u30AF\u30A8\u30EA\u30D1\u30E9\u30E1\u30FC\u30BF\u3068\u3057\u3066\u4ED8\u4E0E\uFF09\u3068\u30B9\u30DA\u30FC\u30B9URL\u306F\u81EA\u52D5\u7684\u306B\u8A2D\u5B9A\u3055\u308C\u307E\u3059\u3002
687
+ - \`connector_backlog-api-key_request\`: Backlog REST API\uFF08v2\uFF09\u3092\u547C\u3073\u51FA\u3059\u552F\u4E00\u306E\u624B\u6BB5\u3067\u3059\u3002\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8\u4E00\u89A7\u306E\u53D6\u5F97\u3001\u8AB2\u984C\u306E\u691C\u7D22\u3001\u8AB2\u984C\u8A73\u7D30\u306E\u53D6\u5F97\u3001\u8AB2\u984C\u306E\u4F5C\u6210\u30FB\u66F4\u65B0\u3001Wiki\u7BA1\u7406\u3001\u30E6\u30FC\u30B6\u30FC\u53D6\u5F97\u306B\u4F7F\u7528\u3057\u307E\u3059\u3002\u8A8D\u8A3C\uFF08API\u30AD\u30FC\u3092\u30AF\u30A8\u30EA\u30D1\u30E9\u30E1\u30FC\u30BF\u3068\u3057\u3066\u4ED8\u4E0E\uFF09\u3068\u30B9\u30DA\u30FC\u30B9URL\u306F\u81EA\u52D5\u7684\u306B\u8A2D\u5B9A\u3055\u308C\u307E\u3059\u3002
639
688
 
640
689
  ### Business Logic
641
690
 
@@ -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
@@ -309,6 +314,15 @@ var ConnectorPlugin = class _ConnectorPlugin {
309
314
  * `runSetupFlow` from `setup-flow.ts`.
310
315
  */
311
316
  setup;
317
+ /**
318
+ * 統一 introspection。SQL DB の `information_schema` / `SHOW` / `DESCRIBE` や SaaS の
319
+ * メタデータ API といった取得経路の差を吸収し、tables / columns / PK / FK を共通型
320
+ * {@link IntrospectedSchema} へ正規化して返す。取得経路は {@link IntrospectContext} で
321
+ * 抽象化され、SQL DB は `ctx.query`、SaaS は `ctx.proxyFetch` + `ctx.params` を使う。
322
+ * `ctx.profile === true` のときは L2 プロファイル(行数・NULL 率等)も best-effort で埋める。
323
+ * coding-agent の `DataContextIndex` がデータ地図を構築する際に使う。
324
+ */
325
+ introspect;
312
326
  /**
313
327
  * Opt-out of the default "verify before save" behavior on connection
314
328
  * creation. The backend invokes `checkConnection` synchronously while
@@ -323,6 +337,14 @@ var ConnectorPlugin = class _ConnectorPlugin {
323
337
  * the default verify-on-create behavior without opt-in.
324
338
  */
325
339
  skipConnectionCheckOnCreate;
340
+ /**
341
+ * 決定論的な「立ち上げ survey」レシピ(ルールベース prewarm 基盤)。実装した connector は、LLM を使わずに
342
+ * read-only で自分を survey する probe 列(テーブル/列メタデータ → 小サンプル)を宣言する。coding-agent の
343
+ * recon driver がこれを読み、connector ツールの `execute` を直接呼んで結果を seed にする。未実装の connector は
344
+ * driver 側で safely skip される(その connection は listConnections のみ seed)。標準 `information_schema` を
345
+ * 持つ SQL connector は `makeStandardSqlSurveyProbes` を使える。**probe は必ず read-only**。
346
+ */
347
+ surveyProbes;
326
348
  constructor(config) {
327
349
  this.slug = config.slug;
328
350
  this.authType = config.authType;
@@ -340,7 +362,9 @@ var ConnectorPlugin = class _ConnectorPlugin {
340
362
  this.query = config.query;
341
363
  this.checkConnection = config.checkConnection;
342
364
  this.setup = config.setup;
365
+ this.introspect = config.introspect;
343
366
  this.skipConnectionCheckOnCreate = config.skipConnectionCheckOnCreate;
367
+ this.surveyProbes = config.surveyProbes;
344
368
  }
345
369
  get connectorKey() {
346
370
  return _ConnectorPlugin.deriveKey(this.slug, this.authType);
@@ -348,7 +372,7 @@ var ConnectorPlugin = class _ConnectorPlugin {
348
372
  /**
349
373
  * Create tools for connections that belong to this connector.
350
374
  * Filters connections by connectorKey internally.
351
- * Returns tools keyed as `${connectorKey}_${toolName}`.
375
+ * Returns tools keyed as `connector_${connectorKey}_${toolName}`.
352
376
  */
353
377
  createTools(connections, config, opts) {
354
378
  const myConnections = connections.filter(
@@ -358,7 +382,7 @@ var ConnectorPlugin = class _ConnectorPlugin {
358
382
  for (const t of Object.values(this.tools)) {
359
383
  const tool = t.createTool(myConnections, config);
360
384
  const originalToModelOutput = tool.toModelOutput;
361
- result[`${this.connectorKey}_${t.name}`] = {
385
+ result[`connector_${this.connectorKey}_${t.name}`] = {
362
386
  ...tool,
363
387
  toModelOutput: async (options) => {
364
388
  if (!originalToModelOutput) {
@@ -378,25 +402,25 @@ var ConnectorPlugin = class _ConnectorPlugin {
378
402
  if (authType) return `${slug}-${authType}`;
379
403
  const LEGACY_NULL_AUTH_TYPE_MAP = {
380
404
  // user-password
381
- "postgresql": "user-password",
382
- "mysql": "user-password",
383
- "clickhouse": "user-password",
384
- "kintone": "user-password",
405
+ postgresql: "user-password",
406
+ mysql: "user-password",
407
+ clickhouse: "user-password",
408
+ kintone: "user-password",
385
409
  "squadbase-db": "user-password",
386
410
  // service-account
387
- "snowflake": "service-account",
388
- "bigquery": "service-account",
411
+ snowflake: "service-account",
412
+ bigquery: "service-account",
389
413
  "google-analytics": "service-account",
390
414
  "google-calendar": "service-account",
391
415
  "aws-athena": "service-account",
392
- "redshift": "service-account",
416
+ redshift: "service-account",
393
417
  // api-key
394
- "databricks": "api-key",
395
- "dbt": "api-key",
396
- "airtable": "api-key",
397
- "openai": "api-key",
398
- "gemini": "api-key",
399
- "anthropic": "api-key",
418
+ databricks: "api-key",
419
+ dbt: "api-key",
420
+ airtable: "api-key",
421
+ openai: "api-key",
422
+ gemini: "api-key",
423
+ anthropic: "api-key",
400
424
  "wix-store": "api-key"
401
425
  };
402
426
  const fallbackAuthType = LEGACY_NULL_AUTH_TYPE_MAP[slug];
@@ -498,15 +522,15 @@ function normalizeRequestPath(path2, basePathSegment) {
498
522
  // ../connectors/src/connectors/clickup/setup.ts
499
523
  var clickupOnboarding = new ConnectorOnboarding({
500
524
  dataOverviewInstructions: {
501
- en: `1. Call clickup_request with GET /team to list workspaces (the ClickUp API still calls workspaces "teams"). Pick the first workspace's \`id\`.
502
- 2. Call clickup_request with GET /team/{team_id}/space?archived=false to list spaces in the workspace.
525
+ en: `1. Call connector_clickup_request with GET /team to list workspaces (the ClickUp API still calls workspaces "teams"). Pick the first workspace's \`id\`.
526
+ 2. Call connector_clickup_request with GET /team/{team_id}/space?archived=false to list spaces in the workspace.
503
527
  3. Pick one space and list its folders (GET /space/{space_id}/folder?archived=false) and folderless lists (GET /space/{space_id}/list?archived=false). Each folder also contains lists at GET /folder/{folder_id}/list.
504
- 4. Pick one list and call clickup_request with GET /list/{list_id}/task?page=0&include_closed=true to sample tasks. Inspect each task's \`status\`, \`assignees\`, \`due_date\`, and \`custom_fields\`.
528
+ 4. Pick one list and call connector_clickup_request with GET /list/{list_id}/task?page=0&include_closed=true to sample tasks. Inspect each task's \`status\`, \`assignees\`, \`due_date\`, and \`custom_fields\`.
505
529
  5. If custom fields are used, call GET /list/{list_id}/field to get their definitions.`,
506
- ja: `1. clickup_request \u3067 GET /team \u3092\u547C\u3073\u51FA\u3057\u3066\u30EF\u30FC\u30AF\u30B9\u30DA\u30FC\u30B9\u4E00\u89A7\u3092\u53D6\u5F97\u3057\u307E\u3059\uFF08ClickUp API \u3067\u306F\u30EF\u30FC\u30AF\u30B9\u30DA\u30FC\u30B9\u3092 "team" \u3068\u547C\u3073\u307E\u3059\uFF09\u3002\u6700\u521D\u306E\u30EF\u30FC\u30AF\u30B9\u30DA\u30FC\u30B9\u306E \`id\` \u3092\u9078\u629E\u3057\u307E\u3059\u3002
507
- 2. clickup_request \u3067 GET /team/{team_id}/space?archived=false \u3092\u547C\u3073\u51FA\u3057\u3066\u30EF\u30FC\u30AF\u30B9\u30DA\u30FC\u30B9\u5185\u306E\u30B9\u30DA\u30FC\u30B9\u4E00\u89A7\u3092\u53D6\u5F97\u3057\u307E\u3059\u3002
530
+ ja: `1. connector_clickup_request \u3067 GET /team \u3092\u547C\u3073\u51FA\u3057\u3066\u30EF\u30FC\u30AF\u30B9\u30DA\u30FC\u30B9\u4E00\u89A7\u3092\u53D6\u5F97\u3057\u307E\u3059\uFF08ClickUp API \u3067\u306F\u30EF\u30FC\u30AF\u30B9\u30DA\u30FC\u30B9\u3092 "team" \u3068\u547C\u3073\u307E\u3059\uFF09\u3002\u6700\u521D\u306E\u30EF\u30FC\u30AF\u30B9\u30DA\u30FC\u30B9\u306E \`id\` \u3092\u9078\u629E\u3057\u307E\u3059\u3002
531
+ 2. connector_clickup_request \u3067 GET /team/{team_id}/space?archived=false \u3092\u547C\u3073\u51FA\u3057\u3066\u30EF\u30FC\u30AF\u30B9\u30DA\u30FC\u30B9\u5185\u306E\u30B9\u30DA\u30FC\u30B9\u4E00\u89A7\u3092\u53D6\u5F97\u3057\u307E\u3059\u3002
508
532
  3. \u30B9\u30DA\u30FC\u30B9\u30921\u3064\u9078\u3073\u3001\u30D5\u30A9\u30EB\u30C0\u4E00\u89A7\uFF08GET /space/{space_id}/folder?archived=false\uFF09\u3068\u30D5\u30A9\u30EB\u30C0\u7121\u3057\u30EA\u30B9\u30C8\u4E00\u89A7\uFF08GET /space/{space_id}/list?archived=false\uFF09\u3092\u53D6\u5F97\u3057\u307E\u3059\u3002\u5404\u30D5\u30A9\u30EB\u30C0\u5185\u306E\u30EA\u30B9\u30C8\u306F GET /folder/{folder_id}/list \u3067\u53D6\u5F97\u3067\u304D\u307E\u3059\u3002
509
- 4. \u30EA\u30B9\u30C8\u30921\u3064\u9078\u3073\u3001clickup_request \u3067 GET /list/{list_id}/task?page=0&include_closed=true \u3092\u547C\u3073\u51FA\u3057\u3066\u30BF\u30B9\u30AF\u3092\u30B5\u30F3\u30D7\u30EA\u30F3\u30B0\u3057\u307E\u3059\u3002\u5404\u30BF\u30B9\u30AF\u306E \`status\`, \`assignees\`, \`due_date\`, \`custom_fields\` \u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002
533
+ 4. \u30EA\u30B9\u30C8\u30921\u3064\u9078\u3073\u3001connector_clickup_request \u3067 GET /list/{list_id}/task?page=0&include_closed=true \u3092\u547C\u3073\u51FA\u3057\u3066\u30BF\u30B9\u30AF\u3092\u30B5\u30F3\u30D7\u30EA\u30F3\u30B0\u3057\u307E\u3059\u3002\u5404\u30BF\u30B9\u30AF\u306E \`status\`, \`assignees\`, \`due_date\`, \`custom_fields\` \u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002
510
534
  5. \u30AB\u30B9\u30BF\u30E0\u30D5\u30A3\u30FC\u30EB\u30C9\u304C\u5229\u7528\u3055\u308C\u3066\u3044\u308B\u5834\u5408\u306F GET /list/{list_id}/field \u3067\u305D\u306E\u5B9A\u7FA9\u3092\u53D6\u5F97\u3057\u3066\u304F\u3060\u3055\u3044\u3002`
511
535
  }
512
536
  });
@@ -567,6 +591,21 @@ async function listFolderlessLists(params, spaceId) {
567
591
  const data = await res.json();
568
592
  return data.lists ?? [];
569
593
  }
594
+ var CLICKUP_SAMPLE_LISTS_PER_SPACE = 5;
595
+ async function fetchListTaskCount(params, listId) {
596
+ try {
597
+ const res = await apiFetch(
598
+ params,
599
+ `/list/${encodeURIComponent(listId)}/task?archived=false&page=0`
600
+ );
601
+ if (!res.ok) return null;
602
+ const data = await res.json();
603
+ const tasks = data.tasks ?? [];
604
+ return tasks.length >= 100 ? "100+" : String(tasks.length);
605
+ } catch {
606
+ return null;
607
+ }
608
+ }
570
609
  var clickupSetupFlow = {
571
610
  initialState: () => ({}),
572
611
  steps: [
@@ -636,6 +675,31 @@ var clickupSetupFlow = {
636
675
  for (const f of folders) sections.push(` - ${f.name}`);
637
676
  sections.push(`- Folderless lists (${folderlessLists.length}):`);
638
677
  for (const l of folderlessLists) sections.push(` - ${l.name}`);
678
+ const sampled = folderlessLists.slice(0, CLICKUP_SAMPLE_LISTS_PER_SPACE);
679
+ if (sampled.length > 0) {
680
+ const counts = await Promise.all(
681
+ sampled.map((l) => fetchListTaskCount(rt.params, l.id))
682
+ );
683
+ sections.push(
684
+ "",
685
+ rt.language === "ja" ? `- \u30EA\u30B9\u30C8\u5225\u30BF\u30B9\u30AF\u4EF6\u6570 (\u4E0A\u4F4D${sampled.length}\u4EF6):` : `- Task counts (first ${sampled.length} lists):`
686
+ );
687
+ sections.push("");
688
+ sections.push("| List | Tasks |");
689
+ sections.push("|------|-------|");
690
+ for (let i = 0; i < sampled.length; i++) {
691
+ const list = sampled[i];
692
+ const count = counts[i] ?? "-";
693
+ const safeName = list.name.replace(/\|/g, "\\|");
694
+ sections.push(`| ${safeName} | ${count} |`);
695
+ }
696
+ if (folderlessLists.length > sampled.length) {
697
+ sections.push(
698
+ "",
699
+ rt.language === "ja" ? `_\u5168${folderlessLists.length}\u4EF6\u306E\u3046\u3061\u5148\u982D${sampled.length}\u4EF6\u3092\u8868\u793A_` : `_Showing first ${sampled.length} of ${folderlessLists.length} folderless lists._`
700
+ );
701
+ }
702
+ }
639
703
  sections.push("");
640
704
  }
641
705
  return sections.join("\n");
@@ -766,7 +830,7 @@ var clickupConnector = new ConnectorPlugin({
766
830
  systemPrompt: {
767
831
  en: `### Tools
768
832
 
769
- - \`clickup_request\`: The only way to call the ClickUp REST API v2. Use it to list workspaces, spaces, folders, lists, tasks, members, and custom fields. Authentication (Personal API Token in the \`Authorization\` header \u2014 no \`Bearer\` prefix) is configured automatically. Provide the API path and optionally append query parameters like \`page\`, \`archived\`, \`include_closed\`.
833
+ - \`connector_clickup_request\`: The only way to call the ClickUp REST API v2. Use it to list workspaces, spaces, folders, lists, tasks, members, and custom fields. Authentication (Personal API Token in the \`Authorization\` header \u2014 no \`Bearer\` prefix) is configured automatically. Provide the API path and optionally append query parameters like \`page\`, \`archived\`, \`include_closed\`.
770
834
 
771
835
  ### Business Logic
772
836
 
@@ -852,7 +916,7 @@ export default async function handler(c: Context) {
852
916
  - POST \`/team/{team_id}/time_entries\` \u2014 Create a time entry`,
853
917
  ja: `### \u30C4\u30FC\u30EB
854
918
 
855
- - \`clickup_request\`: ClickUp REST API v2 \u3092\u547C\u3073\u51FA\u3059\u552F\u4E00\u306E\u624B\u6BB5\u3067\u3059\u3002\u30EF\u30FC\u30AF\u30B9\u30DA\u30FC\u30B9\u3001\u30B9\u30DA\u30FC\u30B9\u3001\u30D5\u30A9\u30EB\u30C0\u3001\u30EA\u30B9\u30C8\u3001\u30BF\u30B9\u30AF\u3001\u30E1\u30F3\u30D0\u30FC\u3001\u30AB\u30B9\u30BF\u30E0\u30D5\u30A3\u30FC\u30EB\u30C9\u306E\u53D6\u5F97\u30FB\u66F4\u65B0\u306B\u4F7F\u7528\u3057\u307E\u3059\u3002\u8A8D\u8A3C\uFF08Personal API Token \u3092 \`Authorization\` \u30D8\u30C3\u30C0\u30FC\u306B\u8A2D\u5B9A \u2014 \`Bearer\` \u30D7\u30EC\u30D5\u30A3\u30C3\u30AF\u30B9\u306F\u4ED8\u304D\u307E\u305B\u3093\uFF09\u306F\u81EA\u52D5\u3067\u884C\u308F\u308C\u307E\u3059\u3002API\u30D1\u30B9\u3092\u6307\u5B9A\u3057\u3001\u5FC5\u8981\u306B\u5FDC\u3058\u3066 \`page\`, \`archived\`, \`include_closed\` \u306A\u3069\u306E\u30AF\u30A8\u30EA\u30D1\u30E9\u30E1\u30FC\u30BF\u3092\u4ED8\u52A0\u3057\u3066\u304F\u3060\u3055\u3044\u3002
919
+ - \`connector_clickup_request\`: ClickUp REST API v2 \u3092\u547C\u3073\u51FA\u3059\u552F\u4E00\u306E\u624B\u6BB5\u3067\u3059\u3002\u30EF\u30FC\u30AF\u30B9\u30DA\u30FC\u30B9\u3001\u30B9\u30DA\u30FC\u30B9\u3001\u30D5\u30A9\u30EB\u30C0\u3001\u30EA\u30B9\u30C8\u3001\u30BF\u30B9\u30AF\u3001\u30E1\u30F3\u30D0\u30FC\u3001\u30AB\u30B9\u30BF\u30E0\u30D5\u30A3\u30FC\u30EB\u30C9\u306E\u53D6\u5F97\u30FB\u66F4\u65B0\u306B\u4F7F\u7528\u3057\u307E\u3059\u3002\u8A8D\u8A3C\uFF08Personal API Token \u3092 \`Authorization\` \u30D8\u30C3\u30C0\u30FC\u306B\u8A2D\u5B9A \u2014 \`Bearer\` \u30D7\u30EC\u30D5\u30A3\u30C3\u30AF\u30B9\u306F\u4ED8\u304D\u307E\u305B\u3093\uFF09\u306F\u81EA\u52D5\u3067\u884C\u308F\u308C\u307E\u3059\u3002API\u30D1\u30B9\u3092\u6307\u5B9A\u3057\u3001\u5FC5\u8981\u306B\u5FDC\u3058\u3066 \`page\`, \`archived\`, \`include_closed\` \u306A\u3069\u306E\u30AF\u30A8\u30EA\u30D1\u30E9\u30E1\u30FC\u30BF\u3092\u4ED8\u52A0\u3057\u3066\u304F\u3060\u3055\u3044\u3002
856
920
 
857
921
  ### Business Logic
858
922
 
@@ -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
@@ -219,6 +224,15 @@ var ConnectorPlugin = class _ConnectorPlugin {
219
224
  * `runSetupFlow` from `setup-flow.ts`.
220
225
  */
221
226
  setup;
227
+ /**
228
+ * 統一 introspection。SQL DB の `information_schema` / `SHOW` / `DESCRIBE` や SaaS の
229
+ * メタデータ API といった取得経路の差を吸収し、tables / columns / PK / FK を共通型
230
+ * {@link IntrospectedSchema} へ正規化して返す。取得経路は {@link IntrospectContext} で
231
+ * 抽象化され、SQL DB は `ctx.query`、SaaS は `ctx.proxyFetch` + `ctx.params` を使う。
232
+ * `ctx.profile === true` のときは L2 プロファイル(行数・NULL 率等)も best-effort で埋める。
233
+ * coding-agent の `DataContextIndex` がデータ地図を構築する際に使う。
234
+ */
235
+ introspect;
222
236
  /**
223
237
  * Opt-out of the default "verify before save" behavior on connection
224
238
  * creation. The backend invokes `checkConnection` synchronously while
@@ -233,6 +247,14 @@ var ConnectorPlugin = class _ConnectorPlugin {
233
247
  * the default verify-on-create behavior without opt-in.
234
248
  */
235
249
  skipConnectionCheckOnCreate;
250
+ /**
251
+ * 決定論的な「立ち上げ survey」レシピ(ルールベース prewarm 基盤)。実装した connector は、LLM を使わずに
252
+ * read-only で自分を survey する probe 列(テーブル/列メタデータ → 小サンプル)を宣言する。coding-agent の
253
+ * recon driver がこれを読み、connector ツールの `execute` を直接呼んで結果を seed にする。未実装の connector は
254
+ * driver 側で safely skip される(その connection は listConnections のみ seed)。標準 `information_schema` を
255
+ * 持つ SQL connector は `makeStandardSqlSurveyProbes` を使える。**probe は必ず read-only**。
256
+ */
257
+ surveyProbes;
236
258
  constructor(config) {
237
259
  this.slug = config.slug;
238
260
  this.authType = config.authType;
@@ -250,7 +272,9 @@ var ConnectorPlugin = class _ConnectorPlugin {
250
272
  this.query = config.query;
251
273
  this.checkConnection = config.checkConnection;
252
274
  this.setup = config.setup;
275
+ this.introspect = config.introspect;
253
276
  this.skipConnectionCheckOnCreate = config.skipConnectionCheckOnCreate;
277
+ this.surveyProbes = config.surveyProbes;
254
278
  }
255
279
  get connectorKey() {
256
280
  return _ConnectorPlugin.deriveKey(this.slug, this.authType);
@@ -258,7 +282,7 @@ var ConnectorPlugin = class _ConnectorPlugin {
258
282
  /**
259
283
  * Create tools for connections that belong to this connector.
260
284
  * Filters connections by connectorKey internally.
261
- * Returns tools keyed as `${connectorKey}_${toolName}`.
285
+ * Returns tools keyed as `connector_${connectorKey}_${toolName}`.
262
286
  */
263
287
  createTools(connections, config, opts) {
264
288
  const myConnections = connections.filter(
@@ -268,7 +292,7 @@ var ConnectorPlugin = class _ConnectorPlugin {
268
292
  for (const t of Object.values(this.tools)) {
269
293
  const tool = t.createTool(myConnections, config);
270
294
  const originalToModelOutput = tool.toModelOutput;
271
- result[`${this.connectorKey}_${t.name}`] = {
295
+ result[`connector_${this.connectorKey}_${t.name}`] = {
272
296
  ...tool,
273
297
  toModelOutput: async (options) => {
274
298
  if (!originalToModelOutput) {
@@ -288,25 +312,25 @@ var ConnectorPlugin = class _ConnectorPlugin {
288
312
  if (authType) return `${slug}-${authType}`;
289
313
  const LEGACY_NULL_AUTH_TYPE_MAP = {
290
314
  // user-password
291
- "postgresql": "user-password",
292
- "mysql": "user-password",
293
- "clickhouse": "user-password",
294
- "kintone": "user-password",
315
+ postgresql: "user-password",
316
+ mysql: "user-password",
317
+ clickhouse: "user-password",
318
+ kintone: "user-password",
295
319
  "squadbase-db": "user-password",
296
320
  // service-account
297
- "snowflake": "service-account",
298
- "bigquery": "service-account",
321
+ snowflake: "service-account",
322
+ bigquery: "service-account",
299
323
  "google-analytics": "service-account",
300
324
  "google-calendar": "service-account",
301
325
  "aws-athena": "service-account",
302
- "redshift": "service-account",
326
+ redshift: "service-account",
303
327
  // api-key
304
- "databricks": "api-key",
305
- "dbt": "api-key",
306
- "airtable": "api-key",
307
- "openai": "api-key",
308
- "gemini": "api-key",
309
- "anthropic": "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",
310
334
  "wix-store": "api-key"
311
335
  };
312
336
  const fallbackAuthType = LEGACY_NULL_AUTH_TYPE_MAP[slug];
@@ -398,14 +422,14 @@ var AUTH_TYPES = {
398
422
  // ../connectors/src/connectors/cosmosdb/setup.ts
399
423
  var cosmosdbOnboarding = new ConnectorOnboarding({
400
424
  dataOverviewInstructions: {
401
- en: `1. Use cosmosdb_listContainers to list all containers in the configured database
402
- 2. For key containers, sample documents with cosmosdb_query: container="users", sql="SELECT TOP 5 * FROM c"
425
+ en: `1. Use connector_cosmosdb_listContainers to list all containers in the configured database
426
+ 2. For key containers, sample documents with connector_cosmosdb_query: container="users", sql="SELECT TOP 5 * FROM c"
403
427
  3. Examine the document structure to understand the schema (Cosmos DB containers are schema-flexible \u2014 items in the same container may have different fields)
404
- 4. Use cosmosdb_query with GROUP BY to analyse data distribution if needed: \`SELECT c.status, COUNT(1) AS n FROM c GROUP BY c.status\``,
405
- ja: `1. cosmosdb_listContainers \u3067\u5BFE\u8C61\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u5185\u306E\u30B3\u30F3\u30C6\u30CA\u4E00\u89A7\u3092\u53D6\u5F97
406
- 2. \u4E3B\u8981\u30B3\u30F3\u30C6\u30CA\u306B\u3064\u3044\u3066 cosmosdb_query \u3067\u30C9\u30AD\u30E5\u30E1\u30F3\u30C8\u3092\u30B5\u30F3\u30D7\u30EA\u30F3\u30B0: container="users", sql="SELECT TOP 5 * FROM c"
428
+ 4. Use connector_cosmosdb_query with GROUP BY to analyse data distribution if needed: \`SELECT c.status, COUNT(1) AS n FROM c GROUP BY c.status\``,
429
+ ja: `1. connector_cosmosdb_listContainers \u3067\u5BFE\u8C61\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u5185\u306E\u30B3\u30F3\u30C6\u30CA\u4E00\u89A7\u3092\u53D6\u5F97
430
+ 2. \u4E3B\u8981\u30B3\u30F3\u30C6\u30CA\u306B\u3064\u3044\u3066 connector_cosmosdb_query \u3067\u30C9\u30AD\u30E5\u30E1\u30F3\u30C8\u3092\u30B5\u30F3\u30D7\u30EA\u30F3\u30B0: container="users", sql="SELECT TOP 5 * FROM c"
407
431
  3. \u30C9\u30AD\u30E5\u30E1\u30F3\u30C8\u69CB\u9020\u3092\u78BA\u8A8D\u3057\u3066\u30B9\u30AD\u30FC\u30DE\u3092\u628A\u63E1\uFF08Cosmos DB \u306E\u30B3\u30F3\u30C6\u30CA\u306F\u30B9\u30AD\u30FC\u30DE\u304C\u67D4\u8EDF\u306A\u305F\u3081\u3001\u540C\u3058\u30B3\u30F3\u30C6\u30CA\u5185\u3067\u3082\u30C9\u30AD\u30E5\u30E1\u30F3\u30C8\u306E\u30D5\u30A3\u30FC\u30EB\u30C9\u304C\u7570\u306A\u308B\u5834\u5408\u304C\u3042\u308A\u307E\u3059\uFF09
408
- 4. \u5FC5\u8981\u306B\u5FDC\u3058\u3066 cosmosdb_query \u306E GROUP BY \u3067\u30C7\u30FC\u30BF\u5206\u5E03\u3092\u78BA\u8A8D: \`SELECT c.status, COUNT(1) AS n FROM c GROUP BY c.status\``
432
+ 4. \u5FC5\u8981\u306B\u5FDC\u3058\u3066 connector_cosmosdb_query \u306E GROUP BY \u3067\u30C7\u30FC\u30BF\u5206\u5E03\u3092\u78BA\u8A8D: \`SELECT c.status, COUNT(1) AS n FROM c GROUP BY c.status\``
409
433
  }
410
434
  });
411
435
 
@@ -717,8 +741,8 @@ var cosmosdbConnector = new ConnectorPlugin({
717
741
  systemPrompt: {
718
742
  en: `### Tools
719
743
 
720
- - \`cosmosdb_listContainers\`: Lists all containers in the configured database, with their partition key paths. Use this first to explore available data.
721
- - \`cosmosdb_query\`: Executes a Cosmos DB SQL (Core / NoSQL API) query against a single container and returns items. Use for schema exploration, data sampling, and analytical queries. Pass \`partitionKey\` to scope the query to a single partition (cross-partition queries are enabled by default).
744
+ - \`connector_cosmosdb_listContainers\`: Lists all containers in the configured database, with their partition key paths. Use this first to explore available data.
745
+ - \`connector_cosmosdb_query\`: Executes a Cosmos DB SQL (Core / NoSQL API) query against a single container and returns items. Use for schema exploration, data sampling, and analytical queries. Pass \`partitionKey\` to scope the query to a single partition (cross-partition queries are enabled by default).
722
746
 
723
747
  ### Business Logic
724
748
 
@@ -763,8 +787,8 @@ export default async function handler(_c: Context) {
763
787
  - Always bound results with \`TOP n\` and prefer scoped queries with a \`partitionKey\` value when possible \u2014 cross-partition queries cost more RUs.`,
764
788
  ja: `### \u30C4\u30FC\u30EB
765
789
 
766
- - \`cosmosdb_listContainers\`: \u8A2D\u5B9A\u3055\u308C\u305F\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u5185\u306E\u30B3\u30F3\u30C6\u30CA\u4E00\u89A7\uFF08\u30D1\u30FC\u30C6\u30A3\u30B7\u30E7\u30F3\u30AD\u30FC\u306E\u30D1\u30B9\u4ED8\u304D\uFF09\u3092\u53D6\u5F97\u3057\u307E\u3059\u3002\u30C7\u30FC\u30BF\u63A2\u7D22\u306E\u6700\u521D\u306E\u30B9\u30C6\u30C3\u30D7\u3068\u3057\u3066\u4F7F\u7528\u3057\u3066\u304F\u3060\u3055\u3044\u3002
767
- - \`cosmosdb_query\`: \u5358\u4E00\u306E\u30B3\u30F3\u30C6\u30CA\u306B\u5BFE\u3057\u3066 Cosmos DB SQL\uFF08Core / NoSQL API\uFF09\u30AF\u30A8\u30EA\u3092\u5B9F\u884C\u3057\u3001\u30A2\u30A4\u30C6\u30E0\u3092\u8FD4\u3057\u307E\u3059\u3002\u30B9\u30AD\u30FC\u30DE\u63A2\u7D22\u3001\u30C7\u30FC\u30BF\u306E\u30B5\u30F3\u30D7\u30EA\u30F3\u30B0\u3001\u5206\u6790\u30AF\u30A8\u30EA\u306B\u4F7F\u7528\u3057\u307E\u3059\u3002\`partitionKey\` \u3092\u6E21\u3059\u3068\u5358\u4E00\u30D1\u30FC\u30C6\u30A3\u30B7\u30E7\u30F3\u306B\u30B9\u30B3\u30FC\u30D7\u3067\u304D\u3001\u672A\u6307\u5B9A\u3060\u3068\u30AF\u30ED\u30B9\u30D1\u30FC\u30C6\u30A3\u30B7\u30E7\u30F3\u30AF\u30A8\u30EA\u306B\u306A\u308A\u307E\u3059\u3002
790
+ - \`connector_cosmosdb_listContainers\`: \u8A2D\u5B9A\u3055\u308C\u305F\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u5185\u306E\u30B3\u30F3\u30C6\u30CA\u4E00\u89A7\uFF08\u30D1\u30FC\u30C6\u30A3\u30B7\u30E7\u30F3\u30AD\u30FC\u306E\u30D1\u30B9\u4ED8\u304D\uFF09\u3092\u53D6\u5F97\u3057\u307E\u3059\u3002\u30C7\u30FC\u30BF\u63A2\u7D22\u306E\u6700\u521D\u306E\u30B9\u30C6\u30C3\u30D7\u3068\u3057\u3066\u4F7F\u7528\u3057\u3066\u304F\u3060\u3055\u3044\u3002
791
+ - \`connector_cosmosdb_query\`: \u5358\u4E00\u306E\u30B3\u30F3\u30C6\u30CA\u306B\u5BFE\u3057\u3066 Cosmos DB SQL\uFF08Core / NoSQL API\uFF09\u30AF\u30A8\u30EA\u3092\u5B9F\u884C\u3057\u3001\u30A2\u30A4\u30C6\u30E0\u3092\u8FD4\u3057\u307E\u3059\u3002\u30B9\u30AD\u30FC\u30DE\u63A2\u7D22\u3001\u30C7\u30FC\u30BF\u306E\u30B5\u30F3\u30D7\u30EA\u30F3\u30B0\u3001\u5206\u6790\u30AF\u30A8\u30EA\u306B\u4F7F\u7528\u3057\u307E\u3059\u3002\`partitionKey\` \u3092\u6E21\u3059\u3068\u5358\u4E00\u30D1\u30FC\u30C6\u30A3\u30B7\u30E7\u30F3\u306B\u30B9\u30B3\u30FC\u30D7\u3067\u304D\u3001\u672A\u6307\u5B9A\u3060\u3068\u30AF\u30ED\u30B9\u30D1\u30FC\u30C6\u30A3\u30B7\u30E7\u30F3\u30AF\u30A8\u30EA\u306B\u306A\u308A\u307E\u3059\u3002
768
792
 
769
793
  ### Business Logic
770
794