@squadbase/vite-server 0.1.17-dev.a107052 → 0.1.17-dev.d4fff69

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 +4284 -820
  2. package/dist/connectors/airtable-oauth.js +48 -8
  3. package/dist/connectors/airtable.js +44 -8
  4. package/dist/connectors/amplitude.js +8 -8
  5. package/dist/connectors/anthropic.js +2 -2
  6. package/dist/connectors/asana.js +37 -10
  7. package/dist/connectors/attio.js +30 -13
  8. package/dist/connectors/aws-billing.js +8 -8
  9. package/dist/connectors/azure-sql.js +47 -10
  10. package/dist/connectors/backlog-api-key.js +40 -15
  11. package/dist/connectors/clickup.js +50 -10
  12. package/dist/connectors/cosmosdb.js +12 -12
  13. package/dist/connectors/customerio.js +8 -8
  14. package/dist/connectors/dbt.js +686 -25
  15. package/dist/connectors/freshdesk.js +82 -8
  16. package/dist/connectors/freshsales.js +8 -8
  17. package/dist/connectors/freshservice.js +8 -8
  18. package/dist/connectors/gamma.js +15 -15
  19. package/dist/connectors/gemini.js +2 -2
  20. package/dist/connectors/github.js +12 -12
  21. package/dist/connectors/gmail-oauth.js +10 -10
  22. package/dist/connectors/gmail.js +4 -4
  23. package/dist/connectors/google-ads.js +8 -8
  24. package/dist/connectors/google-analytics-oauth.js +152 -25
  25. package/dist/connectors/google-analytics.js +475 -95
  26. package/dist/connectors/google-audit-log.js +4 -4
  27. package/dist/connectors/google-calendar-oauth.js +61 -15
  28. package/dist/connectors/google-calendar.js +61 -11
  29. package/dist/connectors/google-docs.js +10 -10
  30. package/dist/connectors/google-drive.js +32 -10
  31. package/dist/connectors/google-search-console-oauth.js +126 -17
  32. package/dist/connectors/google-sheets.js +6 -6
  33. package/dist/connectors/google-slides.js +10 -10
  34. package/dist/connectors/grafana.js +45 -10
  35. package/dist/connectors/hackernews.d.ts +5 -0
  36. package/dist/connectors/hackernews.js +890 -0
  37. package/dist/connectors/hubspot-oauth.js +41 -9
  38. package/dist/connectors/hubspot.js +25 -9
  39. package/dist/connectors/influxdb.js +8 -8
  40. package/dist/connectors/intercom-oauth.js +72 -12
  41. package/dist/connectors/intercom.js +12 -12
  42. package/dist/connectors/jdbc.js +37 -10
  43. package/dist/connectors/jira-api-key.js +68 -11
  44. package/dist/connectors/kintone-api-token.js +66 -18
  45. package/dist/connectors/kintone.js +54 -11
  46. package/dist/connectors/linear.js +54 -12
  47. package/dist/connectors/linkedin-ads.js +41 -14
  48. package/dist/connectors/mailchimp-oauth.js +6 -6
  49. package/dist/connectors/mailchimp.js +6 -6
  50. package/dist/connectors/meta-ads-oauth.js +33 -14
  51. package/dist/connectors/meta-ads.js +35 -14
  52. package/dist/connectors/mixpanel.js +8 -8
  53. package/dist/connectors/monday.js +9 -9
  54. package/dist/connectors/mongodb.js +8 -8
  55. package/dist/connectors/notion-oauth.js +60 -11
  56. package/dist/connectors/notion.js +60 -11
  57. package/dist/connectors/openai.js +2 -2
  58. package/dist/connectors/oracle.js +39 -11
  59. package/dist/connectors/outlook-oauth.js +21 -21
  60. package/dist/connectors/powerbi-oauth.js +13 -13
  61. package/dist/connectors/salesforce.js +42 -9
  62. package/dist/connectors/semrush.js +6 -6
  63. package/dist/connectors/sentry.js +36 -10
  64. package/dist/connectors/shopify-oauth.js +43 -10
  65. package/dist/connectors/shopify.js +8 -8
  66. package/dist/connectors/sqlserver.js +47 -10
  67. package/dist/connectors/stripe-api-key.js +66 -15
  68. package/dist/connectors/stripe-oauth.js +70 -19
  69. package/dist/connectors/supabase.js +31 -6
  70. package/dist/connectors/tableau.js +15 -15
  71. package/dist/connectors/tiktok-ads.js +37 -16
  72. package/dist/connectors/wix-store.js +8 -8
  73. package/dist/connectors/x.d.ts +5 -0
  74. package/dist/connectors/x.js +927 -0
  75. package/dist/connectors/zendesk-oauth.js +55 -12
  76. package/dist/connectors/zendesk.js +12 -12
  77. package/dist/index.js +4302 -818
  78. package/dist/main.js +4302 -818
  79. package/dist/vite-plugin.js +4282 -818
  80. package/package.json +9 -1
@@ -308,7 +308,7 @@ async function runMssqlQuery(parsed, sql, options = {}) {
308
308
  try {
309
309
  const result = await pool.request().query(sql);
310
310
  const recordset = result.recordset ?? [];
311
- return { rows: recordset };
311
+ return { rows: recordset, rowsAffected: result.rowsAffected ?? [] };
312
312
  } finally {
313
313
  await pool.close();
314
314
  }
@@ -513,7 +513,7 @@ var ConnectorPlugin = class _ConnectorPlugin {
513
513
  /**
514
514
  * Create tools for connections that belong to this connector.
515
515
  * Filters connections by connectorKey internally.
516
- * Returns tools keyed as `${connectorKey}_${toolName}`.
516
+ * Returns tools keyed as `connector_${connectorKey}_${toolName}`.
517
517
  */
518
518
  createTools(connections, config, opts) {
519
519
  const myConnections = connections.filter(
@@ -523,7 +523,7 @@ var ConnectorPlugin = class _ConnectorPlugin {
523
523
  for (const t of Object.values(this.tools)) {
524
524
  const tool = t.createTool(myConnections, config);
525
525
  const originalToModelOutput = tool.toModelOutput;
526
- result[`${this.connectorKey}_${t.name}`] = {
526
+ result[`connector_${this.connectorKey}_${t.name}`] = {
527
527
  ...tool,
528
528
  toModelOutput: async (options) => {
529
529
  if (!originalToModelOutput) {
@@ -650,6 +650,12 @@ var AUTH_TYPES = {
650
650
  USER_PASSWORD: "user-password"
651
651
  };
652
652
 
653
+ // ../connectors/src/lib/sql-dml.ts
654
+ function isDmlStatement(sql) {
655
+ const stripped = sql.replace(/^(\s*(--[^\n]*\n|\/\*[\s\S]*?\*\/))+/, "").trimStart();
656
+ return /^(insert|update|delete|merge)\b/i.test(stripped);
657
+ }
658
+
653
659
  // ../connectors/src/lib/unwrap-sample-limit.ts
654
660
  var STRICT_WRAPPER_RE = /^\s*SELECT\s+\*\s+FROM\s+\(([\s\S]+)\)\s+AS\s+\w+\s+LIMIT\s+(\d+)\s*;?\s*$/i;
655
661
  var TRAILING_LIMIT_RE = /\s+LIMIT\s+(\d+)\s*;?\s*$/i;
@@ -756,6 +762,28 @@ function buildFlow(options) {
756
762
  fetchAll: () => fetchTableNames(rt.params, schema),
757
763
  limit: SQLSERVER_SETUP_MAX_TABLES
758
764
  });
765
+ let rowCounts = /* @__PURE__ */ new Map();
766
+ try {
767
+ const countRows = await runSqlServerSetupQuery(
768
+ rt.params,
769
+ `SELECT t.TABLE_NAME, SUM(p.rows) AS row_count
770
+ FROM INFORMATION_SCHEMA.TABLES t
771
+ JOIN sys.partitions p
772
+ ON OBJECT_ID(t.TABLE_SCHEMA + '.' + t.TABLE_NAME) = p.object_id
773
+ AND p.index_id IN (0, 1)
774
+ WHERE t.TABLE_SCHEMA = ${quoteLiteral(schema)}
775
+ AND t.TABLE_TYPE IN ('BASE TABLE', 'VIEW')
776
+ GROUP BY t.TABLE_NAME`,
777
+ forceEncrypt
778
+ );
779
+ rowCounts = new Map(
780
+ countRows.map((r) => [
781
+ String(r["TABLE_NAME"] ?? ""),
782
+ Number(r["row_count"] ?? 0)
783
+ ])
784
+ );
785
+ } catch {
786
+ }
759
787
  const sections = [
760
788
  `## ${connectorName}`,
761
789
  "",
@@ -772,7 +800,9 @@ function buildFlow(options) {
772
800
  ORDER BY ORDINAL_POSITION`,
773
801
  forceEncrypt
774
802
  );
775
- sections.push(`#### Table: ${table}`, "");
803
+ const rowCount = rowCounts.get(table);
804
+ const heading = typeof rowCount === "number" ? `#### Table: ${table} (~${rowCount.toLocaleString()} rows)` : `#### Table: ${table}`;
805
+ sections.push(heading, "");
776
806
  sections.push("| Column | Type | Nullable | Default |");
777
807
  sections.push("|--------|------|----------|---------|");
778
808
  for (const c of cols) {
@@ -805,11 +835,11 @@ init_utils();
805
835
  // ../connectors/src/connectors/azure-sql/setup.ts
806
836
  var azureSqlOnboarding = new ConnectorOnboarding({
807
837
  dataOverviewInstructions: {
808
- en: `1. Use azure-sql_executeQuery to confirm the database flavor: \`SELECT @@VERSION\` (Azure SQL returns "Microsoft SQL Azure \u2026")
838
+ en: `1. Use connector_azure-sql_executeQuery to confirm the database flavor: \`SELECT @@VERSION\` (Azure SQL returns "Microsoft SQL Azure \u2026")
809
839
  2. List user tables: \`SELECT TABLE_SCHEMA, TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE' AND TABLE_SCHEMA NOT IN ('sys', 'INFORMATION_SCHEMA')\`
810
840
  3. For key tables, fetch column info: \`SELECT COLUMN_NAME, DATA_TYPE FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = 'dbo' AND TABLE_NAME = 'xxx'\`
811
841
  4. Sample up to 3 tables. Azure SQL is T-SQL, so use \`TOP\` rather than \`LIMIT\`: \`SELECT TOP 5 * FROM <schema>.<table_name>\``,
812
- ja: `1. azure-sql_executeQuery \u3067\u30D5\u30EC\u30FC\u30D0\u30FC\u3092\u78BA\u8A8D: \`SELECT @@VERSION\`\uFF08Azure SQL \u306F "Microsoft SQL Azure \u2026" \u3092\u8FD4\u3057\u307E\u3059\uFF09
842
+ ja: `1. connector_azure-sql_executeQuery \u3067\u30D5\u30EC\u30FC\u30D0\u30FC\u3092\u78BA\u8A8D: \`SELECT @@VERSION\`\uFF08Azure SQL \u306F "Microsoft SQL Azure \u2026" \u3092\u8FD4\u3057\u307E\u3059\uFF09
813
843
  2. \u30E6\u30FC\u30B6\u30FC\u30C6\u30FC\u30D6\u30EB\u4E00\u89A7: \`SELECT TABLE_SCHEMA, TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE' AND TABLE_SCHEMA NOT IN ('sys', 'INFORMATION_SCHEMA')\`
814
844
  3. \u4E3B\u8981\u30C6\u30FC\u30D6\u30EB\u306E\u30AB\u30E9\u30E0\u60C5\u5831: \`SELECT COLUMN_NAME, DATA_TYPE FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = 'dbo' AND TABLE_NAME = 'xxx'\`
815
845
  4. \u5FC5\u8981\u306B\u5FDC\u3058\u3066\u6700\u59273\u30C6\u30FC\u30D6\u30EB\u3092\u30B5\u30F3\u30D7\u30EA\u30F3\u30B0\u3002Azure SQL \u306F T-SQL \u306E\u305F\u3081 \`LIMIT\` \u3067\u306F\u306A\u304F \`TOP\` \u3092\u4F7F\u7528: \`SELECT TOP 5 * FROM <schema>.<table_name>\``
@@ -841,6 +871,9 @@ var outputSchema = z.discriminatedUnion("success", [
841
871
  z.object({
842
872
  success: z.literal(true),
843
873
  rowCount: z.number(),
874
+ rowsAffected: z.number().optional().describe(
875
+ "Affected rows for INSERT/UPDATE/DELETE; undefined for SELECT"
876
+ ),
844
877
  truncated: z.boolean(),
845
878
  rows: z.array(z.record(z.string(), z.unknown()))
846
879
  }),
@@ -854,7 +887,8 @@ var executeQueryTool = new ConnectorTool({
854
887
  description: `Execute a T-SQL query against Azure SQL Database. Returns up to ${MAX_ROWS} rows.
855
888
  Use for: schema exploration via \`INFORMATION_SCHEMA\`, data sampling, and analytical queries.
856
889
  Azure SQL is T-SQL: use \`TOP n\` instead of \`LIMIT n\`. Identifiers can be wrapped in square brackets.
857
- Avoid loading large amounts of data; always include \`TOP\` in queries.`,
890
+ Avoid loading large amounts of data; always include \`TOP\` in queries.
891
+ 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.`,
858
892
  inputSchema,
859
893
  outputSchema,
860
894
  async execute({ connectionId, sql }, connections) {
@@ -881,7 +915,7 @@ Avoid loading large amounts of data; always include \`TOP\` in queries.`,
881
915
  };
882
916
  }
883
917
  try {
884
- const { rows } = await runMssqlQuery(parsed, sql, {
918
+ const { rows, rowsAffected } = await runMssqlQuery(parsed, sql, {
885
919
  forceEncrypt: true,
886
920
  tunnelParams: connectionParamsToRecord(connection2)
887
921
  });
@@ -889,6 +923,9 @@ Avoid loading large amounts of data; always include \`TOP\` in queries.`,
889
923
  return {
890
924
  success: true,
891
925
  rowCount: Math.min(rows.length, MAX_ROWS),
926
+ // tedious counts SELECT result rows in rowsAffected too, so only
927
+ // report it for DML. Multi-statement batches are summed.
928
+ rowsAffected: isDmlStatement(sql) ? rowsAffected.reduce((sum, n) => sum + n, 0) : void 0,
892
929
  truncated,
893
930
  rows: rows.slice(0, MAX_ROWS)
894
931
  };
@@ -915,7 +952,7 @@ var azureSqlConnector = new ConnectorPlugin({
915
952
  systemPrompt: {
916
953
  en: `### Tools
917
954
 
918
- - \`azure-sql_executeQuery\`: Executes a T-SQL query against Azure SQL Database and returns rows. Use for schema exploration via \`INFORMATION_SCHEMA\` and data sampling. See the SQL Reference below for Azure SQL-specific notes.
955
+ - \`connector_azure-sql_executeQuery\`: Executes a T-SQL query against Azure SQL Database and returns rows. Use for schema exploration via \`INFORMATION_SCHEMA\` and data sampling. See the SQL Reference below for Azure SQL-specific notes.
919
956
 
920
957
  ### Business Logic
921
958
 
@@ -932,7 +969,7 @@ The business logic type for this connector is "sql".
932
969
  - Row-limit compatibility: the platform's server-logic schema inference may wrap your query as \`SELECT * FROM (<inner>) AS _sq LIMIT N\`. T-SQL does not understand \`LIMIT\`, so the connector detects this exact wrapper at \`query()\` time, executes \`<inner>\` directly, and slices the first N rows in JS. You do not need to handle this \u2014 but do not author your own \`LIMIT\` clauses; use \`TOP\` / \`OFFSET ... FETCH NEXT\` in queries you write.`,
933
970
  ja: `### \u30C4\u30FC\u30EB
934
971
 
935
- - \`azure-sql_executeQuery\`: Azure SQL Database \u306B\u5BFE\u3057\u3066 T-SQL \u30AF\u30A8\u30EA\u3092\u5B9F\u884C\u3057\u3001\u884C\u30C7\u30FC\u30BF\u3092\u8FD4\u3057\u307E\u3059\u3002\`INFORMATION_SCHEMA\` \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\u3002Azure SQL \u56FA\u6709\u306E\u6CE8\u610F\u70B9\u306F\u4E0B\u90E8\u306E\u300CSQL \u30EA\u30D5\u30A1\u30EC\u30F3\u30B9\u300D\u3092\u53C2\u7167\u3057\u3066\u304F\u3060\u3055\u3044\u3002
972
+ - \`connector_azure-sql_executeQuery\`: Azure SQL Database \u306B\u5BFE\u3057\u3066 T-SQL \u30AF\u30A8\u30EA\u3092\u5B9F\u884C\u3057\u3001\u884C\u30C7\u30FC\u30BF\u3092\u8FD4\u3057\u307E\u3059\u3002\`INFORMATION_SCHEMA\` \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\u3002Azure SQL \u56FA\u6709\u306E\u6CE8\u610F\u70B9\u306F\u4E0B\u90E8\u306E\u300CSQL \u30EA\u30D5\u30A1\u30EC\u30F3\u30B9\u300D\u3092\u53C2\u7167\u3057\u3066\u304F\u3060\u3055\u3044\u3002
936
973
 
937
974
  ### Business Logic
938
975
 
@@ -212,7 +212,7 @@ var ConnectorPlugin = class _ConnectorPlugin {
212
212
  /**
213
213
  * Create tools for connections that belong to this connector.
214
214
  * Filters connections by connectorKey internally.
215
- * Returns tools keyed as `${connectorKey}_${toolName}`.
215
+ * Returns tools keyed as `connector_${connectorKey}_${toolName}`.
216
216
  */
217
217
  createTools(connections, config, opts) {
218
218
  const myConnections = connections.filter(
@@ -222,7 +222,7 @@ var ConnectorPlugin = class _ConnectorPlugin {
222
222
  for (const t of Object.values(this.tools)) {
223
223
  const tool = t.createTool(myConnections, config);
224
224
  const originalToModelOutput = tool.toModelOutput;
225
- result[`${this.connectorKey}_${t.name}`] = {
225
+ result[`connector_${this.connectorKey}_${t.name}`] = {
226
226
  ...tool,
227
227
  toModelOutput: async (options) => {
228
228
  if (!originalToModelOutput) {
@@ -352,14 +352,14 @@ var AUTH_TYPES = {
352
352
  // ../connectors/src/connectors/backlog/setup.ts
353
353
  var backlogOnboarding = new ConnectorOnboarding({
354
354
  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`
355
+ en: `1. Call connector_backlog-api-key_request with GET space to verify the connection and get space information
356
+ 2. Call connector_backlog-api-key_request with GET projects to list all accessible projects
357
+ 3. For key projects, call connector_backlog-api-key_request with GET issues?projectId[]={projectId}&count=5&order=desc to retrieve recent issues
358
+ 4. Call connector_backlog-api-key_request with GET projects/{projectIdOrKey}/statuses to understand the workflow statuses`,
359
+ 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
360
+ 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
361
+ 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
362
+ 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
363
  }
364
364
  });
365
365
 
@@ -408,6 +408,20 @@ async function listStatuses(params, projectIdOrKey) {
408
408
  if (!res.ok) return [];
409
409
  return await res.json();
410
410
  }
411
+ async function countIssues(params, projectId, statusId) {
412
+ try {
413
+ const statusParam = statusId ? `&statusId[]=${statusId}` : "";
414
+ const res = await apiFetch(
415
+ params,
416
+ `issues/count?projectId[]=${encodeURIComponent(projectId)}${statusParam}`
417
+ );
418
+ if (!res.ok) return null;
419
+ const data = await res.json();
420
+ return typeof data.count === "number" ? data.count : null;
421
+ } catch {
422
+ return null;
423
+ }
424
+ }
411
425
  var backlogSetupFlow = {
412
426
  initialState: () => ({}),
413
427
  steps: [
@@ -457,14 +471,25 @@ var backlogSetupFlow = {
457
471
  continue;
458
472
  }
459
473
  sections.push(`### Project: ${project.name} (${project.projectKey})`, "");
460
- const [issueTypes, statuses] = await Promise.all([
474
+ const [issueTypes, statuses, totalIssues] = await Promise.all([
461
475
  listIssueTypes(rt.params, id),
462
- listStatuses(rt.params, id)
476
+ listStatuses(rt.params, id),
477
+ countIssues(rt.params, id)
463
478
  ]);
479
+ if (totalIssues != null) {
480
+ sections.push(`- Total issues: ${totalIssues.toLocaleString()}`);
481
+ }
464
482
  sections.push(`- Issue types (${issueTypes.length}):`);
465
483
  for (const t of issueTypes) sections.push(` - ${t.name}`);
484
+ const statusCounts = await Promise.all(
485
+ statuses.map((s) => countIssues(rt.params, id, s.id))
486
+ );
466
487
  sections.push(`- Statuses (${statuses.length}):`);
467
- for (const s of statuses) sections.push(` - ${s.name}`);
488
+ for (let i = 0; i < statuses.length; i++) {
489
+ const c = statusCounts[i];
490
+ const cStr = c != null ? `: ${c.toLocaleString()} issues` : "";
491
+ sections.push(` - ${statuses[i].name}${cStr}`);
492
+ }
468
493
  sections.push("");
469
494
  }
470
495
  return sections.join("\n");
@@ -563,7 +588,7 @@ var backlogConnector = new ConnectorPlugin({
563
588
  systemPrompt: {
564
589
  en: `### Tools
565
590
 
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.
591
+ - \`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
592
 
568
593
  ### Business Logic
569
594
 
@@ -635,7 +660,7 @@ await backlog.request("/api/v2/issues", {
635
660
  - order: "asc" or "desc"`,
636
661
  ja: `### \u30C4\u30FC\u30EB
637
662
 
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
663
+ - \`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
664
 
640
665
  ### Business Logic
641
666
 
@@ -348,7 +348,7 @@ var ConnectorPlugin = class _ConnectorPlugin {
348
348
  /**
349
349
  * Create tools for connections that belong to this connector.
350
350
  * Filters connections by connectorKey internally.
351
- * Returns tools keyed as `${connectorKey}_${toolName}`.
351
+ * Returns tools keyed as `connector_${connectorKey}_${toolName}`.
352
352
  */
353
353
  createTools(connections, config, opts) {
354
354
  const myConnections = connections.filter(
@@ -358,7 +358,7 @@ var ConnectorPlugin = class _ConnectorPlugin {
358
358
  for (const t of Object.values(this.tools)) {
359
359
  const tool = t.createTool(myConnections, config);
360
360
  const originalToModelOutput = tool.toModelOutput;
361
- result[`${this.connectorKey}_${t.name}`] = {
361
+ result[`connector_${this.connectorKey}_${t.name}`] = {
362
362
  ...tool,
363
363
  toModelOutput: async (options) => {
364
364
  if (!originalToModelOutput) {
@@ -498,15 +498,15 @@ function normalizeRequestPath(path2, basePathSegment) {
498
498
  // ../connectors/src/connectors/clickup/setup.ts
499
499
  var clickupOnboarding = new ConnectorOnboarding({
500
500
  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.
501
+ 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\`.
502
+ 2. Call connector_clickup_request with GET /team/{team_id}/space?archived=false to list spaces in the workspace.
503
503
  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\`.
504
+ 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
505
  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
506
+ 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
507
+ 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
508
  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
509
+ 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
510
  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
511
  }
512
512
  });
@@ -567,6 +567,21 @@ async function listFolderlessLists(params, spaceId) {
567
567
  const data = await res.json();
568
568
  return data.lists ?? [];
569
569
  }
570
+ var CLICKUP_SAMPLE_LISTS_PER_SPACE = 5;
571
+ async function fetchListTaskCount(params, listId) {
572
+ try {
573
+ const res = await apiFetch(
574
+ params,
575
+ `/list/${encodeURIComponent(listId)}/task?archived=false&page=0`
576
+ );
577
+ if (!res.ok) return null;
578
+ const data = await res.json();
579
+ const tasks = data.tasks ?? [];
580
+ return tasks.length >= 100 ? "100+" : String(tasks.length);
581
+ } catch {
582
+ return null;
583
+ }
584
+ }
570
585
  var clickupSetupFlow = {
571
586
  initialState: () => ({}),
572
587
  steps: [
@@ -636,6 +651,31 @@ var clickupSetupFlow = {
636
651
  for (const f of folders) sections.push(` - ${f.name}`);
637
652
  sections.push(`- Folderless lists (${folderlessLists.length}):`);
638
653
  for (const l of folderlessLists) sections.push(` - ${l.name}`);
654
+ const sampled = folderlessLists.slice(0, CLICKUP_SAMPLE_LISTS_PER_SPACE);
655
+ if (sampled.length > 0) {
656
+ const counts = await Promise.all(
657
+ sampled.map((l) => fetchListTaskCount(rt.params, l.id))
658
+ );
659
+ sections.push(
660
+ "",
661
+ rt.language === "ja" ? `- \u30EA\u30B9\u30C8\u5225\u30BF\u30B9\u30AF\u4EF6\u6570 (\u4E0A\u4F4D${sampled.length}\u4EF6):` : `- Task counts (first ${sampled.length} lists):`
662
+ );
663
+ sections.push("");
664
+ sections.push("| List | Tasks |");
665
+ sections.push("|------|-------|");
666
+ for (let i = 0; i < sampled.length; i++) {
667
+ const list = sampled[i];
668
+ const count = counts[i] ?? "-";
669
+ const safeName = list.name.replace(/\|/g, "\\|");
670
+ sections.push(`| ${safeName} | ${count} |`);
671
+ }
672
+ if (folderlessLists.length > sampled.length) {
673
+ sections.push(
674
+ "",
675
+ 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._`
676
+ );
677
+ }
678
+ }
639
679
  sections.push("");
640
680
  }
641
681
  return sections.join("\n");
@@ -766,7 +806,7 @@ var clickupConnector = new ConnectorPlugin({
766
806
  systemPrompt: {
767
807
  en: `### Tools
768
808
 
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\`.
809
+ - \`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
810
 
771
811
  ### Business Logic
772
812
 
@@ -852,7 +892,7 @@ export default async function handler(c: Context) {
852
892
  - POST \`/team/{team_id}/time_entries\` \u2014 Create a time entry`,
853
893
  ja: `### \u30C4\u30FC\u30EB
854
894
 
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
895
+ - \`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
896
 
857
897
  ### Business Logic
858
898
 
@@ -258,7 +258,7 @@ var ConnectorPlugin = class _ConnectorPlugin {
258
258
  /**
259
259
  * Create tools for connections that belong to this connector.
260
260
  * Filters connections by connectorKey internally.
261
- * Returns tools keyed as `${connectorKey}_${toolName}`.
261
+ * Returns tools keyed as `connector_${connectorKey}_${toolName}`.
262
262
  */
263
263
  createTools(connections, config, opts) {
264
264
  const myConnections = connections.filter(
@@ -268,7 +268,7 @@ var ConnectorPlugin = class _ConnectorPlugin {
268
268
  for (const t of Object.values(this.tools)) {
269
269
  const tool = t.createTool(myConnections, config);
270
270
  const originalToModelOutput = tool.toModelOutput;
271
- result[`${this.connectorKey}_${t.name}`] = {
271
+ result[`connector_${this.connectorKey}_${t.name}`] = {
272
272
  ...tool,
273
273
  toModelOutput: async (options) => {
274
274
  if (!originalToModelOutput) {
@@ -398,14 +398,14 @@ var AUTH_TYPES = {
398
398
  // ../connectors/src/connectors/cosmosdb/setup.ts
399
399
  var cosmosdbOnboarding = new ConnectorOnboarding({
400
400
  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"
401
+ en: `1. Use connector_cosmosdb_listContainers to list all containers in the configured database
402
+ 2. For key containers, sample documents with connector_cosmosdb_query: container="users", sql="SELECT TOP 5 * FROM c"
403
403
  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"
404
+ 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\``,
405
+ 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
406
+ 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
407
  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\``
408
+ 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
409
  }
410
410
  });
411
411
 
@@ -717,8 +717,8 @@ var cosmosdbConnector = new ConnectorPlugin({
717
717
  systemPrompt: {
718
718
  en: `### Tools
719
719
 
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).
720
+ - \`connector_cosmosdb_listContainers\`: Lists all containers in the configured database, with their partition key paths. Use this first to explore available data.
721
+ - \`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
722
 
723
723
  ### Business Logic
724
724
 
@@ -763,8 +763,8 @@ export default async function handler(_c: Context) {
763
763
  - Always bound results with \`TOP n\` and prefer scoped queries with a \`partitionKey\` value when possible \u2014 cross-partition queries cost more RUs.`,
764
764
  ja: `### \u30C4\u30FC\u30EB
765
765
 
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
766
+ - \`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
767
+ - \`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
768
 
769
769
  ### Business Logic
770
770
 
@@ -295,7 +295,7 @@ var ConnectorPlugin = class _ConnectorPlugin {
295
295
  /**
296
296
  * Create tools for connections that belong to this connector.
297
297
  * Filters connections by connectorKey internally.
298
- * Returns tools keyed as `${connectorKey}_${toolName}`.
298
+ * Returns tools keyed as `connector_${connectorKey}_${toolName}`.
299
299
  */
300
300
  createTools(connections, config, opts) {
301
301
  const myConnections = connections.filter(
@@ -305,7 +305,7 @@ var ConnectorPlugin = class _ConnectorPlugin {
305
305
  for (const t of Object.values(this.tools)) {
306
306
  const tool = t.createTool(myConnections, config);
307
307
  const originalToModelOutput = tool.toModelOutput;
308
- result[`${this.connectorKey}_${t.name}`] = {
308
+ result[`connector_${this.connectorKey}_${t.name}`] = {
309
309
  ...tool,
310
310
  toModelOutput: async (options) => {
311
311
  if (!originalToModelOutput) {
@@ -430,12 +430,12 @@ var AUTH_TYPES = {
430
430
  // ../connectors/src/connectors/customerio/setup.ts
431
431
  var customerioOnboarding = new ConnectorOnboarding({
432
432
  dataOverviewInstructions: {
433
- en: `1. Call customerio_request with GET /v1/segments to list all segments
434
- 2. Call customerio_request with GET /v1/campaigns to list all campaigns
433
+ en: `1. Call connector_customerio_request with GET /v1/segments to list all segments
434
+ 2. Call connector_customerio_request with GET /v1/campaigns to list all campaigns
435
435
  3. Pick a segment and call GET /v1/segments/{segment_id}/membership to view member IDs
436
436
  4. Pick a customer ID and call GET /v1/customers/{id}/attributes to view customer attributes`,
437
- ja: `1. customerio_request \u3067 GET /v1/segments \u3092\u547C\u3073\u51FA\u3057\u3001\u5168\u30BB\u30B0\u30E1\u30F3\u30C8\u4E00\u89A7\u3092\u53D6\u5F97
438
- 2. customerio_request \u3067 GET /v1/campaigns \u3092\u547C\u3073\u51FA\u3057\u3001\u5168\u30AD\u30E3\u30F3\u30DA\u30FC\u30F3\u4E00\u89A7\u3092\u53D6\u5F97
437
+ ja: `1. connector_customerio_request \u3067 GET /v1/segments \u3092\u547C\u3073\u51FA\u3057\u3001\u5168\u30BB\u30B0\u30E1\u30F3\u30C8\u4E00\u89A7\u3092\u53D6\u5F97
438
+ 2. connector_customerio_request \u3067 GET /v1/campaigns \u3092\u547C\u3073\u51FA\u3057\u3001\u5168\u30AD\u30E3\u30F3\u30DA\u30FC\u30F3\u4E00\u89A7\u3092\u53D6\u5F97
439
439
  3. \u30BB\u30B0\u30E1\u30F3\u30C8\u3092\u9078\u629E\u3057 GET /v1/segments/{segment_id}/membership \u3067\u30E1\u30F3\u30D0\u30FCID\u3092\u78BA\u8A8D
440
440
  4. \u9867\u5BA2ID\u3092\u9078\u629E\u3057 GET /v1/customers/{id}/attributes \u3067\u9867\u5BA2\u5C5E\u6027\u3092\u78BA\u8A8D`
441
441
  }
@@ -667,7 +667,7 @@ var customerioConnector = new ConnectorPlugin({
667
667
  systemPrompt: {
668
668
  en: `### Tools
669
669
 
670
- - \`customerio_request\`: The only way to call the Customer.io App API. Use it to read customer data, manage campaigns and segments, send transactional messages, and trigger broadcasts. Authentication (Bearer token with App API Key) is configured automatically.
670
+ - \`connector_customerio_request\`: The only way to call the Customer.io App API. Use it to read customer data, manage campaigns and segments, send transactional messages, and trigger broadcasts. Authentication (Bearer token with App API Key) is configured automatically.
671
671
 
672
672
  ### Business Logic
673
673
 
@@ -751,7 +751,7 @@ export default async function handler(c: Context) {
751
751
  - Pagination uses cursor-based \`start\` parameter for customer listing`,
752
752
  ja: `### \u30C4\u30FC\u30EB
753
753
 
754
- - \`customerio_request\`: Customer.io App API\u3092\u547C\u3073\u51FA\u3059\u552F\u4E00\u306E\u624B\u6BB5\u3067\u3059\u3002\u9867\u5BA2\u30C7\u30FC\u30BF\u306E\u8AAD\u307F\u53D6\u308A\u3001\u30AD\u30E3\u30F3\u30DA\u30FC\u30F3\u3084\u30BB\u30B0\u30E1\u30F3\u30C8\u306E\u7BA1\u7406\u3001\u30C8\u30E9\u30F3\u30B6\u30AF\u30B7\u30E7\u30F3\u30E1\u30C3\u30BB\u30FC\u30B8\u306E\u9001\u4FE1\u3001\u30D6\u30ED\u30FC\u30C9\u30AD\u30E3\u30B9\u30C8\u306E\u30C8\u30EA\u30AC\u30FC\u306B\u4F7F\u7528\u3057\u307E\u3059\u3002\u8A8D\u8A3C\uFF08App API\u30AD\u30FC\u306B\u3088\u308BBearer\u30C8\u30FC\u30AF\u30F3\uFF09\u306F\u81EA\u52D5\u7684\u306B\u8A2D\u5B9A\u3055\u308C\u307E\u3059\u3002
754
+ - \`connector_customerio_request\`: Customer.io App API\u3092\u547C\u3073\u51FA\u3059\u552F\u4E00\u306E\u624B\u6BB5\u3067\u3059\u3002\u9867\u5BA2\u30C7\u30FC\u30BF\u306E\u8AAD\u307F\u53D6\u308A\u3001\u30AD\u30E3\u30F3\u30DA\u30FC\u30F3\u3084\u30BB\u30B0\u30E1\u30F3\u30C8\u306E\u7BA1\u7406\u3001\u30C8\u30E9\u30F3\u30B6\u30AF\u30B7\u30E7\u30F3\u30E1\u30C3\u30BB\u30FC\u30B8\u306E\u9001\u4FE1\u3001\u30D6\u30ED\u30FC\u30C9\u30AD\u30E3\u30B9\u30C8\u306E\u30C8\u30EA\u30AC\u30FC\u306B\u4F7F\u7528\u3057\u307E\u3059\u3002\u8A8D\u8A3C\uFF08App API\u30AD\u30FC\u306B\u3088\u308BBearer\u30C8\u30FC\u30AF\u30F3\uFF09\u306F\u81EA\u52D5\u7684\u306B\u8A2D\u5B9A\u3055\u308C\u307E\u3059\u3002
755
755
 
756
756
  ### Business Logic
757
757