@squadbase/vite-server 0.1.9-dev.f236b23 → 0.1.10-dev.5aa0720

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli/index.js CHANGED
@@ -910,17 +910,17 @@ var require_nacl_fast = __commonJS({
910
910
  }
911
911
  var sigma = new Uint8Array([101, 120, 112, 97, 110, 100, 32, 51, 50, 45, 98, 121, 116, 101, 32, 107]);
912
912
  function crypto_stream_salsa20_xor(c6, cpos, m4, mpos, b6, n2, k6) {
913
- var z96 = new Uint8Array(16), x = new Uint8Array(64);
913
+ var z98 = new Uint8Array(16), x = new Uint8Array(64);
914
914
  var u, i6;
915
- for (i6 = 0; i6 < 16; i6++) z96[i6] = 0;
916
- for (i6 = 0; i6 < 8; i6++) z96[i6] = n2[i6];
915
+ for (i6 = 0; i6 < 16; i6++) z98[i6] = 0;
916
+ for (i6 = 0; i6 < 8; i6++) z98[i6] = n2[i6];
917
917
  while (b6 >= 64) {
918
- crypto_core_salsa20(x, z96, k6, sigma);
918
+ crypto_core_salsa20(x, z98, k6, sigma);
919
919
  for (i6 = 0; i6 < 64; i6++) c6[cpos + i6] = m4[mpos + i6] ^ x[i6];
920
920
  u = 1;
921
921
  for (i6 = 8; i6 < 16; i6++) {
922
- u = u + (z96[i6] & 255) | 0;
923
- z96[i6] = u & 255;
922
+ u = u + (z98[i6] & 255) | 0;
923
+ z98[i6] = u & 255;
924
924
  u >>>= 8;
925
925
  }
926
926
  b6 -= 64;
@@ -928,30 +928,30 @@ var require_nacl_fast = __commonJS({
928
928
  mpos += 64;
929
929
  }
930
930
  if (b6 > 0) {
931
- crypto_core_salsa20(x, z96, k6, sigma);
931
+ crypto_core_salsa20(x, z98, k6, sigma);
932
932
  for (i6 = 0; i6 < b6; i6++) c6[cpos + i6] = m4[mpos + i6] ^ x[i6];
933
933
  }
934
934
  return 0;
935
935
  }
936
936
  function crypto_stream_salsa20(c6, cpos, b6, n2, k6) {
937
- var z96 = new Uint8Array(16), x = new Uint8Array(64);
937
+ var z98 = new Uint8Array(16), x = new Uint8Array(64);
938
938
  var u, i6;
939
- for (i6 = 0; i6 < 16; i6++) z96[i6] = 0;
940
- for (i6 = 0; i6 < 8; i6++) z96[i6] = n2[i6];
939
+ for (i6 = 0; i6 < 16; i6++) z98[i6] = 0;
940
+ for (i6 = 0; i6 < 8; i6++) z98[i6] = n2[i6];
941
941
  while (b6 >= 64) {
942
- crypto_core_salsa20(x, z96, k6, sigma);
942
+ crypto_core_salsa20(x, z98, k6, sigma);
943
943
  for (i6 = 0; i6 < 64; i6++) c6[cpos + i6] = x[i6];
944
944
  u = 1;
945
945
  for (i6 = 8; i6 < 16; i6++) {
946
- u = u + (z96[i6] & 255) | 0;
947
- z96[i6] = u & 255;
946
+ u = u + (z98[i6] & 255) | 0;
947
+ z98[i6] = u & 255;
948
948
  u >>>= 8;
949
949
  }
950
950
  b6 -= 64;
951
951
  cpos += 64;
952
952
  }
953
953
  if (b6 > 0) {
954
- crypto_core_salsa20(x, z96, k6, sigma);
954
+ crypto_core_salsa20(x, z98, k6, sigma);
955
955
  for (i6 = 0; i6 < b6; i6++) c6[cpos + i6] = x[i6];
956
956
  }
957
957
  return 0;
@@ -1831,12 +1831,12 @@ var require_nacl_fast = __commonJS({
1831
1831
  for (a6 = 0; a6 < 16; a6++) o2[a6] = c6[a6];
1832
1832
  }
1833
1833
  function crypto_scalarmult(q2, n2, p2) {
1834
- var z96 = new Uint8Array(32);
1834
+ var z98 = new Uint8Array(32);
1835
1835
  var x = new Float64Array(80), r6, i6;
1836
1836
  var a6 = gf(), b6 = gf(), c6 = gf(), d6 = gf(), e6 = gf(), f6 = gf();
1837
- for (i6 = 0; i6 < 31; i6++) z96[i6] = n2[i6];
1838
- z96[31] = n2[31] & 127 | 64;
1839
- z96[0] &= 248;
1837
+ for (i6 = 0; i6 < 31; i6++) z98[i6] = n2[i6];
1838
+ z98[31] = n2[31] & 127 | 64;
1839
+ z98[0] &= 248;
1840
1840
  unpack25519(x, p2);
1841
1841
  for (i6 = 0; i6 < 16; i6++) {
1842
1842
  b6[i6] = x[i6];
@@ -1844,7 +1844,7 @@ var require_nacl_fast = __commonJS({
1844
1844
  }
1845
1845
  a6[0] = d6[0] = 1;
1846
1846
  for (i6 = 254; i6 >= 0; --i6) {
1847
- r6 = z96[i6 >>> 3] >>> (i6 & 7) & 1;
1847
+ r6 = z98[i6 >>> 3] >>> (i6 & 7) & 1;
1848
1848
  sel25519(a6, b6, r6);
1849
1849
  sel25519(c6, d6, r6);
1850
1850
  A(e6, a6, c6);
@@ -4861,8 +4861,8 @@ var require_poly1305 = __commonJS({
4861
4861
  });
4862
4862
  var u = {}, w;
4863
4863
  for (w in b6) b6.hasOwnProperty(w) && (u[w] = b6[w]);
4864
- var x = "object" === typeof window, y = "function" === typeof importScripts, z96 = "object" === typeof process && "object" === typeof process.versions && "string" === typeof process.versions.node, B = "", C, D, E, F, G;
4865
- if (z96) B = y ? __require("path").dirname(B) + "/" : __dirname + "/", C = function(a6, c6) {
4864
+ var x = "object" === typeof window, y = "function" === typeof importScripts, z98 = "object" === typeof process && "object" === typeof process.versions && "string" === typeof process.versions.node, B = "", C, D, E, F, G;
4865
+ if (z98) B = y ? __require("path").dirname(B) + "/" : __dirname + "/", C = function(a6, c6) {
4866
4866
  var d6 = H(a6);
4867
4867
  if (d6) return c6 ? d6 : d6.toString();
4868
4868
  F || (F = __require("fs"));
@@ -5118,7 +5118,7 @@ var require_poly1305 = __commonJS({
5118
5118
  function H(a6) {
5119
5119
  if (a6.startsWith(V)) {
5120
5120
  a6 = a6.slice(V.length);
5121
- if ("boolean" === typeof z96 && z96) {
5121
+ if ("boolean" === typeof z98 && z98) {
5122
5122
  var c6 = Buffer.from(a6, "base64");
5123
5123
  c6 = new Uint8Array(c6.buffer, c6.byteOffset, c6.byteLength);
5124
5124
  } else try {
@@ -39041,14 +39041,14 @@ var init_NormalizedSchema = __esm({
39041
39041
  throw new Error("@smithy/core/schema - cannot iterate non-struct schema.");
39042
39042
  }
39043
39043
  const struct = this.getSchema();
39044
- const z96 = struct[4].length;
39044
+ const z98 = struct[4].length;
39045
39045
  let it = struct[anno.it];
39046
- if (it && z96 === it.length) {
39046
+ if (it && z98 === it.length) {
39047
39047
  yield* it;
39048
39048
  return;
39049
39049
  }
39050
- it = Array(z96);
39051
- for (let i6 = 0; i6 < z96; ++i6) {
39050
+ it = Array(z98);
39051
+ for (let i6 = 0; i6 < z98; ++i6) {
39052
39052
  const k6 = struct[4][i6];
39053
39053
  const v = member([struct[5][i6], 0], k6);
39054
39054
  yield it[i6] = [k6, v];
@@ -39729,12 +39729,12 @@ var init_split_header = __esm({
39729
39729
  "../../node_modules/@smithy/core/dist-es/submodules/serde/split-header.js"() {
39730
39730
  "use strict";
39731
39731
  splitHeader = (value) => {
39732
- const z96 = value.length;
39732
+ const z98 = value.length;
39733
39733
  const values = [];
39734
39734
  let withinQuotes = false;
39735
39735
  let prevChar = void 0;
39736
39736
  let anchor = 0;
39737
- for (let i6 = 0; i6 < z96; ++i6) {
39737
+ for (let i6 = 0; i6 < z98; ++i6) {
39738
39738
  const char = value[i6];
39739
39739
  switch (char) {
39740
39740
  case `"`:
@@ -39755,12 +39755,12 @@ var init_split_header = __esm({
39755
39755
  values.push(value.slice(anchor));
39756
39756
  return values.map((v) => {
39757
39757
  v = v.trim();
39758
- const z97 = v.length;
39759
- if (z97 < 2) {
39758
+ const z99 = v.length;
39759
+ if (z99 < 2) {
39760
39760
  return v;
39761
39761
  }
39762
- if (v[0] === `"` && v[z97 - 1] === `"`) {
39763
- v = v.slice(1, z97 - 1);
39762
+ if (v[0] === `"` && v[z99 - 1] === `"`) {
39763
+ v = v.slice(1, z99 - 1);
39764
39764
  }
39765
39765
  return v.replace(/\\"/g, '"');
39766
39766
  });
@@ -41197,11 +41197,11 @@ var init_EndpointCache = __esm({
41197
41197
  }
41198
41198
  hash(endpointParams) {
41199
41199
  let buffer = "";
41200
- const { parameters: parameters79 } = this;
41201
- if (parameters79.length === 0) {
41200
+ const { parameters: parameters80 } = this;
41201
+ if (parameters80.length === 0) {
41202
41202
  return false;
41203
41203
  }
41204
- for (const param of parameters79) {
41204
+ for (const param of parameters80) {
41205
41205
  const val = String(endpointParams[param] ?? "");
41206
41206
  if (val.includes("|;")) {
41207
41207
  return false;
@@ -47673,8 +47673,8 @@ var init_ProtocolLib = __esm({
47673
47673
  constructor(queryCompat = false) {
47674
47674
  this.queryCompat = queryCompat;
47675
47675
  }
47676
- resolveRestContentType(defaultContentType, inputSchema95) {
47677
- const members = inputSchema95.getMemberSchemas();
47676
+ resolveRestContentType(defaultContentType, inputSchema97) {
47677
+ const members = inputSchema97.getMemberSchemas();
47678
47678
  const httpPayloadMember = Object.values(members).find((m4) => {
47679
47679
  return !!m4.getMergedTraits().httpPayload;
47680
47680
  });
@@ -47689,7 +47689,7 @@ var init_ProtocolLib = __esm({
47689
47689
  } else {
47690
47690
  return defaultContentType;
47691
47691
  }
47692
- } else if (!inputSchema95.isUnitSchema()) {
47692
+ } else if (!inputSchema97.isUnitSchema()) {
47693
47693
  const hasBody = Object.values(members).find((m4) => {
47694
47694
  const { httpQuery, httpQueryParams, httpHeader, httpLabel, httpPrefixHeaders } = m4.getMergedTraits();
47695
47695
  const noPrefixHeaders = httpPrefixHeaders === void 0;
@@ -48542,9 +48542,9 @@ var init_AwsRestJsonProtocol = __esm({
48542
48542
  }
48543
48543
  async serializeRequest(operationSchema, input, context) {
48544
48544
  const request2 = await super.serializeRequest(operationSchema, input, context);
48545
- const inputSchema95 = NormalizedSchema.of(operationSchema.input);
48545
+ const inputSchema97 = NormalizedSchema.of(operationSchema.input);
48546
48546
  if (!request2.headers["content-type"]) {
48547
- const contentType = this.mixin.resolveRestContentType(this.getDefaultContentType(), inputSchema95);
48547
+ const contentType = this.mixin.resolveRestContentType(this.getDefaultContentType(), inputSchema97);
48548
48548
  if (contentType) {
48549
48549
  request2.headers["content-type"] = contentType;
48550
48550
  }
@@ -48556,8 +48556,8 @@ var init_AwsRestJsonProtocol = __esm({
48556
48556
  }
48557
48557
  async deserializeResponse(operationSchema, context, response) {
48558
48558
  const output = await super.deserializeResponse(operationSchema, context, response);
48559
- const outputSchema95 = NormalizedSchema.of(operationSchema.output);
48560
- for (const [name, member2] of outputSchema95.structIterator()) {
48559
+ const outputSchema97 = NormalizedSchema.of(operationSchema.output);
48560
+ for (const [name, member2] of outputSchema97.structIterator()) {
48561
48561
  if (member2.getMemberTraits().httpPayload && !(name in output)) {
48562
48562
  output[name] = null;
48563
48563
  }
@@ -54375,22 +54375,22 @@ var init_loadCognitoIdentity = __esm({
54375
54375
  });
54376
54376
 
54377
54377
  // ../../node_modules/@aws-sdk/credential-provider-cognito-identity/dist-es/fromCognitoIdentity.js
54378
- function fromCognitoIdentity(parameters79) {
54378
+ function fromCognitoIdentity(parameters80) {
54379
54379
  return async (awsIdentityProperties) => {
54380
- parameters79.logger?.debug("@aws-sdk/credential-provider-cognito-identity - fromCognitoIdentity");
54380
+ parameters80.logger?.debug("@aws-sdk/credential-provider-cognito-identity - fromCognitoIdentity");
54381
54381
  const { GetCredentialsForIdentityCommand: GetCredentialsForIdentityCommand2, CognitoIdentityClient: CognitoIdentityClient2 } = await Promise.resolve().then(() => (init_loadCognitoIdentity(), loadCognitoIdentity_exports));
54382
- const fromConfigs = (property) => parameters79.clientConfig?.[property] ?? parameters79.parentClientConfig?.[property] ?? awsIdentityProperties?.callerClientConfig?.[property];
54383
- const { Credentials: { AccessKeyId = throwOnMissingAccessKeyId(parameters79.logger), Expiration, SecretKey = throwOnMissingSecretKey(parameters79.logger), SessionToken } = throwOnMissingCredentials(parameters79.logger) } = await (parameters79.client ?? new CognitoIdentityClient2(Object.assign({}, parameters79.clientConfig ?? {}, {
54382
+ const fromConfigs = (property) => parameters80.clientConfig?.[property] ?? parameters80.parentClientConfig?.[property] ?? awsIdentityProperties?.callerClientConfig?.[property];
54383
+ const { Credentials: { AccessKeyId = throwOnMissingAccessKeyId(parameters80.logger), Expiration, SecretKey = throwOnMissingSecretKey(parameters80.logger), SessionToken } = throwOnMissingCredentials(parameters80.logger) } = await (parameters80.client ?? new CognitoIdentityClient2(Object.assign({}, parameters80.clientConfig ?? {}, {
54384
54384
  region: fromConfigs("region"),
54385
54385
  profile: fromConfigs("profile"),
54386
54386
  userAgentAppId: fromConfigs("userAgentAppId")
54387
54387
  }))).send(new GetCredentialsForIdentityCommand2({
54388
- CustomRoleArn: parameters79.customRoleArn,
54389
- IdentityId: parameters79.identityId,
54390
- Logins: parameters79.logins ? await resolveLogins(parameters79.logins) : void 0
54388
+ CustomRoleArn: parameters80.customRoleArn,
54389
+ IdentityId: parameters80.identityId,
54390
+ Logins: parameters80.logins ? await resolveLogins(parameters80.logins) : void 0
54391
54391
  }));
54392
54392
  return {
54393
- identityId: parameters79.identityId,
54393
+ identityId: parameters80.identityId,
54394
54394
  accessKeyId: AccessKeyId,
54395
54395
  secretAccessKey: SecretKey,
54396
54396
  sessionToken: SessionToken,
@@ -67147,11 +67147,11 @@ var require_bignumber = __commonJS({
67147
67147
  return n2 > 0 || n2 === i6 ? i6 : i6 - 1;
67148
67148
  }
67149
67149
  function coeffToString(a6) {
67150
- var s, z96, i6 = 1, j6 = a6.length, r6 = a6[0] + "";
67150
+ var s, z98, i6 = 1, j6 = a6.length, r6 = a6[0] + "";
67151
67151
  for (; i6 < j6; ) {
67152
67152
  s = a6[i6++] + "";
67153
- z96 = LOG_BASE - s.length;
67154
- for (; z96--; s = "0" + s) ;
67153
+ z98 = LOG_BASE - s.length;
67154
+ for (; z98--; s = "0" + s) ;
67155
67155
  r6 += s;
67156
67156
  }
67157
67157
  for (j6 = r6.length; r6.charCodeAt(--j6) === 48; ) ;
@@ -67184,15 +67184,15 @@ var require_bignumber = __commonJS({
67184
67184
  function toExponential(str, e6) {
67185
67185
  return (str.length > 1 ? str.charAt(0) + "." + str.slice(1) : str) + (e6 < 0 ? "e" : "e+") + e6;
67186
67186
  }
67187
- function toFixedPoint(str, e6, z96) {
67187
+ function toFixedPoint(str, e6, z98) {
67188
67188
  var len, zs;
67189
67189
  if (e6 < 0) {
67190
- for (zs = z96 + "."; ++e6; zs += z96) ;
67190
+ for (zs = z98 + "."; ++e6; zs += z98) ;
67191
67191
  str = zs + str;
67192
67192
  } else {
67193
67193
  len = str.length;
67194
67194
  if (++e6 > len) {
67195
- for (zs = z96, e6 -= len; --e6; zs += z96) ;
67195
+ for (zs = z98, e6 -= len; --e6; zs += z98) ;
67196
67196
  str += zs;
67197
67197
  } else if (e6 < len) {
67198
67198
  str = str.slice(0, e6) + "." + str.slice(e6);
@@ -89708,6 +89708,12 @@ var NOOP_TUNNEL = (connectionUrl) => ({
89708
89708
  close: async () => {
89709
89709
  }
89710
89710
  });
89711
+ var NOOP_TUNNEL_HOSTPORT = (host, port) => ({
89712
+ host,
89713
+ port,
89714
+ close: async () => {
89715
+ }
89716
+ });
89711
89717
  function connectionParamsToRecord(connection) {
89712
89718
  const out = {};
89713
89719
  for (const p2 of connection.parameters) {
@@ -89715,9 +89721,9 @@ function connectionParamsToRecord(connection) {
89715
89721
  }
89716
89722
  return out;
89717
89723
  }
89718
- async function maybeOpenSshTunnel(params, connectionUrl, defaultDbPort) {
89724
+ async function maybeOpenSshTunnelHostPort(params, dbHost, dbPort) {
89719
89725
  const sshHost = params[sshTunnelParameters.sshHost.slug];
89720
- if (!sshHost) return NOOP_TUNNEL(connectionUrl);
89726
+ if (!sshHost) return NOOP_TUNNEL_HOSTPORT(dbHost, dbPort);
89721
89727
  const sshUsername = params[sshTunnelParameters.sshUsername.slug];
89722
89728
  const sshPrivateKeyBase64 = params[sshTunnelParameters.sshPrivateKeyBase64.slug];
89723
89729
  if (!sshUsername || !sshPrivateKeyBase64) {
@@ -89727,9 +89733,6 @@ async function maybeOpenSshTunnel(params, connectionUrl, defaultDbPort) {
89727
89733
  }
89728
89734
  const sshPort = Number(params[sshTunnelParameters.sshPort.slug] || "22") || 22;
89729
89735
  const sshPassphrase = params[sshTunnelParameters.sshPassphrase.slug];
89730
- const url = new URL(connectionUrl);
89731
- const dbHost = url.hostname;
89732
- const dbPort = url.port ? Number(url.port) : defaultDbPort;
89733
89736
  const [{ Client: Client2 }, net] = await Promise.all([
89734
89737
  Promise.resolve().then(() => __toESM(require_lib3(), 1)),
89735
89738
  import("net")
@@ -89772,16 +89775,29 @@ async function maybeOpenSshTunnel(params, connectionUrl, defaultDbPort) {
89772
89775
  sshClient.end();
89773
89776
  throw new Error("Failed to allocate local port for SSH tunnel.");
89774
89777
  }
89775
- url.hostname = "127.0.0.1";
89776
- url.port = String(address.port);
89777
89778
  return {
89778
- connectionUrl: url.toString(),
89779
+ host: "127.0.0.1",
89780
+ port: address.port,
89779
89781
  close: async () => {
89780
89782
  await new Promise((resolve) => server.close(() => resolve()));
89781
89783
  sshClient.end();
89782
89784
  }
89783
89785
  };
89784
89786
  }
89787
+ async function maybeOpenSshTunnel(params, connectionUrl, defaultDbPort) {
89788
+ const sshHost = params[sshTunnelParameters.sshHost.slug];
89789
+ if (!sshHost) return NOOP_TUNNEL(connectionUrl);
89790
+ const url = new URL(connectionUrl);
89791
+ const dbHost = url.hostname;
89792
+ const dbPort = url.port ? Number(url.port) : defaultDbPort;
89793
+ const tunnel = await maybeOpenSshTunnelHostPort(params, dbHost, dbPort);
89794
+ url.hostname = tunnel.host;
89795
+ url.port = String(tunnel.port);
89796
+ return {
89797
+ connectionUrl: url.toString(),
89798
+ close: tunnel.close
89799
+ };
89800
+ }
89785
89801
 
89786
89802
  // ../connectors/src/connectors/postgresql/setup.ts
89787
89803
  var postgresqlOnboarding = new ConnectorOnboarding({
@@ -91923,9 +91939,16 @@ A Filter is an Expression. Leaves are \`Dimensions\`, \`Tags\`, or \`CostCategor
91923
91939
 
91924
91940
  ### Business Logic
91925
91941
 
91926
- The business logic type for this connector is "typescript". The connector exposes resolved AWS credentials via \`connection(connectionId)\`; pass them to \`@aws-sdk/client-cost-explorer\` directly inside the handler. Do NOT read AWS credentials from environment variables.
91942
+ The business logic type for this connector is "typescript". The connector exposes resolved AWS credentials via \`connection(connectionId)\` (already typed as \`{ accessKeyId, secretAccessKey, region }\` \u2014 do NOT add an \`as\` cast). Pass them to \`@aws-sdk/client-cost-explorer\` directly inside the handler. Do NOT read AWS credentials from environment variables.
91927
91943
 
91928
- #### Example
91944
+ #### Server logic slug naming
91945
+
91946
+ When creating a server logic for this connector, the \`slug\` (file name) MUST be lowercase kebab-case or snake_case \u2014 only \`[a-z0-9-_]\` is allowed. camelCase and uppercase will fail validation.
91947
+
91948
+ - OK: \`monthly-cost-trend\`, \`cost_by_service\`, \`top10-services\`
91949
+ - NG: \`monthlyCostTrend\`, \`MonthlyCostTrend\`, \`monthly cost trend\`
91950
+
91951
+ #### Example (slug: \`monthly-cost-trend\`)
91929
91952
 
91930
91953
  \`\`\`ts
91931
91954
  import type { Context } from "hono";
@@ -92001,9 +92024,16 @@ Filter \u306F Expression \u3067\u3059\u3002\u30EA\u30FC\u30D5\u306F \`Dimensions
92001
92024
 
92002
92025
  ### Business Logic
92003
92026
 
92004
- \u3053\u306E\u30B3\u30CD\u30AF\u30BF\u306E\u30D3\u30B8\u30CD\u30B9\u30ED\u30B8\u30C3\u30AF\u30BF\u30A4\u30D7\u306F "typescript" \u3067\u3059\u3002\`connection(connectionId)\` \u3067\u89E3\u6C7A\u6E08\u307F\u306E AWS \u8A8D\u8A3C\u60C5\u5831\u3092\u53D6\u5F97\u3057\u3001\`@aws-sdk/client-cost-explorer\` \u306B\u76F4\u63A5\u6E21\u3057\u3066\u30CF\u30F3\u30C9\u30E9\u5185\u3067\u5229\u7528\u3057\u3066\u304F\u3060\u3055\u3044\u3002\u74B0\u5883\u5909\u6570\u304B\u3089 AWS \u8A8D\u8A3C\u60C5\u5831\u3092\u8AAD\u307F\u53D6\u3089\u306A\u3044\u3067\u304F\u3060\u3055\u3044\u3002
92027
+ \u3053\u306E\u30B3\u30CD\u30AF\u30BF\u306E\u30D3\u30B8\u30CD\u30B9\u30ED\u30B8\u30C3\u30AF\u30BF\u30A4\u30D7\u306F "typescript" \u3067\u3059\u3002\`connection(connectionId)\` \u3067\u89E3\u6C7A\u6E08\u307F\u306E AWS \u8A8D\u8A3C\u60C5\u5831\uFF08\`{ accessKeyId, secretAccessKey, region }\` \u3068\u3057\u3066\u578B\u4ED8\u3051\u6E08\u307F \u2014 \`as\` \u30AD\u30E3\u30B9\u30C8\u306F\u4E0D\u8981\uFF09\u3092\u53D6\u5F97\u3057\u3001\`@aws-sdk/client-cost-explorer\` \u306B\u76F4\u63A5\u6E21\u3057\u3066\u30CF\u30F3\u30C9\u30E9\u5185\u3067\u5229\u7528\u3057\u3066\u304F\u3060\u3055\u3044\u3002\u74B0\u5883\u5909\u6570\u304B\u3089 AWS \u8A8D\u8A3C\u60C5\u5831\u3092\u8AAD\u307F\u53D6\u3089\u306A\u3044\u3067\u304F\u3060\u3055\u3044\u3002
92005
92028
 
92006
- #### Example
92029
+ #### \u30B5\u30FC\u30D0\u30FC\u30ED\u30B8\u30C3\u30AF\u306E slug \u547D\u540D\u898F\u5247
92030
+
92031
+ \u3053\u306E\u30B3\u30CD\u30AF\u30BF\u7528\u306E\u30B5\u30FC\u30D0\u30FC\u30ED\u30B8\u30C3\u30AF\u3092\u4F5C\u6210\u3059\u308B\u969B\u3001\`slug\`\uFF08\u30D5\u30A1\u30A4\u30EB\u540D\uFF09\u306F **\u5C0F\u6587\u5B57\u306E kebab-case \u307E\u305F\u306F snake_case** \u306B\u3057\u3066\u304F\u3060\u3055\u3044\uFF08\u8A31\u5BB9\u6587\u5B57\u306F \`[a-z0-9-_]\` \u306E\u307F\uFF09\u3002camelCase \u3084\u5927\u6587\u5B57\u3092\u542B\u3080\u3068\u30D0\u30EA\u30C7\u30FC\u30B7\u30E7\u30F3\u30A8\u30E9\u30FC\u306B\u306A\u308A\u307E\u3059\u3002
92032
+
92033
+ - OK: \`monthly-cost-trend\`\u3001\`cost_by_service\`\u3001\`top10-services\`
92034
+ - NG: \`monthlyCostTrend\`\u3001\`MonthlyCostTrend\`\u3001\`monthly cost trend\`
92035
+
92036
+ #### Example\uFF08slug: \`monthly-cost-trend\`\uFF09
92007
92037
 
92008
92038
  \`\`\`ts
92009
92039
  import type { Context } from "hono";
@@ -111442,17 +111472,27 @@ async function importMssql() {
111442
111472
  }
111443
111473
  async function runMssqlQuery(parsed, sql, options = {}) {
111444
111474
  const sqlMod = await importMssql();
111445
- const config = toMssqlConfig(parsed, {
111446
- encrypt: options.forceEncrypt
111447
- });
111448
- const pool = new sqlMod.ConnectionPool(config);
111449
- await pool.connect();
111475
+ const tunnel = options.tunnelParams ? await maybeOpenSshTunnelHostPort(
111476
+ options.tunnelParams,
111477
+ parsed.server,
111478
+ parsed.port
111479
+ ) : null;
111450
111480
  try {
111451
- const result = await pool.request().query(sql);
111452
- const recordset = result.recordset ?? [];
111453
- return { rows: recordset };
111481
+ const tunneled = tunnel ? { ...parsed, server: tunnel.host, port: tunnel.port } : parsed;
111482
+ const config = toMssqlConfig(tunneled, {
111483
+ encrypt: options.forceEncrypt
111484
+ });
111485
+ const pool = new sqlMod.ConnectionPool(config);
111486
+ await pool.connect();
111487
+ try {
111488
+ const result = await pool.request().query(sql);
111489
+ const recordset = result.recordset ?? [];
111490
+ return { rows: recordset };
111491
+ } finally {
111492
+ await pool.close();
111493
+ }
111454
111494
  } finally {
111455
- await pool.close();
111495
+ await tunnel?.close();
111456
111496
  }
111457
111497
  }
111458
111498
  async function checkMssqlConnection(url, credentials, options = {}) {
@@ -111540,35 +111580,69 @@ function parseOracleJdbcUrl(jdbcUrl, options = {}) {
111540
111580
  function redactOracleUrl(jdbcUrl) {
111541
111581
  return jdbcUrl.replace(/(:\/\/)([^@/]+)@/, "$1***@").replace(/(thin:)([^@]+)@/i, "$1***@");
111542
111582
  }
111583
+ function parseOracleConnectStringHostPort(connectString) {
111584
+ const m4 = /^([^:/]+):(\d+)(.*)$/.exec(connectString);
111585
+ if (!m4) return null;
111586
+ return { host: m4[1], port: Number(m4[2]), trailing: m4[3] };
111587
+ }
111588
+ function rewriteOracleConnectStringHostPort(connectString, host, port) {
111589
+ const parts = parseOracleConnectStringHostPort(connectString);
111590
+ if (!parts) return connectString;
111591
+ return `${host}:${port}${parts.trailing}`;
111592
+ }
111543
111593
 
111544
111594
  // ../connectors/src/lib/oracle-runner.ts
111545
111595
  async function importOracleDb() {
111546
111596
  const mod = await import("oracledb");
111547
111597
  return mod.default ?? mod;
111548
111598
  }
111549
- async function runOracleQuery(parsed, sql) {
111599
+ async function runOracleQuery(parsed, sql, options = {}) {
111550
111600
  const oracledb = await importOracleDb();
111551
- const connection = await oracledb.getConnection({
111552
- user: parsed.user,
111553
- password: parsed.password,
111554
- connectString: parsed.connectString
111555
- });
111601
+ let tunnel = null;
111602
+ if (options.tunnelParams) {
111603
+ const hostPort = parseOracleConnectStringHostPort(parsed.connectString);
111604
+ if (hostPort) {
111605
+ tunnel = await maybeOpenSshTunnelHostPort(
111606
+ options.tunnelParams,
111607
+ hostPort.host,
111608
+ hostPort.port
111609
+ );
111610
+ }
111611
+ }
111556
111612
  try {
111557
- const result = await connection.execute(sql, [], {
111558
- outFormat: oracledb.OUT_FORMAT_OBJECT,
111559
- // Bound by the connector's own row cap, but keep the driver from
111560
- // streaming arbitrarily large result sets.
111561
- maxRows: 5e3
111613
+ const connectString = tunnel ? rewriteOracleConnectStringHostPort(
111614
+ parsed.connectString,
111615
+ tunnel.host,
111616
+ tunnel.port
111617
+ ) : parsed.connectString;
111618
+ const connection = await oracledb.getConnection({
111619
+ user: parsed.user,
111620
+ password: parsed.password,
111621
+ connectString
111562
111622
  });
111563
- return { rows: result.rows ?? [] };
111564
- } finally {
111565
111623
  try {
111566
- await connection.close();
111567
- } catch {
111624
+ const result = await connection.execute(
111625
+ sql,
111626
+ [],
111627
+ {
111628
+ outFormat: oracledb.OUT_FORMAT_OBJECT,
111629
+ // Bound by the connector's own row cap, but keep the driver from
111630
+ // streaming arbitrarily large result sets.
111631
+ maxRows: 5e3
111632
+ }
111633
+ );
111634
+ return { rows: result.rows ?? [] };
111635
+ } finally {
111636
+ try {
111637
+ await connection.close();
111638
+ } catch {
111639
+ }
111568
111640
  }
111641
+ } finally {
111642
+ await tunnel?.close();
111569
111643
  }
111570
111644
  }
111571
- async function checkOracleConnection(url, credentials) {
111645
+ async function checkOracleConnection(url, credentials, options = {}) {
111572
111646
  let parsed;
111573
111647
  try {
111574
111648
  parsed = parseOracleJdbcUrl(url, credentials);
@@ -111579,7 +111653,7 @@ async function checkOracleConnection(url, credentials) {
111579
111653
  };
111580
111654
  }
111581
111655
  try {
111582
- await runOracleQuery(parsed, "SELECT 1 FROM DUAL");
111656
+ await runOracleQuery(parsed, "SELECT 1 FROM DUAL", options);
111583
111657
  return { success: true };
111584
111658
  } catch (err) {
111585
111659
  let msg = err instanceof Error ? err.message : String(err);
@@ -111789,12 +111863,13 @@ Always bound results: LIMIT for PG/MySQL/Redshift, TOP for SQL Server, FETCH FIR
111789
111863
  };
111790
111864
  }
111791
111865
  try {
111866
+ const tunnelParams = connectionParamsToRecord(connection);
111792
111867
  if (parsed.driver === "sqlserver") {
111793
111868
  const mssqlParsed = parseSqlServerJdbcUrl(parsed.originalUrl, {
111794
111869
  username,
111795
111870
  password
111796
111871
  });
111797
- const result = await runMssqlQuery(mssqlParsed, sql);
111872
+ const result = await runMssqlQuery(mssqlParsed, sql, { tunnelParams });
111798
111873
  const rows = result.rows;
111799
111874
  return {
111800
111875
  success: true,
@@ -111809,7 +111884,9 @@ Always bound results: LIMIT for PG/MySQL/Redshift, TOP for SQL Server, FETCH FIR
111809
111884
  password
111810
111885
  });
111811
111886
  const cleanSql = sql.replace(/;\s*$/, "");
111812
- const result = await runOracleQuery(oracleParsed, cleanSql);
111887
+ const result = await runOracleQuery(oracleParsed, cleanSql, {
111888
+ tunnelParams
111889
+ });
111813
111890
  const rows = result.rows;
111814
111891
  return {
111815
111892
  success: true,
@@ -111821,7 +111898,7 @@ Always bound results: LIMIT for PG/MySQL/Redshift, TOP for SQL Server, FETCH FIR
111821
111898
  let tunnel;
111822
111899
  try {
111823
111900
  tunnel = await maybeOpenSshTunnel(
111824
- connectionParamsToRecord(connection),
111901
+ tunnelParams,
111825
111902
  parsed.nativeUrl,
111826
111903
  parsed.defaultPort
111827
111904
  );
@@ -111995,10 +112072,18 @@ JDBC URL \u306E\u30D7\u30EC\u30D5\u30A3\u30C3\u30AF\u30B9\u306B\u3088\u308A\u65B
111995
112072
  };
111996
112073
  }
111997
112074
  if (parsed.driver === "sqlserver") {
111998
- return checkMssqlConnection(parsed.originalUrl, { username, password });
112075
+ return checkMssqlConnection(
112076
+ parsed.originalUrl,
112077
+ { username, password },
112078
+ { tunnelParams: params }
112079
+ );
111999
112080
  }
112000
112081
  if (parsed.driver === "oracle") {
112001
- return checkOracleConnection(parsed.originalUrl, { username, password });
112082
+ return checkOracleConnection(
112083
+ parsed.originalUrl,
112084
+ { username, password },
112085
+ { tunnelParams: params }
112086
+ );
112002
112087
  }
112003
112088
  const tunnel = await maybeOpenSshTunnel(
112004
112089
  params,
@@ -112055,10 +112140,12 @@ JDBC URL \u306E\u30D7\u30EC\u30D5\u30A3\u30C3\u30AF\u30B9\u306B\u3088\u308A\u65B
112055
112140
  });
112056
112141
  const sample = unwrapSampleLimit(sql);
112057
112142
  if (sample) {
112058
- const result = await runMssqlQuery(mssqlParsed, sample.inner);
112143
+ const result = await runMssqlQuery(mssqlParsed, sample.inner, {
112144
+ tunnelParams: params
112145
+ });
112059
112146
  return { rows: result.rows.slice(0, sample.limit) };
112060
112147
  }
112061
- return runMssqlQuery(mssqlParsed, sql);
112148
+ return runMssqlQuery(mssqlParsed, sql, { tunnelParams: params });
112062
112149
  }
112063
112150
  if (parsed.driver === "oracle") {
112064
112151
  const oracleParsed = parseOracleJdbcUrl(parsed.originalUrl, {
@@ -112068,11 +112155,13 @@ JDBC URL \u306E\u30D7\u30EC\u30D5\u30A3\u30C3\u30AF\u30B9\u306B\u3088\u308A\u65B
112068
112155
  const sample = unwrapSampleLimit(sql);
112069
112156
  if (sample) {
112070
112157
  const inner = sample.inner.replace(/;\s*$/, "");
112071
- const result = await runOracleQuery(oracleParsed, inner);
112158
+ const result = await runOracleQuery(oracleParsed, inner, {
112159
+ tunnelParams: params
112160
+ });
112072
112161
  return { rows: result.rows.slice(0, sample.limit) };
112073
112162
  }
112074
112163
  const cleanSql = sql.replace(/;\s*$/, "");
112075
- return runOracleQuery(oracleParsed, cleanSql);
112164
+ return runOracleQuery(oracleParsed, cleanSql, { tunnelParams: params });
112076
112165
  }
112077
112166
  const tunnel = await maybeOpenSshTunnel(
112078
112167
  params,
@@ -112304,16 +112393,18 @@ var semrushOnboarding = new ConnectorOnboarding({
112304
112393
  - Write only 1 sentence between tool calls, then immediately call the next tool. Skip unnecessary explanations and proceed efficiently`
112305
112394
  },
112306
112395
  dataOverviewInstructions: {
112307
- en: `1. Call ${requestToolName12} with path "/" and queryParams \`{ "type": "domain_overview", "domain": "<example.com>", "database": "us" }\` to inspect the domain overview report (CSV)
112396
+ en: `1. Call ${requestToolName12} with path "/" and queryParams \`{ "type": "domain_ranks", "domain": "<example.com>", "database": "us" }\` to inspect the domain summary report (single-row CSV: rank, organic/paid keywords, traffic, cost)
112308
112397
  2. Call ${requestToolName12} with path "/" and queryParams \`{ "type": "domain_organic", "domain": "<example.com>", "database": "us", "display_limit": "5" }\` to sample organic keywords
112309
112398
  3. Call ${requestToolName12} with path "/" and queryParams \`{ "type": "phrase_this", "phrase": "<keyword>", "database": "us" }\` to inspect a keyword overview
112310
- 4. Explore other report types (backlinks_overview, domain_adwords, phrase_related) and the Trends API ("/analytics/v1/...") with responseFormat="json" as needed
112311
- 5. Remember: the Standard Analytics API returns semicolon-separated CSV with the first row as the header`,
112312
- ja: `1. ${requestToolName12} \u3067 path "/" \u3068 queryParams \`{ "type": "domain_overview", "domain": "<example.com>", "database": "us" }\` \u3092\u547C\u3073\u51FA\u3057\u3001\u30C9\u30E1\u30A4\u30F3\u30AA\u30FC\u30D0\u30FC\u30D3\u30E5\u30FC\uFF08CSV\uFF09\u3092\u78BA\u8A8D
112399
+ 4. Optionally call ${requestToolName12} with path "/analytics/v1/" and queryParams \`{ "type": "backlinks_overview", "target": "<example.com>", "target_type": "root_domain" }\` to inspect a backlinks summary (returns semicolon-separated CSV \u2014 keep \`responseFormat="text"\`)
112400
+ 5. Always pass an explicit small \`display_limit\` (e.g. \`"5"\`) \u2014 never rely on the default 10000, which can trip \`ERROR 132\` even when units remain
112401
+ 6. Remember: the Standard Analytics API and the \`/analytics/v1/?type=backlinks_*\` Backlinks endpoints both return semicolon-separated CSV with the first row as the header`,
112402
+ ja: `1. ${requestToolName12} \u3067 path "/" \u3068 queryParams \`{ "type": "domain_ranks", "domain": "<example.com>", "database": "us" }\` \u3092\u547C\u3073\u51FA\u3057\u3001\u30C9\u30E1\u30A4\u30F3\u30B5\u30DE\u30EA\u30FC\u30EC\u30DD\u30FC\u30C8\uFF08rank\u30FB\u30AA\u30FC\u30AC\u30CB\u30C3\u30AF/\u6709\u6599\u30AD\u30FC\u30EF\u30FC\u30C9\u30FB\u30C8\u30E9\u30D5\u30A3\u30C3\u30AF\u30FB\u30B3\u30B9\u30C8\u7B49\u306E1\u884CCSV\uFF09\u3092\u78BA\u8A8D
112313
112403
  2. ${requestToolName12} \u3067 path "/" \u3068 queryParams \`{ "type": "domain_organic", "domain": "<example.com>", "database": "us", "display_limit": "5" }\` \u3092\u547C\u3073\u51FA\u3057\u3001\u30AA\u30FC\u30AC\u30CB\u30C3\u30AF\u30AD\u30FC\u30EF\u30FC\u30C9\u3092\u30B5\u30F3\u30D7\u30EA\u30F3\u30B0
112314
112404
  3. ${requestToolName12} \u3067 path "/" \u3068 queryParams \`{ "type": "phrase_this", "phrase": "<keyword>", "database": "us" }\` \u3092\u547C\u3073\u51FA\u3057\u3001\u30AD\u30FC\u30EF\u30FC\u30C9\u6982\u8981\u3092\u78BA\u8A8D
112315
- 4. \u5FC5\u8981\u306B\u5FDC\u3058\u3066\u4ED6\u306E\u30EC\u30DD\u30FC\u30C8\u30BF\u30A4\u30D7\uFF08backlinks_overview\u3001domain_adwords\u3001phrase_related\uFF09\u3084 Trends API ("/analytics/v1/...", responseFormat="json") \u3092\u63A2\u7D22
112316
- 5. \u6CE8\u610F: Standard Analytics API \u306F\u30BB\u30DF\u30B3\u30ED\u30F3\u533A\u5207\u308ACSV\u3092\u8FD4\u3057\u30011\u884C\u76EE\u304C\u30D8\u30C3\u30C0\u30FC`
112405
+ 4. \u5FC5\u8981\u306B\u5FDC\u3058\u3066 ${requestToolName12} \u3067 path "/analytics/v1/" \u3068 queryParams \`{ "type": "backlinks_overview", "target": "<example.com>", "target_type": "root_domain" }\` \u3092\u547C\u3073\u51FA\u3057\u3066\u30D0\u30C3\u30AF\u30EA\u30F3\u30AF\u30B5\u30DE\u30EA\u30FC\u3092\u78BA\u8A8D\uFF08\u30BB\u30DF\u30B3\u30ED\u30F3\u533A\u5207\u308ACSV\u3092\u8FD4\u3059\u305F\u3081 \`responseFormat="text"\` \u306E\u307E\u307E\uFF09
112406
+ 5. \`display_limit\` \u306F\u5FC5\u305A\u660E\u793A\u7684\u306B\u5C0F\u3055\u3044\u5024\uFF08\u4F8B: \`"5"\`\uFF09\u3092\u6307\u5B9A\u3059\u308B\u3053\u3068\u3002\u30C7\u30D5\u30A9\u30EB\u30C810000\u306E\u307E\u307E\u3060\u3068\u30E6\u30CB\u30C3\u30C8\u6B8B\u91CF\u304C\u3042\u3063\u3066\u3082 \`ERROR 132\` \u3067\u62D2\u5426\u3055\u308C\u308B\u3053\u3068\u304C\u3042\u308B
112407
+ 6. \u6CE8\u610F: Standard Analytics API \u304A\u3088\u3073 \`/analytics/v1/?type=backlinks_*\` \u306E\u30D0\u30C3\u30AF\u30EA\u30F3\u30AF\u7CFB\u30A8\u30F3\u30C9\u30DD\u30A4\u30F3\u30C8\u306F\u3069\u3061\u3089\u3082\u30BB\u30DF\u30B3\u30ED\u30F3\u533A\u5207\u308ACSV\uFF081\u884C\u76EE\u304C\u30D8\u30C3\u30C0\u30FC\uFF09\u3092\u8FD4\u3059`
112317
112408
  }
112318
112409
  });
112319
112410
 
@@ -112340,10 +112431,19 @@ The business logic type for this connector is "typescript". Write handler code u
112340
112431
 
112341
112432
  SDK methods (client created via \`connection(connectionId)\`):
112342
112433
  - \`client.request(path, init?)\` \u2014 low-level authenticated fetch. Pass \`init.query\` to set query parameters; \`key\` is injected automatically
112343
- - \`client.report(type, query?)\` \u2014 call a Standard Analytics report and parse the CSV into \`{ columns, rows, raw }\`
112434
+ - \`client.checkUnits()\` \u2014 return the current API unit balance as a number. **FREE \u2014 does not consume units.** Use as a pre-flight before \`report()\`
112435
+ - \`client.report(type, query?)\` \u2014 call a Standard Analytics report and parse the CSV into \`{ columns: string[], rows: Record<string, string>[], raw: string }\`. Throws \`API UNITS BALANCE IS ZERO\` when the account is out of units
112344
112436
  - \`client.trends(path, query?)\` \u2014 call a Trends API endpoint (\`/analytics/v1/...\`) and return parsed JSON
112345
112437
  - \`client.projects(path, init?)\` \u2014 call a Projects API endpoint (\`/management/v1/...\`) and return parsed JSON
112346
112438
 
112439
+ \u{1F6A8} **MANDATORY pre-flight before creating any server logic that calls \`report()\`.** Before authoring a TypeScript handler that invokes \`client.report(...)\` (Standard Analytics \u2014 \`domain_ranks\`, \`domain_organic\`, \`phrase_this\`, etc.), you MUST first call the \`semrush-api-key_request\` tool with \`path: "https://www.semrush.com/users/countapiunits.html"\`, no \`queryParams\`, \`responseFormat: "text"\` to confirm the unit balance is greater than 0. If the balance is 0, **stop, do not create the server logic**, and report the issue to the user (the account owner needs to top up API units in the Semrush console). \`testFetchServerLogic\` will execute the handler and consume units; creating handlers when the balance is 0 produces \`ERROR 132 :: API UNITS BALANCE IS ZERO\` failures across every server logic.
112440
+
112441
+ \u{1F6A8} **Always set a small \`display_limit\` explicitly \u2014 never rely on the default.** Semrush computes "required units = display_limit \xD7 per-row cost" up front, and rejects the request with \`ERROR 132 :: API UNITS BALANCE IS ZERO\` when the *estimated* cost exceeds the remaining balance, **even when the actual balance is non-zero** (e.g. balance \u2248 40,950 still fails for \`display_limit=10000\` on costly reports). Default to \`display_limit: "1000"\` (or smaller \u2014 \`"100"\` is plenty for most dashboards), and only increase it when the user explicitly asks for a larger sample AND \`checkUnits()\` confirms enough headroom. If you truly need all rows, paginate with \`display_offset\` in chunks of 1000 instead of bumping \`display_limit\`. Treat \`ERROR 132\` as "request too large for the current balance" first, and only as "balance is literally zero" after re-checking units.
112442
+
112443
+ \u{1F6AB} **Do NOT use the Trends API (\`client.trends\`) or Projects API (\`client.projects\`) unless the user explicitly requests them.** These APIs require separate paid subscriptions (Trends and Projects/Management) that not every Semrush account has. Calls without the corresponding subscription fail with an authorization error. Default to the Standard Analytics API (\`client.report\`) for all SEO/keyword/backlink/competitor analysis. Only reach for \`trends()\` / \`projects()\` when the user explicitly mentions Trends data (traffic analytics, market explorer, etc.) or Projects (site audit, position tracking, etc.) \u2014 and confirm the user has the subscription before building the server logic.
112444
+
112445
+ \u26A0\uFE0F **Important: \`report()\` row shape.** \`rows\` is \`Record<string, string>[]\` \u2014 each row is an object keyed by the CSV column NAME (matching \`columns\`), NOT a positional array. Access fields with \`row["Url"]\`, \`row["Keyword"]\`, \`row["Search Volume"]\` (column names may contain spaces). Do NOT use \`columns.indexOf("Url")\` and then \`row[index]\` \u2014 that returns \`undefined\` and silently produces empty results when combined with \`?? ""\` or \`Number(...) || 0\`. All values are strings; convert numeric columns with \`Number(row["Position"])\`.
112446
+
112347
112447
  \`\`\`ts
112348
112448
  import type { Context } from "hono";
112349
112449
  import { connection } from "@squadbase/vite-server/connectors/semrush";
@@ -112356,9 +112456,25 @@ export default async function handler(c: Context) {
112356
112456
  database?: string;
112357
112457
  }>();
112358
112458
 
112359
- const overview = await semrush.report("domain_overview", { domain, database });
112459
+ const result = await semrush.report("domain_organic", {
112460
+ domain,
112461
+ database,
112462
+ display_limit: "100",
112463
+ });
112464
+
112465
+ // \u2705 Correct: access by column name
112466
+ const rows = result.rows.map((row) => ({
112467
+ keyword: row["Keyword"],
112468
+ position: Number(row["Position"]) || 0,
112469
+ searchVolume: Number(row["Search Volume"]) || 0,
112470
+ url: row["Url"] ?? "",
112471
+ }));
112360
112472
 
112361
- return c.json({ columns: overview.columns, rows: overview.rows });
112473
+ // \u274C Wrong: do NOT do this \u2014 row[index] is undefined because rows are objects, not arrays
112474
+ // const urlIdx = result.columns.indexOf("Url");
112475
+ // const url = (row as unknown as string[])[urlIdx];
112476
+
112477
+ return c.json({ columns: result.columns, rows });
112362
112478
  }
112363
112479
  \`\`\`
112364
112480
 
@@ -112370,8 +112486,8 @@ export default async function handler(c: Context) {
112370
112486
 
112371
112487
  Authentication: API key passed as the \`key\` query parameter on every request (handled automatically).
112372
112488
 
112373
- #### Common Standard Analytics report types
112374
- - \`domain_overview\` \u2014 domain summary (organic/paid traffic, keywords, backlinks)
112489
+ #### Common Standard Analytics report types (path \`/\`, returns CSV)
112490
+ - \`domain_ranks\` \u2014 single-row domain summary (rank, organic/paid keywords, traffic, cost). **There is no \`domain_overview\` type \u2014 use \`domain_ranks\`.**
112375
112491
  - \`domain_organic\` \u2014 organic keywords for a domain
112376
112492
  - \`domain_adwords\` \u2014 paid keywords for a domain
112377
112493
  - \`domain_organic_organic\` / \`domain_adwords_adwords\` \u2014 organic / paid competitors
@@ -112380,10 +112496,13 @@ Authentication: API key passed as the \`key\` query parameter on every request (
112380
112496
  - \`phrase_fullsearch\` \u2014 full-text keyword research
112381
112497
  - \`phrase_questions\` \u2014 question keywords
112382
112498
  - \`phrase_kdi\` \u2014 keyword difficulty index
112499
+ - \`url_organic\` / \`url_adwords\` \u2014 keywords ranking for a specific URL
112500
+
112501
+ #### Backlinks API report types (path \`/analytics/v1/\`, also returns **CSV** \u2014 not JSON)
112502
+ Backlinks endpoints live under \`/analytics/v1/?type=backlinks_*\` and require \`target\` + \`target_type\` (\`root_domain\` | \`domain\` | \`url\`) instead of \`domain\`/\`database\`. They return semicolon-separated CSV, so use \`responseFormat="text"\` from the request tool, and from the SDK use \`client.request("/analytics/v1/", { query: { type: "backlinks_overview", target, target_type: "root_domain" } })\` and parse the CSV yourself \u2014 \`client.trends()\` will throw because it JSON-parses the body.
112383
112503
  - \`backlinks_overview\` \u2014 backlinks summary
112384
112504
  - \`backlinks\` \u2014 list of backlinks
112385
112505
  - \`backlinks_refdomains\` \u2014 referring domains
112386
- - \`url_organic\` / \`url_adwords\` \u2014 keywords ranking for a specific URL
112387
112506
 
112388
112507
  To check remaining API units (free, does NOT consume units), call the request tool with an absolute URL: \`path: "https://www.semrush.com/users/countapiunits.html"\`, no query params, \`responseFormat: "text"\`. The response body is just a number.
112389
112508
 
@@ -112391,7 +112510,7 @@ To check remaining API units (free, does NOT consume units), call the request to
112391
112510
  - \`type\` \u2014 report type (required for the Standard API)
112392
112511
  - \`domain\` / \`phrase\` / \`url\` \u2014 entity to query
112393
112512
  - \`database\` \u2014 regional database (e.g. \`us\`, \`uk\`, \`de\`, \`fr\`, \`jp\`, \`br\`); required for most reports
112394
- - \`display_limit\` \u2014 page size (default 10000, max 100000 depending on report)
112513
+ - \`display_limit\` \u2014 page size (default 10000, max 100000 depending on report). **Do NOT use the default \u2014 always pass an explicit small value like \`"1000"\`.** Large limits make Semrush pre-charge required units and reject with \`ERROR 132\` even when the balance is non-zero.
112395
112514
  - \`display_offset\` \u2014 pagination offset
112396
112515
  - \`display_date\` \u2014 historical date in \`YYYYMM15\` format (always day 15)
112397
112516
  - \`export_columns\` \u2014 comma-separated columns to return (e.g. \`Ph,Po,Nq,Cp\`)
@@ -112402,6 +112521,7 @@ To check remaining API units (free, does NOT consume units), call the request to
112402
112521
  - Each Standard Analytics report consumes API units; check the unit balance via \`https://www.semrush.com/users/countapiunits.html?key=...\` (free) first if you suspect a quota issue
112403
112522
  - The CSV separator is \`;\` (semicolon), NOT \`,\`. Some cells may contain commas inside them.
112404
112523
  - An HTTP 200 response with a body starting with \`ERROR\` indicates an API error (auth, parameters, or quota)
112524
+ - \`ERROR 132 :: API UNITS BALANCE IS ZERO\` does NOT only mean the balance is literally 0. Semrush also returns it when \`display_limit \xD7 per-row cost\` exceeds the remaining balance. Re-check the balance with \`countapiunits.html\` and lower \`display_limit\` (e.g. to \`1000\` or \`100\`) before assuming the account is empty.
112405
112525
  - The Trends API requires a separate Trends subscription; calls without it will fail with an authorization error
112406
112526
  - Date strings in historical endpoints must be the 15th of the month (\`YYYYMM15\`)`,
112407
112527
  ja: `### \u30C4\u30FC\u30EB
@@ -112414,10 +112534,19 @@ To check remaining API units (free, does NOT consume units), call the request to
112414
112534
 
112415
112535
  SDK\u30E1\u30BD\u30C3\u30C9 (\`connection(connectionId)\` \u3067\u4F5C\u6210\u3057\u305F\u30AF\u30E9\u30A4\u30A2\u30F3\u30C8):
112416
112536
  - \`client.request(path, init?)\` \u2014 \u8A8D\u8A3C\u4ED8\u304D\u306E\u4F4E\u30EC\u30D9\u30EBfetch\u3002\`init.query\` \u3067\u30AF\u30A8\u30EA\u30D1\u30E9\u30E1\u30FC\u30BF\u3092\u6307\u5B9A\u3002\`key\` \u306F\u81EA\u52D5\u4ED8\u4E0E
112417
- - \`client.report(type, query?)\` \u2014 Standard Analytics \u306E\u30EC\u30DD\u30FC\u30C8\u3092\u547C\u3073\u51FA\u3057\u3001CSV\u3092 \`{ columns, rows, raw }\` \u306B\u30D1\u30FC\u30B9
112537
+ - \`client.checkUnits()\` \u2014 \u73FE\u5728\u306E API \u30E6\u30CB\u30C3\u30C8\u6B8B\u91CF\u3092\u6570\u5024\u3067\u8FD4\u3059\u3002**\u7121\u6599\u3067\u3001\u30E6\u30CB\u30C3\u30C8\u3092\u6D88\u8CBB\u3057\u306A\u3044\u3002** \`report()\` \u5B9F\u884C\u524D\u306E\u30D7\u30EA\u30D5\u30E9\u30A4\u30C8\u306B\u4F7F\u3046
112538
+ - \`client.report(type, query?)\` \u2014 Standard Analytics \u306E\u30EC\u30DD\u30FC\u30C8\u3092\u547C\u3073\u51FA\u3057\u3001CSV\u3092 \`{ columns: string[], rows: Record<string, string>[], raw: string }\` \u306B\u30D1\u30FC\u30B9\u3002\u6B8B\u91CF\u30BC\u30ED\u306E\u5834\u5408\u306F \`API UNITS BALANCE IS ZERO\` \u3092\u542B\u3080\u30A8\u30E9\u30FC\u3092 throw
112418
112539
  - \`client.trends(path, query?)\` \u2014 Trends API \u30A8\u30F3\u30C9\u30DD\u30A4\u30F3\u30C8\uFF08\`/analytics/v1/...\`\uFF09\u3092\u547C\u3073\u51FA\u3057 JSON \u3092\u8FD4\u3059
112419
112540
  - \`client.projects(path, init?)\` \u2014 Projects API \u30A8\u30F3\u30C9\u30DD\u30A4\u30F3\u30C8\uFF08\`/management/v1/...\`\uFF09\u3092\u547C\u3073\u51FA\u3057 JSON \u3092\u8FD4\u3059
112420
112541
 
112542
+ \u{1F6A8} **\`report()\` \u3092\u547C\u3076\u30B5\u30FC\u30D0\u30FC\u30ED\u30B8\u30C3\u30AF\u3092\u4F5C\u6210\u3059\u308B\u524D\u306E\u5FC5\u9808\u30D7\u30EA\u30D5\u30E9\u30A4\u30C8\u3002** Standard Analytics\uFF08\`domain_ranks\`\u3001\`domain_organic\`\u3001\`phrase_this\` \u306A\u3069\uFF09\u306E \`client.report(...)\` \u3092\u542B\u3080 TypeScript \u30CF\u30F3\u30C9\u30E9\u3092\u4F5C\u6210\u3059\u308B\u524D\u306B\u3001\u5FC5\u305A \`semrush-api-key_request\` \u30C4\u30FC\u30EB\u3092 \`path: "https://www.semrush.com/users/countapiunits.html"\`\u3001\`queryParams\` \u7121\u3057\u3001\`responseFormat: "text"\` \u3067\u547C\u3073\u51FA\u3057\u3066\u30E6\u30CB\u30C3\u30C8\u6B8B\u91CF\u304C 0 \u3088\u308A\u5927\u304D\u3044\u3053\u3068\u3092\u78BA\u8A8D\u3059\u308B\u3053\u3068\u3002\u6B8B\u91CF\u304C 0 \u306E\u5834\u5408\u306F **\u30B5\u30FC\u30D0\u30FC\u30ED\u30B8\u30C3\u30AF\u3092\u4F5C\u6210\u305B\u305A\u306B\u505C\u6B62\u3057\u3001\u30E6\u30FC\u30B6\u30FC\u306B\u5831\u544A**\u3059\u308B\uFF08Semrush \u306E\u7BA1\u7406\u30B3\u30F3\u30BD\u30FC\u30EB\u304B\u3089 API \u30E6\u30CB\u30C3\u30C8\u3092\u88DC\u5145\u3059\u308B\u5FC5\u8981\u304C\u3042\u308B\uFF09\u3002\`testFetchServerLogic\` \u306F\u30CF\u30F3\u30C9\u30E9\u3092\u5B9F\u884C\u3057\u3066\u30E6\u30CB\u30C3\u30C8\u3092\u6D88\u8CBB\u3059\u308B\u305F\u3081\u3001\u6B8B\u91CF 0 \u306E\u307E\u307E\u4F5C\u6210\u3059\u308B\u3068\u5168\u30B5\u30FC\u30D0\u30FC\u30ED\u30B8\u30C3\u30AF\u304C \`ERROR 132 :: API UNITS BALANCE IS ZERO\` \u3067\u5931\u6557\u3059\u308B\u3002
112543
+
112544
+ \u{1F6A8} **\`display_limit\` \u306F\u5FC5\u305A\u660E\u793A\u7684\u306B\u5C0F\u3055\u3044\u5024\u3092\u6307\u5B9A\u3057\u3001\u30C7\u30D5\u30A9\u30EB\u30C8\u306B\u983C\u3089\u306A\u3044\u3053\u3068\u3002** Semrush \u306F\u4E8B\u524D\u306B\u300C\u5FC5\u8981\u30E6\u30CB\u30C3\u30C8 = display_limit \xD7 \u884C\u3042\u305F\u308A\u5358\u4FA1\u300D\u3092\u8A08\u7B97\u3057\u3001\u305D\u306E**\u898B\u7A4D\u984D**\u304C\u6B8B\u91CF\u3092\u8D85\u3048\u308B\u3068\u30EA\u30AF\u30A8\u30B9\u30C8\u3092 \`ERROR 132 :: API UNITS BALANCE IS ZERO\` \u3067\u62D2\u5426\u3059\u308B\u3002**\u5B9F\u6B8B\u91CF\u304C\u30BC\u30ED\u3067\u306A\u304F\u3066\u3082**\u8D77\u3053\u308B\uFF08\u4F8B\uFF1A\u6B8B\u91CF\u7D04 40,950 \u3067\u3082\u3001\u30B3\u30B9\u30C8\u306E\u9AD8\u3044\u30EC\u30DD\u30FC\u30C8\u3067 \`display_limit=10000\` \u3060\u3068\u5931\u6557\u3059\u308B\uFF09\u3002\u539F\u5247\u3068\u3057\u3066 \`display_limit: "1000"\`\uFF08\u30C0\u30C3\u30B7\u30E5\u30DC\u30FC\u30C9\u7528\u9014\u306A\u3089 \`"100"\` \u3067\u3082\u5341\u5206\uFF09\u3092\u6307\u5B9A\u3057\u3001\u30E6\u30FC\u30B6\u30FC\u304C\u660E\u793A\u7684\u306B\u5927\u304D\u306A\u30B5\u30F3\u30D7\u30EB\u3092\u8981\u6C42\u3057\u3001\u304B\u3064 \`checkUnits()\` \u3067\u6B8B\u91CF\u306B\u5341\u5206\u306A\u4F59\u88D5\u304C\u3042\u308B\u3053\u3068\u3092\u78BA\u8A8D\u3067\u304D\u305F\u5834\u5408\u306E\u307F\u5897\u3084\u3059\u3002\u5168\u884C\u304C\u5FC5\u8981\u306A\u5834\u5408\u306F \`display_limit\` \u3092\u4E0A\u3052\u308B\u306E\u3067\u306F\u306A\u304F\u3001\`display_offset\` \u3067 1000 \u4EF6\u523B\u307F\u306E\u30DA\u30FC\u30B8\u30CD\u30FC\u30B7\u30E7\u30F3\u3092\u5B9F\u88C5\u3059\u308B\u3053\u3068\u3002\`ERROR 132\` \u306F\u300C\u6B8B\u91CF\u304C\u6587\u5B57\u901A\u308A\u30BC\u30ED\u300D\u3088\u308A\u5148\u306B\u300C\u73FE\u5728\u306E\u6B8B\u91CF\u306B\u5BFE\u3057\u3066\u30EA\u30AF\u30A8\u30B9\u30C8\u304C\u5927\u304D\u3059\u304E\u308B\u300D\u3092\u7591\u3044\u3001\u30E6\u30CB\u30C3\u30C8\u3092\u518D\u78BA\u8A8D\u3057\u3066\u304B\u3089\u5224\u65AD\u3059\u308B\u3053\u3068\u3002
112545
+
112546
+ \u{1F6AB} **Trends API\uFF08\`client.trends\`\uFF09\u3068 Projects API\uFF08\`client.projects\`\uFF09\u306F\u3001\u30E6\u30FC\u30B6\u30FC\u304B\u3089\u660E\u793A\u7684\u306B\u6307\u793A\u3055\u308C\u306A\u3044\u9650\u308A\u4F7F\u7528\u3057\u306A\u3044\u3053\u3068\u3002** \u3053\u308C\u3089\u306E API \u306F\u5225\u9014\u6709\u6599\u30B5\u30D6\u30B9\u30AF\u30EA\u30D7\u30B7\u30E7\u30F3\uFF08Trends / Projects\uFF08Management\uFF09\uFF09\u304C\u5FC5\u8981\u3067\u3001\u3059\u3079\u3066\u306E Semrush \u30A2\u30AB\u30A6\u30F3\u30C8\u304C\u5951\u7D04\u3057\u3066\u3044\u308B\u308F\u3051\u3067\u306F\u306A\u3044\u3002\u30B5\u30D6\u30B9\u30AF\u30EA\u30D7\u30B7\u30E7\u30F3\u304C\u306A\u3044\u72B6\u614B\u3067\u547C\u3073\u51FA\u3059\u3068\u8A8D\u53EF\u30A8\u30E9\u30FC\u3067\u5931\u6557\u3059\u308B\u3002SEO\u30FB\u30AD\u30FC\u30EF\u30FC\u30C9\u30FB\u88AB\u30EA\u30F3\u30AF\u30FB\u7AF6\u5408\u5206\u6790\u306F\u539F\u5247 Standard Analytics API\uFF08\`client.report\`\uFF09\u3067\u884C\u3046\u3002\`trends()\` / \`projects()\` \u3092\u4F7F\u3046\u306E\u306F\u3001\u30E6\u30FC\u30B6\u30FC\u304C Trends \u30C7\u30FC\u30BF\uFF08\u30C8\u30E9\u30D5\u30A3\u30C3\u30AF\u30A2\u30CA\u30EA\u30C6\u30A3\u30AF\u30B9\u3001\u30DE\u30FC\u30B1\u30C3\u30C8\u30A8\u30AF\u30B9\u30D7\u30ED\u30FC\u30E9\u30FC\u7B49\uFF09\u307E\u305F\u306F Projects \u6A5F\u80FD\uFF08\u30B5\u30A4\u30C8\u76E3\u67FB\u3001\u30DD\u30B8\u30B7\u30E7\u30F3\u30C8\u30E9\u30C3\u30AD\u30F3\u30B0\u7B49\uFF09\u3092**\u660E\u793A\u7684\u306B\u6C42\u3081\u305F\u5834\u5408\u306E\u307F**\u3067\u3001\u305D\u306E\u969B\u3082\u30B5\u30D6\u30B9\u30AF\u30EA\u30D7\u30B7\u30E7\u30F3\u306E\u6709\u7121\u3092\u30E6\u30FC\u30B6\u30FC\u306B\u78BA\u8A8D\u3057\u3066\u304B\u3089\u30B5\u30FC\u30D0\u30FC\u30ED\u30B8\u30C3\u30AF\u3092\u4F5C\u6210\u3059\u308B\u3053\u3068\u3002
112547
+
112548
+ \u26A0\uFE0F **\u91CD\u8981: \`report()\` \u306E\u884C\uFF08row\uFF09\u306E\u5F62\u72B6\u306B\u3064\u3044\u3066\u3002** \`rows\` \u306F \`Record<string, string>[]\` \u3067\u3059 \u2014 \u5404\u884C\u306F CSV \u306E\u30AB\u30E9\u30E0\u300C\u540D\u300D\uFF08\`columns\` \u3068\u4E00\u81F4\uFF09\u3092\u30AD\u30FC\u3068\u3057\u305F\u30AA\u30D6\u30B8\u30A7\u30AF\u30C8\u3067\u3042\u308A\u3001\u4F4D\u7F6E\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u306E\u914D\u5217\u3067\u306F\u3042\u308A\u307E\u305B\u3093\u3002\u30D5\u30A3\u30FC\u30EB\u30C9\u3078\u306E\u30A2\u30AF\u30BB\u30B9\u306F\u5FC5\u305A \`row["Url"]\`\u3001\`row["Keyword"]\`\u3001\`row["Search Volume"]\`\uFF08\u30AB\u30E9\u30E0\u540D\u306B\u30B9\u30DA\u30FC\u30B9\u3092\u542B\u3080\u3053\u3068\u3042\u308A\uFF09\u306E\u3088\u3046\u306B\u30AB\u30E9\u30E0\u540D\u3067\u884C\u3063\u3066\u304F\u3060\u3055\u3044\u3002\`columns.indexOf("Url")\` \u3067\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u3092\u53D6\u5F97\u3057\u3066\u304B\u3089 \`row[index]\` \u3067\u30A2\u30AF\u30BB\u30B9\u3057\u3066\u306F\u3044\u3051\u307E\u305B\u3093 \u2014 \u305D\u308C\u306F \`undefined\` \u3092\u8FD4\u3057\u3001\`?? ""\` \u3084 \`Number(...) || 0\` \u3068\u7D44\u307F\u5408\u308F\u3055\u308B\u3053\u3068\u3067\u7D50\u679C\u304C\u7A7A\u306B\u306A\u308B\u7121\u97F3\u306E\u5931\u6557\u3092\u751F\u307F\u307E\u3059\u3002\u5168\u3066\u306E\u5024\u306F\u6587\u5B57\u5217\u306A\u306E\u3067\u3001\u6570\u5024\u30AB\u30E9\u30E0\u306F \`Number(row["Position"])\` \u3067\u660E\u793A\u5909\u63DB\u3057\u3066\u304F\u3060\u3055\u3044\u3002
112549
+
112421
112550
  \`\`\`ts
112422
112551
  import type { Context } from "hono";
112423
112552
  import { connection } from "@squadbase/vite-server/connectors/semrush";
@@ -112430,9 +112559,25 @@ export default async function handler(c: Context) {
112430
112559
  database?: string;
112431
112560
  }>();
112432
112561
 
112433
- const overview = await semrush.report("domain_overview", { domain, database });
112562
+ const result = await semrush.report("domain_organic", {
112563
+ domain,
112564
+ database,
112565
+ display_limit: "100",
112566
+ });
112434
112567
 
112435
- return c.json({ columns: overview.columns, rows: overview.rows });
112568
+ // \u2705 \u6B63: \u30AB\u30E9\u30E0\u540D\u3067\u30A2\u30AF\u30BB\u30B9\u3059\u308B
112569
+ const rows = result.rows.map((row) => ({
112570
+ keyword: row["Keyword"],
112571
+ position: Number(row["Position"]) || 0,
112572
+ searchVolume: Number(row["Search Volume"]) || 0,
112573
+ url: row["Url"] ?? "",
112574
+ }));
112575
+
112576
+ // \u274C \u8AA4: \u884C\u306F\u30AA\u30D6\u30B8\u30A7\u30AF\u30C8\u3067\u3042\u308A\u914D\u5217\u3067\u306F\u306A\u3044\u305F\u3081 row[index] \u306F undefined \u306B\u306A\u308B
112577
+ // const urlIdx = result.columns.indexOf("Url");
112578
+ // const url = (row as unknown as string[])[urlIdx];
112579
+
112580
+ return c.json({ columns: result.columns, rows });
112436
112581
  }
112437
112582
  \`\`\`
112438
112583
 
@@ -112444,8 +112589,8 @@ export default async function handler(c: Context) {
112444
112589
 
112445
112590
  \u8A8D\u8A3C: API\u30AD\u30FC\u3092\u3059\u3079\u3066\u306E\u30EA\u30AF\u30A8\u30B9\u30C8\u306B \`key\` \u30AF\u30A8\u30EA\u30D1\u30E9\u30E1\u30FC\u30BF\u3068\u3057\u3066\u4ED8\u4E0E\uFF08\u81EA\u52D5\uFF09\u3002
112446
112591
 
112447
- #### \u4E3B\u8981\u306A Standard Analytics \u30EC\u30DD\u30FC\u30C8\u30BF\u30A4\u30D7
112448
- - \`domain_overview\` \u2014 \u30C9\u30E1\u30A4\u30F3\u306E\u30B5\u30DE\u30EA\u30FC\uFF08\u30AA\u30FC\u30AC\u30CB\u30C3\u30AF/\u6709\u6599\u30C8\u30E9\u30D5\u30A3\u30C3\u30AF\u3001\u30AD\u30FC\u30EF\u30FC\u30C9\u3001\u30D0\u30C3\u30AF\u30EA\u30F3\u30AF\uFF09
112592
+ #### \u4E3B\u8981\u306A Standard Analytics \u30EC\u30DD\u30FC\u30C8\u30BF\u30A4\u30D7\uFF08path \`/\`\u3001CSV\u3092\u8FD4\u3059\uFF09
112593
+ - \`domain_ranks\` \u2014 \u30C9\u30E1\u30A4\u30F3\u306E\u30B5\u30DE\u30EA\u30FC\uFF08rank\u3001\u30AA\u30FC\u30AC\u30CB\u30C3\u30AF/\u6709\u6599\u30AD\u30FC\u30EF\u30FC\u30C9\u6570\u3001\u30C8\u30E9\u30D5\u30A3\u30C3\u30AF\u3001\u30B3\u30B9\u30C8\u306E1\u884CCSV\uFF09\u3002**\`domain_overview\` \u3068\u3044\u3046\u30BF\u30A4\u30D7\u306F\u5B58\u5728\u3057\u306A\u3044\u3002\`domain_ranks\` \u3092\u4F7F\u3046\u3053\u3068\u3002**
112449
112594
  - \`domain_organic\` \u2014 \u30C9\u30E1\u30A4\u30F3\u306E\u30AA\u30FC\u30AC\u30CB\u30C3\u30AF\u30AD\u30FC\u30EF\u30FC\u30C9
112450
112595
  - \`domain_adwords\` \u2014 \u30C9\u30E1\u30A4\u30F3\u306E\u6709\u6599\u30AD\u30FC\u30EF\u30FC\u30C9
112451
112596
  - \`domain_organic_organic\` / \`domain_adwords_adwords\` \u2014 \u30AA\u30FC\u30AC\u30CB\u30C3\u30AF\uFF0F\u6709\u6599\u306E\u7AF6\u5408
@@ -112454,10 +112599,13 @@ export default async function handler(c: Context) {
112454
112599
  - \`phrase_fullsearch\` \u2014 \u30D5\u30EB\u30C6\u30AD\u30B9\u30C8\u30AD\u30FC\u30EF\u30FC\u30C9\u30EA\u30B5\u30FC\u30C1
112455
112600
  - \`phrase_questions\` \u2014 \u8CEA\u554F\u5F62\u5F0F\u30AD\u30FC\u30EF\u30FC\u30C9
112456
112601
  - \`phrase_kdi\` \u2014 \u30AD\u30FC\u30EF\u30FC\u30C9\u96E3\u6613\u5EA6\uFF08KDI\uFF09
112602
+ - \`url_organic\` / \`url_adwords\` \u2014 \u7279\u5B9AURL\u3067\u30E9\u30F3\u30AF\u30A4\u30F3\u3057\u3066\u3044\u308B\u30AD\u30FC\u30EF\u30FC\u30C9
112603
+
112604
+ #### Backlinks API \u30EC\u30DD\u30FC\u30C8\u30BF\u30A4\u30D7\uFF08path \`/analytics/v1/\`\u3001\u3053\u3061\u3089\u3082 **CSV** \u3092\u8FD4\u3059\u3002JSON \u3067\u306F\u306A\u3044\uFF09
112605
+ Backlinks \u7CFB\u30A8\u30F3\u30C9\u30DD\u30A4\u30F3\u30C8\u306F \`/analytics/v1/?type=backlinks_*\` \u914D\u4E0B\u306B\u3042\u308A\u3001\`domain\`/\`database\` \u3067\u306F\u306A\u304F \`target\` + \`target_type\`\uFF08\`root_domain\` | \`domain\` | \`url\`\uFF09\u3092\u8981\u6C42\u3059\u308B\u3002\u30EC\u30B9\u30DD\u30F3\u30B9\u306F\u30BB\u30DF\u30B3\u30ED\u30F3\u533A\u5207\u308ACSV\u306A\u306E\u3067\u3001request \u30C4\u30FC\u30EB\u3067\u306F \`responseFormat="text"\` \u3092\u4F7F\u3044\u3001SDK \u3067\u306F \`client.request("/analytics/v1/", { query: { type: "backlinks_overview", target, target_type: "root_domain" } })\` \u3092\u547C\u3093\u3067 CSV \u3092\u81EA\u524D\u3067\u30D1\u30FC\u30B9\u3059\u308B\u3053\u3068\u3002\`client.trends()\` \u306F JSON.parse \u3059\u308B\u305F\u3081 backlinks \u7CFB\u3067\u4F7F\u3046\u3068 throw \u3059\u308B\u3002
112457
112606
  - \`backlinks_overview\` \u2014 \u30D0\u30C3\u30AF\u30EA\u30F3\u30AF\u6982\u8981
112458
112607
  - \`backlinks\` \u2014 \u30D0\u30C3\u30AF\u30EA\u30F3\u30AF\u4E00\u89A7
112459
112608
  - \`backlinks_refdomains\` \u2014 \u53C2\u7167\u30C9\u30E1\u30A4\u30F3
112460
- - \`url_organic\` / \`url_adwords\` \u2014 \u7279\u5B9AURL\u3067\u30E9\u30F3\u30AF\u30A4\u30F3\u3057\u3066\u3044\u308B\u30AD\u30FC\u30EF\u30FC\u30C9
112461
112609
 
112462
112610
  API \u30E6\u30CB\u30C3\u30C8\u6B8B\u91CF\u306E\u78BA\u8A8D\uFF08\u7121\u6599\u3001\u30E6\u30CB\u30C3\u30C8\u3092\u6D88\u8CBB\u3057\u306A\u3044\uFF09\u306F request \u30C4\u30FC\u30EB\u306B\u7D76\u5BFEURL\u3092\u6E21\u3059: \`path: "https://www.semrush.com/users/countapiunits.html"\`\u3001queryParams \u306A\u3057\u3001\`responseFormat: "text"\`\u3002\u30EC\u30B9\u30DD\u30F3\u30B9\u672C\u6587\u306F\u6570\u5024\u306E\u307F\u3002
112463
112611
 
@@ -112465,7 +112613,7 @@ API \u30E6\u30CB\u30C3\u30C8\u6B8B\u91CF\u306E\u78BA\u8A8D\uFF08\u7121\u6599\u30
112465
112613
  - \`type\` \u2014 \u30EC\u30DD\u30FC\u30C8\u7A2E\u5225\uFF08Standard API \u3067\u306F\u5FC5\u9808\uFF09
112466
112614
  - \`domain\` / \`phrase\` / \`url\` \u2014 \u30AF\u30A8\u30EA\u5BFE\u8C61\u306E\u30A8\u30F3\u30C6\u30A3\u30C6\u30A3
112467
112615
  - \`database\` \u2014 \u5730\u57DF\u5225\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\uFF08\`us\`, \`uk\`, \`de\`, \`fr\`, \`jp\`, \`br\` \u306A\u3069\uFF09\u3002\u591A\u304F\u306E\u30EC\u30DD\u30FC\u30C8\u3067\u5FC5\u9808
112468
- - \`display_limit\` \u2014 \u30DA\u30FC\u30B8\u30B5\u30A4\u30BA\uFF08\u30C7\u30D5\u30A9\u30EB\u30C810000\u3001\u30EC\u30DD\u30FC\u30C8\u306B\u3088\u3063\u3066\u306F\u6700\u5927100000\uFF09
112616
+ - \`display_limit\` \u2014 \u30DA\u30FC\u30B8\u30B5\u30A4\u30BA\uFF08\u30C7\u30D5\u30A9\u30EB\u30C810000\u3001\u30EC\u30DD\u30FC\u30C8\u306B\u3088\u3063\u3066\u306F\u6700\u5927100000\uFF09\u3002**\u30C7\u30D5\u30A9\u30EB\u30C8\u3092\u4F7F\u308F\u305A\u3001\u5FC5\u305A \`"1000"\` \u7A0B\u5EA6\u306E\u5C0F\u3055\u3044\u5024\u3092\u660E\u793A\u7684\u306B\u6307\u5B9A\u3059\u308B\u3053\u3068\u3002** \u5927\u304D\u3044\u5024\u3060\u3068 Semrush \u304C\u5FC5\u8981\u30E6\u30CB\u30C3\u30C8\u3092\u4E8B\u524D\u8A08\u7B97\u3057\u3001\u6B8B\u91CF\u304C\u3042\u3063\u3066\u3082 \`ERROR 132\` \u3067\u62D2\u5426\u3059\u308B\u3002
112469
112617
  - \`display_offset\` \u2014 \u30DA\u30FC\u30B8\u30CD\u30FC\u30B7\u30E7\u30F3\u30AA\u30D5\u30BB\u30C3\u30C8
112470
112618
  - \`display_date\` \u2014 \u5C65\u6B74\u306E\u65E5\u4ED8\u3002\`YYYYMM15\` \u5F62\u5F0F\uFF08\u5FC5\u305A\u6708\u306E15\u65E5\uFF09
112471
112619
  - \`export_columns\` \u2014 \u8FD4\u5374\u30AB\u30E9\u30E0\u3092\u30AB\u30F3\u30DE\u533A\u5207\u308A\u3067\u6307\u5B9A\uFF08\u4F8B: \`Ph,Po,Nq,Cp\`\uFF09
@@ -112476,6 +112624,7 @@ API \u30E6\u30CB\u30C3\u30C8\u6B8B\u91CF\u306E\u78BA\u8A8D\uFF08\u7121\u6599\u30
112476
112624
  - Standard Analytics \u306E\u5404\u30EC\u30DD\u30FC\u30C8\u306F API \u30E6\u30CB\u30C3\u30C8\u3092\u6D88\u8CBB\u3059\u308B\u3002\u30AF\u30A9\u30FC\u30BF\u304C\u7591\u308F\u3057\u3044\u5834\u5408\u306F \`https://www.semrush.com/users/countapiunits.html?key=...\` \u3067\u6B8B\u91CF\u3092\u5148\u306B\u78BA\u8A8D\u3059\u308B\uFF08\u7121\u6599\uFF09
112477
112625
  - CSV \u306E\u30BB\u30D1\u30EC\u30FC\u30BF\u306F \`;\`\uFF08\u30BB\u30DF\u30B3\u30ED\u30F3\uFF09\u3067\u3042\u308A \`,\` \u3067\u306F\u306A\u3044\u3002\u30BB\u30EB\u5185\u306B\u30AB\u30F3\u30DE\u304C\u542B\u307E\u308C\u308B\u3053\u3068\u304C\u3042\u308B
112478
112626
  - HTTP 200 \u3067\u3082\u672C\u6587\u304C \`ERROR\` \u3067\u59CB\u307E\u308B\u5834\u5408\u306F API\u30A8\u30E9\u30FC\uFF08\u8A8D\u8A3C\u3001\u30D1\u30E9\u30E1\u30FC\u30BF\u3001\u30AF\u30A9\u30FC\u30BF\uFF09
112627
+ - \`ERROR 132 :: API UNITS BALANCE IS ZERO\` \u306F\u300C\u6B8B\u91CF\u304C\u6587\u5B57\u901A\u308A 0\u300D\u3060\u3051\u3092\u610F\u5473\u3059\u308B\u308F\u3051\u3067\u306F\u306A\u3044\u3002Semrush \u306F \`display_limit \xD7 \u884C\u3042\u305F\u308A\u5358\u4FA1\` \u304C\u6B8B\u91CF\u3092\u8D85\u3048\u308B\u5834\u5408\u3082\u540C\u3058\u30A8\u30E9\u30FC\u3092\u8FD4\u3059\u3002\`countapiunits.html\` \u3067\u6B8B\u91CF\u3092\u518D\u78BA\u8A8D\u3057\u3001\`display_limit\` \u3092 \`1000\` \u3084 \`100\` \u307E\u3067\u4E0B\u3052\u3066\u304B\u3089\u300C\u6B8B\u91CF\u5207\u308C\u300D\u3068\u5224\u65AD\u3059\u308B\u3053\u3068\u3002
112479
112628
  - Trends API \u306F\u5225\u9014 Trends \u30B5\u30D6\u30B9\u30AF\u30EA\u30D7\u30B7\u30E7\u30F3\u304C\u5FC5\u8981\u3002\u672A\u5951\u7D04\u3060\u3068\u8A8D\u53EF\u30A8\u30E9\u30FC\u306B\u306A\u308B
112480
112629
  - \u5C65\u6B74\u30A8\u30F3\u30C9\u30DD\u30A4\u30F3\u30C8\u306E\u65E5\u4ED8\u306F\u5FC5\u305A\u6708\u306E15\u65E5\uFF08\`YYYYMM15\`\uFF09`
112481
112630
  },
@@ -113595,7 +113744,8 @@ var parameters72 = {
113595
113744
  type: "text",
113596
113745
  secret: true,
113597
113746
  required: false
113598
- })
113747
+ }),
113748
+ ...sshTunnelParameters
113599
113749
  };
113600
113750
 
113601
113751
  // ../connectors/src/connectors/sqlserver/tools/execute-query.ts
@@ -113654,7 +113804,9 @@ Avoid loading large amounts of data; always include \`TOP\` in queries.`,
113654
113804
  };
113655
113805
  }
113656
113806
  try {
113657
- const { rows } = await runMssqlQuery(parsed, sql);
113807
+ const { rows } = await runMssqlQuery(parsed, sql, {
113808
+ tunnelParams: connectionParamsToRecord(connection)
113809
+ });
113658
113810
  const truncated = rows.length > MAX_ROWS14;
113659
113811
  return {
113660
113812
  success: true,
@@ -113725,7 +113877,8 @@ The business logic type for this connector is "sql".
113725
113877
  {
113726
113878
  username: params[parameters72.username.slug],
113727
113879
  password: params[parameters72.password.slug]
113728
- }
113880
+ },
113881
+ { tunnelParams: params }
113729
113882
  );
113730
113883
  },
113731
113884
  async query(params, sql, _namedParams) {
@@ -113735,10 +113888,12 @@ The business logic type for this connector is "sql".
113735
113888
  });
113736
113889
  const sample = unwrapSampleLimit(sql);
113737
113890
  if (sample) {
113738
- const result = await runMssqlQuery(parsed, sample.inner);
113891
+ const result = await runMssqlQuery(parsed, sample.inner, {
113892
+ tunnelParams: params
113893
+ });
113739
113894
  return { rows: result.rows.slice(0, sample.limit) };
113740
113895
  }
113741
- return runMssqlQuery(parsed, sql);
113896
+ return runMssqlQuery(parsed, sql, { tunnelParams: params });
113742
113897
  }
113743
113898
  });
113744
113899
 
@@ -113784,7 +113939,8 @@ var parameters73 = {
113784
113939
  type: "text",
113785
113940
  secret: true,
113786
113941
  required: false
113787
- })
113942
+ }),
113943
+ ...sshTunnelParameters
113788
113944
  };
113789
113945
 
113790
113946
  // ../connectors/src/connectors/azure-sql/tools/execute-query.ts
@@ -113843,7 +113999,10 @@ Avoid loading large amounts of data; always include \`TOP\` in queries.`,
113843
113999
  };
113844
114000
  }
113845
114001
  try {
113846
- const { rows } = await runMssqlQuery(parsed, sql, { forceEncrypt: true });
114002
+ const { rows } = await runMssqlQuery(parsed, sql, {
114003
+ forceEncrypt: true,
114004
+ tunnelParams: connectionParamsToRecord(connection)
114005
+ });
113847
114006
  const truncated = rows.length > MAX_ROWS15;
113848
114007
  return {
113849
114008
  success: true,
@@ -113868,7 +114027,7 @@ var azureSqlConnector = new ConnectorPlugin({
113868
114027
  description: "Connect to Azure SQL Database (managed) using a JDBC-style URL. Encryption is enforced automatically.",
113869
114028
  iconUrl: "https://images.ctfassets.net/9ncizv60xc5y/5TL0yBbxoLlk6jFZuiHl8w/55040f52d57bf0b77a2215c985c5a772/azure-sql-icon.png",
113870
114029
  parameters: parameters73,
113871
- releaseFlag: { dev1: true, dev2: false, prod: false },
114030
+ releaseFlag: { dev1: true, dev2: true, prod: true },
113872
114031
  categories: ["database"],
113873
114032
  onboarding: azureSqlOnboarding,
113874
114033
  systemPrompt: {
@@ -113915,7 +114074,7 @@ The business logic type for this connector is "sql".
113915
114074
  username: params[parameters73.username.slug],
113916
114075
  password: params[parameters73.password.slug]
113917
114076
  },
113918
- { forceEncrypt: true }
114077
+ { forceEncrypt: true, tunnelParams: params }
113919
114078
  );
113920
114079
  },
113921
114080
  async query(params, sql, _namedParams) {
@@ -113926,11 +114085,353 @@ The business logic type for this connector is "sql".
113926
114085
  const sample = unwrapSampleLimit(sql);
113927
114086
  if (sample) {
113928
114087
  const result = await runMssqlQuery(parsed, sample.inner, {
113929
- forceEncrypt: true
114088
+ forceEncrypt: true,
114089
+ tunnelParams: params
113930
114090
  });
113931
114091
  return { rows: result.rows.slice(0, sample.limit) };
113932
114092
  }
113933
- return runMssqlQuery(parsed, sql, { forceEncrypt: true });
114093
+ return runMssqlQuery(parsed, sql, {
114094
+ forceEncrypt: true,
114095
+ tunnelParams: params
114096
+ });
114097
+ }
114098
+ });
114099
+
114100
+ // ../connectors/src/connectors/cosmosdb/setup.ts
114101
+ var cosmosdbOnboarding = new ConnectorOnboarding({
114102
+ dataOverviewInstructions: {
114103
+ en: `1. Use cosmosdb_listContainers to list all containers in the configured database
114104
+ 2. For key containers, sample documents with cosmosdb_query: container="users", sql="SELECT TOP 5 * FROM c"
114105
+ 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)
114106
+ 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\``,
114107
+ ja: `1. cosmosdb_listContainers \u3067\u5BFE\u8C61\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u5185\u306E\u30B3\u30F3\u30C6\u30CA\u4E00\u89A7\u3092\u53D6\u5F97
114108
+ 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"
114109
+ 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
114110
+ 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\``
114111
+ }
114112
+ });
114113
+
114114
+ // ../connectors/src/connectors/cosmosdb/parameters.ts
114115
+ var parameters74 = {
114116
+ endpoint: new ParameterDefinition({
114117
+ slug: "endpoint",
114118
+ name: "Cosmos DB Endpoint",
114119
+ description: "Cosmos DB account endpoint URL (e.g. `https://<account>.documents.azure.com:443/`). Found in the Azure Portal under the account's *Keys* blade.",
114120
+ envVarBaseKey: "COSMOSDB_ENDPOINT",
114121
+ type: "text",
114122
+ secret: false,
114123
+ required: true
114124
+ }),
114125
+ key: new ParameterDefinition({
114126
+ slug: "key",
114127
+ name: "Account Key",
114128
+ description: "Cosmos DB account key (primary or secondary master key). Use a read-only key when only querying data.",
114129
+ envVarBaseKey: "COSMOSDB_KEY",
114130
+ type: "text",
114131
+ secret: true,
114132
+ required: true
114133
+ }),
114134
+ database: new ParameterDefinition({
114135
+ slug: "database",
114136
+ name: "Database",
114137
+ description: "The Cosmos DB database (a.k.a. database account namespace) to connect to.",
114138
+ envVarBaseKey: "COSMOSDB_DATABASE",
114139
+ type: "text",
114140
+ secret: false,
114141
+ required: true
114142
+ })
114143
+ };
114144
+
114145
+ // ../connectors/src/connectors/cosmosdb/tools/list-containers.ts
114146
+ import { z as z90 } from "zod";
114147
+ var inputSchema90 = z90.object({
114148
+ toolUseIntent: z90.string().optional().describe(
114149
+ "Brief description of what you intend to accomplish with this tool call"
114150
+ ),
114151
+ connectionId: z90.string().describe("ID of the Cosmos DB connection to use")
114152
+ });
114153
+ var outputSchema90 = z90.discriminatedUnion("success", [
114154
+ z90.object({
114155
+ success: z90.literal(true),
114156
+ containers: z90.array(
114157
+ z90.object({
114158
+ id: z90.string(),
114159
+ partitionKey: z90.array(z90.string()).optional()
114160
+ })
114161
+ )
114162
+ }),
114163
+ z90.object({
114164
+ success: z90.literal(false),
114165
+ error: z90.string()
114166
+ })
114167
+ ]);
114168
+ var listContainersTool = new ConnectorTool({
114169
+ name: "listContainers",
114170
+ description: `List all containers in the configured Cosmos DB database.
114171
+ Use this as the first step to explore the data structure. Returns container ids and their partition key paths.
114172
+ After listing containers, use the query tool to sample items and understand each container's schema.`,
114173
+ inputSchema: inputSchema90,
114174
+ outputSchema: outputSchema90,
114175
+ async execute({ connectionId }, connections) {
114176
+ const connection = connections.find((c6) => c6.id === connectionId);
114177
+ if (!connection) {
114178
+ return {
114179
+ success: false,
114180
+ error: `Connection ${connectionId} not found`
114181
+ };
114182
+ }
114183
+ console.log(
114184
+ `[connector-query] cosmosdb/${connection.name}: listContainers`
114185
+ );
114186
+ let key;
114187
+ try {
114188
+ const { CosmosClient } = await import("@azure/cosmos");
114189
+ const endpoint = parameters74.endpoint.getValue(connection);
114190
+ key = parameters74.key.getValue(connection);
114191
+ const database = parameters74.database.getValue(connection);
114192
+ const client = new CosmosClient({ endpoint, key });
114193
+ const db = client.database(database);
114194
+ const { resources } = await db.containers.readAll().fetchAll();
114195
+ return {
114196
+ success: true,
114197
+ containers: resources.map((c6) => ({
114198
+ id: c6.id,
114199
+ partitionKey: extractPartitionKeyPaths(c6.partitionKey)
114200
+ }))
114201
+ };
114202
+ } catch (err) {
114203
+ let msg = err instanceof Error ? err.message : String(err);
114204
+ if (key) msg = msg.replaceAll(key, "***");
114205
+ return { success: false, error: msg };
114206
+ }
114207
+ }
114208
+ });
114209
+ function extractPartitionKeyPaths(partitionKey) {
114210
+ if (!partitionKey || typeof partitionKey !== "object") return void 0;
114211
+ const paths = partitionKey.paths;
114212
+ if (!Array.isArray(paths)) return void 0;
114213
+ return paths.filter((p2) => typeof p2 === "string");
114214
+ }
114215
+
114216
+ // ../connectors/src/connectors/cosmosdb/tools/query.ts
114217
+ import { z as z91 } from "zod";
114218
+ var MAX_DOCUMENTS3 = 500;
114219
+ var inputSchema91 = z91.object({
114220
+ toolUseIntent: z91.string().optional().describe(
114221
+ "Brief description of what you intend to accomplish with this tool call"
114222
+ ),
114223
+ connectionId: z91.string().describe("ID of the Cosmos DB connection to use"),
114224
+ container: z91.string().describe("Id of the container (a.k.a. collection) to query"),
114225
+ sql: z91.string().describe(
114226
+ "Cosmos DB SQL query (Core / NoSQL API). Reference items via the alias `c` (e.g. `SELECT TOP 100 c.id, c.name FROM c WHERE c.status = 'active'`). Use `TOP n` rather than `LIMIT n` \u2014 Cosmos DB does not understand `LIMIT`."
114227
+ ),
114228
+ partitionKey: z91.string().optional().describe(
114229
+ `Optional partition key value to scope the query to a single partition. Pass as a JSON-encoded scalar (e.g. '"abc"' or '123'). Omit for cross-partition queries.`
114230
+ )
114231
+ });
114232
+ var outputSchema91 = z91.discriminatedUnion("success", [
114233
+ z91.object({
114234
+ success: z91.literal(true),
114235
+ documentCount: z91.number(),
114236
+ truncated: z91.boolean(),
114237
+ requestCharge: z91.number().optional(),
114238
+ documents: z91.array(z91.unknown())
114239
+ }),
114240
+ z91.object({
114241
+ success: z91.literal(false),
114242
+ error: z91.string()
114243
+ })
114244
+ ]);
114245
+ var queryTool = new ConnectorTool({
114246
+ name: "query",
114247
+ description: `Execute a Cosmos DB SQL (Core / NoSQL API) query against a container. Returns up to ${MAX_DOCUMENTS3} items.
114248
+ Use for: schema exploration, data sampling, aggregations, and analytical queries.
114249
+ Cosmos DB SQL targets a single container; reference items via the alias \`c\` (e.g. \`SELECT c.id FROM c WHERE c.userId = 'abc'\`).
114250
+ Use \`TOP n\` (not \`LIMIT n\`) to bound the result. Cross-partition queries are enabled by default \u2014 pass \`partitionKey\` to restrict to a single partition.`,
114251
+ inputSchema: inputSchema91,
114252
+ outputSchema: outputSchema91,
114253
+ async execute({ connectionId, container, sql, partitionKey }, connections) {
114254
+ const connection = connections.find((c6) => c6.id === connectionId);
114255
+ if (!connection) {
114256
+ return {
114257
+ success: false,
114258
+ error: `Connection ${connectionId} not found`
114259
+ };
114260
+ }
114261
+ console.log(
114262
+ `[connector-query] cosmosdb/${connection.name} (${container}): ${sql}`
114263
+ );
114264
+ let key;
114265
+ try {
114266
+ const cosmos = await import("@azure/cosmos");
114267
+ const { CosmosClient } = cosmos;
114268
+ const endpoint = parameters74.endpoint.getValue(connection);
114269
+ key = parameters74.key.getValue(connection);
114270
+ const database = parameters74.database.getValue(connection);
114271
+ const client = new CosmosClient({ endpoint, key });
114272
+ const cont = client.database(database).container(container);
114273
+ const queryOptions = {
114274
+ // Bound by the connector's own row cap, but keep the SDK from
114275
+ // streaming arbitrarily large continuations.
114276
+ maxItemCount: MAX_DOCUMENTS3 + 1
114277
+ };
114278
+ if (partitionKey != null && partitionKey !== "") {
114279
+ try {
114280
+ queryOptions.partitionKey = JSON.parse(partitionKey);
114281
+ } catch {
114282
+ return {
114283
+ success: false,
114284
+ error: `Invalid partitionKey: must be a JSON-encoded scalar (e.g. '"abc"' or '123'). Got: ${partitionKey}`
114285
+ };
114286
+ }
114287
+ }
114288
+ const iterator = cont.items.query(sql, queryOptions);
114289
+ const { resources, requestCharge } = await iterator.fetchNext();
114290
+ const documents = resources ?? [];
114291
+ const truncated = documents.length > MAX_DOCUMENTS3;
114292
+ return {
114293
+ success: true,
114294
+ documentCount: Math.min(documents.length, MAX_DOCUMENTS3),
114295
+ truncated,
114296
+ requestCharge,
114297
+ documents: documents.slice(0, MAX_DOCUMENTS3)
114298
+ };
114299
+ } catch (err) {
114300
+ let msg = err instanceof Error ? err.message : String(err);
114301
+ if (key) msg = msg.replaceAll(key, "***");
114302
+ return { success: false, error: msg };
114303
+ }
114304
+ }
114305
+ });
114306
+
114307
+ // ../connectors/src/connectors/cosmosdb/index.ts
114308
+ var tools74 = {
114309
+ listContainers: listContainersTool,
114310
+ query: queryTool
114311
+ };
114312
+ var cosmosdbConnector = new ConnectorPlugin({
114313
+ slug: "cosmosdb",
114314
+ authType: AUTH_TYPES.USER_PASSWORD,
114315
+ name: "Azure Cosmos DB",
114316
+ description: "Connect to Azure Cosmos DB (Core / NoSQL API) for document-oriented data storage and SQL-style querying.",
114317
+ iconUrl: "https://images.ctfassets.net/9ncizv60xc5y/5p9B2Db0V2d8mK2jgBWtZu/dad72db8f41b16c50de2bcef03f9d415/cosmosdb-icon.png",
114318
+ parameters: parameters74,
114319
+ releaseFlag: { dev1: true, dev2: true, prod: true },
114320
+ categories: ["database"],
114321
+ onboarding: cosmosdbOnboarding,
114322
+ systemPrompt: {
114323
+ en: `### Tools
114324
+
114325
+ - \`cosmosdb_listContainers\`: Lists all containers in the configured database, with their partition key paths. Use this first to explore available data.
114326
+ - \`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).
114327
+
114328
+ ### Business Logic
114329
+
114330
+ The business logic type for this connector is "typescript". Write handler code using the connector SDK shown below. Do NOT access credentials directly from environment variables.
114331
+
114332
+ \u26A0\uFE0F **The client returned by \`connection(connectionId)\` is NOT the raw \`@azure/cosmos\` \`CosmosClient\`.** It is a thin wrapper exposing only two methods:
114333
+ - \`client.query<T>(container, sql, options?) => Promise<T[]>\` \u2014 runs a Cosmos SQL query against the named container and returns the **already-unwrapped** items array (no \`{ resources }\` wrapper). \`options\` accepts \`{ maxItemCount?: number; partitionKey?: unknown }\`.
114334
+ - \`client.listContainers() => Promise<{ id: string; partitionKey?: string[] }[]>\` \u2014 lists containers in the configured database.
114335
+
114336
+ There is **no** \`client.databases\`, \`client.database(...)\`, \`client.container(...)\`, or \`client.items\`. Do NOT attempt to use the \`@azure/cosmos\` \`CosmosClient\` API directly through this client \u2014 those calls will fail with \`Cannot read properties of undefined\`.
114337
+
114338
+ \`\`\`ts
114339
+ import type { Context } from "hono";
114340
+ import { connection } from "@squadbase/vite-server/connectors/cosmosdb";
114341
+
114342
+ const cosmos = connection("<connectionId>");
114343
+
114344
+ export default async function handler(_c: Context) {
114345
+ // \`query\` returns the items array directly \u2014 no \`.resources\` to unwrap.
114346
+ const rows = await cosmos.query<{ prod: string; orderCount: number }>(
114347
+ "<containerName>",
114348
+ "SELECT c.prod, COUNT(1) AS orderCount FROM c GROUP BY c.prod",
114349
+ // Optional: scope to a single partition to save RUs.
114350
+ // { partitionKey: "<partitionKeyValue>" },
114351
+ );
114352
+
114353
+ rows.sort((a, b) => Number(b.orderCount) - Number(a.orderCount));
114354
+
114355
+ return new Response(JSON.stringify(rows), {
114356
+ headers: { "Content-Type": "application/json" },
114357
+ });
114358
+ }
114359
+ \`\`\`
114360
+
114361
+ ### Cosmos DB SQL Reference
114362
+ - Cosmos DB stores schema-flexible JSON items in **containers** organised under a **database**. Items are partitioned by a per-container partition key path.
114363
+ - Queries always target a single container and reference items via the alias \`c\` (e.g. \`SELECT c.id, c.name FROM c WHERE c.status = 'active'\`).
114364
+ - Row limiting: use \`TOP n\` (e.g. \`SELECT TOP 100 * FROM c\`). \`LIMIT\` is **not** supported. \`OFFSET m LIMIT n\` is supported on newer accounts but \`TOP\` is the safe default.
114365
+ - System fields are prefixed with an underscore (\`c.id\`, \`c._ts\` for the modification timestamp, \`c._etag\`).
114366
+ - Aggregates: \`COUNT(1)\`, \`SUM\`, \`AVG\`, \`MIN\`, \`MAX\`, with \`GROUP BY\` (e.g. \`SELECT c.country, COUNT(1) AS n FROM c GROUP BY c.country\`).
114367
+ - Joins: only **intra-document** joins via \`JOIN\` over arrays inside the same item; there is no cross-container/cross-document join.
114368
+ - Always bound results with \`TOP n\` and prefer scoped queries with a \`partitionKey\` value when possible \u2014 cross-partition queries cost more RUs.`,
114369
+ ja: `### \u30C4\u30FC\u30EB
114370
+
114371
+ - \`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
114372
+ - \`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
114373
+
114374
+ ### Business Logic
114375
+
114376
+ \u3053\u306E\u30B3\u30CD\u30AF\u30BF\u306E\u30D3\u30B8\u30CD\u30B9\u30ED\u30B8\u30C3\u30AF\u30BF\u30A4\u30D7\u306F "typescript" \u3067\u3059\u3002\u4EE5\u4E0B\u306B\u793A\u3059\u30B3\u30CD\u30AF\u30BFSDK\u3092\u4F7F\u7528\u3057\u3066\u30CF\u30F3\u30C9\u30E9\u30B3\u30FC\u30C9\u3092\u8A18\u8FF0\u3057\u3066\u304F\u3060\u3055\u3044\u3002\u74B0\u5883\u5909\u6570\u304B\u3089\u76F4\u63A5\u8A8D\u8A3C\u60C5\u5831\u306B\u30A2\u30AF\u30BB\u30B9\u3057\u306A\u3044\u3067\u304F\u3060\u3055\u3044\u3002
114377
+
114378
+ \u26A0\uFE0F **\`connection(connectionId)\` \u304C\u8FD4\u3059\u30AF\u30E9\u30A4\u30A2\u30F3\u30C8\u306F \`@azure/cosmos\` \u306E \`CosmosClient\` \u305D\u306E\u3082\u306E\u3067\u306F\u3042\u308A\u307E\u305B\u3093\u3002** \u4EE5\u4E0B\u306E2\u30E1\u30BD\u30C3\u30C9\u306E\u307F\u3092\u516C\u958B\u3059\u308B\u8584\u3044\u30E9\u30C3\u30D1\u30FC\u3067\u3059\uFF1A
114379
+ - \`client.query<T>(container, sql, options?) => Promise<T[]>\` \u2014 \u6307\u5B9A\u30B3\u30F3\u30C6\u30CA\u306B\u5BFE\u3057\u3066 Cosmos SQL \u3092\u5B9F\u884C\u3057\u3001**\u3059\u3067\u306B\u5C55\u958B\u6E08\u307F\u306E\u30A2\u30A4\u30C6\u30E0\u914D\u5217**\u3092\u8FD4\u3059\uFF08\`{ resources }\` \u3067\u30E9\u30C3\u30D7\u3055\u308C\u3066\u3044\u306A\u3044\uFF09\u3002\`options\` \u306F \`{ maxItemCount?: number; partitionKey?: unknown }\`\u3002
114380
+ - \`client.listContainers() => Promise<{ id: string; partitionKey?: string[] }[]>\` \u2014 \u8A2D\u5B9A\u3055\u308C\u305F\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u5185\u306E\u30B3\u30F3\u30C6\u30CA\u4E00\u89A7\u3092\u8FD4\u3059\u3002
114381
+
114382
+ \`client.databases\`\u3001\`client.database(...)\`\u3001\`client.container(...)\`\u3001\`client.items\` \u306F **\u5B58\u5728\u3057\u306A\u3044**\u3002\`@azure/cosmos\` \u306E \`CosmosClient\` API \u3092\u3053\u306E\u30AF\u30E9\u30A4\u30A2\u30F3\u30C8\u8D8A\u3057\u306B\u76F4\u63A5\u4F7F\u304A\u3046\u3068\u3057\u306A\u3044\u3053\u3068 \u2014 \`Cannot read properties of undefined\` \u3067\u5931\u6557\u3059\u308B\u3002
114383
+
114384
+ \`\`\`ts
114385
+ import type { Context } from "hono";
114386
+ import { connection } from "@squadbase/vite-server/connectors/cosmosdb";
114387
+
114388
+ const cosmos = connection("<connectionId>");
114389
+
114390
+ export default async function handler(_c: Context) {
114391
+ // \`query\` \u306F items \u914D\u5217\u3092\u305D\u306E\u307E\u307E\u8FD4\u3059 \u2014 \`.resources\` \u306E\u5C55\u958B\u306F\u4E0D\u8981\u3002
114392
+ const rows = await cosmos.query<{ prod: string; orderCount: number }>(
114393
+ "<containerName>",
114394
+ "SELECT c.prod, COUNT(1) AS orderCount FROM c GROUP BY c.prod",
114395
+ // \u4EFB\u610F: \u5358\u4E00\u30D1\u30FC\u30C6\u30A3\u30B7\u30E7\u30F3\u306B\u30B9\u30B3\u30FC\u30D7\u3057\u3066 RU \u3092\u7BC0\u7D04\u3002
114396
+ // { partitionKey: "<partitionKeyValue>" },
114397
+ );
114398
+
114399
+ rows.sort((a, b) => Number(b.orderCount) - Number(a.orderCount));
114400
+
114401
+ return new Response(JSON.stringify(rows), {
114402
+ headers: { "Content-Type": "application/json" },
114403
+ });
114404
+ }
114405
+ \`\`\`
114406
+
114407
+ ### Cosmos DB SQL \u30EA\u30D5\u30A1\u30EC\u30F3\u30B9
114408
+ - Cosmos DB \u306F\u30B9\u30AD\u30FC\u30DE\u67D4\u8EDF\u306A JSON \u30A2\u30A4\u30C6\u30E0\u3092 **\u30B3\u30F3\u30C6\u30CA** \u306B\u683C\u7D0D\u3057\u3001\u30B3\u30F3\u30C6\u30CA\u306F\u30B3\u30F3\u30C6\u30CA\u3054\u3068\u306E\u30D1\u30FC\u30C6\u30A3\u30B7\u30E7\u30F3\u30AD\u30FC\u30D1\u30B9\u3067\u30D1\u30FC\u30C6\u30A3\u30B7\u30E7\u30F3\u5206\u5272\u3055\u308C\u307E\u3059\u3002\u30B3\u30F3\u30C6\u30CA\u306F **\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9** \u306B\u307E\u3068\u3081\u3089\u308C\u307E\u3059\u3002
114409
+ - \u30AF\u30A8\u30EA\u306F\u5E38\u306B\u5358\u4E00\u30B3\u30F3\u30C6\u30CA\u3092\u5BFE\u8C61\u3068\u3057\u3001\u30A2\u30A4\u30C6\u30E0\u306F\u5225\u540D \`c\` \u3067\u53C2\u7167\u3057\u307E\u3059\uFF08\u4F8B: \`SELECT c.id, c.name FROM c WHERE c.status = 'active'\`\uFF09\u3002
114410
+ - \u884C\u6570\u5236\u9650: \`TOP n\` \u3092\u4F7F\u7528\u3057\u307E\u3059\uFF08\u4F8B: \`SELECT TOP 100 * FROM c\`\uFF09\u3002\`LIMIT\` \u306F **\u4F7F\u7528\u3067\u304D\u307E\u305B\u3093**\u3002\u65B0\u3057\u3044\u30A2\u30AB\u30A6\u30F3\u30C8\u3067\u306F \`OFFSET m LIMIT n\` \u304C\u4F7F\u3048\u307E\u3059\u304C\u3001\u5B89\u5168\u5074\u306E\u65E2\u5B9A\u306F \`TOP\` \u3067\u3059\u3002
114411
+ - \u30B7\u30B9\u30C6\u30E0\u30D5\u30A3\u30FC\u30EB\u30C9\u306F\u30A2\u30F3\u30C0\u30FC\u30B9\u30B3\u30A2\u59CB\u307E\u308A\uFF08\`c.id\`\u3001\u5909\u66F4\u6642\u523B\u306E \`c._ts\`\u3001\`c._etag\`\uFF09\u3002
114412
+ - \u96C6\u7D04: \`COUNT(1)\`\u3001\`SUM\`\u3001\`AVG\`\u3001\`MIN\`\u3001\`MAX\` \u3092 \`GROUP BY\` \u3068\u7D44\u307F\u5408\u308F\u305B\u307E\u3059\uFF08\u4F8B: \`SELECT c.country, COUNT(1) AS n FROM c GROUP BY c.country\`\uFF09\u3002
114413
+ - \u7D50\u5408: \u540C\u4E00\u30A2\u30A4\u30C6\u30E0\u5185\u306E\u914D\u5217\u306B\u5BFE\u3059\u308B **\u30A4\u30F3\u30C8\u30E9\u30C9\u30AD\u30E5\u30E1\u30F3\u30C8** \`JOIN\` \u306E\u307F\u3067\u3001\u30B3\u30F3\u30C6\u30CA\u9593\uFF0F\u30C9\u30AD\u30E5\u30E1\u30F3\u30C8\u9593\u306E\u7D50\u5408\u306F\u30B5\u30DD\u30FC\u30C8\u3055\u308C\u307E\u305B\u3093\u3002
114414
+ - \u7D50\u679C\u4EF6\u6570\u306F\u5FC5\u305A \`TOP n\` \u3067\u5236\u9650\u3057\u3001\u53EF\u80FD\u3067\u3042\u308C\u3070 \`partitionKey\` \u3067\u5358\u4E00\u30D1\u30FC\u30C6\u30A3\u30B7\u30E7\u30F3\u306B\u30B9\u30B3\u30FC\u30D7\u3057\u3066\u304F\u3060\u3055\u3044\uFF08\u30AF\u30ED\u30B9\u30D1\u30FC\u30C6\u30A3\u30B7\u30E7\u30F3\u30AF\u30A8\u30EA\u306F RU \u3092\u591A\u304F\u6D88\u8CBB\u3057\u307E\u3059\uFF09\u3002`
114415
+ },
114416
+ tools: tools74,
114417
+ async checkConnection(params, _config) {
114418
+ try {
114419
+ const { CosmosClient } = await import("@azure/cosmos");
114420
+ const client = new CosmosClient({
114421
+ endpoint: params[parameters74.endpoint.slug],
114422
+ key: params[parameters74.key.slug]
114423
+ });
114424
+ const database = params[parameters74.database.slug];
114425
+ await client.database(database).read();
114426
+ return { success: true };
114427
+ } catch (error2) {
114428
+ const msg = error2 instanceof Error ? error2.message : String(error2);
114429
+ const key = params[parameters74.key.slug];
114430
+ return {
114431
+ success: false,
114432
+ error: key ? msg.replaceAll(key, "***") : msg
114433
+ };
114434
+ }
113934
114435
  }
113935
114436
  });
113936
114437
 
@@ -113951,7 +114452,7 @@ var oracleOnboarding = new ConnectorOnboarding({
113951
114452
  });
113952
114453
 
113953
114454
  // ../connectors/src/connectors/oracle/parameters.ts
113954
- var parameters74 = {
114455
+ var parameters75 = {
113955
114456
  jdbcUrl: new ParameterDefinition({
113956
114457
  slug: "jdbc-url",
113957
114458
  name: "Oracle JDBC URL",
@@ -113978,31 +114479,32 @@ var parameters74 = {
113978
114479
  type: "text",
113979
114480
  secret: true,
113980
114481
  required: false
113981
- })
114482
+ }),
114483
+ ...sshTunnelParameters
113982
114484
  };
113983
114485
 
113984
114486
  // ../connectors/src/connectors/oracle/tools/execute-query.ts
113985
- import { z as z90 } from "zod";
114487
+ import { z as z92 } from "zod";
113986
114488
  var MAX_ROWS16 = 500;
113987
- var inputSchema90 = z90.object({
113988
- toolUseIntent: z90.string().optional().describe(
114489
+ var inputSchema92 = z92.object({
114490
+ toolUseIntent: z92.string().optional().describe(
113989
114491
  "Brief description of what you intend to accomplish with this tool call"
113990
114492
  ),
113991
- connectionId: z90.string().describe("ID of the Oracle connection to use"),
113992
- sql: z90.string().describe(
114493
+ connectionId: z92.string().describe("ID of the Oracle connection to use"),
114494
+ sql: z92.string().describe(
113993
114495
  "PL/SQL-compatible query. Oracle has no `LIMIT`; use `FETCH FIRST n ROWS ONLY` or filter on `ROWNUM`. Don't end the statement with a semicolon \u2014 the driver rejects trailing terminators."
113994
114496
  )
113995
114497
  });
113996
- var outputSchema90 = z90.discriminatedUnion("success", [
113997
- z90.object({
113998
- success: z90.literal(true),
113999
- rowCount: z90.number(),
114000
- truncated: z90.boolean(),
114001
- rows: z90.array(z90.record(z90.string(), z90.unknown()))
114498
+ var outputSchema92 = z92.discriminatedUnion("success", [
114499
+ z92.object({
114500
+ success: z92.literal(true),
114501
+ rowCount: z92.number(),
114502
+ truncated: z92.boolean(),
114503
+ rows: z92.array(z92.record(z92.string(), z92.unknown()))
114002
114504
  }),
114003
- z90.object({
114004
- success: z90.literal(false),
114005
- error: z90.string()
114505
+ z92.object({
114506
+ success: z92.literal(false),
114507
+ error: z92.string()
114006
114508
  })
114007
114509
  ]);
114008
114510
  var executeQueryTool16 = new ConnectorTool({
@@ -114012,8 +114514,8 @@ Use for: schema exploration via \`USER_TABLES\` / \`USER_TAB_COLUMNS\` / \`ALL_T
114012
114514
  Oracle uses \`FETCH FIRST n ROWS ONLY\` (12c+) or \`ROWNUM\` for row limiting \u2014 there is no \`LIMIT\` keyword.
114013
114515
  Unquoted identifiers are stored upper-case (\`SELECT * FROM employees\` resolves to \`EMPLOYEES\`).
114014
114516
  Do NOT terminate statements with a semicolon; the driver rejects trailing terminators.`,
114015
- inputSchema: inputSchema90,
114016
- outputSchema: outputSchema90,
114517
+ inputSchema: inputSchema92,
114518
+ outputSchema: outputSchema92,
114017
114519
  async execute({ connectionId, sql }, connections) {
114018
114520
  const connection = connections.find((c6) => c6.id === connectionId);
114019
114521
  if (!connection) {
@@ -114022,9 +114524,9 @@ Do NOT terminate statements with a semicolon; the driver rejects trailing termin
114022
114524
  error: `Connection ${connectionId} not found`
114023
114525
  };
114024
114526
  }
114025
- const jdbcUrl = parameters74.jdbcUrl.getValue(connection);
114026
- const username = parameters74.username.tryGetValue(connection);
114027
- const password = parameters74.password.tryGetValue(connection);
114527
+ const jdbcUrl = parameters75.jdbcUrl.getValue(connection);
114528
+ const username = parameters75.username.tryGetValue(connection);
114529
+ const password = parameters75.password.tryGetValue(connection);
114028
114530
  console.log(
114029
114531
  `[connector-query] oracle/${connection.name} (${redactOracleUrl(jdbcUrl)}): ${sql}`
114030
114532
  );
@@ -114039,7 +114541,9 @@ Do NOT terminate statements with a semicolon; the driver rejects trailing termin
114039
114541
  }
114040
114542
  try {
114041
114543
  const cleanSql = sql.replace(/;\s*$/, "");
114042
- const { rows } = await runOracleQuery(parsed, cleanSql);
114544
+ const { rows } = await runOracleQuery(parsed, cleanSql, {
114545
+ tunnelParams: connectionParamsToRecord(connection)
114546
+ });
114043
114547
  const truncated = rows.length > MAX_ROWS16;
114044
114548
  return {
114045
114549
  success: true,
@@ -114056,14 +114560,14 @@ Do NOT terminate statements with a semicolon; the driver rejects trailing termin
114056
114560
  });
114057
114561
 
114058
114562
  // ../connectors/src/connectors/oracle/index.ts
114059
- var tools74 = { executeQuery: executeQueryTool16 };
114563
+ var tools75 = { executeQuery: executeQueryTool16 };
114060
114564
  var oracleConnector = new ConnectorPlugin({
114061
114565
  slug: "oracle",
114062
114566
  authType: AUTH_TYPES.USER_PASSWORD,
114063
114567
  name: "Oracle Database",
114064
114568
  description: "Connect to Oracle Database using a JDBC-style URL via the pure-JS Thin driver (no Oracle Instant Client required).",
114065
114569
  iconUrl: "https://images.ctfassets.net/9ncizv60xc5y/3iGEdzvGHncU5bYqFOROiV/9e7bdda7230d7ca6b34e7f6a862de876/oracle-icon.webp",
114066
- parameters: parameters74,
114570
+ parameters: parameters75,
114067
114571
  releaseFlag: { dev1: true, dev2: false, prod: false },
114068
114572
  categories: ["database"],
114069
114573
  onboarding: oracleOnboarding,
@@ -114107,26 +114611,32 @@ The business logic type for this connector is "sql".
114107
114611
  - \u30B9\u30C6\u30FC\u30C8\u30E1\u30F3\u30C8\u672B\u5C3E\u306B\u30BB\u30DF\u30B3\u30ED\u30F3\u3092\u4ED8\u3051\u306A\u3044\u3067\u304F\u3060\u3055\u3044\uFF08thin \u30C9\u30E9\u30A4\u30D0\u304C\u62D2\u5426\u3057\u307E\u3059\uFF09\u3002
114108
114612
  - \u884C\u6570\u5236\u9650\u306E\u4E92\u63DB\u6027: \u30D7\u30E9\u30C3\u30C8\u30D5\u30A9\u30FC\u30E0\u306E server-logic \u30B9\u30AD\u30FC\u30DE\u63A8\u8AD6\u306F\u3001\u30AF\u30A8\u30EA\u3092 \`SELECT * FROM (<inner>) AS _sq LIMIT N\` \u306E\u5F62\u3067\u30E9\u30C3\u30D7\u3057\u3066\u304F\u308B\u3053\u3068\u304C\u3042\u308A\u307E\u3059\u3002Oracle \u306B\u306F \`LIMIT\` \u30AD\u30FC\u30EF\u30FC\u30C9\u304C\u5B58\u5728\u3057\u306A\u3044\u305F\u3081\u3001\u30B3\u30CD\u30AF\u30BF\u306F \`query()\` \u5185\u3067\u3053\u306E\u30E9\u30C3\u30D1\u3092\u691C\u51FA\u3057\u3001\`<inner>\` \u3092\u305D\u306E\u307E\u307E\u5B9F\u884C\u3057\u3066 JS \u5074\u3067\u5148\u982D N \u884C\u306B\u5207\u308A\u8A70\u3081\u307E\u3059\u3002\u5229\u7528\u8005\u5074\u3067\u5BFE\u51E6\u3059\u308B\u5FC5\u8981\u306F\u3042\u308A\u307E\u305B\u3093\u304C\u3001\u81EA\u5206\u3067\u66F8\u304F SQL \u3067\u306F \`LIMIT\` \u3092\u4F7F\u308F\u305A \`FETCH FIRST N ROWS ONLY\` / \`OFFSET m ROWS FETCH NEXT N ROWS ONLY\` / \`ROWNUM\` \u3092\u4F7F\u3063\u3066\u304F\u3060\u3055\u3044\u3002`
114109
114613
  },
114110
- tools: tools74,
114614
+ tools: tools75,
114111
114615
  async checkConnection(params, _config) {
114112
- return checkOracleConnection(params[parameters74.jdbcUrl.slug], {
114113
- username: params[parameters74.username.slug],
114114
- password: params[parameters74.password.slug]
114115
- });
114616
+ return checkOracleConnection(
114617
+ params[parameters75.jdbcUrl.slug],
114618
+ {
114619
+ username: params[parameters75.username.slug],
114620
+ password: params[parameters75.password.slug]
114621
+ },
114622
+ { tunnelParams: params }
114623
+ );
114116
114624
  },
114117
114625
  async query(params, sql, _namedParams) {
114118
- const parsed = parseOracleJdbcUrl(params[parameters74.jdbcUrl.slug], {
114119
- username: params[parameters74.username.slug],
114120
- password: params[parameters74.password.slug]
114626
+ const parsed = parseOracleJdbcUrl(params[parameters75.jdbcUrl.slug], {
114627
+ username: params[parameters75.username.slug],
114628
+ password: params[parameters75.password.slug]
114121
114629
  });
114122
114630
  const sample = unwrapSampleLimit(sql);
114123
114631
  if (sample) {
114124
114632
  const inner = sample.inner.replace(/;\s*$/, "");
114125
- const result = await runOracleQuery(parsed, inner);
114633
+ const result = await runOracleQuery(parsed, inner, {
114634
+ tunnelParams: params
114635
+ });
114126
114636
  return { rows: result.rows.slice(0, sample.limit) };
114127
114637
  }
114128
114638
  const cleanSql = sql.replace(/;\s*$/, "");
114129
- return runOracleQuery(parsed, cleanSql);
114639
+ return runOracleQuery(parsed, cleanSql, { tunnelParams: params });
114130
114640
  }
114131
114641
  });
114132
114642
 
@@ -114147,7 +114657,7 @@ var freshserviceOnboarding = new ConnectorOnboarding({
114147
114657
  });
114148
114658
 
114149
114659
  // ../connectors/src/connectors/freshservice/parameters.ts
114150
- var parameters75 = {
114660
+ var parameters76 = {
114151
114661
  domain: new ParameterDefinition({
114152
114662
  slug: "domain",
114153
114663
  name: "Freshservice Domain",
@@ -114169,7 +114679,7 @@ var parameters75 = {
114169
114679
  };
114170
114680
 
114171
114681
  // ../connectors/src/connectors/freshservice/tools/request.ts
114172
- import { z as z91 } from "zod";
114682
+ import { z as z93 } from "zod";
114173
114683
  var BASE_PATH_SEGMENT12 = "/api/v2";
114174
114684
  var REQUEST_TIMEOUT_MS70 = 6e4;
114175
114685
  function buildBaseUrl(domain) {
@@ -114180,33 +114690,33 @@ function buildBaseUrl(domain) {
114180
114690
  function basicAuthHeader(apiKey) {
114181
114691
  return `Basic ${Buffer.from(`${apiKey}:X`).toString("base64")}`;
114182
114692
  }
114183
- var inputSchema91 = z91.object({
114184
- toolUseIntent: z91.string().optional().describe(
114693
+ var inputSchema93 = z93.object({
114694
+ toolUseIntent: z93.string().optional().describe(
114185
114695
  "Brief description of what you intend to accomplish with this tool call"
114186
114696
  ),
114187
- connectionId: z91.string().describe("ID of the Freshservice connection to use"),
114188
- method: z91.enum(["GET", "POST", "PUT", "DELETE"]).describe(
114697
+ connectionId: z93.string().describe("ID of the Freshservice connection to use"),
114698
+ method: z93.enum(["GET", "POST", "PUT", "DELETE"]).describe(
114189
114699
  "HTTP method. GET for reading resources, POST for creating, PUT for updating, DELETE for removing."
114190
114700
  ),
114191
- path: z91.string().describe(
114701
+ path: z93.string().describe(
114192
114702
  "API path (e.g., '/tickets', '/tickets/123', '/agents'). Append query parameters such as '?per_page=100&page=1' for pagination."
114193
114703
  ),
114194
- body: z91.record(z91.string(), z91.unknown()).optional().describe(
114704
+ body: z93.record(z93.string(), z93.unknown()).optional().describe(
114195
114705
  'Request body (JSON) for POST/PUT requests. Example: { "subject": "...", "description": "...", "email": "...", "priority": 2, "status": 2, "source": 2 }.'
114196
114706
  )
114197
114707
  });
114198
- var outputSchema91 = z91.discriminatedUnion("success", [
114199
- z91.object({
114200
- success: z91.literal(true),
114201
- status: z91.number(),
114202
- data: z91.union([
114203
- z91.record(z91.string(), z91.unknown()),
114204
- z91.array(z91.unknown())
114708
+ var outputSchema93 = z93.discriminatedUnion("success", [
114709
+ z93.object({
114710
+ success: z93.literal(true),
114711
+ status: z93.number(),
114712
+ data: z93.union([
114713
+ z93.record(z93.string(), z93.unknown()),
114714
+ z93.array(z93.unknown())
114205
114715
  ])
114206
114716
  }),
114207
- z91.object({
114208
- success: z91.literal(false),
114209
- error: z91.string()
114717
+ z93.object({
114718
+ success: z93.literal(false),
114719
+ error: z93.string()
114210
114720
  })
114211
114721
  ]);
114212
114722
  var requestTool52 = new ConnectorTool({
@@ -114237,8 +114747,8 @@ Field codes:
114237
114747
  - ticket priority: 1 Low, 2 Medium, 3 High, 4 Urgent
114238
114748
  - ticket status: 2 Open, 3 Pending, 4 Resolved, 5 Closed
114239
114749
  - ticket source: 1 Email, 2 Portal, 3 Phone, 4 Chat, 5 Feedback widget, 7 Yammer, 8 AwsCloudwatch, 9 Pagerduty, 10 Walkup, 11 Slack`,
114240
- inputSchema: inputSchema91,
114241
- outputSchema: outputSchema91,
114750
+ inputSchema: inputSchema93,
114751
+ outputSchema: outputSchema93,
114242
114752
  async execute({ connectionId, method, path: path5, body }, connections) {
114243
114753
  const connection = connections.find((c6) => c6.id === connectionId);
114244
114754
  if (!connection) {
@@ -114251,8 +114761,8 @@ Field codes:
114251
114761
  `[connector-request] freshservice/${connection.name}: ${method} ${path5}`
114252
114762
  );
114253
114763
  try {
114254
- const apiKey = parameters75.apiKey.getValue(connection);
114255
- const domain = parameters75.domain.getValue(connection);
114764
+ const apiKey = parameters76.apiKey.getValue(connection);
114765
+ const domain = parameters76.domain.getValue(connection);
114256
114766
  const baseUrl = buildBaseUrl(domain);
114257
114767
  const normalizedPath = normalizeRequestPath(path5, BASE_PATH_SEGMENT12);
114258
114768
  const url = `${baseUrl}${normalizedPath}`;
@@ -114291,14 +114801,14 @@ Field codes:
114291
114801
  });
114292
114802
 
114293
114803
  // ../connectors/src/connectors/freshservice/index.ts
114294
- var tools75 = { request: requestTool52 };
114804
+ var tools76 = { request: requestTool52 };
114295
114805
  var freshserviceConnector = new ConnectorPlugin({
114296
114806
  slug: "freshservice",
114297
114807
  authType: AUTH_TYPES.API_KEY,
114298
114808
  name: "Freshservice",
114299
114809
  description: "Connect to Freshservice (ITSM) for ticket, agent, asset, and ITIL workflow data via API key.",
114300
114810
  iconUrl: "https://images.ctfassets.net/9ncizv60xc5y/6Tj64HZOoIrGgQYDayBosY/3f45b29d3479726b5d245ac38d5a7036/freshservice-icon.svg",
114301
- parameters: parameters75,
114811
+ parameters: parameters76,
114302
114812
  releaseFlag: { dev1: true, dev2: true, prod: true },
114303
114813
  categories: ["productivity"],
114304
114814
  onboarding: freshserviceOnboarding,
@@ -114456,7 +114966,7 @@ export default async function handler(c: Context) {
114456
114966
  - \`status\`: 2=Open, 3=Pending, 4=Resolved, 5=Closed
114457
114967
  - \`source\`: 1=Email, 2=Portal, 3=Phone, 4=Chat, 5=Feedback widget, 7=Yammer, 8=AwsCloudwatch, 9=Pagerduty, 10=Walkup, 11=Slack`
114458
114968
  },
114459
- tools: tools75
114969
+ tools: tools76
114460
114970
  });
114461
114971
 
114462
114972
  // ../connectors/src/connectors/freshdesk/setup.ts
@@ -114476,7 +114986,7 @@ var freshdeskOnboarding = new ConnectorOnboarding({
114476
114986
  });
114477
114987
 
114478
114988
  // ../connectors/src/connectors/freshdesk/parameters.ts
114479
- var parameters76 = {
114989
+ var parameters77 = {
114480
114990
  domain: new ParameterDefinition({
114481
114991
  slug: "domain",
114482
114992
  name: "Freshdesk Domain",
@@ -114498,7 +115008,7 @@ var parameters76 = {
114498
115008
  };
114499
115009
 
114500
115010
  // ../connectors/src/connectors/freshdesk/tools/request.ts
114501
- import { z as z92 } from "zod";
115011
+ import { z as z94 } from "zod";
114502
115012
  var BASE_PATH_SEGMENT13 = "/api/v2";
114503
115013
  var REQUEST_TIMEOUT_MS71 = 6e4;
114504
115014
  function buildBaseUrl2(domain) {
@@ -114509,33 +115019,33 @@ function buildBaseUrl2(domain) {
114509
115019
  function basicAuthHeader2(apiKey) {
114510
115020
  return `Basic ${Buffer.from(`${apiKey}:X`).toString("base64")}`;
114511
115021
  }
114512
- var inputSchema92 = z92.object({
114513
- toolUseIntent: z92.string().optional().describe(
115022
+ var inputSchema94 = z94.object({
115023
+ toolUseIntent: z94.string().optional().describe(
114514
115024
  "Brief description of what you intend to accomplish with this tool call"
114515
115025
  ),
114516
- connectionId: z92.string().describe("ID of the Freshdesk connection to use"),
114517
- method: z92.enum(["GET", "POST", "PUT", "DELETE"]).describe(
115026
+ connectionId: z94.string().describe("ID of the Freshdesk connection to use"),
115027
+ method: z94.enum(["GET", "POST", "PUT", "DELETE"]).describe(
114518
115028
  "HTTP method. GET for reading resources, POST for creating, PUT for updating, DELETE for removing."
114519
115029
  ),
114520
- path: z92.string().describe(
115030
+ path: z94.string().describe(
114521
115031
  "API path (e.g., '/tickets', '/tickets/123', '/contacts'). Append query parameters such as '?per_page=100&page=1&order_by=created_at&order_type=desc'."
114522
115032
  ),
114523
- body: z92.record(z92.string(), z92.unknown()).optional().describe(
115033
+ body: z94.record(z94.string(), z94.unknown()).optional().describe(
114524
115034
  'Request body (JSON) for POST/PUT requests. Example creating a ticket: { "subject": "...", "description": "...", "email": "...", "priority": 2, "status": 2, "source": 1 }.'
114525
115035
  )
114526
115036
  });
114527
- var outputSchema92 = z92.discriminatedUnion("success", [
114528
- z92.object({
114529
- success: z92.literal(true),
114530
- status: z92.number(),
114531
- data: z92.union([
114532
- z92.record(z92.string(), z92.unknown()),
114533
- z92.array(z92.unknown())
115037
+ var outputSchema94 = z94.discriminatedUnion("success", [
115038
+ z94.object({
115039
+ success: z94.literal(true),
115040
+ status: z94.number(),
115041
+ data: z94.union([
115042
+ z94.record(z94.string(), z94.unknown()),
115043
+ z94.array(z94.unknown())
114534
115044
  ])
114535
115045
  }),
114536
- z92.object({
114537
- success: z92.literal(false),
114538
- error: z92.string()
115046
+ z94.object({
115047
+ success: z94.literal(false),
115048
+ error: z94.string()
114539
115049
  })
114540
115050
  ]);
114541
115051
  var requestTool53 = new ConnectorTool({
@@ -114566,8 +115076,8 @@ Field codes (tickets):
114566
115076
  - priority: 1 Low, 2 Medium, 3 High, 4 Urgent
114567
115077
  - status: 2 Open, 3 Pending, 4 Resolved, 5 Closed
114568
115078
  - source: 1 Email, 2 Portal, 3 Phone, 7 Chat, 9 Feedback widget, 10 Outbound email`,
114569
- inputSchema: inputSchema92,
114570
- outputSchema: outputSchema92,
115079
+ inputSchema: inputSchema94,
115080
+ outputSchema: outputSchema94,
114571
115081
  async execute({ connectionId, method, path: path5, body }, connections) {
114572
115082
  const connection = connections.find((c6) => c6.id === connectionId);
114573
115083
  if (!connection) {
@@ -114580,8 +115090,8 @@ Field codes (tickets):
114580
115090
  `[connector-request] freshdesk/${connection.name}: ${method} ${path5}`
114581
115091
  );
114582
115092
  try {
114583
- const apiKey = parameters76.apiKey.getValue(connection);
114584
- const domain = parameters76.domain.getValue(connection);
115093
+ const apiKey = parameters77.apiKey.getValue(connection);
115094
+ const domain = parameters77.domain.getValue(connection);
114585
115095
  const baseUrl = buildBaseUrl2(domain);
114586
115096
  const normalizedPath = normalizeRequestPath(path5, BASE_PATH_SEGMENT13);
114587
115097
  const url = `${baseUrl}${normalizedPath}`;
@@ -114620,14 +115130,14 @@ Field codes (tickets):
114620
115130
  });
114621
115131
 
114622
115132
  // ../connectors/src/connectors/freshdesk/index.ts
114623
- var tools76 = { request: requestTool53 };
115133
+ var tools77 = { request: requestTool53 };
114624
115134
  var freshdeskConnector = new ConnectorPlugin({
114625
115135
  slug: "freshdesk",
114626
115136
  authType: AUTH_TYPES.API_KEY,
114627
115137
  name: "Freshdesk",
114628
115138
  description: "Connect to Freshdesk for customer support ticket, contact, and company data via API key.",
114629
115139
  iconUrl: "https://images.ctfassets.net/9ncizv60xc5y/1PSjIfQJgTYmiWriNTx4uE/26905f4120713bda0afd0b23d02a154e/freshdesk-icon.png",
114630
- parameters: parameters76,
115140
+ parameters: parameters77,
114631
115141
  releaseFlag: { dev1: true, dev2: true, prod: true },
114632
115142
  categories: ["crm"],
114633
115143
  onboarding: freshdeskOnboarding,
@@ -114787,7 +115297,7 @@ export default async function handler(c: Context) {
114787
115297
  - \`status\`: 2=Open, 3=Pending, 4=Resolved, 5=Closed
114788
115298
  - \`source\`: 1=Email, 2=Portal, 3=Phone, 7=Chat, 9=Feedback widget, 10=Outbound email`
114789
115299
  },
114790
- tools: tools76
115300
+ tools: tools77
114791
115301
  });
114792
115302
 
114793
115303
  // ../connectors/src/connectors/freshsales/setup.ts
@@ -114807,7 +115317,7 @@ var freshsalesOnboarding = new ConnectorOnboarding({
114807
115317
  });
114808
115318
 
114809
115319
  // ../connectors/src/connectors/freshsales/parameters.ts
114810
- var parameters77 = {
115320
+ var parameters78 = {
114811
115321
  bundleAlias: new ParameterDefinition({
114812
115322
  slug: "bundle-alias",
114813
115323
  name: "Freshsales Bundle Alias",
@@ -114829,7 +115339,7 @@ var parameters77 = {
114829
115339
  };
114830
115340
 
114831
115341
  // ../connectors/src/connectors/freshsales/tools/request.ts
114832
- import { z as z93 } from "zod";
115342
+ import { z as z95 } from "zod";
114833
115343
  var BASE_PATH_SEGMENT14 = "/crm/sales/api";
114834
115344
  var REQUEST_TIMEOUT_MS72 = 6e4;
114835
115345
  function buildBaseUrl3(bundleAlias) {
@@ -114837,33 +115347,33 @@ function buildBaseUrl3(bundleAlias) {
114837
115347
  const subdomain = trimmed.split(".")[0];
114838
115348
  return `https://${subdomain}.myfreshworks.com${BASE_PATH_SEGMENT14}`;
114839
115349
  }
114840
- var inputSchema93 = z93.object({
114841
- toolUseIntent: z93.string().optional().describe(
115350
+ var inputSchema95 = z95.object({
115351
+ toolUseIntent: z95.string().optional().describe(
114842
115352
  "Brief description of what you intend to accomplish with this tool call"
114843
115353
  ),
114844
- connectionId: z93.string().describe("ID of the Freshsales connection to use"),
114845
- method: z93.enum(["GET", "POST", "PUT", "DELETE"]).describe(
115354
+ connectionId: z95.string().describe("ID of the Freshsales connection to use"),
115355
+ method: z95.enum(["GET", "POST", "PUT", "DELETE"]).describe(
114846
115356
  "HTTP method. GET for reading resources (including /lookup), POST for creating, PUT for updating, DELETE for removing."
114847
115357
  ),
114848
- path: z93.string().describe(
115358
+ path: z95.string().describe(
114849
115359
  "API path (e.g., '/contacts', '/contacts/filters', '/contacts/view/{view_id}', '/deals/{id}', '/lookup'). Append query parameters such as '?page=1&per_page=100'."
114850
115360
  ),
114851
- body: z93.record(z93.string(), z93.unknown()).optional().describe(
115361
+ body: z95.record(z95.string(), z95.unknown()).optional().describe(
114852
115362
  'Request body (JSON). For creating a contact: { "contact": { "first_name": "...", "last_name": "...", "email": "..." } }. For lookup: { "q": "john@example.com", "f": "email", "entities": "contact" }.'
114853
115363
  )
114854
115364
  });
114855
- var outputSchema93 = z93.discriminatedUnion("success", [
114856
- z93.object({
114857
- success: z93.literal(true),
114858
- status: z93.number(),
114859
- data: z93.union([
114860
- z93.record(z93.string(), z93.unknown()),
114861
- z93.array(z93.unknown())
115365
+ var outputSchema95 = z95.discriminatedUnion("success", [
115366
+ z95.object({
115367
+ success: z95.literal(true),
115368
+ status: z95.number(),
115369
+ data: z95.union([
115370
+ z95.record(z95.string(), z95.unknown()),
115371
+ z95.array(z95.unknown())
114862
115372
  ])
114863
115373
  }),
114864
- z93.object({
114865
- success: z93.literal(false),
114866
- error: z93.string()
115374
+ z95.object({
115375
+ success: z95.literal(false),
115376
+ error: z95.string()
114867
115377
  })
114868
115378
  ]);
114869
115379
  var requestTool54 = new ConnectorTool({
@@ -114896,8 +115406,8 @@ Common endpoints:
114896
115406
  Pagination: 1-indexed \`page\` + \`per_page\` (default 25, max 100). View endpoints return \`{ contacts/sales_accounts/deals: [...], meta: { total_pages, total } }\`.
114897
115407
 
114898
115408
  Includes: most GET endpoints accept \`?include=\` with a comma-separated list (\`owner\`, \`creator\`, \`deals\`, \`contacts\`, etc.) to inline related records.`,
114899
- inputSchema: inputSchema93,
114900
- outputSchema: outputSchema93,
115409
+ inputSchema: inputSchema95,
115410
+ outputSchema: outputSchema95,
114901
115411
  async execute({ connectionId, method, path: path5, body }, connections) {
114902
115412
  const connection = connections.find((c6) => c6.id === connectionId);
114903
115413
  if (!connection) {
@@ -114910,8 +115420,8 @@ Includes: most GET endpoints accept \`?include=\` with a comma-separated list (\
114910
115420
  `[connector-request] freshsales/${connection.name}: ${method} ${path5}`
114911
115421
  );
114912
115422
  try {
114913
- const apiKey = parameters77.apiKey.getValue(connection);
114914
- const bundle = parameters77.bundleAlias.getValue(connection);
115423
+ const apiKey = parameters78.apiKey.getValue(connection);
115424
+ const bundle = parameters78.bundleAlias.getValue(connection);
114915
115425
  const baseUrl = buildBaseUrl3(bundle);
114916
115426
  const normalizedPath = normalizeRequestPath(path5, BASE_PATH_SEGMENT14);
114917
115427
  const url = `${baseUrl}${normalizedPath}`;
@@ -114949,14 +115459,14 @@ Includes: most GET endpoints accept \`?include=\` with a comma-separated list (\
114949
115459
  });
114950
115460
 
114951
115461
  // ../connectors/src/connectors/freshsales/index.ts
114952
- var tools77 = { request: requestTool54 };
115462
+ var tools78 = { request: requestTool54 };
114953
115463
  var freshsalesConnector = new ConnectorPlugin({
114954
115464
  slug: "freshsales",
114955
115465
  authType: AUTH_TYPES.API_KEY,
114956
115466
  name: "Freshsales",
114957
115467
  description: "Connect to Freshsales / Freshworks CRM for contact, account, and deal data via API key.",
114958
115468
  iconUrl: "https://images.ctfassets.net/9ncizv60xc5y/4UDOrFPM6wOFekbMVljjgl/4acc6060c3a1ff703980e6f4e76a3cd4/629b6c6f7c5cd817694c321f.png",
114959
- parameters: parameters77,
115469
+ parameters: parameters78,
114960
115470
  releaseFlag: { dev1: true, dev2: true, prod: true },
114961
115471
  categories: ["crm"],
114962
115472
  onboarding: freshsalesOnboarding,
@@ -115128,7 +115638,7 @@ export default async function handler(c: Context) {
115128
115638
  - GET \`/selector/lifecycle_stages\` \u2014 \u30E9\u30A4\u30D5\u30B5\u30A4\u30AF\u30EB\u30B9\u30C6\u30FC\u30B8
115129
115639
  - GET \`/selector/territories\` / \`/selector/business_types\` / \`/selector/industry_types\` / \`/selector/contact_statuses\` / \`/selector/sales_activity_types\``
115130
115640
  },
115131
- tools: tools77
115641
+ tools: tools78
115132
115642
  });
115133
115643
 
115134
115644
  // ../connectors/src/connectors/github/setup.ts
@@ -115154,7 +115664,7 @@ var githubOnboarding = new ConnectorOnboarding({
115154
115664
  });
115155
115665
 
115156
115666
  // ../connectors/src/connectors/github/parameters.ts
115157
- var parameters78 = {
115667
+ var parameters79 = {
115158
115668
  personalAccessToken: new ParameterDefinition({
115159
115669
  slug: "personal-access-token",
115160
115670
  name: "GitHub Personal Access Token",
@@ -115177,42 +115687,42 @@ var parameters78 = {
115177
115687
  var DEFAULT_BASE_URL = "https://api.github.com";
115178
115688
 
115179
115689
  // ../connectors/src/connectors/github/tools/request.ts
115180
- import { z as z94 } from "zod";
115690
+ import { z as z96 } from "zod";
115181
115691
  var REQUEST_TIMEOUT_MS73 = 6e4;
115182
115692
  function resolveBaseUrl(connectionBaseUrl) {
115183
115693
  const trimmed = connectionBaseUrl?.trim();
115184
115694
  return trimmed && trimmed.replace(/\/+$/, "") || DEFAULT_BASE_URL;
115185
115695
  }
115186
- var inputSchema94 = z94.object({
115187
- toolUseIntent: z94.string().optional().describe(
115696
+ var inputSchema96 = z96.object({
115697
+ toolUseIntent: z96.string().optional().describe(
115188
115698
  "Brief description of what you intend to accomplish with this tool call"
115189
115699
  ),
115190
- connectionId: z94.string().describe("ID of the GitHub connection to use"),
115191
- method: z94.enum(["GET", "POST", "PUT", "PATCH", "DELETE"]).describe(
115700
+ connectionId: z96.string().describe("ID of the GitHub connection to use"),
115701
+ method: z96.enum(["GET", "POST", "PUT", "PATCH", "DELETE"]).describe(
115192
115702
  "HTTP method. GET for reading, POST for creating, PATCH for partial updates, PUT for replacement (e.g. starring), DELETE for removal."
115193
115703
  ),
115194
- path: z94.string().describe(
115704
+ path: z96.string().describe(
115195
115705
  "API path (e.g., '/user', '/repos/{owner}/{repo}/issues', '/search/repositories?q=topic:react'). Append query parameters such as '?state=open&per_page=100&page=1'."
115196
115706
  ),
115197
- body: z94.union([
115198
- z94.record(z94.string(), z94.unknown()),
115199
- z94.array(z94.unknown())
115707
+ body: z96.union([
115708
+ z96.record(z96.string(), z96.unknown()),
115709
+ z96.array(z96.unknown())
115200
115710
  ]).optional().describe(
115201
115711
  'Request body (JSON). Example creating an issue: { "title": "...", "body": "...", "labels": ["bug"] }.'
115202
115712
  )
115203
115713
  });
115204
- var outputSchema94 = z94.discriminatedUnion("success", [
115205
- z94.object({
115206
- success: z94.literal(true),
115207
- status: z94.number(),
115208
- data: z94.union([
115209
- z94.record(z94.string(), z94.unknown()),
115210
- z94.array(z94.unknown())
115714
+ var outputSchema96 = z96.discriminatedUnion("success", [
115715
+ z96.object({
115716
+ success: z96.literal(true),
115717
+ status: z96.number(),
115718
+ data: z96.union([
115719
+ z96.record(z96.string(), z96.unknown()),
115720
+ z96.array(z96.unknown())
115211
115721
  ])
115212
115722
  }),
115213
- z94.object({
115214
- success: z94.literal(false),
115215
- error: z94.string()
115723
+ z96.object({
115724
+ success: z96.literal(false),
115725
+ error: z96.string()
115216
115726
  })
115217
115727
  ]);
115218
115728
  var requestTool55 = new ConnectorTool({
@@ -115250,8 +115760,8 @@ Common endpoints:
115250
115760
  Pagination: 1-indexed \`page\` + \`per_page\` (max 100). The \`Link\` response header exposes \`rel="next"\`/\`rel="last"\` URLs.
115251
115761
 
115252
115762
  Rate limits: 5,000 req/hr on REST endpoints, 30 req/min on /search/*. Inspect \`X-RateLimit-Remaining\` to throttle.`,
115253
- inputSchema: inputSchema94,
115254
- outputSchema: outputSchema94,
115763
+ inputSchema: inputSchema96,
115764
+ outputSchema: outputSchema96,
115255
115765
  async execute({ connectionId, method, path: path5, body }, connections) {
115256
115766
  const connection = connections.find((c6) => c6.id === connectionId);
115257
115767
  if (!connection) {
@@ -115264,8 +115774,8 @@ Rate limits: 5,000 req/hr on REST endpoints, 30 req/min on /search/*. Inspect \`
115264
115774
  `[connector-request] github/${connection.name}: ${method} ${path5}`
115265
115775
  );
115266
115776
  try {
115267
- const token = parameters78.personalAccessToken.getValue(connection);
115268
- const baseUrl = resolveBaseUrl(parameters78.baseUrl.tryGetValue(connection));
115777
+ const token = parameters79.personalAccessToken.getValue(connection);
115778
+ const baseUrl = resolveBaseUrl(parameters79.baseUrl.tryGetValue(connection));
115269
115779
  const trimmedPath = path5.trim().replace(/^\/+/, "/");
115270
115780
  const url = `${baseUrl}${trimmedPath.startsWith("/") ? "" : "/"}${trimmedPath}`;
115271
115781
  const controller = new AbortController();
@@ -115305,14 +115815,14 @@ Rate limits: 5,000 req/hr on REST endpoints, 30 req/min on /search/*. Inspect \`
115305
115815
  });
115306
115816
 
115307
115817
  // ../connectors/src/connectors/github/index.ts
115308
- var tools78 = { request: requestTool55 };
115818
+ var tools79 = { request: requestTool55 };
115309
115819
  var githubConnector = new ConnectorPlugin({
115310
115820
  slug: "github",
115311
115821
  authType: AUTH_TYPES.PAT,
115312
115822
  name: "GitHub",
115313
115823
  description: "Connect to GitHub for repository, issue, pull request, commit, and search data via Personal Access Token (Classic or fine-grained).",
115314
115824
  iconUrl: "https://images.ctfassets.net/9ncizv60xc5y/2flOAufkhDrLKuOQqEVS3/1f9dcf145680ef77aef149709263e2d4/github-icon.svg",
115315
- parameters: parameters78,
115825
+ parameters: parameters79,
115316
115826
  releaseFlag: { dev1: true, dev2: true, prod: true },
115317
115827
  categories: ["productivity"],
115318
115828
  onboarding: githubOnboarding,
@@ -115532,7 +116042,7 @@ export default async function handler(c: Context) {
115532
116042
  **\u30AF\u30A9\u30FC\u30BF**
115533
116043
  - GET \`/rate_limit\` \u2014 REST / GraphQL / search \u306E\u6B8B\u30EC\u30FC\u30C8\u78BA\u8A8D`
115534
116044
  },
115535
- tools: tools78
116045
+ tools: tools79
115536
116046
  });
115537
116047
 
115538
116048
  // ../connectors/src/connectors/registry.ts
@@ -115610,6 +116120,7 @@ var plugins = {
115610
116120
  clickup: clickupConnector,
115611
116121
  sqlserver: sqlserverConnector,
115612
116122
  azureSql: azureSqlConnector,
116123
+ cosmosdb: cosmosdbConnector,
115613
116124
  oracle: oracleConnector,
115614
116125
  freshservice: freshserviceConnector,
115615
116126
  freshdesk: freshdeskConnector,
@@ -115841,62 +116352,62 @@ import { watch as fsWatch2 } from "fs";
115841
116352
  import path2 from "path";
115842
116353
 
115843
116354
  // src/types/server-logic.ts
115844
- import { z as z95 } from "zod";
115845
- var parameterMetaSchema = z95.object({
115846
- name: z95.string(),
115847
- type: z95.enum(["string", "number", "boolean"]),
115848
- description: z95.string(),
115849
- required: z95.boolean().optional(),
115850
- default: z95.union([z95.string(), z95.number(), z95.boolean()]).optional()
115851
- });
115852
- var serverLogicCacheConfigSchema = z95.object({
115853
- ttl: z95.number(),
115854
- staleWhileRevalidate: z95.boolean().optional()
115855
- });
115856
- var serverLogicSchemaObjectSchema = z95.lazy(
115857
- () => z95.object({
115858
- type: z95.enum(["string", "number", "integer", "boolean", "object", "array", "null"]).optional(),
115859
- format: z95.string().optional(),
115860
- description: z95.string().optional(),
115861
- nullable: z95.boolean().optional(),
115862
- enum: z95.array(z95.union([z95.string(), z95.number(), z95.boolean(), z95.null()])).optional(),
116355
+ import { z as z97 } from "zod";
116356
+ var parameterMetaSchema = z97.object({
116357
+ name: z97.string(),
116358
+ type: z97.enum(["string", "number", "boolean"]),
116359
+ description: z97.string(),
116360
+ required: z97.boolean().optional(),
116361
+ default: z97.union([z97.string(), z97.number(), z97.boolean()]).optional()
116362
+ });
116363
+ var serverLogicCacheConfigSchema = z97.object({
116364
+ ttl: z97.number(),
116365
+ staleWhileRevalidate: z97.boolean().optional()
116366
+ });
116367
+ var serverLogicSchemaObjectSchema = z97.lazy(
116368
+ () => z97.object({
116369
+ type: z97.enum(["string", "number", "integer", "boolean", "object", "array", "null"]).optional(),
116370
+ format: z97.string().optional(),
116371
+ description: z97.string().optional(),
116372
+ nullable: z97.boolean().optional(),
116373
+ enum: z97.array(z97.union([z97.string(), z97.number(), z97.boolean(), z97.null()])).optional(),
115863
116374
  items: serverLogicSchemaObjectSchema.optional(),
115864
- properties: z95.record(z95.string(), serverLogicSchemaObjectSchema).optional(),
115865
- required: z95.array(z95.string()).optional(),
115866
- additionalProperties: z95.union([z95.boolean(), serverLogicSchemaObjectSchema]).optional(),
115867
- minimum: z95.number().optional(),
115868
- maximum: z95.number().optional(),
115869
- minLength: z95.number().optional(),
115870
- maxLength: z95.number().optional(),
115871
- pattern: z95.string().optional()
116375
+ properties: z97.record(z97.string(), serverLogicSchemaObjectSchema).optional(),
116376
+ required: z97.array(z97.string()).optional(),
116377
+ additionalProperties: z97.union([z97.boolean(), serverLogicSchemaObjectSchema]).optional(),
116378
+ minimum: z97.number().optional(),
116379
+ maximum: z97.number().optional(),
116380
+ minLength: z97.number().optional(),
116381
+ maxLength: z97.number().optional(),
116382
+ pattern: z97.string().optional()
115872
116383
  })
115873
116384
  );
115874
- var serverLogicMediaTypeSchema = z95.object({
116385
+ var serverLogicMediaTypeSchema = z97.object({
115875
116386
  schema: serverLogicSchemaObjectSchema.optional(),
115876
- example: z95.unknown().optional()
116387
+ example: z97.unknown().optional()
115877
116388
  });
115878
- var serverLogicResponseSchema = z95.object({
115879
- description: z95.string().optional(),
115880
- content: z95.record(z95.string(), serverLogicMediaTypeSchema).optional()
116389
+ var serverLogicResponseSchema = z97.object({
116390
+ description: z97.string().optional(),
116391
+ content: z97.record(z97.string(), serverLogicMediaTypeSchema).optional()
115881
116392
  });
115882
116393
  var jsonBaseFields = {
115883
- description: z95.string(),
115884
- parameters: z95.array(parameterMetaSchema).optional(),
116394
+ description: z97.string(),
116395
+ parameters: z97.array(parameterMetaSchema).optional(),
115885
116396
  response: serverLogicResponseSchema.optional(),
115886
116397
  cache: serverLogicCacheConfigSchema.optional()
115887
116398
  };
115888
- var jsonSqlServerLogicSchema = z95.object({
116399
+ var jsonSqlServerLogicSchema = z97.object({
115889
116400
  ...jsonBaseFields,
115890
- type: z95.literal("sql").optional(),
115891
- query: z95.string(),
115892
- connectionId: z95.string()
116401
+ type: z97.literal("sql").optional(),
116402
+ query: z97.string(),
116403
+ connectionId: z97.string()
115893
116404
  });
115894
- var jsonTypeScriptServerLogicSchema = z95.object({
116405
+ var jsonTypeScriptServerLogicSchema = z97.object({
115895
116406
  ...jsonBaseFields,
115896
- type: z95.literal("typescript"),
115897
- handlerPath: z95.string()
116407
+ type: z97.literal("typescript"),
116408
+ handlerPath: z97.string()
115898
116409
  });
115899
- var anyJsonServerLogicSchema = z95.union([
116410
+ var anyJsonServerLogicSchema = z97.union([
115900
116411
  jsonTypeScriptServerLogicSchema,
115901
116412
  jsonSqlServerLogicSchema
115902
116413
  ]);