@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/main.js CHANGED
@@ -909,17 +909,17 @@ var require_nacl_fast = __commonJS({
909
909
  }
910
910
  var sigma = new Uint8Array([101, 120, 112, 97, 110, 100, 32, 51, 50, 45, 98, 121, 116, 101, 32, 107]);
911
911
  function crypto_stream_salsa20_xor(c6, cpos, m4, mpos, b6, n2, k6) {
912
- var z96 = new Uint8Array(16), x = new Uint8Array(64);
912
+ var z98 = new Uint8Array(16), x = new Uint8Array(64);
913
913
  var u, i6;
914
- for (i6 = 0; i6 < 16; i6++) z96[i6] = 0;
915
- for (i6 = 0; i6 < 8; i6++) z96[i6] = n2[i6];
914
+ for (i6 = 0; i6 < 16; i6++) z98[i6] = 0;
915
+ for (i6 = 0; i6 < 8; i6++) z98[i6] = n2[i6];
916
916
  while (b6 >= 64) {
917
- crypto_core_salsa20(x, z96, k6, sigma);
917
+ crypto_core_salsa20(x, z98, k6, sigma);
918
918
  for (i6 = 0; i6 < 64; i6++) c6[cpos + i6] = m4[mpos + i6] ^ x[i6];
919
919
  u = 1;
920
920
  for (i6 = 8; i6 < 16; i6++) {
921
- u = u + (z96[i6] & 255) | 0;
922
- z96[i6] = u & 255;
921
+ u = u + (z98[i6] & 255) | 0;
922
+ z98[i6] = u & 255;
923
923
  u >>>= 8;
924
924
  }
925
925
  b6 -= 64;
@@ -927,30 +927,30 @@ var require_nacl_fast = __commonJS({
927
927
  mpos += 64;
928
928
  }
929
929
  if (b6 > 0) {
930
- crypto_core_salsa20(x, z96, k6, sigma);
930
+ crypto_core_salsa20(x, z98, k6, sigma);
931
931
  for (i6 = 0; i6 < b6; i6++) c6[cpos + i6] = m4[mpos + i6] ^ x[i6];
932
932
  }
933
933
  return 0;
934
934
  }
935
935
  function crypto_stream_salsa20(c6, cpos, b6, n2, k6) {
936
- var z96 = new Uint8Array(16), x = new Uint8Array(64);
936
+ var z98 = new Uint8Array(16), x = new Uint8Array(64);
937
937
  var u, i6;
938
- for (i6 = 0; i6 < 16; i6++) z96[i6] = 0;
939
- for (i6 = 0; i6 < 8; i6++) z96[i6] = n2[i6];
938
+ for (i6 = 0; i6 < 16; i6++) z98[i6] = 0;
939
+ for (i6 = 0; i6 < 8; i6++) z98[i6] = n2[i6];
940
940
  while (b6 >= 64) {
941
- crypto_core_salsa20(x, z96, k6, sigma);
941
+ crypto_core_salsa20(x, z98, k6, sigma);
942
942
  for (i6 = 0; i6 < 64; i6++) c6[cpos + i6] = x[i6];
943
943
  u = 1;
944
944
  for (i6 = 8; i6 < 16; i6++) {
945
- u = u + (z96[i6] & 255) | 0;
946
- z96[i6] = u & 255;
945
+ u = u + (z98[i6] & 255) | 0;
946
+ z98[i6] = u & 255;
947
947
  u >>>= 8;
948
948
  }
949
949
  b6 -= 64;
950
950
  cpos += 64;
951
951
  }
952
952
  if (b6 > 0) {
953
- crypto_core_salsa20(x, z96, k6, sigma);
953
+ crypto_core_salsa20(x, z98, k6, sigma);
954
954
  for (i6 = 0; i6 < b6; i6++) c6[cpos + i6] = x[i6];
955
955
  }
956
956
  return 0;
@@ -1830,12 +1830,12 @@ var require_nacl_fast = __commonJS({
1830
1830
  for (a6 = 0; a6 < 16; a6++) o2[a6] = c6[a6];
1831
1831
  }
1832
1832
  function crypto_scalarmult(q2, n2, p2) {
1833
- var z96 = new Uint8Array(32);
1833
+ var z98 = new Uint8Array(32);
1834
1834
  var x = new Float64Array(80), r6, i6;
1835
1835
  var a6 = gf(), b6 = gf(), c6 = gf(), d6 = gf(), e6 = gf(), f6 = gf();
1836
- for (i6 = 0; i6 < 31; i6++) z96[i6] = n2[i6];
1837
- z96[31] = n2[31] & 127 | 64;
1838
- z96[0] &= 248;
1836
+ for (i6 = 0; i6 < 31; i6++) z98[i6] = n2[i6];
1837
+ z98[31] = n2[31] & 127 | 64;
1838
+ z98[0] &= 248;
1839
1839
  unpack25519(x, p2);
1840
1840
  for (i6 = 0; i6 < 16; i6++) {
1841
1841
  b6[i6] = x[i6];
@@ -1843,7 +1843,7 @@ var require_nacl_fast = __commonJS({
1843
1843
  }
1844
1844
  a6[0] = d6[0] = 1;
1845
1845
  for (i6 = 254; i6 >= 0; --i6) {
1846
- r6 = z96[i6 >>> 3] >>> (i6 & 7) & 1;
1846
+ r6 = z98[i6 >>> 3] >>> (i6 & 7) & 1;
1847
1847
  sel25519(a6, b6, r6);
1848
1848
  sel25519(c6, d6, r6);
1849
1849
  A(e6, a6, c6);
@@ -4860,8 +4860,8 @@ var require_poly1305 = __commonJS({
4860
4860
  });
4861
4861
  var u = {}, w;
4862
4862
  for (w in b6) b6.hasOwnProperty(w) && (u[w] = b6[w]);
4863
- 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;
4864
- if (z96) B = y ? __require("path").dirname(B) + "/" : __dirname + "/", C = function(a6, c6) {
4863
+ 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;
4864
+ if (z98) B = y ? __require("path").dirname(B) + "/" : __dirname + "/", C = function(a6, c6) {
4865
4865
  var d6 = H(a6);
4866
4866
  if (d6) return c6 ? d6 : d6.toString();
4867
4867
  F || (F = __require("fs"));
@@ -5117,7 +5117,7 @@ var require_poly1305 = __commonJS({
5117
5117
  function H(a6) {
5118
5118
  if (a6.startsWith(V)) {
5119
5119
  a6 = a6.slice(V.length);
5120
- if ("boolean" === typeof z96 && z96) {
5120
+ if ("boolean" === typeof z98 && z98) {
5121
5121
  var c6 = Buffer.from(a6, "base64");
5122
5122
  c6 = new Uint8Array(c6.buffer, c6.byteOffset, c6.byteLength);
5123
5123
  } else try {
@@ -39040,14 +39040,14 @@ var init_NormalizedSchema = __esm({
39040
39040
  throw new Error("@smithy/core/schema - cannot iterate non-struct schema.");
39041
39041
  }
39042
39042
  const struct = this.getSchema();
39043
- const z96 = struct[4].length;
39043
+ const z98 = struct[4].length;
39044
39044
  let it = struct[anno.it];
39045
- if (it && z96 === it.length) {
39045
+ if (it && z98 === it.length) {
39046
39046
  yield* it;
39047
39047
  return;
39048
39048
  }
39049
- it = Array(z96);
39050
- for (let i6 = 0; i6 < z96; ++i6) {
39049
+ it = Array(z98);
39050
+ for (let i6 = 0; i6 < z98; ++i6) {
39051
39051
  const k6 = struct[4][i6];
39052
39052
  const v = member([struct[5][i6], 0], k6);
39053
39053
  yield it[i6] = [k6, v];
@@ -39728,12 +39728,12 @@ var init_split_header = __esm({
39728
39728
  "../../node_modules/@smithy/core/dist-es/submodules/serde/split-header.js"() {
39729
39729
  "use strict";
39730
39730
  splitHeader = (value) => {
39731
- const z96 = value.length;
39731
+ const z98 = value.length;
39732
39732
  const values = [];
39733
39733
  let withinQuotes = false;
39734
39734
  let prevChar = void 0;
39735
39735
  let anchor = 0;
39736
- for (let i6 = 0; i6 < z96; ++i6) {
39736
+ for (let i6 = 0; i6 < z98; ++i6) {
39737
39737
  const char = value[i6];
39738
39738
  switch (char) {
39739
39739
  case `"`:
@@ -39754,12 +39754,12 @@ var init_split_header = __esm({
39754
39754
  values.push(value.slice(anchor));
39755
39755
  return values.map((v) => {
39756
39756
  v = v.trim();
39757
- const z97 = v.length;
39758
- if (z97 < 2) {
39757
+ const z99 = v.length;
39758
+ if (z99 < 2) {
39759
39759
  return v;
39760
39760
  }
39761
- if (v[0] === `"` && v[z97 - 1] === `"`) {
39762
- v = v.slice(1, z97 - 1);
39761
+ if (v[0] === `"` && v[z99 - 1] === `"`) {
39762
+ v = v.slice(1, z99 - 1);
39763
39763
  }
39764
39764
  return v.replace(/\\"/g, '"');
39765
39765
  });
@@ -41196,11 +41196,11 @@ var init_EndpointCache = __esm({
41196
41196
  }
41197
41197
  hash(endpointParams) {
41198
41198
  let buffer = "";
41199
- const { parameters: parameters79 } = this;
41200
- if (parameters79.length === 0) {
41199
+ const { parameters: parameters80 } = this;
41200
+ if (parameters80.length === 0) {
41201
41201
  return false;
41202
41202
  }
41203
- for (const param of parameters79) {
41203
+ for (const param of parameters80) {
41204
41204
  const val = String(endpointParams[param] ?? "");
41205
41205
  if (val.includes("|;")) {
41206
41206
  return false;
@@ -47672,8 +47672,8 @@ var init_ProtocolLib = __esm({
47672
47672
  constructor(queryCompat = false) {
47673
47673
  this.queryCompat = queryCompat;
47674
47674
  }
47675
- resolveRestContentType(defaultContentType, inputSchema95) {
47676
- const members = inputSchema95.getMemberSchemas();
47675
+ resolveRestContentType(defaultContentType, inputSchema97) {
47676
+ const members = inputSchema97.getMemberSchemas();
47677
47677
  const httpPayloadMember = Object.values(members).find((m4) => {
47678
47678
  return !!m4.getMergedTraits().httpPayload;
47679
47679
  });
@@ -47688,7 +47688,7 @@ var init_ProtocolLib = __esm({
47688
47688
  } else {
47689
47689
  return defaultContentType;
47690
47690
  }
47691
- } else if (!inputSchema95.isUnitSchema()) {
47691
+ } else if (!inputSchema97.isUnitSchema()) {
47692
47692
  const hasBody = Object.values(members).find((m4) => {
47693
47693
  const { httpQuery, httpQueryParams, httpHeader, httpLabel, httpPrefixHeaders } = m4.getMergedTraits();
47694
47694
  const noPrefixHeaders = httpPrefixHeaders === void 0;
@@ -48541,9 +48541,9 @@ var init_AwsRestJsonProtocol = __esm({
48541
48541
  }
48542
48542
  async serializeRequest(operationSchema, input, context) {
48543
48543
  const request2 = await super.serializeRequest(operationSchema, input, context);
48544
- const inputSchema95 = NormalizedSchema.of(operationSchema.input);
48544
+ const inputSchema97 = NormalizedSchema.of(operationSchema.input);
48545
48545
  if (!request2.headers["content-type"]) {
48546
- const contentType = this.mixin.resolveRestContentType(this.getDefaultContentType(), inputSchema95);
48546
+ const contentType = this.mixin.resolveRestContentType(this.getDefaultContentType(), inputSchema97);
48547
48547
  if (contentType) {
48548
48548
  request2.headers["content-type"] = contentType;
48549
48549
  }
@@ -48555,8 +48555,8 @@ var init_AwsRestJsonProtocol = __esm({
48555
48555
  }
48556
48556
  async deserializeResponse(operationSchema, context, response) {
48557
48557
  const output = await super.deserializeResponse(operationSchema, context, response);
48558
- const outputSchema95 = NormalizedSchema.of(operationSchema.output);
48559
- for (const [name, member2] of outputSchema95.structIterator()) {
48558
+ const outputSchema97 = NormalizedSchema.of(operationSchema.output);
48559
+ for (const [name, member2] of outputSchema97.structIterator()) {
48560
48560
  if (member2.getMemberTraits().httpPayload && !(name in output)) {
48561
48561
  output[name] = null;
48562
48562
  }
@@ -54374,22 +54374,22 @@ var init_loadCognitoIdentity = __esm({
54374
54374
  });
54375
54375
 
54376
54376
  // ../../node_modules/@aws-sdk/credential-provider-cognito-identity/dist-es/fromCognitoIdentity.js
54377
- function fromCognitoIdentity(parameters79) {
54377
+ function fromCognitoIdentity(parameters80) {
54378
54378
  return async (awsIdentityProperties) => {
54379
- parameters79.logger?.debug("@aws-sdk/credential-provider-cognito-identity - fromCognitoIdentity");
54379
+ parameters80.logger?.debug("@aws-sdk/credential-provider-cognito-identity - fromCognitoIdentity");
54380
54380
  const { GetCredentialsForIdentityCommand: GetCredentialsForIdentityCommand2, CognitoIdentityClient: CognitoIdentityClient2 } = await Promise.resolve().then(() => (init_loadCognitoIdentity(), loadCognitoIdentity_exports));
54381
- const fromConfigs = (property) => parameters79.clientConfig?.[property] ?? parameters79.parentClientConfig?.[property] ?? awsIdentityProperties?.callerClientConfig?.[property];
54382
- const { Credentials: { AccessKeyId = throwOnMissingAccessKeyId(parameters79.logger), Expiration, SecretKey = throwOnMissingSecretKey(parameters79.logger), SessionToken } = throwOnMissingCredentials(parameters79.logger) } = await (parameters79.client ?? new CognitoIdentityClient2(Object.assign({}, parameters79.clientConfig ?? {}, {
54381
+ const fromConfigs = (property) => parameters80.clientConfig?.[property] ?? parameters80.parentClientConfig?.[property] ?? awsIdentityProperties?.callerClientConfig?.[property];
54382
+ const { Credentials: { AccessKeyId = throwOnMissingAccessKeyId(parameters80.logger), Expiration, SecretKey = throwOnMissingSecretKey(parameters80.logger), SessionToken } = throwOnMissingCredentials(parameters80.logger) } = await (parameters80.client ?? new CognitoIdentityClient2(Object.assign({}, parameters80.clientConfig ?? {}, {
54383
54383
  region: fromConfigs("region"),
54384
54384
  profile: fromConfigs("profile"),
54385
54385
  userAgentAppId: fromConfigs("userAgentAppId")
54386
54386
  }))).send(new GetCredentialsForIdentityCommand2({
54387
- CustomRoleArn: parameters79.customRoleArn,
54388
- IdentityId: parameters79.identityId,
54389
- Logins: parameters79.logins ? await resolveLogins(parameters79.logins) : void 0
54387
+ CustomRoleArn: parameters80.customRoleArn,
54388
+ IdentityId: parameters80.identityId,
54389
+ Logins: parameters80.logins ? await resolveLogins(parameters80.logins) : void 0
54390
54390
  }));
54391
54391
  return {
54392
- identityId: parameters79.identityId,
54392
+ identityId: parameters80.identityId,
54393
54393
  accessKeyId: AccessKeyId,
54394
54394
  secretAccessKey: SecretKey,
54395
54395
  sessionToken: SessionToken,
@@ -67146,11 +67146,11 @@ var require_bignumber = __commonJS({
67146
67146
  return n2 > 0 || n2 === i6 ? i6 : i6 - 1;
67147
67147
  }
67148
67148
  function coeffToString(a6) {
67149
- var s, z96, i6 = 1, j6 = a6.length, r6 = a6[0] + "";
67149
+ var s, z98, i6 = 1, j6 = a6.length, r6 = a6[0] + "";
67150
67150
  for (; i6 < j6; ) {
67151
67151
  s = a6[i6++] + "";
67152
- z96 = LOG_BASE - s.length;
67153
- for (; z96--; s = "0" + s) ;
67152
+ z98 = LOG_BASE - s.length;
67153
+ for (; z98--; s = "0" + s) ;
67154
67154
  r6 += s;
67155
67155
  }
67156
67156
  for (j6 = r6.length; r6.charCodeAt(--j6) === 48; ) ;
@@ -67183,15 +67183,15 @@ var require_bignumber = __commonJS({
67183
67183
  function toExponential(str, e6) {
67184
67184
  return (str.length > 1 ? str.charAt(0) + "." + str.slice(1) : str) + (e6 < 0 ? "e" : "e+") + e6;
67185
67185
  }
67186
- function toFixedPoint(str, e6, z96) {
67186
+ function toFixedPoint(str, e6, z98) {
67187
67187
  var len, zs;
67188
67188
  if (e6 < 0) {
67189
- for (zs = z96 + "."; ++e6; zs += z96) ;
67189
+ for (zs = z98 + "."; ++e6; zs += z98) ;
67190
67190
  str = zs + str;
67191
67191
  } else {
67192
67192
  len = str.length;
67193
67193
  if (++e6 > len) {
67194
- for (zs = z96, e6 -= len; --e6; zs += z96) ;
67194
+ for (zs = z98, e6 -= len; --e6; zs += z98) ;
67195
67195
  str += zs;
67196
67196
  } else if (e6 < len) {
67197
67197
  str = str.slice(0, e6) + "." + str.slice(e6);
@@ -89643,6 +89643,12 @@ var NOOP_TUNNEL = (connectionUrl) => ({
89643
89643
  close: async () => {
89644
89644
  }
89645
89645
  });
89646
+ var NOOP_TUNNEL_HOSTPORT = (host, port) => ({
89647
+ host,
89648
+ port,
89649
+ close: async () => {
89650
+ }
89651
+ });
89646
89652
  function connectionParamsToRecord(connection2) {
89647
89653
  const out = {};
89648
89654
  for (const p2 of connection2.parameters) {
@@ -89650,9 +89656,9 @@ function connectionParamsToRecord(connection2) {
89650
89656
  }
89651
89657
  return out;
89652
89658
  }
89653
- async function maybeOpenSshTunnel(params, connectionUrl, defaultDbPort) {
89659
+ async function maybeOpenSshTunnelHostPort(params, dbHost, dbPort) {
89654
89660
  const sshHost = params[sshTunnelParameters.sshHost.slug];
89655
- if (!sshHost) return NOOP_TUNNEL(connectionUrl);
89661
+ if (!sshHost) return NOOP_TUNNEL_HOSTPORT(dbHost, dbPort);
89656
89662
  const sshUsername = params[sshTunnelParameters.sshUsername.slug];
89657
89663
  const sshPrivateKeyBase64 = params[sshTunnelParameters.sshPrivateKeyBase64.slug];
89658
89664
  if (!sshUsername || !sshPrivateKeyBase64) {
@@ -89662,9 +89668,6 @@ async function maybeOpenSshTunnel(params, connectionUrl, defaultDbPort) {
89662
89668
  }
89663
89669
  const sshPort = Number(params[sshTunnelParameters.sshPort.slug] || "22") || 22;
89664
89670
  const sshPassphrase = params[sshTunnelParameters.sshPassphrase.slug];
89665
- const url = new URL(connectionUrl);
89666
- const dbHost = url.hostname;
89667
- const dbPort = url.port ? Number(url.port) : defaultDbPort;
89668
89671
  const [{ Client: Client2 }, net] = await Promise.all([
89669
89672
  Promise.resolve().then(() => __toESM(require_lib3(), 1)),
89670
89673
  import("net")
@@ -89707,16 +89710,29 @@ async function maybeOpenSshTunnel(params, connectionUrl, defaultDbPort) {
89707
89710
  sshClient.end();
89708
89711
  throw new Error("Failed to allocate local port for SSH tunnel.");
89709
89712
  }
89710
- url.hostname = "127.0.0.1";
89711
- url.port = String(address.port);
89712
89713
  return {
89713
- connectionUrl: url.toString(),
89714
+ host: "127.0.0.1",
89715
+ port: address.port,
89714
89716
  close: async () => {
89715
89717
  await new Promise((resolve) => server.close(() => resolve()));
89716
89718
  sshClient.end();
89717
89719
  }
89718
89720
  };
89719
89721
  }
89722
+ async function maybeOpenSshTunnel(params, connectionUrl, defaultDbPort) {
89723
+ const sshHost = params[sshTunnelParameters.sshHost.slug];
89724
+ if (!sshHost) return NOOP_TUNNEL(connectionUrl);
89725
+ const url = new URL(connectionUrl);
89726
+ const dbHost = url.hostname;
89727
+ const dbPort = url.port ? Number(url.port) : defaultDbPort;
89728
+ const tunnel = await maybeOpenSshTunnelHostPort(params, dbHost, dbPort);
89729
+ url.hostname = tunnel.host;
89730
+ url.port = String(tunnel.port);
89731
+ return {
89732
+ connectionUrl: url.toString(),
89733
+ close: tunnel.close
89734
+ };
89735
+ }
89720
89736
 
89721
89737
  // ../connectors/src/connectors/postgresql/setup.ts
89722
89738
  var postgresqlOnboarding = new ConnectorOnboarding({
@@ -91858,9 +91874,16 @@ A Filter is an Expression. Leaves are \`Dimensions\`, \`Tags\`, or \`CostCategor
91858
91874
 
91859
91875
  ### Business Logic
91860
91876
 
91861
- 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.
91877
+ 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.
91862
91878
 
91863
- #### Example
91879
+ #### Server logic slug naming
91880
+
91881
+ 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.
91882
+
91883
+ - OK: \`monthly-cost-trend\`, \`cost_by_service\`, \`top10-services\`
91884
+ - NG: \`monthlyCostTrend\`, \`MonthlyCostTrend\`, \`monthly cost trend\`
91885
+
91886
+ #### Example (slug: \`monthly-cost-trend\`)
91864
91887
 
91865
91888
  \`\`\`ts
91866
91889
  import type { Context } from "hono";
@@ -91936,9 +91959,16 @@ Filter \u306F Expression \u3067\u3059\u3002\u30EA\u30FC\u30D5\u306F \`Dimensions
91936
91959
 
91937
91960
  ### Business Logic
91938
91961
 
91939
- \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
91962
+ \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
91940
91963
 
91941
- #### Example
91964
+ #### \u30B5\u30FC\u30D0\u30FC\u30ED\u30B8\u30C3\u30AF\u306E slug \u547D\u540D\u898F\u5247
91965
+
91966
+ \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
91967
+
91968
+ - OK: \`monthly-cost-trend\`\u3001\`cost_by_service\`\u3001\`top10-services\`
91969
+ - NG: \`monthlyCostTrend\`\u3001\`MonthlyCostTrend\`\u3001\`monthly cost trend\`
91970
+
91971
+ #### Example\uFF08slug: \`monthly-cost-trend\`\uFF09
91942
91972
 
91943
91973
  \`\`\`ts
91944
91974
  import type { Context } from "hono";
@@ -111377,17 +111407,27 @@ async function importMssql() {
111377
111407
  }
111378
111408
  async function runMssqlQuery(parsed, sql, options = {}) {
111379
111409
  const sqlMod = await importMssql();
111380
- const config = toMssqlConfig(parsed, {
111381
- encrypt: options.forceEncrypt
111382
- });
111383
- const pool = new sqlMod.ConnectionPool(config);
111384
- await pool.connect();
111410
+ const tunnel = options.tunnelParams ? await maybeOpenSshTunnelHostPort(
111411
+ options.tunnelParams,
111412
+ parsed.server,
111413
+ parsed.port
111414
+ ) : null;
111385
111415
  try {
111386
- const result = await pool.request().query(sql);
111387
- const recordset = result.recordset ?? [];
111388
- return { rows: recordset };
111416
+ const tunneled = tunnel ? { ...parsed, server: tunnel.host, port: tunnel.port } : parsed;
111417
+ const config = toMssqlConfig(tunneled, {
111418
+ encrypt: options.forceEncrypt
111419
+ });
111420
+ const pool = new sqlMod.ConnectionPool(config);
111421
+ await pool.connect();
111422
+ try {
111423
+ const result = await pool.request().query(sql);
111424
+ const recordset = result.recordset ?? [];
111425
+ return { rows: recordset };
111426
+ } finally {
111427
+ await pool.close();
111428
+ }
111389
111429
  } finally {
111390
- await pool.close();
111430
+ await tunnel?.close();
111391
111431
  }
111392
111432
  }
111393
111433
  async function checkMssqlConnection(url, credentials, options = {}) {
@@ -111475,35 +111515,69 @@ function parseOracleJdbcUrl(jdbcUrl, options = {}) {
111475
111515
  function redactOracleUrl(jdbcUrl) {
111476
111516
  return jdbcUrl.replace(/(:\/\/)([^@/]+)@/, "$1***@").replace(/(thin:)([^@]+)@/i, "$1***@");
111477
111517
  }
111518
+ function parseOracleConnectStringHostPort(connectString) {
111519
+ const m4 = /^([^:/]+):(\d+)(.*)$/.exec(connectString);
111520
+ if (!m4) return null;
111521
+ return { host: m4[1], port: Number(m4[2]), trailing: m4[3] };
111522
+ }
111523
+ function rewriteOracleConnectStringHostPort(connectString, host, port) {
111524
+ const parts = parseOracleConnectStringHostPort(connectString);
111525
+ if (!parts) return connectString;
111526
+ return `${host}:${port}${parts.trailing}`;
111527
+ }
111478
111528
 
111479
111529
  // ../connectors/src/lib/oracle-runner.ts
111480
111530
  async function importOracleDb() {
111481
111531
  const mod = await import("oracledb");
111482
111532
  return mod.default ?? mod;
111483
111533
  }
111484
- async function runOracleQuery(parsed, sql) {
111534
+ async function runOracleQuery(parsed, sql, options = {}) {
111485
111535
  const oracledb = await importOracleDb();
111486
- const connection2 = await oracledb.getConnection({
111487
- user: parsed.user,
111488
- password: parsed.password,
111489
- connectString: parsed.connectString
111490
- });
111536
+ let tunnel = null;
111537
+ if (options.tunnelParams) {
111538
+ const hostPort = parseOracleConnectStringHostPort(parsed.connectString);
111539
+ if (hostPort) {
111540
+ tunnel = await maybeOpenSshTunnelHostPort(
111541
+ options.tunnelParams,
111542
+ hostPort.host,
111543
+ hostPort.port
111544
+ );
111545
+ }
111546
+ }
111491
111547
  try {
111492
- const result = await connection2.execute(sql, [], {
111493
- outFormat: oracledb.OUT_FORMAT_OBJECT,
111494
- // Bound by the connector's own row cap, but keep the driver from
111495
- // streaming arbitrarily large result sets.
111496
- maxRows: 5e3
111548
+ const connectString = tunnel ? rewriteOracleConnectStringHostPort(
111549
+ parsed.connectString,
111550
+ tunnel.host,
111551
+ tunnel.port
111552
+ ) : parsed.connectString;
111553
+ const connection2 = await oracledb.getConnection({
111554
+ user: parsed.user,
111555
+ password: parsed.password,
111556
+ connectString
111497
111557
  });
111498
- return { rows: result.rows ?? [] };
111499
- } finally {
111500
111558
  try {
111501
- await connection2.close();
111502
- } catch {
111559
+ const result = await connection2.execute(
111560
+ sql,
111561
+ [],
111562
+ {
111563
+ outFormat: oracledb.OUT_FORMAT_OBJECT,
111564
+ // Bound by the connector's own row cap, but keep the driver from
111565
+ // streaming arbitrarily large result sets.
111566
+ maxRows: 5e3
111567
+ }
111568
+ );
111569
+ return { rows: result.rows ?? [] };
111570
+ } finally {
111571
+ try {
111572
+ await connection2.close();
111573
+ } catch {
111574
+ }
111503
111575
  }
111576
+ } finally {
111577
+ await tunnel?.close();
111504
111578
  }
111505
111579
  }
111506
- async function checkOracleConnection(url, credentials) {
111580
+ async function checkOracleConnection(url, credentials, options = {}) {
111507
111581
  let parsed;
111508
111582
  try {
111509
111583
  parsed = parseOracleJdbcUrl(url, credentials);
@@ -111514,7 +111588,7 @@ async function checkOracleConnection(url, credentials) {
111514
111588
  };
111515
111589
  }
111516
111590
  try {
111517
- await runOracleQuery(parsed, "SELECT 1 FROM DUAL");
111591
+ await runOracleQuery(parsed, "SELECT 1 FROM DUAL", options);
111518
111592
  return { success: true };
111519
111593
  } catch (err) {
111520
111594
  let msg = err instanceof Error ? err.message : String(err);
@@ -111724,12 +111798,13 @@ Always bound results: LIMIT for PG/MySQL/Redshift, TOP for SQL Server, FETCH FIR
111724
111798
  };
111725
111799
  }
111726
111800
  try {
111801
+ const tunnelParams = connectionParamsToRecord(connection2);
111727
111802
  if (parsed.driver === "sqlserver") {
111728
111803
  const mssqlParsed = parseSqlServerJdbcUrl(parsed.originalUrl, {
111729
111804
  username,
111730
111805
  password
111731
111806
  });
111732
- const result = await runMssqlQuery(mssqlParsed, sql);
111807
+ const result = await runMssqlQuery(mssqlParsed, sql, { tunnelParams });
111733
111808
  const rows = result.rows;
111734
111809
  return {
111735
111810
  success: true,
@@ -111744,7 +111819,9 @@ Always bound results: LIMIT for PG/MySQL/Redshift, TOP for SQL Server, FETCH FIR
111744
111819
  password
111745
111820
  });
111746
111821
  const cleanSql = sql.replace(/;\s*$/, "");
111747
- const result = await runOracleQuery(oracleParsed, cleanSql);
111822
+ const result = await runOracleQuery(oracleParsed, cleanSql, {
111823
+ tunnelParams
111824
+ });
111748
111825
  const rows = result.rows;
111749
111826
  return {
111750
111827
  success: true,
@@ -111756,7 +111833,7 @@ Always bound results: LIMIT for PG/MySQL/Redshift, TOP for SQL Server, FETCH FIR
111756
111833
  let tunnel;
111757
111834
  try {
111758
111835
  tunnel = await maybeOpenSshTunnel(
111759
- connectionParamsToRecord(connection2),
111836
+ tunnelParams,
111760
111837
  parsed.nativeUrl,
111761
111838
  parsed.defaultPort
111762
111839
  );
@@ -111930,10 +112007,18 @@ JDBC URL \u306E\u30D7\u30EC\u30D5\u30A3\u30C3\u30AF\u30B9\u306B\u3088\u308A\u65B
111930
112007
  };
111931
112008
  }
111932
112009
  if (parsed.driver === "sqlserver") {
111933
- return checkMssqlConnection(parsed.originalUrl, { username, password });
112010
+ return checkMssqlConnection(
112011
+ parsed.originalUrl,
112012
+ { username, password },
112013
+ { tunnelParams: params }
112014
+ );
111934
112015
  }
111935
112016
  if (parsed.driver === "oracle") {
111936
- return checkOracleConnection(parsed.originalUrl, { username, password });
112017
+ return checkOracleConnection(
112018
+ parsed.originalUrl,
112019
+ { username, password },
112020
+ { tunnelParams: params }
112021
+ );
111937
112022
  }
111938
112023
  const tunnel = await maybeOpenSshTunnel(
111939
112024
  params,
@@ -111990,10 +112075,12 @@ JDBC URL \u306E\u30D7\u30EC\u30D5\u30A3\u30C3\u30AF\u30B9\u306B\u3088\u308A\u65B
111990
112075
  });
111991
112076
  const sample = unwrapSampleLimit(sql);
111992
112077
  if (sample) {
111993
- const result = await runMssqlQuery(mssqlParsed, sample.inner);
112078
+ const result = await runMssqlQuery(mssqlParsed, sample.inner, {
112079
+ tunnelParams: params
112080
+ });
111994
112081
  return { rows: result.rows.slice(0, sample.limit) };
111995
112082
  }
111996
- return runMssqlQuery(mssqlParsed, sql);
112083
+ return runMssqlQuery(mssqlParsed, sql, { tunnelParams: params });
111997
112084
  }
111998
112085
  if (parsed.driver === "oracle") {
111999
112086
  const oracleParsed = parseOracleJdbcUrl(parsed.originalUrl, {
@@ -112003,11 +112090,13 @@ JDBC URL \u306E\u30D7\u30EC\u30D5\u30A3\u30C3\u30AF\u30B9\u306B\u3088\u308A\u65B
112003
112090
  const sample = unwrapSampleLimit(sql);
112004
112091
  if (sample) {
112005
112092
  const inner = sample.inner.replace(/;\s*$/, "");
112006
- const result = await runOracleQuery(oracleParsed, inner);
112093
+ const result = await runOracleQuery(oracleParsed, inner, {
112094
+ tunnelParams: params
112095
+ });
112007
112096
  return { rows: result.rows.slice(0, sample.limit) };
112008
112097
  }
112009
112098
  const cleanSql = sql.replace(/;\s*$/, "");
112010
- return runOracleQuery(oracleParsed, cleanSql);
112099
+ return runOracleQuery(oracleParsed, cleanSql, { tunnelParams: params });
112011
112100
  }
112012
112101
  const tunnel = await maybeOpenSshTunnel(
112013
112102
  params,
@@ -112239,16 +112328,18 @@ var semrushOnboarding = new ConnectorOnboarding({
112239
112328
  - Write only 1 sentence between tool calls, then immediately call the next tool. Skip unnecessary explanations and proceed efficiently`
112240
112329
  },
112241
112330
  dataOverviewInstructions: {
112242
- en: `1. Call ${requestToolName12} with path "/" and queryParams \`{ "type": "domain_overview", "domain": "<example.com>", "database": "us" }\` to inspect the domain overview report (CSV)
112331
+ 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)
112243
112332
  2. Call ${requestToolName12} with path "/" and queryParams \`{ "type": "domain_organic", "domain": "<example.com>", "database": "us", "display_limit": "5" }\` to sample organic keywords
112244
112333
  3. Call ${requestToolName12} with path "/" and queryParams \`{ "type": "phrase_this", "phrase": "<keyword>", "database": "us" }\` to inspect a keyword overview
112245
- 4. Explore other report types (backlinks_overview, domain_adwords, phrase_related) and the Trends API ("/analytics/v1/...") with responseFormat="json" as needed
112246
- 5. Remember: the Standard Analytics API returns semicolon-separated CSV with the first row as the header`,
112247
- 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
112334
+ 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"\`)
112335
+ 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
112336
+ 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`,
112337
+ 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
112248
112338
  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
112249
112339
  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
112250
- 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
112251
- 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`
112340
+ 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
112341
+ 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
112342
+ 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`
112252
112343
  }
112253
112344
  });
112254
112345
 
@@ -112275,10 +112366,19 @@ The business logic type for this connector is "typescript". Write handler code u
112275
112366
 
112276
112367
  SDK methods (client created via \`connection(connectionId)\`):
112277
112368
  - \`client.request(path, init?)\` \u2014 low-level authenticated fetch. Pass \`init.query\` to set query parameters; \`key\` is injected automatically
112278
- - \`client.report(type, query?)\` \u2014 call a Standard Analytics report and parse the CSV into \`{ columns, rows, raw }\`
112369
+ - \`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()\`
112370
+ - \`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
112279
112371
  - \`client.trends(path, query?)\` \u2014 call a Trends API endpoint (\`/analytics/v1/...\`) and return parsed JSON
112280
112372
  - \`client.projects(path, init?)\` \u2014 call a Projects API endpoint (\`/management/v1/...\`) and return parsed JSON
112281
112373
 
112374
+ \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.
112375
+
112376
+ \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.
112377
+
112378
+ \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.
112379
+
112380
+ \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"])\`.
112381
+
112282
112382
  \`\`\`ts
112283
112383
  import type { Context } from "hono";
112284
112384
  import { connection } from "@squadbase/vite-server/connectors/semrush";
@@ -112291,9 +112391,25 @@ export default async function handler(c: Context) {
112291
112391
  database?: string;
112292
112392
  }>();
112293
112393
 
112294
- const overview = await semrush.report("domain_overview", { domain, database });
112394
+ const result = await semrush.report("domain_organic", {
112395
+ domain,
112396
+ database,
112397
+ display_limit: "100",
112398
+ });
112399
+
112400
+ // \u2705 Correct: access by column name
112401
+ const rows = result.rows.map((row) => ({
112402
+ keyword: row["Keyword"],
112403
+ position: Number(row["Position"]) || 0,
112404
+ searchVolume: Number(row["Search Volume"]) || 0,
112405
+ url: row["Url"] ?? "",
112406
+ }));
112295
112407
 
112296
- return c.json({ columns: overview.columns, rows: overview.rows });
112408
+ // \u274C Wrong: do NOT do this \u2014 row[index] is undefined because rows are objects, not arrays
112409
+ // const urlIdx = result.columns.indexOf("Url");
112410
+ // const url = (row as unknown as string[])[urlIdx];
112411
+
112412
+ return c.json({ columns: result.columns, rows });
112297
112413
  }
112298
112414
  \`\`\`
112299
112415
 
@@ -112305,8 +112421,8 @@ export default async function handler(c: Context) {
112305
112421
 
112306
112422
  Authentication: API key passed as the \`key\` query parameter on every request (handled automatically).
112307
112423
 
112308
- #### Common Standard Analytics report types
112309
- - \`domain_overview\` \u2014 domain summary (organic/paid traffic, keywords, backlinks)
112424
+ #### Common Standard Analytics report types (path \`/\`, returns CSV)
112425
+ - \`domain_ranks\` \u2014 single-row domain summary (rank, organic/paid keywords, traffic, cost). **There is no \`domain_overview\` type \u2014 use \`domain_ranks\`.**
112310
112426
  - \`domain_organic\` \u2014 organic keywords for a domain
112311
112427
  - \`domain_adwords\` \u2014 paid keywords for a domain
112312
112428
  - \`domain_organic_organic\` / \`domain_adwords_adwords\` \u2014 organic / paid competitors
@@ -112315,10 +112431,13 @@ Authentication: API key passed as the \`key\` query parameter on every request (
112315
112431
  - \`phrase_fullsearch\` \u2014 full-text keyword research
112316
112432
  - \`phrase_questions\` \u2014 question keywords
112317
112433
  - \`phrase_kdi\` \u2014 keyword difficulty index
112434
+ - \`url_organic\` / \`url_adwords\` \u2014 keywords ranking for a specific URL
112435
+
112436
+ #### Backlinks API report types (path \`/analytics/v1/\`, also returns **CSV** \u2014 not JSON)
112437
+ 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.
112318
112438
  - \`backlinks_overview\` \u2014 backlinks summary
112319
112439
  - \`backlinks\` \u2014 list of backlinks
112320
112440
  - \`backlinks_refdomains\` \u2014 referring domains
112321
- - \`url_organic\` / \`url_adwords\` \u2014 keywords ranking for a specific URL
112322
112441
 
112323
112442
  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.
112324
112443
 
@@ -112326,7 +112445,7 @@ To check remaining API units (free, does NOT consume units), call the request to
112326
112445
  - \`type\` \u2014 report type (required for the Standard API)
112327
112446
  - \`domain\` / \`phrase\` / \`url\` \u2014 entity to query
112328
112447
  - \`database\` \u2014 regional database (e.g. \`us\`, \`uk\`, \`de\`, \`fr\`, \`jp\`, \`br\`); required for most reports
112329
- - \`display_limit\` \u2014 page size (default 10000, max 100000 depending on report)
112448
+ - \`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.
112330
112449
  - \`display_offset\` \u2014 pagination offset
112331
112450
  - \`display_date\` \u2014 historical date in \`YYYYMM15\` format (always day 15)
112332
112451
  - \`export_columns\` \u2014 comma-separated columns to return (e.g. \`Ph,Po,Nq,Cp\`)
@@ -112337,6 +112456,7 @@ To check remaining API units (free, does NOT consume units), call the request to
112337
112456
  - 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
112338
112457
  - The CSV separator is \`;\` (semicolon), NOT \`,\`. Some cells may contain commas inside them.
112339
112458
  - An HTTP 200 response with a body starting with \`ERROR\` indicates an API error (auth, parameters, or quota)
112459
+ - \`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.
112340
112460
  - The Trends API requires a separate Trends subscription; calls without it will fail with an authorization error
112341
112461
  - Date strings in historical endpoints must be the 15th of the month (\`YYYYMM15\`)`,
112342
112462
  ja: `### \u30C4\u30FC\u30EB
@@ -112349,10 +112469,19 @@ To check remaining API units (free, does NOT consume units), call the request to
112349
112469
 
112350
112470
  SDK\u30E1\u30BD\u30C3\u30C9 (\`connection(connectionId)\` \u3067\u4F5C\u6210\u3057\u305F\u30AF\u30E9\u30A4\u30A2\u30F3\u30C8):
112351
112471
  - \`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
112352
- - \`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
112472
+ - \`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
112473
+ - \`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
112353
112474
  - \`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
112354
112475
  - \`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
112355
112476
 
112477
+ \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
112478
+
112479
+ \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
112480
+
112481
+ \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
112482
+
112483
+ \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
112484
+
112356
112485
  \`\`\`ts
112357
112486
  import type { Context } from "hono";
112358
112487
  import { connection } from "@squadbase/vite-server/connectors/semrush";
@@ -112365,9 +112494,25 @@ export default async function handler(c: Context) {
112365
112494
  database?: string;
112366
112495
  }>();
112367
112496
 
112368
- const overview = await semrush.report("domain_overview", { domain, database });
112497
+ const result = await semrush.report("domain_organic", {
112498
+ domain,
112499
+ database,
112500
+ display_limit: "100",
112501
+ });
112369
112502
 
112370
- return c.json({ columns: overview.columns, rows: overview.rows });
112503
+ // \u2705 \u6B63: \u30AB\u30E9\u30E0\u540D\u3067\u30A2\u30AF\u30BB\u30B9\u3059\u308B
112504
+ const rows = result.rows.map((row) => ({
112505
+ keyword: row["Keyword"],
112506
+ position: Number(row["Position"]) || 0,
112507
+ searchVolume: Number(row["Search Volume"]) || 0,
112508
+ url: row["Url"] ?? "",
112509
+ }));
112510
+
112511
+ // \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
112512
+ // const urlIdx = result.columns.indexOf("Url");
112513
+ // const url = (row as unknown as string[])[urlIdx];
112514
+
112515
+ return c.json({ columns: result.columns, rows });
112371
112516
  }
112372
112517
  \`\`\`
112373
112518
 
@@ -112379,8 +112524,8 @@ export default async function handler(c: Context) {
112379
112524
 
112380
112525
  \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
112381
112526
 
112382
- #### \u4E3B\u8981\u306A Standard Analytics \u30EC\u30DD\u30FC\u30C8\u30BF\u30A4\u30D7
112383
- - \`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
112527
+ #### \u4E3B\u8981\u306A Standard Analytics \u30EC\u30DD\u30FC\u30C8\u30BF\u30A4\u30D7\uFF08path \`/\`\u3001CSV\u3092\u8FD4\u3059\uFF09
112528
+ - \`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**
112384
112529
  - \`domain_organic\` \u2014 \u30C9\u30E1\u30A4\u30F3\u306E\u30AA\u30FC\u30AC\u30CB\u30C3\u30AF\u30AD\u30FC\u30EF\u30FC\u30C9
112385
112530
  - \`domain_adwords\` \u2014 \u30C9\u30E1\u30A4\u30F3\u306E\u6709\u6599\u30AD\u30FC\u30EF\u30FC\u30C9
112386
112531
  - \`domain_organic_organic\` / \`domain_adwords_adwords\` \u2014 \u30AA\u30FC\u30AC\u30CB\u30C3\u30AF\uFF0F\u6709\u6599\u306E\u7AF6\u5408
@@ -112389,10 +112534,13 @@ export default async function handler(c: Context) {
112389
112534
  - \`phrase_fullsearch\` \u2014 \u30D5\u30EB\u30C6\u30AD\u30B9\u30C8\u30AD\u30FC\u30EF\u30FC\u30C9\u30EA\u30B5\u30FC\u30C1
112390
112535
  - \`phrase_questions\` \u2014 \u8CEA\u554F\u5F62\u5F0F\u30AD\u30FC\u30EF\u30FC\u30C9
112391
112536
  - \`phrase_kdi\` \u2014 \u30AD\u30FC\u30EF\u30FC\u30C9\u96E3\u6613\u5EA6\uFF08KDI\uFF09
112537
+ - \`url_organic\` / \`url_adwords\` \u2014 \u7279\u5B9AURL\u3067\u30E9\u30F3\u30AF\u30A4\u30F3\u3057\u3066\u3044\u308B\u30AD\u30FC\u30EF\u30FC\u30C9
112538
+
112539
+ #### 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
112540
+ 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
112392
112541
  - \`backlinks_overview\` \u2014 \u30D0\u30C3\u30AF\u30EA\u30F3\u30AF\u6982\u8981
112393
112542
  - \`backlinks\` \u2014 \u30D0\u30C3\u30AF\u30EA\u30F3\u30AF\u4E00\u89A7
112394
112543
  - \`backlinks_refdomains\` \u2014 \u53C2\u7167\u30C9\u30E1\u30A4\u30F3
112395
- - \`url_organic\` / \`url_adwords\` \u2014 \u7279\u5B9AURL\u3067\u30E9\u30F3\u30AF\u30A4\u30F3\u3057\u3066\u3044\u308B\u30AD\u30FC\u30EF\u30FC\u30C9
112396
112544
 
112397
112545
  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
112398
112546
 
@@ -112400,7 +112548,7 @@ API \u30E6\u30CB\u30C3\u30C8\u6B8B\u91CF\u306E\u78BA\u8A8D\uFF08\u7121\u6599\u30
112400
112548
  - \`type\` \u2014 \u30EC\u30DD\u30FC\u30C8\u7A2E\u5225\uFF08Standard API \u3067\u306F\u5FC5\u9808\uFF09
112401
112549
  - \`domain\` / \`phrase\` / \`url\` \u2014 \u30AF\u30A8\u30EA\u5BFE\u8C61\u306E\u30A8\u30F3\u30C6\u30A3\u30C6\u30A3
112402
112550
  - \`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
112403
- - \`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
112551
+ - \`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
112404
112552
  - \`display_offset\` \u2014 \u30DA\u30FC\u30B8\u30CD\u30FC\u30B7\u30E7\u30F3\u30AA\u30D5\u30BB\u30C3\u30C8
112405
112553
  - \`display_date\` \u2014 \u5C65\u6B74\u306E\u65E5\u4ED8\u3002\`YYYYMM15\` \u5F62\u5F0F\uFF08\u5FC5\u305A\u6708\u306E15\u65E5\uFF09
112406
112554
  - \`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
@@ -112411,6 +112559,7 @@ API \u30E6\u30CB\u30C3\u30C8\u6B8B\u91CF\u306E\u78BA\u8A8D\uFF08\u7121\u6599\u30
112411
112559
  - 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
112412
112560
  - 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
112413
112561
  - 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
112562
+ - \`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
112414
112563
  - 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
112415
112564
  - \u5C65\u6B74\u30A8\u30F3\u30C9\u30DD\u30A4\u30F3\u30C8\u306E\u65E5\u4ED8\u306F\u5FC5\u305A\u6708\u306E15\u65E5\uFF08\`YYYYMM15\`\uFF09`
112416
112565
  },
@@ -113530,7 +113679,8 @@ var parameters72 = {
113530
113679
  type: "text",
113531
113680
  secret: true,
113532
113681
  required: false
113533
- })
113682
+ }),
113683
+ ...sshTunnelParameters
113534
113684
  };
113535
113685
 
113536
113686
  // ../connectors/src/connectors/sqlserver/tools/execute-query.ts
@@ -113589,7 +113739,9 @@ Avoid loading large amounts of data; always include \`TOP\` in queries.`,
113589
113739
  };
113590
113740
  }
113591
113741
  try {
113592
- const { rows } = await runMssqlQuery(parsed, sql);
113742
+ const { rows } = await runMssqlQuery(parsed, sql, {
113743
+ tunnelParams: connectionParamsToRecord(connection2)
113744
+ });
113593
113745
  const truncated = rows.length > MAX_ROWS14;
113594
113746
  return {
113595
113747
  success: true,
@@ -113660,7 +113812,8 @@ The business logic type for this connector is "sql".
113660
113812
  {
113661
113813
  username: params[parameters72.username.slug],
113662
113814
  password: params[parameters72.password.slug]
113663
- }
113815
+ },
113816
+ { tunnelParams: params }
113664
113817
  );
113665
113818
  },
113666
113819
  async query(params, sql, _namedParams) {
@@ -113670,10 +113823,12 @@ The business logic type for this connector is "sql".
113670
113823
  });
113671
113824
  const sample = unwrapSampleLimit(sql);
113672
113825
  if (sample) {
113673
- const result = await runMssqlQuery(parsed, sample.inner);
113826
+ const result = await runMssqlQuery(parsed, sample.inner, {
113827
+ tunnelParams: params
113828
+ });
113674
113829
  return { rows: result.rows.slice(0, sample.limit) };
113675
113830
  }
113676
- return runMssqlQuery(parsed, sql);
113831
+ return runMssqlQuery(parsed, sql, { tunnelParams: params });
113677
113832
  }
113678
113833
  });
113679
113834
 
@@ -113719,7 +113874,8 @@ var parameters73 = {
113719
113874
  type: "text",
113720
113875
  secret: true,
113721
113876
  required: false
113722
- })
113877
+ }),
113878
+ ...sshTunnelParameters
113723
113879
  };
113724
113880
 
113725
113881
  // ../connectors/src/connectors/azure-sql/tools/execute-query.ts
@@ -113778,7 +113934,10 @@ Avoid loading large amounts of data; always include \`TOP\` in queries.`,
113778
113934
  };
113779
113935
  }
113780
113936
  try {
113781
- const { rows } = await runMssqlQuery(parsed, sql, { forceEncrypt: true });
113937
+ const { rows } = await runMssqlQuery(parsed, sql, {
113938
+ forceEncrypt: true,
113939
+ tunnelParams: connectionParamsToRecord(connection2)
113940
+ });
113782
113941
  const truncated = rows.length > MAX_ROWS15;
113783
113942
  return {
113784
113943
  success: true,
@@ -113803,7 +113962,7 @@ var azureSqlConnector = new ConnectorPlugin({
113803
113962
  description: "Connect to Azure SQL Database (managed) using a JDBC-style URL. Encryption is enforced automatically.",
113804
113963
  iconUrl: "https://images.ctfassets.net/9ncizv60xc5y/5TL0yBbxoLlk6jFZuiHl8w/55040f52d57bf0b77a2215c985c5a772/azure-sql-icon.png",
113805
113964
  parameters: parameters73,
113806
- releaseFlag: { dev1: true, dev2: false, prod: false },
113965
+ releaseFlag: { dev1: true, dev2: true, prod: true },
113807
113966
  categories: ["database"],
113808
113967
  onboarding: azureSqlOnboarding,
113809
113968
  systemPrompt: {
@@ -113850,7 +114009,7 @@ The business logic type for this connector is "sql".
113850
114009
  username: params[parameters73.username.slug],
113851
114010
  password: params[parameters73.password.slug]
113852
114011
  },
113853
- { forceEncrypt: true }
114012
+ { forceEncrypt: true, tunnelParams: params }
113854
114013
  );
113855
114014
  },
113856
114015
  async query(params, sql, _namedParams) {
@@ -113861,11 +114020,353 @@ The business logic type for this connector is "sql".
113861
114020
  const sample = unwrapSampleLimit(sql);
113862
114021
  if (sample) {
113863
114022
  const result = await runMssqlQuery(parsed, sample.inner, {
113864
- forceEncrypt: true
114023
+ forceEncrypt: true,
114024
+ tunnelParams: params
113865
114025
  });
113866
114026
  return { rows: result.rows.slice(0, sample.limit) };
113867
114027
  }
113868
- return runMssqlQuery(parsed, sql, { forceEncrypt: true });
114028
+ return runMssqlQuery(parsed, sql, {
114029
+ forceEncrypt: true,
114030
+ tunnelParams: params
114031
+ });
114032
+ }
114033
+ });
114034
+
114035
+ // ../connectors/src/connectors/cosmosdb/setup.ts
114036
+ var cosmosdbOnboarding = new ConnectorOnboarding({
114037
+ dataOverviewInstructions: {
114038
+ en: `1. Use cosmosdb_listContainers to list all containers in the configured database
114039
+ 2. For key containers, sample documents with cosmosdb_query: container="users", sql="SELECT TOP 5 * FROM c"
114040
+ 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)
114041
+ 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\``,
114042
+ ja: `1. cosmosdb_listContainers \u3067\u5BFE\u8C61\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u5185\u306E\u30B3\u30F3\u30C6\u30CA\u4E00\u89A7\u3092\u53D6\u5F97
114043
+ 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"
114044
+ 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
114045
+ 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\``
114046
+ }
114047
+ });
114048
+
114049
+ // ../connectors/src/connectors/cosmosdb/parameters.ts
114050
+ var parameters74 = {
114051
+ endpoint: new ParameterDefinition({
114052
+ slug: "endpoint",
114053
+ name: "Cosmos DB Endpoint",
114054
+ 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.",
114055
+ envVarBaseKey: "COSMOSDB_ENDPOINT",
114056
+ type: "text",
114057
+ secret: false,
114058
+ required: true
114059
+ }),
114060
+ key: new ParameterDefinition({
114061
+ slug: "key",
114062
+ name: "Account Key",
114063
+ description: "Cosmos DB account key (primary or secondary master key). Use a read-only key when only querying data.",
114064
+ envVarBaseKey: "COSMOSDB_KEY",
114065
+ type: "text",
114066
+ secret: true,
114067
+ required: true
114068
+ }),
114069
+ database: new ParameterDefinition({
114070
+ slug: "database",
114071
+ name: "Database",
114072
+ description: "The Cosmos DB database (a.k.a. database account namespace) to connect to.",
114073
+ envVarBaseKey: "COSMOSDB_DATABASE",
114074
+ type: "text",
114075
+ secret: false,
114076
+ required: true
114077
+ })
114078
+ };
114079
+
114080
+ // ../connectors/src/connectors/cosmosdb/tools/list-containers.ts
114081
+ import { z as z90 } from "zod";
114082
+ var inputSchema90 = z90.object({
114083
+ toolUseIntent: z90.string().optional().describe(
114084
+ "Brief description of what you intend to accomplish with this tool call"
114085
+ ),
114086
+ connectionId: z90.string().describe("ID of the Cosmos DB connection to use")
114087
+ });
114088
+ var outputSchema90 = z90.discriminatedUnion("success", [
114089
+ z90.object({
114090
+ success: z90.literal(true),
114091
+ containers: z90.array(
114092
+ z90.object({
114093
+ id: z90.string(),
114094
+ partitionKey: z90.array(z90.string()).optional()
114095
+ })
114096
+ )
114097
+ }),
114098
+ z90.object({
114099
+ success: z90.literal(false),
114100
+ error: z90.string()
114101
+ })
114102
+ ]);
114103
+ var listContainersTool = new ConnectorTool({
114104
+ name: "listContainers",
114105
+ description: `List all containers in the configured Cosmos DB database.
114106
+ Use this as the first step to explore the data structure. Returns container ids and their partition key paths.
114107
+ After listing containers, use the query tool to sample items and understand each container's schema.`,
114108
+ inputSchema: inputSchema90,
114109
+ outputSchema: outputSchema90,
114110
+ async execute({ connectionId }, connections) {
114111
+ const connection2 = connections.find((c6) => c6.id === connectionId);
114112
+ if (!connection2) {
114113
+ return {
114114
+ success: false,
114115
+ error: `Connection ${connectionId} not found`
114116
+ };
114117
+ }
114118
+ console.log(
114119
+ `[connector-query] cosmosdb/${connection2.name}: listContainers`
114120
+ );
114121
+ let key;
114122
+ try {
114123
+ const { CosmosClient } = await import("@azure/cosmos");
114124
+ const endpoint = parameters74.endpoint.getValue(connection2);
114125
+ key = parameters74.key.getValue(connection2);
114126
+ const database = parameters74.database.getValue(connection2);
114127
+ const client = new CosmosClient({ endpoint, key });
114128
+ const db = client.database(database);
114129
+ const { resources } = await db.containers.readAll().fetchAll();
114130
+ return {
114131
+ success: true,
114132
+ containers: resources.map((c6) => ({
114133
+ id: c6.id,
114134
+ partitionKey: extractPartitionKeyPaths(c6.partitionKey)
114135
+ }))
114136
+ };
114137
+ } catch (err) {
114138
+ let msg = err instanceof Error ? err.message : String(err);
114139
+ if (key) msg = msg.replaceAll(key, "***");
114140
+ return { success: false, error: msg };
114141
+ }
114142
+ }
114143
+ });
114144
+ function extractPartitionKeyPaths(partitionKey) {
114145
+ if (!partitionKey || typeof partitionKey !== "object") return void 0;
114146
+ const paths = partitionKey.paths;
114147
+ if (!Array.isArray(paths)) return void 0;
114148
+ return paths.filter((p2) => typeof p2 === "string");
114149
+ }
114150
+
114151
+ // ../connectors/src/connectors/cosmosdb/tools/query.ts
114152
+ import { z as z91 } from "zod";
114153
+ var MAX_DOCUMENTS3 = 500;
114154
+ var inputSchema91 = z91.object({
114155
+ toolUseIntent: z91.string().optional().describe(
114156
+ "Brief description of what you intend to accomplish with this tool call"
114157
+ ),
114158
+ connectionId: z91.string().describe("ID of the Cosmos DB connection to use"),
114159
+ container: z91.string().describe("Id of the container (a.k.a. collection) to query"),
114160
+ sql: z91.string().describe(
114161
+ "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`."
114162
+ ),
114163
+ partitionKey: z91.string().optional().describe(
114164
+ `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.`
114165
+ )
114166
+ });
114167
+ var outputSchema91 = z91.discriminatedUnion("success", [
114168
+ z91.object({
114169
+ success: z91.literal(true),
114170
+ documentCount: z91.number(),
114171
+ truncated: z91.boolean(),
114172
+ requestCharge: z91.number().optional(),
114173
+ documents: z91.array(z91.unknown())
114174
+ }),
114175
+ z91.object({
114176
+ success: z91.literal(false),
114177
+ error: z91.string()
114178
+ })
114179
+ ]);
114180
+ var queryTool = new ConnectorTool({
114181
+ name: "query",
114182
+ description: `Execute a Cosmos DB SQL (Core / NoSQL API) query against a container. Returns up to ${MAX_DOCUMENTS3} items.
114183
+ Use for: schema exploration, data sampling, aggregations, and analytical queries.
114184
+ Cosmos DB SQL targets a single container; reference items via the alias \`c\` (e.g. \`SELECT c.id FROM c WHERE c.userId = 'abc'\`).
114185
+ 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.`,
114186
+ inputSchema: inputSchema91,
114187
+ outputSchema: outputSchema91,
114188
+ async execute({ connectionId, container, sql, partitionKey }, connections) {
114189
+ const connection2 = connections.find((c6) => c6.id === connectionId);
114190
+ if (!connection2) {
114191
+ return {
114192
+ success: false,
114193
+ error: `Connection ${connectionId} not found`
114194
+ };
114195
+ }
114196
+ console.log(
114197
+ `[connector-query] cosmosdb/${connection2.name} (${container}): ${sql}`
114198
+ );
114199
+ let key;
114200
+ try {
114201
+ const cosmos = await import("@azure/cosmos");
114202
+ const { CosmosClient } = cosmos;
114203
+ const endpoint = parameters74.endpoint.getValue(connection2);
114204
+ key = parameters74.key.getValue(connection2);
114205
+ const database = parameters74.database.getValue(connection2);
114206
+ const client = new CosmosClient({ endpoint, key });
114207
+ const cont = client.database(database).container(container);
114208
+ const queryOptions = {
114209
+ // Bound by the connector's own row cap, but keep the SDK from
114210
+ // streaming arbitrarily large continuations.
114211
+ maxItemCount: MAX_DOCUMENTS3 + 1
114212
+ };
114213
+ if (partitionKey != null && partitionKey !== "") {
114214
+ try {
114215
+ queryOptions.partitionKey = JSON.parse(partitionKey);
114216
+ } catch {
114217
+ return {
114218
+ success: false,
114219
+ error: `Invalid partitionKey: must be a JSON-encoded scalar (e.g. '"abc"' or '123'). Got: ${partitionKey}`
114220
+ };
114221
+ }
114222
+ }
114223
+ const iterator = cont.items.query(sql, queryOptions);
114224
+ const { resources, requestCharge } = await iterator.fetchNext();
114225
+ const documents = resources ?? [];
114226
+ const truncated = documents.length > MAX_DOCUMENTS3;
114227
+ return {
114228
+ success: true,
114229
+ documentCount: Math.min(documents.length, MAX_DOCUMENTS3),
114230
+ truncated,
114231
+ requestCharge,
114232
+ documents: documents.slice(0, MAX_DOCUMENTS3)
114233
+ };
114234
+ } catch (err) {
114235
+ let msg = err instanceof Error ? err.message : String(err);
114236
+ if (key) msg = msg.replaceAll(key, "***");
114237
+ return { success: false, error: msg };
114238
+ }
114239
+ }
114240
+ });
114241
+
114242
+ // ../connectors/src/connectors/cosmosdb/index.ts
114243
+ var tools74 = {
114244
+ listContainers: listContainersTool,
114245
+ query: queryTool
114246
+ };
114247
+ var cosmosdbConnector = new ConnectorPlugin({
114248
+ slug: "cosmosdb",
114249
+ authType: AUTH_TYPES.USER_PASSWORD,
114250
+ name: "Azure Cosmos DB",
114251
+ description: "Connect to Azure Cosmos DB (Core / NoSQL API) for document-oriented data storage and SQL-style querying.",
114252
+ iconUrl: "https://images.ctfassets.net/9ncizv60xc5y/5p9B2Db0V2d8mK2jgBWtZu/dad72db8f41b16c50de2bcef03f9d415/cosmosdb-icon.png",
114253
+ parameters: parameters74,
114254
+ releaseFlag: { dev1: true, dev2: true, prod: true },
114255
+ categories: ["database"],
114256
+ onboarding: cosmosdbOnboarding,
114257
+ systemPrompt: {
114258
+ en: `### Tools
114259
+
114260
+ - \`cosmosdb_listContainers\`: Lists all containers in the configured database, with their partition key paths. Use this first to explore available data.
114261
+ - \`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).
114262
+
114263
+ ### Business Logic
114264
+
114265
+ 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.
114266
+
114267
+ \u26A0\uFE0F **The client returned by \`connection(connectionId)\` is NOT the raw \`@azure/cosmos\` \`CosmosClient\`.** It is a thin wrapper exposing only two methods:
114268
+ - \`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 }\`.
114269
+ - \`client.listContainers() => Promise<{ id: string; partitionKey?: string[] }[]>\` \u2014 lists containers in the configured database.
114270
+
114271
+ 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\`.
114272
+
114273
+ \`\`\`ts
114274
+ import type { Context } from "hono";
114275
+ import { connection } from "@squadbase/vite-server/connectors/cosmosdb";
114276
+
114277
+ const cosmos = connection("<connectionId>");
114278
+
114279
+ export default async function handler(_c: Context) {
114280
+ // \`query\` returns the items array directly \u2014 no \`.resources\` to unwrap.
114281
+ const rows = await cosmos.query<{ prod: string; orderCount: number }>(
114282
+ "<containerName>",
114283
+ "SELECT c.prod, COUNT(1) AS orderCount FROM c GROUP BY c.prod",
114284
+ // Optional: scope to a single partition to save RUs.
114285
+ // { partitionKey: "<partitionKeyValue>" },
114286
+ );
114287
+
114288
+ rows.sort((a, b) => Number(b.orderCount) - Number(a.orderCount));
114289
+
114290
+ return new Response(JSON.stringify(rows), {
114291
+ headers: { "Content-Type": "application/json" },
114292
+ });
114293
+ }
114294
+ \`\`\`
114295
+
114296
+ ### Cosmos DB SQL Reference
114297
+ - Cosmos DB stores schema-flexible JSON items in **containers** organised under a **database**. Items are partitioned by a per-container partition key path.
114298
+ - 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'\`).
114299
+ - 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.
114300
+ - System fields are prefixed with an underscore (\`c.id\`, \`c._ts\` for the modification timestamp, \`c._etag\`).
114301
+ - 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\`).
114302
+ - Joins: only **intra-document** joins via \`JOIN\` over arrays inside the same item; there is no cross-container/cross-document join.
114303
+ - Always bound results with \`TOP n\` and prefer scoped queries with a \`partitionKey\` value when possible \u2014 cross-partition queries cost more RUs.`,
114304
+ ja: `### \u30C4\u30FC\u30EB
114305
+
114306
+ - \`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
114307
+ - \`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
114308
+
114309
+ ### Business Logic
114310
+
114311
+ \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
114312
+
114313
+ \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
114314
+ - \`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
114315
+ - \`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
114316
+
114317
+ \`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
114318
+
114319
+ \`\`\`ts
114320
+ import type { Context } from "hono";
114321
+ import { connection } from "@squadbase/vite-server/connectors/cosmosdb";
114322
+
114323
+ const cosmos = connection("<connectionId>");
114324
+
114325
+ export default async function handler(_c: Context) {
114326
+ // \`query\` \u306F items \u914D\u5217\u3092\u305D\u306E\u307E\u307E\u8FD4\u3059 \u2014 \`.resources\` \u306E\u5C55\u958B\u306F\u4E0D\u8981\u3002
114327
+ const rows = await cosmos.query<{ prod: string; orderCount: number }>(
114328
+ "<containerName>",
114329
+ "SELECT c.prod, COUNT(1) AS orderCount FROM c GROUP BY c.prod",
114330
+ // \u4EFB\u610F: \u5358\u4E00\u30D1\u30FC\u30C6\u30A3\u30B7\u30E7\u30F3\u306B\u30B9\u30B3\u30FC\u30D7\u3057\u3066 RU \u3092\u7BC0\u7D04\u3002
114331
+ // { partitionKey: "<partitionKeyValue>" },
114332
+ );
114333
+
114334
+ rows.sort((a, b) => Number(b.orderCount) - Number(a.orderCount));
114335
+
114336
+ return new Response(JSON.stringify(rows), {
114337
+ headers: { "Content-Type": "application/json" },
114338
+ });
114339
+ }
114340
+ \`\`\`
114341
+
114342
+ ### Cosmos DB SQL \u30EA\u30D5\u30A1\u30EC\u30F3\u30B9
114343
+ - 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
114344
+ - \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
114345
+ - \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
114346
+ - \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
114347
+ - \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
114348
+ - \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
114349
+ - \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`
114350
+ },
114351
+ tools: tools74,
114352
+ async checkConnection(params, _config) {
114353
+ try {
114354
+ const { CosmosClient } = await import("@azure/cosmos");
114355
+ const client = new CosmosClient({
114356
+ endpoint: params[parameters74.endpoint.slug],
114357
+ key: params[parameters74.key.slug]
114358
+ });
114359
+ const database = params[parameters74.database.slug];
114360
+ await client.database(database).read();
114361
+ return { success: true };
114362
+ } catch (error2) {
114363
+ const msg = error2 instanceof Error ? error2.message : String(error2);
114364
+ const key = params[parameters74.key.slug];
114365
+ return {
114366
+ success: false,
114367
+ error: key ? msg.replaceAll(key, "***") : msg
114368
+ };
114369
+ }
113869
114370
  }
113870
114371
  });
113871
114372
 
@@ -113886,7 +114387,7 @@ var oracleOnboarding = new ConnectorOnboarding({
113886
114387
  });
113887
114388
 
113888
114389
  // ../connectors/src/connectors/oracle/parameters.ts
113889
- var parameters74 = {
114390
+ var parameters75 = {
113890
114391
  jdbcUrl: new ParameterDefinition({
113891
114392
  slug: "jdbc-url",
113892
114393
  name: "Oracle JDBC URL",
@@ -113913,31 +114414,32 @@ var parameters74 = {
113913
114414
  type: "text",
113914
114415
  secret: true,
113915
114416
  required: false
113916
- })
114417
+ }),
114418
+ ...sshTunnelParameters
113917
114419
  };
113918
114420
 
113919
114421
  // ../connectors/src/connectors/oracle/tools/execute-query.ts
113920
- import { z as z90 } from "zod";
114422
+ import { z as z92 } from "zod";
113921
114423
  var MAX_ROWS16 = 500;
113922
- var inputSchema90 = z90.object({
113923
- toolUseIntent: z90.string().optional().describe(
114424
+ var inputSchema92 = z92.object({
114425
+ toolUseIntent: z92.string().optional().describe(
113924
114426
  "Brief description of what you intend to accomplish with this tool call"
113925
114427
  ),
113926
- connectionId: z90.string().describe("ID of the Oracle connection to use"),
113927
- sql: z90.string().describe(
114428
+ connectionId: z92.string().describe("ID of the Oracle connection to use"),
114429
+ sql: z92.string().describe(
113928
114430
  "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."
113929
114431
  )
113930
114432
  });
113931
- var outputSchema90 = z90.discriminatedUnion("success", [
113932
- z90.object({
113933
- success: z90.literal(true),
113934
- rowCount: z90.number(),
113935
- truncated: z90.boolean(),
113936
- rows: z90.array(z90.record(z90.string(), z90.unknown()))
114433
+ var outputSchema92 = z92.discriminatedUnion("success", [
114434
+ z92.object({
114435
+ success: z92.literal(true),
114436
+ rowCount: z92.number(),
114437
+ truncated: z92.boolean(),
114438
+ rows: z92.array(z92.record(z92.string(), z92.unknown()))
113937
114439
  }),
113938
- z90.object({
113939
- success: z90.literal(false),
113940
- error: z90.string()
114440
+ z92.object({
114441
+ success: z92.literal(false),
114442
+ error: z92.string()
113941
114443
  })
113942
114444
  ]);
113943
114445
  var executeQueryTool16 = new ConnectorTool({
@@ -113947,8 +114449,8 @@ Use for: schema exploration via \`USER_TABLES\` / \`USER_TAB_COLUMNS\` / \`ALL_T
113947
114449
  Oracle uses \`FETCH FIRST n ROWS ONLY\` (12c+) or \`ROWNUM\` for row limiting \u2014 there is no \`LIMIT\` keyword.
113948
114450
  Unquoted identifiers are stored upper-case (\`SELECT * FROM employees\` resolves to \`EMPLOYEES\`).
113949
114451
  Do NOT terminate statements with a semicolon; the driver rejects trailing terminators.`,
113950
- inputSchema: inputSchema90,
113951
- outputSchema: outputSchema90,
114452
+ inputSchema: inputSchema92,
114453
+ outputSchema: outputSchema92,
113952
114454
  async execute({ connectionId, sql }, connections) {
113953
114455
  const connection2 = connections.find((c6) => c6.id === connectionId);
113954
114456
  if (!connection2) {
@@ -113957,9 +114459,9 @@ Do NOT terminate statements with a semicolon; the driver rejects trailing termin
113957
114459
  error: `Connection ${connectionId} not found`
113958
114460
  };
113959
114461
  }
113960
- const jdbcUrl = parameters74.jdbcUrl.getValue(connection2);
113961
- const username = parameters74.username.tryGetValue(connection2);
113962
- const password = parameters74.password.tryGetValue(connection2);
114462
+ const jdbcUrl = parameters75.jdbcUrl.getValue(connection2);
114463
+ const username = parameters75.username.tryGetValue(connection2);
114464
+ const password = parameters75.password.tryGetValue(connection2);
113963
114465
  console.log(
113964
114466
  `[connector-query] oracle/${connection2.name} (${redactOracleUrl(jdbcUrl)}): ${sql}`
113965
114467
  );
@@ -113974,7 +114476,9 @@ Do NOT terminate statements with a semicolon; the driver rejects trailing termin
113974
114476
  }
113975
114477
  try {
113976
114478
  const cleanSql = sql.replace(/;\s*$/, "");
113977
- const { rows } = await runOracleQuery(parsed, cleanSql);
114479
+ const { rows } = await runOracleQuery(parsed, cleanSql, {
114480
+ tunnelParams: connectionParamsToRecord(connection2)
114481
+ });
113978
114482
  const truncated = rows.length > MAX_ROWS16;
113979
114483
  return {
113980
114484
  success: true,
@@ -113991,14 +114495,14 @@ Do NOT terminate statements with a semicolon; the driver rejects trailing termin
113991
114495
  });
113992
114496
 
113993
114497
  // ../connectors/src/connectors/oracle/index.ts
113994
- var tools74 = { executeQuery: executeQueryTool16 };
114498
+ var tools75 = { executeQuery: executeQueryTool16 };
113995
114499
  var oracleConnector = new ConnectorPlugin({
113996
114500
  slug: "oracle",
113997
114501
  authType: AUTH_TYPES.USER_PASSWORD,
113998
114502
  name: "Oracle Database",
113999
114503
  description: "Connect to Oracle Database using a JDBC-style URL via the pure-JS Thin driver (no Oracle Instant Client required).",
114000
114504
  iconUrl: "https://images.ctfassets.net/9ncizv60xc5y/3iGEdzvGHncU5bYqFOROiV/9e7bdda7230d7ca6b34e7f6a862de876/oracle-icon.webp",
114001
- parameters: parameters74,
114505
+ parameters: parameters75,
114002
114506
  releaseFlag: { dev1: true, dev2: false, prod: false },
114003
114507
  categories: ["database"],
114004
114508
  onboarding: oracleOnboarding,
@@ -114042,26 +114546,32 @@ The business logic type for this connector is "sql".
114042
114546
  - \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
114043
114547
  - \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`
114044
114548
  },
114045
- tools: tools74,
114549
+ tools: tools75,
114046
114550
  async checkConnection(params, _config) {
114047
- return checkOracleConnection(params[parameters74.jdbcUrl.slug], {
114048
- username: params[parameters74.username.slug],
114049
- password: params[parameters74.password.slug]
114050
- });
114551
+ return checkOracleConnection(
114552
+ params[parameters75.jdbcUrl.slug],
114553
+ {
114554
+ username: params[parameters75.username.slug],
114555
+ password: params[parameters75.password.slug]
114556
+ },
114557
+ { tunnelParams: params }
114558
+ );
114051
114559
  },
114052
114560
  async query(params, sql, _namedParams) {
114053
- const parsed = parseOracleJdbcUrl(params[parameters74.jdbcUrl.slug], {
114054
- username: params[parameters74.username.slug],
114055
- password: params[parameters74.password.slug]
114561
+ const parsed = parseOracleJdbcUrl(params[parameters75.jdbcUrl.slug], {
114562
+ username: params[parameters75.username.slug],
114563
+ password: params[parameters75.password.slug]
114056
114564
  });
114057
114565
  const sample = unwrapSampleLimit(sql);
114058
114566
  if (sample) {
114059
114567
  const inner = sample.inner.replace(/;\s*$/, "");
114060
- const result = await runOracleQuery(parsed, inner);
114568
+ const result = await runOracleQuery(parsed, inner, {
114569
+ tunnelParams: params
114570
+ });
114061
114571
  return { rows: result.rows.slice(0, sample.limit) };
114062
114572
  }
114063
114573
  const cleanSql = sql.replace(/;\s*$/, "");
114064
- return runOracleQuery(parsed, cleanSql);
114574
+ return runOracleQuery(parsed, cleanSql, { tunnelParams: params });
114065
114575
  }
114066
114576
  });
114067
114577
 
@@ -114082,7 +114592,7 @@ var freshserviceOnboarding = new ConnectorOnboarding({
114082
114592
  });
114083
114593
 
114084
114594
  // ../connectors/src/connectors/freshservice/parameters.ts
114085
- var parameters75 = {
114595
+ var parameters76 = {
114086
114596
  domain: new ParameterDefinition({
114087
114597
  slug: "domain",
114088
114598
  name: "Freshservice Domain",
@@ -114104,7 +114614,7 @@ var parameters75 = {
114104
114614
  };
114105
114615
 
114106
114616
  // ../connectors/src/connectors/freshservice/tools/request.ts
114107
- import { z as z91 } from "zod";
114617
+ import { z as z93 } from "zod";
114108
114618
  var BASE_PATH_SEGMENT12 = "/api/v2";
114109
114619
  var REQUEST_TIMEOUT_MS70 = 6e4;
114110
114620
  function buildBaseUrl(domain) {
@@ -114115,33 +114625,33 @@ function buildBaseUrl(domain) {
114115
114625
  function basicAuthHeader(apiKey) {
114116
114626
  return `Basic ${Buffer.from(`${apiKey}:X`).toString("base64")}`;
114117
114627
  }
114118
- var inputSchema91 = z91.object({
114119
- toolUseIntent: z91.string().optional().describe(
114628
+ var inputSchema93 = z93.object({
114629
+ toolUseIntent: z93.string().optional().describe(
114120
114630
  "Brief description of what you intend to accomplish with this tool call"
114121
114631
  ),
114122
- connectionId: z91.string().describe("ID of the Freshservice connection to use"),
114123
- method: z91.enum(["GET", "POST", "PUT", "DELETE"]).describe(
114632
+ connectionId: z93.string().describe("ID of the Freshservice connection to use"),
114633
+ method: z93.enum(["GET", "POST", "PUT", "DELETE"]).describe(
114124
114634
  "HTTP method. GET for reading resources, POST for creating, PUT for updating, DELETE for removing."
114125
114635
  ),
114126
- path: z91.string().describe(
114636
+ path: z93.string().describe(
114127
114637
  "API path (e.g., '/tickets', '/tickets/123', '/agents'). Append query parameters such as '?per_page=100&page=1' for pagination."
114128
114638
  ),
114129
- body: z91.record(z91.string(), z91.unknown()).optional().describe(
114639
+ body: z93.record(z93.string(), z93.unknown()).optional().describe(
114130
114640
  'Request body (JSON) for POST/PUT requests. Example: { "subject": "...", "description": "...", "email": "...", "priority": 2, "status": 2, "source": 2 }.'
114131
114641
  )
114132
114642
  });
114133
- var outputSchema91 = z91.discriminatedUnion("success", [
114134
- z91.object({
114135
- success: z91.literal(true),
114136
- status: z91.number(),
114137
- data: z91.union([
114138
- z91.record(z91.string(), z91.unknown()),
114139
- z91.array(z91.unknown())
114643
+ var outputSchema93 = z93.discriminatedUnion("success", [
114644
+ z93.object({
114645
+ success: z93.literal(true),
114646
+ status: z93.number(),
114647
+ data: z93.union([
114648
+ z93.record(z93.string(), z93.unknown()),
114649
+ z93.array(z93.unknown())
114140
114650
  ])
114141
114651
  }),
114142
- z91.object({
114143
- success: z91.literal(false),
114144
- error: z91.string()
114652
+ z93.object({
114653
+ success: z93.literal(false),
114654
+ error: z93.string()
114145
114655
  })
114146
114656
  ]);
114147
114657
  var requestTool52 = new ConnectorTool({
@@ -114172,8 +114682,8 @@ Field codes:
114172
114682
  - ticket priority: 1 Low, 2 Medium, 3 High, 4 Urgent
114173
114683
  - ticket status: 2 Open, 3 Pending, 4 Resolved, 5 Closed
114174
114684
  - ticket source: 1 Email, 2 Portal, 3 Phone, 4 Chat, 5 Feedback widget, 7 Yammer, 8 AwsCloudwatch, 9 Pagerduty, 10 Walkup, 11 Slack`,
114175
- inputSchema: inputSchema91,
114176
- outputSchema: outputSchema91,
114685
+ inputSchema: inputSchema93,
114686
+ outputSchema: outputSchema93,
114177
114687
  async execute({ connectionId, method, path: path6, body }, connections) {
114178
114688
  const connection2 = connections.find((c6) => c6.id === connectionId);
114179
114689
  if (!connection2) {
@@ -114186,8 +114696,8 @@ Field codes:
114186
114696
  `[connector-request] freshservice/${connection2.name}: ${method} ${path6}`
114187
114697
  );
114188
114698
  try {
114189
- const apiKey = parameters75.apiKey.getValue(connection2);
114190
- const domain = parameters75.domain.getValue(connection2);
114699
+ const apiKey = parameters76.apiKey.getValue(connection2);
114700
+ const domain = parameters76.domain.getValue(connection2);
114191
114701
  const baseUrl = buildBaseUrl(domain);
114192
114702
  const normalizedPath = normalizeRequestPath(path6, BASE_PATH_SEGMENT12);
114193
114703
  const url = `${baseUrl}${normalizedPath}`;
@@ -114226,14 +114736,14 @@ Field codes:
114226
114736
  });
114227
114737
 
114228
114738
  // ../connectors/src/connectors/freshservice/index.ts
114229
- var tools75 = { request: requestTool52 };
114739
+ var tools76 = { request: requestTool52 };
114230
114740
  var freshserviceConnector = new ConnectorPlugin({
114231
114741
  slug: "freshservice",
114232
114742
  authType: AUTH_TYPES.API_KEY,
114233
114743
  name: "Freshservice",
114234
114744
  description: "Connect to Freshservice (ITSM) for ticket, agent, asset, and ITIL workflow data via API key.",
114235
114745
  iconUrl: "https://images.ctfassets.net/9ncizv60xc5y/6Tj64HZOoIrGgQYDayBosY/3f45b29d3479726b5d245ac38d5a7036/freshservice-icon.svg",
114236
- parameters: parameters75,
114746
+ parameters: parameters76,
114237
114747
  releaseFlag: { dev1: true, dev2: true, prod: true },
114238
114748
  categories: ["productivity"],
114239
114749
  onboarding: freshserviceOnboarding,
@@ -114391,7 +114901,7 @@ export default async function handler(c: Context) {
114391
114901
  - \`status\`: 2=Open, 3=Pending, 4=Resolved, 5=Closed
114392
114902
  - \`source\`: 1=Email, 2=Portal, 3=Phone, 4=Chat, 5=Feedback widget, 7=Yammer, 8=AwsCloudwatch, 9=Pagerduty, 10=Walkup, 11=Slack`
114393
114903
  },
114394
- tools: tools75
114904
+ tools: tools76
114395
114905
  });
114396
114906
 
114397
114907
  // ../connectors/src/connectors/freshdesk/setup.ts
@@ -114411,7 +114921,7 @@ var freshdeskOnboarding = new ConnectorOnboarding({
114411
114921
  });
114412
114922
 
114413
114923
  // ../connectors/src/connectors/freshdesk/parameters.ts
114414
- var parameters76 = {
114924
+ var parameters77 = {
114415
114925
  domain: new ParameterDefinition({
114416
114926
  slug: "domain",
114417
114927
  name: "Freshdesk Domain",
@@ -114433,7 +114943,7 @@ var parameters76 = {
114433
114943
  };
114434
114944
 
114435
114945
  // ../connectors/src/connectors/freshdesk/tools/request.ts
114436
- import { z as z92 } from "zod";
114946
+ import { z as z94 } from "zod";
114437
114947
  var BASE_PATH_SEGMENT13 = "/api/v2";
114438
114948
  var REQUEST_TIMEOUT_MS71 = 6e4;
114439
114949
  function buildBaseUrl2(domain) {
@@ -114444,33 +114954,33 @@ function buildBaseUrl2(domain) {
114444
114954
  function basicAuthHeader2(apiKey) {
114445
114955
  return `Basic ${Buffer.from(`${apiKey}:X`).toString("base64")}`;
114446
114956
  }
114447
- var inputSchema92 = z92.object({
114448
- toolUseIntent: z92.string().optional().describe(
114957
+ var inputSchema94 = z94.object({
114958
+ toolUseIntent: z94.string().optional().describe(
114449
114959
  "Brief description of what you intend to accomplish with this tool call"
114450
114960
  ),
114451
- connectionId: z92.string().describe("ID of the Freshdesk connection to use"),
114452
- method: z92.enum(["GET", "POST", "PUT", "DELETE"]).describe(
114961
+ connectionId: z94.string().describe("ID of the Freshdesk connection to use"),
114962
+ method: z94.enum(["GET", "POST", "PUT", "DELETE"]).describe(
114453
114963
  "HTTP method. GET for reading resources, POST for creating, PUT for updating, DELETE for removing."
114454
114964
  ),
114455
- path: z92.string().describe(
114965
+ path: z94.string().describe(
114456
114966
  "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'."
114457
114967
  ),
114458
- body: z92.record(z92.string(), z92.unknown()).optional().describe(
114968
+ body: z94.record(z94.string(), z94.unknown()).optional().describe(
114459
114969
  'Request body (JSON) for POST/PUT requests. Example creating a ticket: { "subject": "...", "description": "...", "email": "...", "priority": 2, "status": 2, "source": 1 }.'
114460
114970
  )
114461
114971
  });
114462
- var outputSchema92 = z92.discriminatedUnion("success", [
114463
- z92.object({
114464
- success: z92.literal(true),
114465
- status: z92.number(),
114466
- data: z92.union([
114467
- z92.record(z92.string(), z92.unknown()),
114468
- z92.array(z92.unknown())
114972
+ var outputSchema94 = z94.discriminatedUnion("success", [
114973
+ z94.object({
114974
+ success: z94.literal(true),
114975
+ status: z94.number(),
114976
+ data: z94.union([
114977
+ z94.record(z94.string(), z94.unknown()),
114978
+ z94.array(z94.unknown())
114469
114979
  ])
114470
114980
  }),
114471
- z92.object({
114472
- success: z92.literal(false),
114473
- error: z92.string()
114981
+ z94.object({
114982
+ success: z94.literal(false),
114983
+ error: z94.string()
114474
114984
  })
114475
114985
  ]);
114476
114986
  var requestTool53 = new ConnectorTool({
@@ -114501,8 +115011,8 @@ Field codes (tickets):
114501
115011
  - priority: 1 Low, 2 Medium, 3 High, 4 Urgent
114502
115012
  - status: 2 Open, 3 Pending, 4 Resolved, 5 Closed
114503
115013
  - source: 1 Email, 2 Portal, 3 Phone, 7 Chat, 9 Feedback widget, 10 Outbound email`,
114504
- inputSchema: inputSchema92,
114505
- outputSchema: outputSchema92,
115014
+ inputSchema: inputSchema94,
115015
+ outputSchema: outputSchema94,
114506
115016
  async execute({ connectionId, method, path: path6, body }, connections) {
114507
115017
  const connection2 = connections.find((c6) => c6.id === connectionId);
114508
115018
  if (!connection2) {
@@ -114515,8 +115025,8 @@ Field codes (tickets):
114515
115025
  `[connector-request] freshdesk/${connection2.name}: ${method} ${path6}`
114516
115026
  );
114517
115027
  try {
114518
- const apiKey = parameters76.apiKey.getValue(connection2);
114519
- const domain = parameters76.domain.getValue(connection2);
115028
+ const apiKey = parameters77.apiKey.getValue(connection2);
115029
+ const domain = parameters77.domain.getValue(connection2);
114520
115030
  const baseUrl = buildBaseUrl2(domain);
114521
115031
  const normalizedPath = normalizeRequestPath(path6, BASE_PATH_SEGMENT13);
114522
115032
  const url = `${baseUrl}${normalizedPath}`;
@@ -114555,14 +115065,14 @@ Field codes (tickets):
114555
115065
  });
114556
115066
 
114557
115067
  // ../connectors/src/connectors/freshdesk/index.ts
114558
- var tools76 = { request: requestTool53 };
115068
+ var tools77 = { request: requestTool53 };
114559
115069
  var freshdeskConnector = new ConnectorPlugin({
114560
115070
  slug: "freshdesk",
114561
115071
  authType: AUTH_TYPES.API_KEY,
114562
115072
  name: "Freshdesk",
114563
115073
  description: "Connect to Freshdesk for customer support ticket, contact, and company data via API key.",
114564
115074
  iconUrl: "https://images.ctfassets.net/9ncizv60xc5y/1PSjIfQJgTYmiWriNTx4uE/26905f4120713bda0afd0b23d02a154e/freshdesk-icon.png",
114565
- parameters: parameters76,
115075
+ parameters: parameters77,
114566
115076
  releaseFlag: { dev1: true, dev2: true, prod: true },
114567
115077
  categories: ["crm"],
114568
115078
  onboarding: freshdeskOnboarding,
@@ -114722,7 +115232,7 @@ export default async function handler(c: Context) {
114722
115232
  - \`status\`: 2=Open, 3=Pending, 4=Resolved, 5=Closed
114723
115233
  - \`source\`: 1=Email, 2=Portal, 3=Phone, 7=Chat, 9=Feedback widget, 10=Outbound email`
114724
115234
  },
114725
- tools: tools76
115235
+ tools: tools77
114726
115236
  });
114727
115237
 
114728
115238
  // ../connectors/src/connectors/freshsales/setup.ts
@@ -114742,7 +115252,7 @@ var freshsalesOnboarding = new ConnectorOnboarding({
114742
115252
  });
114743
115253
 
114744
115254
  // ../connectors/src/connectors/freshsales/parameters.ts
114745
- var parameters77 = {
115255
+ var parameters78 = {
114746
115256
  bundleAlias: new ParameterDefinition({
114747
115257
  slug: "bundle-alias",
114748
115258
  name: "Freshsales Bundle Alias",
@@ -114764,7 +115274,7 @@ var parameters77 = {
114764
115274
  };
114765
115275
 
114766
115276
  // ../connectors/src/connectors/freshsales/tools/request.ts
114767
- import { z as z93 } from "zod";
115277
+ import { z as z95 } from "zod";
114768
115278
  var BASE_PATH_SEGMENT14 = "/crm/sales/api";
114769
115279
  var REQUEST_TIMEOUT_MS72 = 6e4;
114770
115280
  function buildBaseUrl3(bundleAlias) {
@@ -114772,33 +115282,33 @@ function buildBaseUrl3(bundleAlias) {
114772
115282
  const subdomain = trimmed.split(".")[0];
114773
115283
  return `https://${subdomain}.myfreshworks.com${BASE_PATH_SEGMENT14}`;
114774
115284
  }
114775
- var inputSchema93 = z93.object({
114776
- toolUseIntent: z93.string().optional().describe(
115285
+ var inputSchema95 = z95.object({
115286
+ toolUseIntent: z95.string().optional().describe(
114777
115287
  "Brief description of what you intend to accomplish with this tool call"
114778
115288
  ),
114779
- connectionId: z93.string().describe("ID of the Freshsales connection to use"),
114780
- method: z93.enum(["GET", "POST", "PUT", "DELETE"]).describe(
115289
+ connectionId: z95.string().describe("ID of the Freshsales connection to use"),
115290
+ method: z95.enum(["GET", "POST", "PUT", "DELETE"]).describe(
114781
115291
  "HTTP method. GET for reading resources (including /lookup), POST for creating, PUT for updating, DELETE for removing."
114782
115292
  ),
114783
- path: z93.string().describe(
115293
+ path: z95.string().describe(
114784
115294
  "API path (e.g., '/contacts', '/contacts/filters', '/contacts/view/{view_id}', '/deals/{id}', '/lookup'). Append query parameters such as '?page=1&per_page=100'."
114785
115295
  ),
114786
- body: z93.record(z93.string(), z93.unknown()).optional().describe(
115296
+ body: z95.record(z95.string(), z95.unknown()).optional().describe(
114787
115297
  'Request body (JSON). For creating a contact: { "contact": { "first_name": "...", "last_name": "...", "email": "..." } }. For lookup: { "q": "john@example.com", "f": "email", "entities": "contact" }.'
114788
115298
  )
114789
115299
  });
114790
- var outputSchema93 = z93.discriminatedUnion("success", [
114791
- z93.object({
114792
- success: z93.literal(true),
114793
- status: z93.number(),
114794
- data: z93.union([
114795
- z93.record(z93.string(), z93.unknown()),
114796
- z93.array(z93.unknown())
115300
+ var outputSchema95 = z95.discriminatedUnion("success", [
115301
+ z95.object({
115302
+ success: z95.literal(true),
115303
+ status: z95.number(),
115304
+ data: z95.union([
115305
+ z95.record(z95.string(), z95.unknown()),
115306
+ z95.array(z95.unknown())
114797
115307
  ])
114798
115308
  }),
114799
- z93.object({
114800
- success: z93.literal(false),
114801
- error: z93.string()
115309
+ z95.object({
115310
+ success: z95.literal(false),
115311
+ error: z95.string()
114802
115312
  })
114803
115313
  ]);
114804
115314
  var requestTool54 = new ConnectorTool({
@@ -114831,8 +115341,8 @@ Common endpoints:
114831
115341
  Pagination: 1-indexed \`page\` + \`per_page\` (default 25, max 100). View endpoints return \`{ contacts/sales_accounts/deals: [...], meta: { total_pages, total } }\`.
114832
115342
 
114833
115343
  Includes: most GET endpoints accept \`?include=\` with a comma-separated list (\`owner\`, \`creator\`, \`deals\`, \`contacts\`, etc.) to inline related records.`,
114834
- inputSchema: inputSchema93,
114835
- outputSchema: outputSchema93,
115344
+ inputSchema: inputSchema95,
115345
+ outputSchema: outputSchema95,
114836
115346
  async execute({ connectionId, method, path: path6, body }, connections) {
114837
115347
  const connection2 = connections.find((c6) => c6.id === connectionId);
114838
115348
  if (!connection2) {
@@ -114845,8 +115355,8 @@ Includes: most GET endpoints accept \`?include=\` with a comma-separated list (\
114845
115355
  `[connector-request] freshsales/${connection2.name}: ${method} ${path6}`
114846
115356
  );
114847
115357
  try {
114848
- const apiKey = parameters77.apiKey.getValue(connection2);
114849
- const bundle = parameters77.bundleAlias.getValue(connection2);
115358
+ const apiKey = parameters78.apiKey.getValue(connection2);
115359
+ const bundle = parameters78.bundleAlias.getValue(connection2);
114850
115360
  const baseUrl = buildBaseUrl3(bundle);
114851
115361
  const normalizedPath = normalizeRequestPath(path6, BASE_PATH_SEGMENT14);
114852
115362
  const url = `${baseUrl}${normalizedPath}`;
@@ -114884,14 +115394,14 @@ Includes: most GET endpoints accept \`?include=\` with a comma-separated list (\
114884
115394
  });
114885
115395
 
114886
115396
  // ../connectors/src/connectors/freshsales/index.ts
114887
- var tools77 = { request: requestTool54 };
115397
+ var tools78 = { request: requestTool54 };
114888
115398
  var freshsalesConnector = new ConnectorPlugin({
114889
115399
  slug: "freshsales",
114890
115400
  authType: AUTH_TYPES.API_KEY,
114891
115401
  name: "Freshsales",
114892
115402
  description: "Connect to Freshsales / Freshworks CRM for contact, account, and deal data via API key.",
114893
115403
  iconUrl: "https://images.ctfassets.net/9ncizv60xc5y/4UDOrFPM6wOFekbMVljjgl/4acc6060c3a1ff703980e6f4e76a3cd4/629b6c6f7c5cd817694c321f.png",
114894
- parameters: parameters77,
115404
+ parameters: parameters78,
114895
115405
  releaseFlag: { dev1: true, dev2: true, prod: true },
114896
115406
  categories: ["crm"],
114897
115407
  onboarding: freshsalesOnboarding,
@@ -115063,7 +115573,7 @@ export default async function handler(c: Context) {
115063
115573
  - GET \`/selector/lifecycle_stages\` \u2014 \u30E9\u30A4\u30D5\u30B5\u30A4\u30AF\u30EB\u30B9\u30C6\u30FC\u30B8
115064
115574
  - GET \`/selector/territories\` / \`/selector/business_types\` / \`/selector/industry_types\` / \`/selector/contact_statuses\` / \`/selector/sales_activity_types\``
115065
115575
  },
115066
- tools: tools77
115576
+ tools: tools78
115067
115577
  });
115068
115578
 
115069
115579
  // ../connectors/src/connectors/github/setup.ts
@@ -115089,7 +115599,7 @@ var githubOnboarding = new ConnectorOnboarding({
115089
115599
  });
115090
115600
 
115091
115601
  // ../connectors/src/connectors/github/parameters.ts
115092
- var parameters78 = {
115602
+ var parameters79 = {
115093
115603
  personalAccessToken: new ParameterDefinition({
115094
115604
  slug: "personal-access-token",
115095
115605
  name: "GitHub Personal Access Token",
@@ -115112,42 +115622,42 @@ var parameters78 = {
115112
115622
  var DEFAULT_BASE_URL = "https://api.github.com";
115113
115623
 
115114
115624
  // ../connectors/src/connectors/github/tools/request.ts
115115
- import { z as z94 } from "zod";
115625
+ import { z as z96 } from "zod";
115116
115626
  var REQUEST_TIMEOUT_MS73 = 6e4;
115117
115627
  function resolveBaseUrl(connectionBaseUrl) {
115118
115628
  const trimmed = connectionBaseUrl?.trim();
115119
115629
  return trimmed && trimmed.replace(/\/+$/, "") || DEFAULT_BASE_URL;
115120
115630
  }
115121
- var inputSchema94 = z94.object({
115122
- toolUseIntent: z94.string().optional().describe(
115631
+ var inputSchema96 = z96.object({
115632
+ toolUseIntent: z96.string().optional().describe(
115123
115633
  "Brief description of what you intend to accomplish with this tool call"
115124
115634
  ),
115125
- connectionId: z94.string().describe("ID of the GitHub connection to use"),
115126
- method: z94.enum(["GET", "POST", "PUT", "PATCH", "DELETE"]).describe(
115635
+ connectionId: z96.string().describe("ID of the GitHub connection to use"),
115636
+ method: z96.enum(["GET", "POST", "PUT", "PATCH", "DELETE"]).describe(
115127
115637
  "HTTP method. GET for reading, POST for creating, PATCH for partial updates, PUT for replacement (e.g. starring), DELETE for removal."
115128
115638
  ),
115129
- path: z94.string().describe(
115639
+ path: z96.string().describe(
115130
115640
  "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'."
115131
115641
  ),
115132
- body: z94.union([
115133
- z94.record(z94.string(), z94.unknown()),
115134
- z94.array(z94.unknown())
115642
+ body: z96.union([
115643
+ z96.record(z96.string(), z96.unknown()),
115644
+ z96.array(z96.unknown())
115135
115645
  ]).optional().describe(
115136
115646
  'Request body (JSON). Example creating an issue: { "title": "...", "body": "...", "labels": ["bug"] }.'
115137
115647
  )
115138
115648
  });
115139
- var outputSchema94 = z94.discriminatedUnion("success", [
115140
- z94.object({
115141
- success: z94.literal(true),
115142
- status: z94.number(),
115143
- data: z94.union([
115144
- z94.record(z94.string(), z94.unknown()),
115145
- z94.array(z94.unknown())
115649
+ var outputSchema96 = z96.discriminatedUnion("success", [
115650
+ z96.object({
115651
+ success: z96.literal(true),
115652
+ status: z96.number(),
115653
+ data: z96.union([
115654
+ z96.record(z96.string(), z96.unknown()),
115655
+ z96.array(z96.unknown())
115146
115656
  ])
115147
115657
  }),
115148
- z94.object({
115149
- success: z94.literal(false),
115150
- error: z94.string()
115658
+ z96.object({
115659
+ success: z96.literal(false),
115660
+ error: z96.string()
115151
115661
  })
115152
115662
  ]);
115153
115663
  var requestTool55 = new ConnectorTool({
@@ -115185,8 +115695,8 @@ Common endpoints:
115185
115695
  Pagination: 1-indexed \`page\` + \`per_page\` (max 100). The \`Link\` response header exposes \`rel="next"\`/\`rel="last"\` URLs.
115186
115696
 
115187
115697
  Rate limits: 5,000 req/hr on REST endpoints, 30 req/min on /search/*. Inspect \`X-RateLimit-Remaining\` to throttle.`,
115188
- inputSchema: inputSchema94,
115189
- outputSchema: outputSchema94,
115698
+ inputSchema: inputSchema96,
115699
+ outputSchema: outputSchema96,
115190
115700
  async execute({ connectionId, method, path: path6, body }, connections) {
115191
115701
  const connection2 = connections.find((c6) => c6.id === connectionId);
115192
115702
  if (!connection2) {
@@ -115199,8 +115709,8 @@ Rate limits: 5,000 req/hr on REST endpoints, 30 req/min on /search/*. Inspect \`
115199
115709
  `[connector-request] github/${connection2.name}: ${method} ${path6}`
115200
115710
  );
115201
115711
  try {
115202
- const token = parameters78.personalAccessToken.getValue(connection2);
115203
- const baseUrl = resolveBaseUrl(parameters78.baseUrl.tryGetValue(connection2));
115712
+ const token = parameters79.personalAccessToken.getValue(connection2);
115713
+ const baseUrl = resolveBaseUrl(parameters79.baseUrl.tryGetValue(connection2));
115204
115714
  const trimmedPath = path6.trim().replace(/^\/+/, "/");
115205
115715
  const url = `${baseUrl}${trimmedPath.startsWith("/") ? "" : "/"}${trimmedPath}`;
115206
115716
  const controller = new AbortController();
@@ -115240,14 +115750,14 @@ Rate limits: 5,000 req/hr on REST endpoints, 30 req/min on /search/*. Inspect \`
115240
115750
  });
115241
115751
 
115242
115752
  // ../connectors/src/connectors/github/index.ts
115243
- var tools78 = { request: requestTool55 };
115753
+ var tools79 = { request: requestTool55 };
115244
115754
  var githubConnector = new ConnectorPlugin({
115245
115755
  slug: "github",
115246
115756
  authType: AUTH_TYPES.PAT,
115247
115757
  name: "GitHub",
115248
115758
  description: "Connect to GitHub for repository, issue, pull request, commit, and search data via Personal Access Token (Classic or fine-grained).",
115249
115759
  iconUrl: "https://images.ctfassets.net/9ncizv60xc5y/2flOAufkhDrLKuOQqEVS3/1f9dcf145680ef77aef149709263e2d4/github-icon.svg",
115250
- parameters: parameters78,
115760
+ parameters: parameters79,
115251
115761
  releaseFlag: { dev1: true, dev2: true, prod: true },
115252
115762
  categories: ["productivity"],
115253
115763
  onboarding: githubOnboarding,
@@ -115467,7 +115977,7 @@ export default async function handler(c: Context) {
115467
115977
  **\u30AF\u30A9\u30FC\u30BF**
115468
115978
  - GET \`/rate_limit\` \u2014 REST / GraphQL / search \u306E\u6B8B\u30EC\u30FC\u30C8\u78BA\u8A8D`
115469
115979
  },
115470
- tools: tools78
115980
+ tools: tools79
115471
115981
  });
115472
115982
 
115473
115983
  // ../connectors/src/connectors/registry.ts
@@ -115545,6 +116055,7 @@ var plugins = {
115545
116055
  clickup: clickupConnector,
115546
116056
  sqlserver: sqlserverConnector,
115547
116057
  azureSql: azureSqlConnector,
116058
+ cosmosdb: cosmosdbConnector,
115548
116059
  oracle: oracleConnector,
115549
116060
  freshservice: freshserviceConnector,
115550
116061
  freshdesk: freshdeskConnector,
@@ -115760,62 +116271,62 @@ function resolveParams2(entry, connectionId, plugin) {
115760
116271
  var { getQuery, loadConnections, reloadEnvFile, watchConnectionsFile } = createConnectorRegistry();
115761
116272
 
115762
116273
  // src/types/server-logic.ts
115763
- import { z as z95 } from "zod";
115764
- var parameterMetaSchema = z95.object({
115765
- name: z95.string(),
115766
- type: z95.enum(["string", "number", "boolean"]),
115767
- description: z95.string(),
115768
- required: z95.boolean().optional(),
115769
- default: z95.union([z95.string(), z95.number(), z95.boolean()]).optional()
115770
- });
115771
- var serverLogicCacheConfigSchema = z95.object({
115772
- ttl: z95.number(),
115773
- staleWhileRevalidate: z95.boolean().optional()
115774
- });
115775
- var serverLogicSchemaObjectSchema = z95.lazy(
115776
- () => z95.object({
115777
- type: z95.enum(["string", "number", "integer", "boolean", "object", "array", "null"]).optional(),
115778
- format: z95.string().optional(),
115779
- description: z95.string().optional(),
115780
- nullable: z95.boolean().optional(),
115781
- enum: z95.array(z95.union([z95.string(), z95.number(), z95.boolean(), z95.null()])).optional(),
116274
+ import { z as z97 } from "zod";
116275
+ var parameterMetaSchema = z97.object({
116276
+ name: z97.string(),
116277
+ type: z97.enum(["string", "number", "boolean"]),
116278
+ description: z97.string(),
116279
+ required: z97.boolean().optional(),
116280
+ default: z97.union([z97.string(), z97.number(), z97.boolean()]).optional()
116281
+ });
116282
+ var serverLogicCacheConfigSchema = z97.object({
116283
+ ttl: z97.number(),
116284
+ staleWhileRevalidate: z97.boolean().optional()
116285
+ });
116286
+ var serverLogicSchemaObjectSchema = z97.lazy(
116287
+ () => z97.object({
116288
+ type: z97.enum(["string", "number", "integer", "boolean", "object", "array", "null"]).optional(),
116289
+ format: z97.string().optional(),
116290
+ description: z97.string().optional(),
116291
+ nullable: z97.boolean().optional(),
116292
+ enum: z97.array(z97.union([z97.string(), z97.number(), z97.boolean(), z97.null()])).optional(),
115782
116293
  items: serverLogicSchemaObjectSchema.optional(),
115783
- properties: z95.record(z95.string(), serverLogicSchemaObjectSchema).optional(),
115784
- required: z95.array(z95.string()).optional(),
115785
- additionalProperties: z95.union([z95.boolean(), serverLogicSchemaObjectSchema]).optional(),
115786
- minimum: z95.number().optional(),
115787
- maximum: z95.number().optional(),
115788
- minLength: z95.number().optional(),
115789
- maxLength: z95.number().optional(),
115790
- pattern: z95.string().optional()
116294
+ properties: z97.record(z97.string(), serverLogicSchemaObjectSchema).optional(),
116295
+ required: z97.array(z97.string()).optional(),
116296
+ additionalProperties: z97.union([z97.boolean(), serverLogicSchemaObjectSchema]).optional(),
116297
+ minimum: z97.number().optional(),
116298
+ maximum: z97.number().optional(),
116299
+ minLength: z97.number().optional(),
116300
+ maxLength: z97.number().optional(),
116301
+ pattern: z97.string().optional()
115791
116302
  })
115792
116303
  );
115793
- var serverLogicMediaTypeSchema = z95.object({
116304
+ var serverLogicMediaTypeSchema = z97.object({
115794
116305
  schema: serverLogicSchemaObjectSchema.optional(),
115795
- example: z95.unknown().optional()
116306
+ example: z97.unknown().optional()
115796
116307
  });
115797
- var serverLogicResponseSchema = z95.object({
115798
- description: z95.string().optional(),
115799
- content: z95.record(z95.string(), serverLogicMediaTypeSchema).optional()
116308
+ var serverLogicResponseSchema = z97.object({
116309
+ description: z97.string().optional(),
116310
+ content: z97.record(z97.string(), serverLogicMediaTypeSchema).optional()
115800
116311
  });
115801
116312
  var jsonBaseFields = {
115802
- description: z95.string(),
115803
- parameters: z95.array(parameterMetaSchema).optional(),
116313
+ description: z97.string(),
116314
+ parameters: z97.array(parameterMetaSchema).optional(),
115804
116315
  response: serverLogicResponseSchema.optional(),
115805
116316
  cache: serverLogicCacheConfigSchema.optional()
115806
116317
  };
115807
- var jsonSqlServerLogicSchema = z95.object({
116318
+ var jsonSqlServerLogicSchema = z97.object({
115808
116319
  ...jsonBaseFields,
115809
- type: z95.literal("sql").optional(),
115810
- query: z95.string(),
115811
- connectionId: z95.string()
116320
+ type: z97.literal("sql").optional(),
116321
+ query: z97.string(),
116322
+ connectionId: z97.string()
115812
116323
  });
115813
- var jsonTypeScriptServerLogicSchema = z95.object({
116324
+ var jsonTypeScriptServerLogicSchema = z97.object({
115814
116325
  ...jsonBaseFields,
115815
- type: z95.literal("typescript"),
115816
- handlerPath: z95.string()
116326
+ type: z97.literal("typescript"),
116327
+ handlerPath: z97.string()
115817
116328
  });
115818
- var anyJsonServerLogicSchema = z95.union([
116329
+ var anyJsonServerLogicSchema = z97.union([
115819
116330
  jsonTypeScriptServerLogicSchema,
115820
116331
  jsonSqlServerLogicSchema
115821
116332
  ]);