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

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.
@@ -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);
@@ -89644,6 +89644,12 @@ var NOOP_TUNNEL = (connectionUrl) => ({
89644
89644
  close: async () => {
89645
89645
  }
89646
89646
  });
89647
+ var NOOP_TUNNEL_HOSTPORT = (host, port) => ({
89648
+ host,
89649
+ port,
89650
+ close: async () => {
89651
+ }
89652
+ });
89647
89653
  function connectionParamsToRecord(connection) {
89648
89654
  const out = {};
89649
89655
  for (const p2 of connection.parameters) {
@@ -89651,9 +89657,9 @@ function connectionParamsToRecord(connection) {
89651
89657
  }
89652
89658
  return out;
89653
89659
  }
89654
- async function maybeOpenSshTunnel(params, connectionUrl, defaultDbPort) {
89660
+ async function maybeOpenSshTunnelHostPort(params, dbHost, dbPort) {
89655
89661
  const sshHost = params[sshTunnelParameters.sshHost.slug];
89656
- if (!sshHost) return NOOP_TUNNEL(connectionUrl);
89662
+ if (!sshHost) return NOOP_TUNNEL_HOSTPORT(dbHost, dbPort);
89657
89663
  const sshUsername = params[sshTunnelParameters.sshUsername.slug];
89658
89664
  const sshPrivateKeyBase64 = params[sshTunnelParameters.sshPrivateKeyBase64.slug];
89659
89665
  if (!sshUsername || !sshPrivateKeyBase64) {
@@ -89663,9 +89669,6 @@ async function maybeOpenSshTunnel(params, connectionUrl, defaultDbPort) {
89663
89669
  }
89664
89670
  const sshPort = Number(params[sshTunnelParameters.sshPort.slug] || "22") || 22;
89665
89671
  const sshPassphrase = params[sshTunnelParameters.sshPassphrase.slug];
89666
- const url = new URL(connectionUrl);
89667
- const dbHost = url.hostname;
89668
- const dbPort = url.port ? Number(url.port) : defaultDbPort;
89669
89672
  const [{ Client: Client2 }, net] = await Promise.all([
89670
89673
  Promise.resolve().then(() => __toESM(require_lib3(), 1)),
89671
89674
  import("net")
@@ -89708,16 +89711,29 @@ async function maybeOpenSshTunnel(params, connectionUrl, defaultDbPort) {
89708
89711
  sshClient.end();
89709
89712
  throw new Error("Failed to allocate local port for SSH tunnel.");
89710
89713
  }
89711
- url.hostname = "127.0.0.1";
89712
- url.port = String(address.port);
89713
89714
  return {
89714
- connectionUrl: url.toString(),
89715
+ host: "127.0.0.1",
89716
+ port: address.port,
89715
89717
  close: async () => {
89716
89718
  await new Promise((resolve) => server.close(() => resolve()));
89717
89719
  sshClient.end();
89718
89720
  }
89719
89721
  };
89720
89722
  }
89723
+ async function maybeOpenSshTunnel(params, connectionUrl, defaultDbPort) {
89724
+ const sshHost = params[sshTunnelParameters.sshHost.slug];
89725
+ if (!sshHost) return NOOP_TUNNEL(connectionUrl);
89726
+ const url = new URL(connectionUrl);
89727
+ const dbHost = url.hostname;
89728
+ const dbPort = url.port ? Number(url.port) : defaultDbPort;
89729
+ const tunnel = await maybeOpenSshTunnelHostPort(params, dbHost, dbPort);
89730
+ url.hostname = tunnel.host;
89731
+ url.port = String(tunnel.port);
89732
+ return {
89733
+ connectionUrl: url.toString(),
89734
+ close: tunnel.close
89735
+ };
89736
+ }
89721
89737
 
89722
89738
  // ../connectors/src/connectors/postgresql/setup.ts
89723
89739
  var postgresqlOnboarding = new ConnectorOnboarding({
@@ -91859,9 +91875,16 @@ A Filter is an Expression. Leaves are \`Dimensions\`, \`Tags\`, or \`CostCategor
91859
91875
 
91860
91876
  ### Business Logic
91861
91877
 
91862
- 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.
91878
+ 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.
91863
91879
 
91864
- #### Example
91880
+ #### Server logic slug naming
91881
+
91882
+ 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.
91883
+
91884
+ - OK: \`monthly-cost-trend\`, \`cost_by_service\`, \`top10-services\`
91885
+ - NG: \`monthlyCostTrend\`, \`MonthlyCostTrend\`, \`monthly cost trend\`
91886
+
91887
+ #### Example (slug: \`monthly-cost-trend\`)
91865
91888
 
91866
91889
  \`\`\`ts
91867
91890
  import type { Context } from "hono";
@@ -91937,9 +91960,16 @@ Filter \u306F Expression \u3067\u3059\u3002\u30EA\u30FC\u30D5\u306F \`Dimensions
91937
91960
 
91938
91961
  ### Business Logic
91939
91962
 
91940
- \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
91963
+ \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
91941
91964
 
91942
- #### Example
91965
+ #### \u30B5\u30FC\u30D0\u30FC\u30ED\u30B8\u30C3\u30AF\u306E slug \u547D\u540D\u898F\u5247
91966
+
91967
+ \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
91968
+
91969
+ - OK: \`monthly-cost-trend\`\u3001\`cost_by_service\`\u3001\`top10-services\`
91970
+ - NG: \`monthlyCostTrend\`\u3001\`MonthlyCostTrend\`\u3001\`monthly cost trend\`
91971
+
91972
+ #### Example\uFF08slug: \`monthly-cost-trend\`\uFF09
91943
91973
 
91944
91974
  \`\`\`ts
91945
91975
  import type { Context } from "hono";
@@ -92848,30 +92878,6 @@ export default async function handler(c: Context) {
92848
92878
 
92849
92879
  // ../connectors/src/connectors/google-ads/tools/list-customers.ts
92850
92880
  import { z as z18 } from "zod";
92851
-
92852
- // ../connectors/src/connectors/google-ads/parameters.ts
92853
- var parameters12 = {
92854
- customerId: new ParameterDefinition({
92855
- slug: "customer-id",
92856
- name: "Google Ads Customer ID",
92857
- description: "The Google Ads customer ID (e.g., 123-456-7890 or 1234567890). Can be found in the top-right corner of your Google Ads account.",
92858
- envVarBaseKey: "GOOGLE_ADS_CUSTOMER_ID",
92859
- type: "text",
92860
- secret: false,
92861
- required: false
92862
- }),
92863
- developerToken: new ParameterDefinition({
92864
- slug: "developer-token",
92865
- name: "Google Ads Developer Token",
92866
- description: "The developer token for accessing the Google Ads API. Required for all API requests.",
92867
- envVarBaseKey: "GOOGLE_ADS_DEVELOPER_TOKEN",
92868
- type: "text",
92869
- secret: true,
92870
- required: true
92871
- })
92872
- };
92873
-
92874
- // ../connectors/src/connectors/google-ads/tools/list-customers.ts
92875
92881
  var BASE_URL2 = "https://googleads.googleapis.com/v18/";
92876
92882
  var REQUEST_TIMEOUT_MS8 = 6e4;
92877
92883
  var cachedToken4 = null;
@@ -92943,7 +92949,6 @@ var listCustomersTool = new ConnectorTool({
92943
92949
  `[connector-request] google-ads/${connection.name}: listCustomers`
92944
92950
  );
92945
92951
  try {
92946
- const developerToken = parameters12.developerToken.getValue(connection);
92947
92952
  const token = await getProxyToken4(config.oauthProxy);
92948
92953
  const proxyUrl = `https://${config.oauthProxy.sandboxId}.${config.oauthProxy.previewBaseDomain}/_sqcore/connections/${connectionId}/request`;
92949
92954
  const controller = new AbortController();
@@ -92957,10 +92962,7 @@ var listCustomersTool = new ConnectorTool({
92957
92962
  },
92958
92963
  body: JSON.stringify({
92959
92964
  url: `${BASE_URL2}customers:listAccessibleCustomers`,
92960
- method: "GET",
92961
- headers: {
92962
- "developer-token": developerToken
92963
- }
92965
+ method: "GET"
92964
92966
  }),
92965
92967
  signal: controller.signal
92966
92968
  });
@@ -92986,7 +92988,6 @@ var listCustomersTool = new ConnectorTool({
92986
92988
  method: "POST",
92987
92989
  headers: {
92988
92990
  "Content-Type": "application/json",
92989
- "developer-token": developerToken,
92990
92991
  "login-customer-id": cid
92991
92992
  },
92992
92993
  body: JSON.stringify({
@@ -93032,30 +93033,24 @@ var googleAdsOnboarding = new ConnectorOnboarding({
93032
93033
  connectionSetupInstructions: {
93033
93034
  ja: `\u4EE5\u4E0B\u306E\u624B\u9806\u3067Google Ads (OAuth) \u30B3\u30CD\u30AF\u30B7\u30E7\u30F3\u306E\u30BB\u30C3\u30C8\u30A2\u30C3\u30D7\u3092\u884C\u3063\u3066\u304F\u3060\u3055\u3044\u3002
93034
93035
 
93035
- 1. \u30E6\u30FC\u30B6\u30FC\u306B\u300CGoogle Ads API \u306E Developer Token \u3092\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044\uFF08Google Ads \u7BA1\u7406\u753B\u9762 > \u30C4\u30FC\u30EB\u3068\u8A2D\u5B9A > API \u30BB\u30F3\u30BF\u30FC\u3067\u53D6\u5F97\u3067\u304D\u307E\u3059\uFF09\u300D\u3068\u4F1D\u3048\u308B
93036
+ 1. \`${listCustomersToolName}\` \u3092\u547C\u3073\u51FA\u3057\u3066\u3001OAuth\u3067\u30A2\u30AF\u30BB\u30B9\u53EF\u80FD\u306AGoogle Ads\u30AB\u30B9\u30BF\u30DE\u30FC\u30A2\u30AB\u30A6\u30F3\u30C8\u4E00\u89A7\u3092\u53D6\u5F97\u3059\u308B
93036
93037
  2. \`updateConnectionParameters\` \u3092\u547C\u3073\u51FA\u3059:
93037
- - \`parameterSlug\`: \`"developer-token"\`
93038
- - \`value\`: \u30E6\u30FC\u30B6\u30FC\u304C\u63D0\u4F9B\u3057\u305F Developer Token
93039
- 3. \`${listCustomersToolName}\` \u3092\u547C\u3073\u51FA\u3057\u3066\u3001OAuth\u3067\u30A2\u30AF\u30BB\u30B9\u53EF\u80FD\u306AGoogle Ads\u30AB\u30B9\u30BF\u30DE\u30FC\u30A2\u30AB\u30A6\u30F3\u30C8\u4E00\u89A7\u3092\u53D6\u5F97\u3059\u308B
93040
- 4. \`updateConnectionParameters\` \u3092\u547C\u3073\u51FA\u3059:
93041
93038
  - \`parameterSlug\`: \`"customer-id"\`
93042
93039
  - \`options\`: \u30AB\u30B9\u30BF\u30DE\u30FC\u4E00\u89A7\u3002\u5404 option \u306E \`label\` \u306F \`\u30A2\u30AB\u30A6\u30F3\u30C8\u540D (id: \u30AB\u30B9\u30BF\u30DE\u30FCID)\` \u306E\u5F62\u5F0F\u3001\`value\` \u306F\u30AB\u30B9\u30BF\u30DE\u30FCID
93043
- 5. \u30E6\u30FC\u30B6\u30FC\u304C\u9078\u629E\u3057\u305F\u30AB\u30B9\u30BF\u30DE\u30FC\u306E \`label\` \u304C\u30E1\u30C3\u30BB\u30FC\u30B8\u3068\u3057\u3066\u5C4A\u304F\u306E\u3067\u3001\u6B21\u306E\u30B9\u30C6\u30C3\u30D7\u306B\u9032\u3080
93040
+ - \u30AB\u30B9\u30BF\u30DE\u30FC\u304C **0\u4EF6** \u306E\u5834\u5408\u306F\u30BB\u30C3\u30C8\u30A2\u30C3\u30D7\u3092\u4E2D\u65AD\u3057\u3001\u30E6\u30FC\u30B6\u30FC\u306B\u30A2\u30AF\u30BB\u30B9\u53EF\u80FD\u306A\u30A2\u30AB\u30A6\u30F3\u30C8\u304C\u306A\u3044\u65E8\u3092\u4F1D\u3048\u308B
93041
+ 3. \u30E6\u30FC\u30B6\u30FC\u304C\u9078\u629E\u3057\u305F\u30AB\u30B9\u30BF\u30DE\u30FC\u306E \`label\` \u304C\u30E1\u30C3\u30BB\u30FC\u30B8\u3068\u3057\u3066\u5C4A\u304F\u306E\u3067\u3001\u6B21\u306E\u30B9\u30C6\u30C3\u30D7\u306B\u9032\u3080
93044
93042
 
93045
93043
  #### \u5236\u7D04
93046
93044
  - **\u30BB\u30C3\u30C8\u30A2\u30C3\u30D7\u4E2D\u306B\u30EC\u30DD\u30FC\u30C8\u30C7\u30FC\u30BF\u3092\u53D6\u5F97\u3057\u306A\u3044\u3053\u3068**\u3002\u5B9F\u884C\u3057\u3066\u3088\u3044\u306E\u306F\u4E0A\u8A18\u624B\u9806\u3067\u6307\u5B9A\u3055\u308C\u305F\u30E1\u30BF\u30C7\u30FC\u30BF\u53D6\u5F97\u306E\u307F
93047
93045
  - \u30C4\u30FC\u30EB\u9593\u306F1\u6587\u3060\u3051\u66F8\u3044\u3066\u5373\u6B21\u306E\u30C4\u30FC\u30EB\u547C\u3073\u51FA\u3057\u3002\u4E0D\u8981\u306A\u8AAC\u660E\u306F\u7701\u7565\u3057\u3001\u52B9\u7387\u7684\u306B\u9032\u3081\u308B`,
93048
93046
  en: `Follow these steps to set up the Google Ads (OAuth) connection.
93049
93047
 
93050
- 1. Ask the user to provide their Google Ads API Developer Token (available in Google Ads UI > Tools & Settings > API Center)
93048
+ 1. Call \`${listCustomersToolName}\` to get the list of Google Ads customer accounts accessible with the OAuth credentials
93051
93049
  2. Call \`updateConnectionParameters\`:
93052
- - \`parameterSlug\`: \`"developer-token"\`
93053
- - \`value\`: The Developer Token provided by the user
93054
- 3. Call \`${listCustomersToolName}\` to get the list of Google Ads customer accounts accessible with the OAuth credentials
93055
- 4. Call \`updateConnectionParameters\`:
93056
93050
  - \`parameterSlug\`: \`"customer-id"\`
93057
93051
  - \`options\`: The customer list. Each option's \`label\` should be \`Account Name (id: customerId)\`, \`value\` should be the customer ID
93058
- 5. The \`label\` of the user's selected customer will arrive as a message. Proceed to the next step
93052
+ - If **0 customers** are returned, abort setup and inform the user that no accessible accounts are available
93053
+ 3. The \`label\` of the user's selected customer will arrive as a message. Proceed to the next step
93059
93054
 
93060
93055
  #### Constraints
93061
93056
  - **Do NOT fetch report data during setup**. Only the metadata requests specified in the steps above are allowed
@@ -93069,6 +93064,19 @@ var googleAdsOnboarding = new ConnectorOnboarding({
93069
93064
  }
93070
93065
  });
93071
93066
 
93067
+ // ../connectors/src/connectors/google-ads/parameters.ts
93068
+ var parameters12 = {
93069
+ customerId: new ParameterDefinition({
93070
+ slug: "customer-id",
93071
+ name: "Google Ads Customer ID",
93072
+ description: "The Google Ads customer ID (e.g., 123-456-7890 or 1234567890). Can be found in the top-right corner of your Google Ads account.",
93073
+ envVarBaseKey: "GOOGLE_ADS_CUSTOMER_ID",
93074
+ type: "text",
93075
+ secret: false,
93076
+ required: false
93077
+ })
93078
+ };
93079
+
93072
93080
  // ../connectors/src/connectors/google-ads/tools/request.ts
93073
93081
  import { z as z19 } from "zod";
93074
93082
  var BASE_URL3 = "https://googleads.googleapis.com/v18/";
@@ -93154,7 +93162,6 @@ Authentication is handled automatically via OAuth proxy.
93154
93162
  const controller = new AbortController();
93155
93163
  const timeout = setTimeout(() => controller.abort(), REQUEST_TIMEOUT_MS9);
93156
93164
  try {
93157
- const developerToken = parameters12.developerToken.getValue(connection);
93158
93165
  const response = await fetch(proxyUrl, {
93159
93166
  method: "POST",
93160
93167
  headers: {
@@ -93166,7 +93173,6 @@ Authentication is handled automatically via OAuth proxy.
93166
93173
  method,
93167
93174
  headers: {
93168
93175
  "Content-Type": "application/json",
93169
- "developer-token": developerToken,
93170
93176
  ...customerId ? { "login-customer-id": customerId } : {}
93171
93177
  },
93172
93178
  ...method === "POST" && body ? { body: JSON.stringify(body) } : {}
@@ -93347,20 +93353,12 @@ const customerIds = await ads.listAccessibleCustomers();
93347
93353
  if (!customerId) {
93348
93354
  return { success: true };
93349
93355
  }
93350
- const developerToken = params[parameters12.developerToken.slug];
93351
- if (!developerToken) {
93352
- return {
93353
- success: false,
93354
- error: "Developer token is required"
93355
- };
93356
- }
93357
93356
  const url = `https://googleads.googleapis.com/v18/customers/${customerId}/googleAds:searchStream`;
93358
93357
  try {
93359
93358
  const res = await proxyFetch(url, {
93360
93359
  method: "POST",
93361
93360
  headers: {
93362
93361
  "Content-Type": "application/json",
93363
- "developer-token": developerToken,
93364
93362
  "login-customer-id": customerId
93365
93363
  },
93366
93364
  body: JSON.stringify({
@@ -111378,17 +111376,27 @@ async function importMssql() {
111378
111376
  }
111379
111377
  async function runMssqlQuery(parsed, sql, options = {}) {
111380
111378
  const sqlMod = await importMssql();
111381
- const config = toMssqlConfig(parsed, {
111382
- encrypt: options.forceEncrypt
111383
- });
111384
- const pool = new sqlMod.ConnectionPool(config);
111385
- await pool.connect();
111379
+ const tunnel = options.tunnelParams ? await maybeOpenSshTunnelHostPort(
111380
+ options.tunnelParams,
111381
+ parsed.server,
111382
+ parsed.port
111383
+ ) : null;
111386
111384
  try {
111387
- const result = await pool.request().query(sql);
111388
- const recordset = result.recordset ?? [];
111389
- return { rows: recordset };
111385
+ const tunneled = tunnel ? { ...parsed, server: tunnel.host, port: tunnel.port } : parsed;
111386
+ const config = toMssqlConfig(tunneled, {
111387
+ encrypt: options.forceEncrypt
111388
+ });
111389
+ const pool = new sqlMod.ConnectionPool(config);
111390
+ await pool.connect();
111391
+ try {
111392
+ const result = await pool.request().query(sql);
111393
+ const recordset = result.recordset ?? [];
111394
+ return { rows: recordset };
111395
+ } finally {
111396
+ await pool.close();
111397
+ }
111390
111398
  } finally {
111391
- await pool.close();
111399
+ await tunnel?.close();
111392
111400
  }
111393
111401
  }
111394
111402
  async function checkMssqlConnection(url, credentials, options = {}) {
@@ -111476,35 +111484,69 @@ function parseOracleJdbcUrl(jdbcUrl, options = {}) {
111476
111484
  function redactOracleUrl(jdbcUrl) {
111477
111485
  return jdbcUrl.replace(/(:\/\/)([^@/]+)@/, "$1***@").replace(/(thin:)([^@]+)@/i, "$1***@");
111478
111486
  }
111487
+ function parseOracleConnectStringHostPort(connectString) {
111488
+ const m4 = /^([^:/]+):(\d+)(.*)$/.exec(connectString);
111489
+ if (!m4) return null;
111490
+ return { host: m4[1], port: Number(m4[2]), trailing: m4[3] };
111491
+ }
111492
+ function rewriteOracleConnectStringHostPort(connectString, host, port) {
111493
+ const parts = parseOracleConnectStringHostPort(connectString);
111494
+ if (!parts) return connectString;
111495
+ return `${host}:${port}${parts.trailing}`;
111496
+ }
111479
111497
 
111480
111498
  // ../connectors/src/lib/oracle-runner.ts
111481
111499
  async function importOracleDb() {
111482
111500
  const mod = await import("oracledb");
111483
111501
  return mod.default ?? mod;
111484
111502
  }
111485
- async function runOracleQuery(parsed, sql) {
111503
+ async function runOracleQuery(parsed, sql, options = {}) {
111486
111504
  const oracledb = await importOracleDb();
111487
- const connection = await oracledb.getConnection({
111488
- user: parsed.user,
111489
- password: parsed.password,
111490
- connectString: parsed.connectString
111491
- });
111505
+ let tunnel = null;
111506
+ if (options.tunnelParams) {
111507
+ const hostPort = parseOracleConnectStringHostPort(parsed.connectString);
111508
+ if (hostPort) {
111509
+ tunnel = await maybeOpenSshTunnelHostPort(
111510
+ options.tunnelParams,
111511
+ hostPort.host,
111512
+ hostPort.port
111513
+ );
111514
+ }
111515
+ }
111492
111516
  try {
111493
- const result = await connection.execute(sql, [], {
111494
- outFormat: oracledb.OUT_FORMAT_OBJECT,
111495
- // Bound by the connector's own row cap, but keep the driver from
111496
- // streaming arbitrarily large result sets.
111497
- maxRows: 5e3
111517
+ const connectString = tunnel ? rewriteOracleConnectStringHostPort(
111518
+ parsed.connectString,
111519
+ tunnel.host,
111520
+ tunnel.port
111521
+ ) : parsed.connectString;
111522
+ const connection = await oracledb.getConnection({
111523
+ user: parsed.user,
111524
+ password: parsed.password,
111525
+ connectString
111498
111526
  });
111499
- return { rows: result.rows ?? [] };
111500
- } finally {
111501
111527
  try {
111502
- await connection.close();
111503
- } catch {
111528
+ const result = await connection.execute(
111529
+ sql,
111530
+ [],
111531
+ {
111532
+ outFormat: oracledb.OUT_FORMAT_OBJECT,
111533
+ // Bound by the connector's own row cap, but keep the driver from
111534
+ // streaming arbitrarily large result sets.
111535
+ maxRows: 5e3
111536
+ }
111537
+ );
111538
+ return { rows: result.rows ?? [] };
111539
+ } finally {
111540
+ try {
111541
+ await connection.close();
111542
+ } catch {
111543
+ }
111504
111544
  }
111545
+ } finally {
111546
+ await tunnel?.close();
111505
111547
  }
111506
111548
  }
111507
- async function checkOracleConnection(url, credentials) {
111549
+ async function checkOracleConnection(url, credentials, options = {}) {
111508
111550
  let parsed;
111509
111551
  try {
111510
111552
  parsed = parseOracleJdbcUrl(url, credentials);
@@ -111515,7 +111557,7 @@ async function checkOracleConnection(url, credentials) {
111515
111557
  };
111516
111558
  }
111517
111559
  try {
111518
- await runOracleQuery(parsed, "SELECT 1 FROM DUAL");
111560
+ await runOracleQuery(parsed, "SELECT 1 FROM DUAL", options);
111519
111561
  return { success: true };
111520
111562
  } catch (err) {
111521
111563
  let msg = err instanceof Error ? err.message : String(err);
@@ -111725,12 +111767,13 @@ Always bound results: LIMIT for PG/MySQL/Redshift, TOP for SQL Server, FETCH FIR
111725
111767
  };
111726
111768
  }
111727
111769
  try {
111770
+ const tunnelParams = connectionParamsToRecord(connection);
111728
111771
  if (parsed.driver === "sqlserver") {
111729
111772
  const mssqlParsed = parseSqlServerJdbcUrl(parsed.originalUrl, {
111730
111773
  username,
111731
111774
  password
111732
111775
  });
111733
- const result = await runMssqlQuery(mssqlParsed, sql);
111776
+ const result = await runMssqlQuery(mssqlParsed, sql, { tunnelParams });
111734
111777
  const rows = result.rows;
111735
111778
  return {
111736
111779
  success: true,
@@ -111745,7 +111788,9 @@ Always bound results: LIMIT for PG/MySQL/Redshift, TOP for SQL Server, FETCH FIR
111745
111788
  password
111746
111789
  });
111747
111790
  const cleanSql = sql.replace(/;\s*$/, "");
111748
- const result = await runOracleQuery(oracleParsed, cleanSql);
111791
+ const result = await runOracleQuery(oracleParsed, cleanSql, {
111792
+ tunnelParams
111793
+ });
111749
111794
  const rows = result.rows;
111750
111795
  return {
111751
111796
  success: true,
@@ -111757,7 +111802,7 @@ Always bound results: LIMIT for PG/MySQL/Redshift, TOP for SQL Server, FETCH FIR
111757
111802
  let tunnel;
111758
111803
  try {
111759
111804
  tunnel = await maybeOpenSshTunnel(
111760
- connectionParamsToRecord(connection),
111805
+ tunnelParams,
111761
111806
  parsed.nativeUrl,
111762
111807
  parsed.defaultPort
111763
111808
  );
@@ -111931,10 +111976,18 @@ JDBC URL \u306E\u30D7\u30EC\u30D5\u30A3\u30C3\u30AF\u30B9\u306B\u3088\u308A\u65B
111931
111976
  };
111932
111977
  }
111933
111978
  if (parsed.driver === "sqlserver") {
111934
- return checkMssqlConnection(parsed.originalUrl, { username, password });
111979
+ return checkMssqlConnection(
111980
+ parsed.originalUrl,
111981
+ { username, password },
111982
+ { tunnelParams: params }
111983
+ );
111935
111984
  }
111936
111985
  if (parsed.driver === "oracle") {
111937
- return checkOracleConnection(parsed.originalUrl, { username, password });
111986
+ return checkOracleConnection(
111987
+ parsed.originalUrl,
111988
+ { username, password },
111989
+ { tunnelParams: params }
111990
+ );
111938
111991
  }
111939
111992
  const tunnel = await maybeOpenSshTunnel(
111940
111993
  params,
@@ -111991,10 +112044,12 @@ JDBC URL \u306E\u30D7\u30EC\u30D5\u30A3\u30C3\u30AF\u30B9\u306B\u3088\u308A\u65B
111991
112044
  });
111992
112045
  const sample = unwrapSampleLimit(sql);
111993
112046
  if (sample) {
111994
- const result = await runMssqlQuery(mssqlParsed, sample.inner);
112047
+ const result = await runMssqlQuery(mssqlParsed, sample.inner, {
112048
+ tunnelParams: params
112049
+ });
111995
112050
  return { rows: result.rows.slice(0, sample.limit) };
111996
112051
  }
111997
- return runMssqlQuery(mssqlParsed, sql);
112052
+ return runMssqlQuery(mssqlParsed, sql, { tunnelParams: params });
111998
112053
  }
111999
112054
  if (parsed.driver === "oracle") {
112000
112055
  const oracleParsed = parseOracleJdbcUrl(parsed.originalUrl, {
@@ -112004,11 +112059,13 @@ JDBC URL \u306E\u30D7\u30EC\u30D5\u30A3\u30C3\u30AF\u30B9\u306B\u3088\u308A\u65B
112004
112059
  const sample = unwrapSampleLimit(sql);
112005
112060
  if (sample) {
112006
112061
  const inner = sample.inner.replace(/;\s*$/, "");
112007
- const result = await runOracleQuery(oracleParsed, inner);
112062
+ const result = await runOracleQuery(oracleParsed, inner, {
112063
+ tunnelParams: params
112064
+ });
112008
112065
  return { rows: result.rows.slice(0, sample.limit) };
112009
112066
  }
112010
112067
  const cleanSql = sql.replace(/;\s*$/, "");
112011
- return runOracleQuery(oracleParsed, cleanSql);
112068
+ return runOracleQuery(oracleParsed, cleanSql, { tunnelParams: params });
112012
112069
  }
112013
112070
  const tunnel = await maybeOpenSshTunnel(
112014
112071
  params,
@@ -112240,16 +112297,18 @@ var semrushOnboarding = new ConnectorOnboarding({
112240
112297
  - Write only 1 sentence between tool calls, then immediately call the next tool. Skip unnecessary explanations and proceed efficiently`
112241
112298
  },
112242
112299
  dataOverviewInstructions: {
112243
- en: `1. Call ${requestToolName12} with path "/" and queryParams \`{ "type": "domain_overview", "domain": "<example.com>", "database": "us" }\` to inspect the domain overview report (CSV)
112300
+ 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)
112244
112301
  2. Call ${requestToolName12} with path "/" and queryParams \`{ "type": "domain_organic", "domain": "<example.com>", "database": "us", "display_limit": "5" }\` to sample organic keywords
112245
112302
  3. Call ${requestToolName12} with path "/" and queryParams \`{ "type": "phrase_this", "phrase": "<keyword>", "database": "us" }\` to inspect a keyword overview
112246
- 4. Explore other report types (backlinks_overview, domain_adwords, phrase_related) and the Trends API ("/analytics/v1/...") with responseFormat="json" as needed
112247
- 5. Remember: the Standard Analytics API returns semicolon-separated CSV with the first row as the header`,
112248
- 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
112303
+ 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"\`)
112304
+ 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
112305
+ 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`,
112306
+ 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
112249
112307
  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
112250
112308
  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
112251
- 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
112252
- 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`
112309
+ 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
112310
+ 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
112311
+ 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`
112253
112312
  }
112254
112313
  });
112255
112314
 
@@ -112276,10 +112335,19 @@ The business logic type for this connector is "typescript". Write handler code u
112276
112335
 
112277
112336
  SDK methods (client created via \`connection(connectionId)\`):
112278
112337
  - \`client.request(path, init?)\` \u2014 low-level authenticated fetch. Pass \`init.query\` to set query parameters; \`key\` is injected automatically
112279
- - \`client.report(type, query?)\` \u2014 call a Standard Analytics report and parse the CSV into \`{ columns, rows, raw }\`
112338
+ - \`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()\`
112339
+ - \`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
112280
112340
  - \`client.trends(path, query?)\` \u2014 call a Trends API endpoint (\`/analytics/v1/...\`) and return parsed JSON
112281
112341
  - \`client.projects(path, init?)\` \u2014 call a Projects API endpoint (\`/management/v1/...\`) and return parsed JSON
112282
112342
 
112343
+ \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.
112344
+
112345
+ \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.
112346
+
112347
+ \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.
112348
+
112349
+ \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"])\`.
112350
+
112283
112351
  \`\`\`ts
112284
112352
  import type { Context } from "hono";
112285
112353
  import { connection } from "@squadbase/vite-server/connectors/semrush";
@@ -112292,9 +112360,25 @@ export default async function handler(c: Context) {
112292
112360
  database?: string;
112293
112361
  }>();
112294
112362
 
112295
- const overview = await semrush.report("domain_overview", { domain, database });
112363
+ const result = await semrush.report("domain_organic", {
112364
+ domain,
112365
+ database,
112366
+ display_limit: "100",
112367
+ });
112368
+
112369
+ // \u2705 Correct: access by column name
112370
+ const rows = result.rows.map((row) => ({
112371
+ keyword: row["Keyword"],
112372
+ position: Number(row["Position"]) || 0,
112373
+ searchVolume: Number(row["Search Volume"]) || 0,
112374
+ url: row["Url"] ?? "",
112375
+ }));
112376
+
112377
+ // \u274C Wrong: do NOT do this \u2014 row[index] is undefined because rows are objects, not arrays
112378
+ // const urlIdx = result.columns.indexOf("Url");
112379
+ // const url = (row as unknown as string[])[urlIdx];
112296
112380
 
112297
- return c.json({ columns: overview.columns, rows: overview.rows });
112381
+ return c.json({ columns: result.columns, rows });
112298
112382
  }
112299
112383
  \`\`\`
112300
112384
 
@@ -112306,8 +112390,8 @@ export default async function handler(c: Context) {
112306
112390
 
112307
112391
  Authentication: API key passed as the \`key\` query parameter on every request (handled automatically).
112308
112392
 
112309
- #### Common Standard Analytics report types
112310
- - \`domain_overview\` \u2014 domain summary (organic/paid traffic, keywords, backlinks)
112393
+ #### Common Standard Analytics report types (path \`/\`, returns CSV)
112394
+ - \`domain_ranks\` \u2014 single-row domain summary (rank, organic/paid keywords, traffic, cost). **There is no \`domain_overview\` type \u2014 use \`domain_ranks\`.**
112311
112395
  - \`domain_organic\` \u2014 organic keywords for a domain
112312
112396
  - \`domain_adwords\` \u2014 paid keywords for a domain
112313
112397
  - \`domain_organic_organic\` / \`domain_adwords_adwords\` \u2014 organic / paid competitors
@@ -112316,10 +112400,13 @@ Authentication: API key passed as the \`key\` query parameter on every request (
112316
112400
  - \`phrase_fullsearch\` \u2014 full-text keyword research
112317
112401
  - \`phrase_questions\` \u2014 question keywords
112318
112402
  - \`phrase_kdi\` \u2014 keyword difficulty index
112403
+ - \`url_organic\` / \`url_adwords\` \u2014 keywords ranking for a specific URL
112404
+
112405
+ #### Backlinks API report types (path \`/analytics/v1/\`, also returns **CSV** \u2014 not JSON)
112406
+ 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.
112319
112407
  - \`backlinks_overview\` \u2014 backlinks summary
112320
112408
  - \`backlinks\` \u2014 list of backlinks
112321
112409
  - \`backlinks_refdomains\` \u2014 referring domains
112322
- - \`url_organic\` / \`url_adwords\` \u2014 keywords ranking for a specific URL
112323
112410
 
112324
112411
  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.
112325
112412
 
@@ -112327,7 +112414,7 @@ To check remaining API units (free, does NOT consume units), call the request to
112327
112414
  - \`type\` \u2014 report type (required for the Standard API)
112328
112415
  - \`domain\` / \`phrase\` / \`url\` \u2014 entity to query
112329
112416
  - \`database\` \u2014 regional database (e.g. \`us\`, \`uk\`, \`de\`, \`fr\`, \`jp\`, \`br\`); required for most reports
112330
- - \`display_limit\` \u2014 page size (default 10000, max 100000 depending on report)
112417
+ - \`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.
112331
112418
  - \`display_offset\` \u2014 pagination offset
112332
112419
  - \`display_date\` \u2014 historical date in \`YYYYMM15\` format (always day 15)
112333
112420
  - \`export_columns\` \u2014 comma-separated columns to return (e.g. \`Ph,Po,Nq,Cp\`)
@@ -112338,6 +112425,7 @@ To check remaining API units (free, does NOT consume units), call the request to
112338
112425
  - 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
112339
112426
  - The CSV separator is \`;\` (semicolon), NOT \`,\`. Some cells may contain commas inside them.
112340
112427
  - An HTTP 200 response with a body starting with \`ERROR\` indicates an API error (auth, parameters, or quota)
112428
+ - \`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.
112341
112429
  - The Trends API requires a separate Trends subscription; calls without it will fail with an authorization error
112342
112430
  - Date strings in historical endpoints must be the 15th of the month (\`YYYYMM15\`)`,
112343
112431
  ja: `### \u30C4\u30FC\u30EB
@@ -112350,10 +112438,19 @@ To check remaining API units (free, does NOT consume units), call the request to
112350
112438
 
112351
112439
  SDK\u30E1\u30BD\u30C3\u30C9 (\`connection(connectionId)\` \u3067\u4F5C\u6210\u3057\u305F\u30AF\u30E9\u30A4\u30A2\u30F3\u30C8):
112352
112440
  - \`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
112353
- - \`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
112441
+ - \`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
112442
+ - \`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
112354
112443
  - \`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
112355
112444
  - \`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
112356
112445
 
112446
+ \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
112447
+
112448
+ \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
112449
+
112450
+ \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
112451
+
112452
+ \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
112453
+
112357
112454
  \`\`\`ts
112358
112455
  import type { Context } from "hono";
112359
112456
  import { connection } from "@squadbase/vite-server/connectors/semrush";
@@ -112366,9 +112463,25 @@ export default async function handler(c: Context) {
112366
112463
  database?: string;
112367
112464
  }>();
112368
112465
 
112369
- const overview = await semrush.report("domain_overview", { domain, database });
112466
+ const result = await semrush.report("domain_organic", {
112467
+ domain,
112468
+ database,
112469
+ display_limit: "100",
112470
+ });
112471
+
112472
+ // \u2705 \u6B63: \u30AB\u30E9\u30E0\u540D\u3067\u30A2\u30AF\u30BB\u30B9\u3059\u308B
112473
+ const rows = result.rows.map((row) => ({
112474
+ keyword: row["Keyword"],
112475
+ position: Number(row["Position"]) || 0,
112476
+ searchVolume: Number(row["Search Volume"]) || 0,
112477
+ url: row["Url"] ?? "",
112478
+ }));
112370
112479
 
112371
- return c.json({ columns: overview.columns, rows: overview.rows });
112480
+ // \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
112481
+ // const urlIdx = result.columns.indexOf("Url");
112482
+ // const url = (row as unknown as string[])[urlIdx];
112483
+
112484
+ return c.json({ columns: result.columns, rows });
112372
112485
  }
112373
112486
  \`\`\`
112374
112487
 
@@ -112380,8 +112493,8 @@ export default async function handler(c: Context) {
112380
112493
 
112381
112494
  \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
112382
112495
 
112383
- #### \u4E3B\u8981\u306A Standard Analytics \u30EC\u30DD\u30FC\u30C8\u30BF\u30A4\u30D7
112384
- - \`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
112496
+ #### \u4E3B\u8981\u306A Standard Analytics \u30EC\u30DD\u30FC\u30C8\u30BF\u30A4\u30D7\uFF08path \`/\`\u3001CSV\u3092\u8FD4\u3059\uFF09
112497
+ - \`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**
112385
112498
  - \`domain_organic\` \u2014 \u30C9\u30E1\u30A4\u30F3\u306E\u30AA\u30FC\u30AC\u30CB\u30C3\u30AF\u30AD\u30FC\u30EF\u30FC\u30C9
112386
112499
  - \`domain_adwords\` \u2014 \u30C9\u30E1\u30A4\u30F3\u306E\u6709\u6599\u30AD\u30FC\u30EF\u30FC\u30C9
112387
112500
  - \`domain_organic_organic\` / \`domain_adwords_adwords\` \u2014 \u30AA\u30FC\u30AC\u30CB\u30C3\u30AF\uFF0F\u6709\u6599\u306E\u7AF6\u5408
@@ -112390,10 +112503,13 @@ export default async function handler(c: Context) {
112390
112503
  - \`phrase_fullsearch\` \u2014 \u30D5\u30EB\u30C6\u30AD\u30B9\u30C8\u30AD\u30FC\u30EF\u30FC\u30C9\u30EA\u30B5\u30FC\u30C1
112391
112504
  - \`phrase_questions\` \u2014 \u8CEA\u554F\u5F62\u5F0F\u30AD\u30FC\u30EF\u30FC\u30C9
112392
112505
  - \`phrase_kdi\` \u2014 \u30AD\u30FC\u30EF\u30FC\u30C9\u96E3\u6613\u5EA6\uFF08KDI\uFF09
112506
+ - \`url_organic\` / \`url_adwords\` \u2014 \u7279\u5B9AURL\u3067\u30E9\u30F3\u30AF\u30A4\u30F3\u3057\u3066\u3044\u308B\u30AD\u30FC\u30EF\u30FC\u30C9
112507
+
112508
+ #### 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
112509
+ 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
112393
112510
  - \`backlinks_overview\` \u2014 \u30D0\u30C3\u30AF\u30EA\u30F3\u30AF\u6982\u8981
112394
112511
  - \`backlinks\` \u2014 \u30D0\u30C3\u30AF\u30EA\u30F3\u30AF\u4E00\u89A7
112395
112512
  - \`backlinks_refdomains\` \u2014 \u53C2\u7167\u30C9\u30E1\u30A4\u30F3
112396
- - \`url_organic\` / \`url_adwords\` \u2014 \u7279\u5B9AURL\u3067\u30E9\u30F3\u30AF\u30A4\u30F3\u3057\u3066\u3044\u308B\u30AD\u30FC\u30EF\u30FC\u30C9
112397
112513
 
112398
112514
  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
112399
112515
 
@@ -112401,7 +112517,7 @@ API \u30E6\u30CB\u30C3\u30C8\u6B8B\u91CF\u306E\u78BA\u8A8D\uFF08\u7121\u6599\u30
112401
112517
  - \`type\` \u2014 \u30EC\u30DD\u30FC\u30C8\u7A2E\u5225\uFF08Standard API \u3067\u306F\u5FC5\u9808\uFF09
112402
112518
  - \`domain\` / \`phrase\` / \`url\` \u2014 \u30AF\u30A8\u30EA\u5BFE\u8C61\u306E\u30A8\u30F3\u30C6\u30A3\u30C6\u30A3
112403
112519
  - \`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
112404
- - \`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
112520
+ - \`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
112405
112521
  - \`display_offset\` \u2014 \u30DA\u30FC\u30B8\u30CD\u30FC\u30B7\u30E7\u30F3\u30AA\u30D5\u30BB\u30C3\u30C8
112406
112522
  - \`display_date\` \u2014 \u5C65\u6B74\u306E\u65E5\u4ED8\u3002\`YYYYMM15\` \u5F62\u5F0F\uFF08\u5FC5\u305A\u6708\u306E15\u65E5\uFF09
112407
112523
  - \`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
@@ -112412,6 +112528,7 @@ API \u30E6\u30CB\u30C3\u30C8\u6B8B\u91CF\u306E\u78BA\u8A8D\uFF08\u7121\u6599\u30
112412
112528
  - 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
112413
112529
  - 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
112414
112530
  - 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
112531
+ - \`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
112415
112532
  - 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
112416
112533
  - \u5C65\u6B74\u30A8\u30F3\u30C9\u30DD\u30A4\u30F3\u30C8\u306E\u65E5\u4ED8\u306F\u5FC5\u305A\u6708\u306E15\u65E5\uFF08\`YYYYMM15\`\uFF09`
112417
112534
  },
@@ -113531,7 +113648,8 @@ var parameters72 = {
113531
113648
  type: "text",
113532
113649
  secret: true,
113533
113650
  required: false
113534
- })
113651
+ }),
113652
+ ...sshTunnelParameters
113535
113653
  };
113536
113654
 
113537
113655
  // ../connectors/src/connectors/sqlserver/tools/execute-query.ts
@@ -113590,7 +113708,9 @@ Avoid loading large amounts of data; always include \`TOP\` in queries.`,
113590
113708
  };
113591
113709
  }
113592
113710
  try {
113593
- const { rows } = await runMssqlQuery(parsed, sql);
113711
+ const { rows } = await runMssqlQuery(parsed, sql, {
113712
+ tunnelParams: connectionParamsToRecord(connection)
113713
+ });
113594
113714
  const truncated = rows.length > MAX_ROWS14;
113595
113715
  return {
113596
113716
  success: true,
@@ -113661,7 +113781,8 @@ The business logic type for this connector is "sql".
113661
113781
  {
113662
113782
  username: params[parameters72.username.slug],
113663
113783
  password: params[parameters72.password.slug]
113664
- }
113784
+ },
113785
+ { tunnelParams: params }
113665
113786
  );
113666
113787
  },
113667
113788
  async query(params, sql, _namedParams) {
@@ -113671,10 +113792,12 @@ The business logic type for this connector is "sql".
113671
113792
  });
113672
113793
  const sample = unwrapSampleLimit(sql);
113673
113794
  if (sample) {
113674
- const result = await runMssqlQuery(parsed, sample.inner);
113795
+ const result = await runMssqlQuery(parsed, sample.inner, {
113796
+ tunnelParams: params
113797
+ });
113675
113798
  return { rows: result.rows.slice(0, sample.limit) };
113676
113799
  }
113677
- return runMssqlQuery(parsed, sql);
113800
+ return runMssqlQuery(parsed, sql, { tunnelParams: params });
113678
113801
  }
113679
113802
  });
113680
113803
 
@@ -113720,7 +113843,8 @@ var parameters73 = {
113720
113843
  type: "text",
113721
113844
  secret: true,
113722
113845
  required: false
113723
- })
113846
+ }),
113847
+ ...sshTunnelParameters
113724
113848
  };
113725
113849
 
113726
113850
  // ../connectors/src/connectors/azure-sql/tools/execute-query.ts
@@ -113779,7 +113903,10 @@ Avoid loading large amounts of data; always include \`TOP\` in queries.`,
113779
113903
  };
113780
113904
  }
113781
113905
  try {
113782
- const { rows } = await runMssqlQuery(parsed, sql, { forceEncrypt: true });
113906
+ const { rows } = await runMssqlQuery(parsed, sql, {
113907
+ forceEncrypt: true,
113908
+ tunnelParams: connectionParamsToRecord(connection)
113909
+ });
113783
113910
  const truncated = rows.length > MAX_ROWS15;
113784
113911
  return {
113785
113912
  success: true,
@@ -113804,7 +113931,7 @@ var azureSqlConnector = new ConnectorPlugin({
113804
113931
  description: "Connect to Azure SQL Database (managed) using a JDBC-style URL. Encryption is enforced automatically.",
113805
113932
  iconUrl: "https://images.ctfassets.net/9ncizv60xc5y/5TL0yBbxoLlk6jFZuiHl8w/55040f52d57bf0b77a2215c985c5a772/azure-sql-icon.png",
113806
113933
  parameters: parameters73,
113807
- releaseFlag: { dev1: true, dev2: false, prod: false },
113934
+ releaseFlag: { dev1: true, dev2: true, prod: true },
113808
113935
  categories: ["database"],
113809
113936
  onboarding: azureSqlOnboarding,
113810
113937
  systemPrompt: {
@@ -113851,7 +113978,7 @@ The business logic type for this connector is "sql".
113851
113978
  username: params[parameters73.username.slug],
113852
113979
  password: params[parameters73.password.slug]
113853
113980
  },
113854
- { forceEncrypt: true }
113981
+ { forceEncrypt: true, tunnelParams: params }
113855
113982
  );
113856
113983
  },
113857
113984
  async query(params, sql, _namedParams) {
@@ -113862,11 +113989,353 @@ The business logic type for this connector is "sql".
113862
113989
  const sample = unwrapSampleLimit(sql);
113863
113990
  if (sample) {
113864
113991
  const result = await runMssqlQuery(parsed, sample.inner, {
113865
- forceEncrypt: true
113992
+ forceEncrypt: true,
113993
+ tunnelParams: params
113866
113994
  });
113867
113995
  return { rows: result.rows.slice(0, sample.limit) };
113868
113996
  }
113869
- return runMssqlQuery(parsed, sql, { forceEncrypt: true });
113997
+ return runMssqlQuery(parsed, sql, {
113998
+ forceEncrypt: true,
113999
+ tunnelParams: params
114000
+ });
114001
+ }
114002
+ });
114003
+
114004
+ // ../connectors/src/connectors/cosmosdb/setup.ts
114005
+ var cosmosdbOnboarding = new ConnectorOnboarding({
114006
+ dataOverviewInstructions: {
114007
+ en: `1. Use cosmosdb_listContainers to list all containers in the configured database
114008
+ 2. For key containers, sample documents with cosmosdb_query: container="users", sql="SELECT TOP 5 * FROM c"
114009
+ 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)
114010
+ 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\``,
114011
+ ja: `1. cosmosdb_listContainers \u3067\u5BFE\u8C61\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u5185\u306E\u30B3\u30F3\u30C6\u30CA\u4E00\u89A7\u3092\u53D6\u5F97
114012
+ 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"
114013
+ 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
114014
+ 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\``
114015
+ }
114016
+ });
114017
+
114018
+ // ../connectors/src/connectors/cosmosdb/parameters.ts
114019
+ var parameters74 = {
114020
+ endpoint: new ParameterDefinition({
114021
+ slug: "endpoint",
114022
+ name: "Cosmos DB Endpoint",
114023
+ 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.",
114024
+ envVarBaseKey: "COSMOSDB_ENDPOINT",
114025
+ type: "text",
114026
+ secret: false,
114027
+ required: true
114028
+ }),
114029
+ key: new ParameterDefinition({
114030
+ slug: "key",
114031
+ name: "Account Key",
114032
+ description: "Cosmos DB account key (primary or secondary master key). Use a read-only key when only querying data.",
114033
+ envVarBaseKey: "COSMOSDB_KEY",
114034
+ type: "text",
114035
+ secret: true,
114036
+ required: true
114037
+ }),
114038
+ database: new ParameterDefinition({
114039
+ slug: "database",
114040
+ name: "Database",
114041
+ description: "The Cosmos DB database (a.k.a. database account namespace) to connect to.",
114042
+ envVarBaseKey: "COSMOSDB_DATABASE",
114043
+ type: "text",
114044
+ secret: false,
114045
+ required: true
114046
+ })
114047
+ };
114048
+
114049
+ // ../connectors/src/connectors/cosmosdb/tools/list-containers.ts
114050
+ import { z as z90 } from "zod";
114051
+ var inputSchema90 = z90.object({
114052
+ toolUseIntent: z90.string().optional().describe(
114053
+ "Brief description of what you intend to accomplish with this tool call"
114054
+ ),
114055
+ connectionId: z90.string().describe("ID of the Cosmos DB connection to use")
114056
+ });
114057
+ var outputSchema90 = z90.discriminatedUnion("success", [
114058
+ z90.object({
114059
+ success: z90.literal(true),
114060
+ containers: z90.array(
114061
+ z90.object({
114062
+ id: z90.string(),
114063
+ partitionKey: z90.array(z90.string()).optional()
114064
+ })
114065
+ )
114066
+ }),
114067
+ z90.object({
114068
+ success: z90.literal(false),
114069
+ error: z90.string()
114070
+ })
114071
+ ]);
114072
+ var listContainersTool = new ConnectorTool({
114073
+ name: "listContainers",
114074
+ description: `List all containers in the configured Cosmos DB database.
114075
+ Use this as the first step to explore the data structure. Returns container ids and their partition key paths.
114076
+ After listing containers, use the query tool to sample items and understand each container's schema.`,
114077
+ inputSchema: inputSchema90,
114078
+ outputSchema: outputSchema90,
114079
+ async execute({ connectionId }, connections) {
114080
+ const connection = connections.find((c6) => c6.id === connectionId);
114081
+ if (!connection) {
114082
+ return {
114083
+ success: false,
114084
+ error: `Connection ${connectionId} not found`
114085
+ };
114086
+ }
114087
+ console.log(
114088
+ `[connector-query] cosmosdb/${connection.name}: listContainers`
114089
+ );
114090
+ let key;
114091
+ try {
114092
+ const { CosmosClient } = await import("@azure/cosmos");
114093
+ const endpoint = parameters74.endpoint.getValue(connection);
114094
+ key = parameters74.key.getValue(connection);
114095
+ const database = parameters74.database.getValue(connection);
114096
+ const client = new CosmosClient({ endpoint, key });
114097
+ const db = client.database(database);
114098
+ const { resources } = await db.containers.readAll().fetchAll();
114099
+ return {
114100
+ success: true,
114101
+ containers: resources.map((c6) => ({
114102
+ id: c6.id,
114103
+ partitionKey: extractPartitionKeyPaths(c6.partitionKey)
114104
+ }))
114105
+ };
114106
+ } catch (err) {
114107
+ let msg = err instanceof Error ? err.message : String(err);
114108
+ if (key) msg = msg.replaceAll(key, "***");
114109
+ return { success: false, error: msg };
114110
+ }
114111
+ }
114112
+ });
114113
+ function extractPartitionKeyPaths(partitionKey) {
114114
+ if (!partitionKey || typeof partitionKey !== "object") return void 0;
114115
+ const paths = partitionKey.paths;
114116
+ if (!Array.isArray(paths)) return void 0;
114117
+ return paths.filter((p2) => typeof p2 === "string");
114118
+ }
114119
+
114120
+ // ../connectors/src/connectors/cosmosdb/tools/query.ts
114121
+ import { z as z91 } from "zod";
114122
+ var MAX_DOCUMENTS3 = 500;
114123
+ var inputSchema91 = z91.object({
114124
+ toolUseIntent: z91.string().optional().describe(
114125
+ "Brief description of what you intend to accomplish with this tool call"
114126
+ ),
114127
+ connectionId: z91.string().describe("ID of the Cosmos DB connection to use"),
114128
+ container: z91.string().describe("Id of the container (a.k.a. collection) to query"),
114129
+ sql: z91.string().describe(
114130
+ "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`."
114131
+ ),
114132
+ partitionKey: z91.string().optional().describe(
114133
+ `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.`
114134
+ )
114135
+ });
114136
+ var outputSchema91 = z91.discriminatedUnion("success", [
114137
+ z91.object({
114138
+ success: z91.literal(true),
114139
+ documentCount: z91.number(),
114140
+ truncated: z91.boolean(),
114141
+ requestCharge: z91.number().optional(),
114142
+ documents: z91.array(z91.unknown())
114143
+ }),
114144
+ z91.object({
114145
+ success: z91.literal(false),
114146
+ error: z91.string()
114147
+ })
114148
+ ]);
114149
+ var queryTool = new ConnectorTool({
114150
+ name: "query",
114151
+ description: `Execute a Cosmos DB SQL (Core / NoSQL API) query against a container. Returns up to ${MAX_DOCUMENTS3} items.
114152
+ Use for: schema exploration, data sampling, aggregations, and analytical queries.
114153
+ Cosmos DB SQL targets a single container; reference items via the alias \`c\` (e.g. \`SELECT c.id FROM c WHERE c.userId = 'abc'\`).
114154
+ 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.`,
114155
+ inputSchema: inputSchema91,
114156
+ outputSchema: outputSchema91,
114157
+ async execute({ connectionId, container, sql, partitionKey }, connections) {
114158
+ const connection = connections.find((c6) => c6.id === connectionId);
114159
+ if (!connection) {
114160
+ return {
114161
+ success: false,
114162
+ error: `Connection ${connectionId} not found`
114163
+ };
114164
+ }
114165
+ console.log(
114166
+ `[connector-query] cosmosdb/${connection.name} (${container}): ${sql}`
114167
+ );
114168
+ let key;
114169
+ try {
114170
+ const cosmos = await import("@azure/cosmos");
114171
+ const { CosmosClient } = cosmos;
114172
+ const endpoint = parameters74.endpoint.getValue(connection);
114173
+ key = parameters74.key.getValue(connection);
114174
+ const database = parameters74.database.getValue(connection);
114175
+ const client = new CosmosClient({ endpoint, key });
114176
+ const cont = client.database(database).container(container);
114177
+ const queryOptions = {
114178
+ // Bound by the connector's own row cap, but keep the SDK from
114179
+ // streaming arbitrarily large continuations.
114180
+ maxItemCount: MAX_DOCUMENTS3 + 1
114181
+ };
114182
+ if (partitionKey != null && partitionKey !== "") {
114183
+ try {
114184
+ queryOptions.partitionKey = JSON.parse(partitionKey);
114185
+ } catch {
114186
+ return {
114187
+ success: false,
114188
+ error: `Invalid partitionKey: must be a JSON-encoded scalar (e.g. '"abc"' or '123'). Got: ${partitionKey}`
114189
+ };
114190
+ }
114191
+ }
114192
+ const iterator = cont.items.query(sql, queryOptions);
114193
+ const { resources, requestCharge } = await iterator.fetchNext();
114194
+ const documents = resources ?? [];
114195
+ const truncated = documents.length > MAX_DOCUMENTS3;
114196
+ return {
114197
+ success: true,
114198
+ documentCount: Math.min(documents.length, MAX_DOCUMENTS3),
114199
+ truncated,
114200
+ requestCharge,
114201
+ documents: documents.slice(0, MAX_DOCUMENTS3)
114202
+ };
114203
+ } catch (err) {
114204
+ let msg = err instanceof Error ? err.message : String(err);
114205
+ if (key) msg = msg.replaceAll(key, "***");
114206
+ return { success: false, error: msg };
114207
+ }
114208
+ }
114209
+ });
114210
+
114211
+ // ../connectors/src/connectors/cosmosdb/index.ts
114212
+ var tools74 = {
114213
+ listContainers: listContainersTool,
114214
+ query: queryTool
114215
+ };
114216
+ var cosmosdbConnector = new ConnectorPlugin({
114217
+ slug: "cosmosdb",
114218
+ authType: AUTH_TYPES.USER_PASSWORD,
114219
+ name: "Azure Cosmos DB",
114220
+ description: "Connect to Azure Cosmos DB (Core / NoSQL API) for document-oriented data storage and SQL-style querying.",
114221
+ iconUrl: "https://images.ctfassets.net/9ncizv60xc5y/5p9B2Db0V2d8mK2jgBWtZu/dad72db8f41b16c50de2bcef03f9d415/cosmosdb-icon.png",
114222
+ parameters: parameters74,
114223
+ releaseFlag: { dev1: true, dev2: true, prod: true },
114224
+ categories: ["database"],
114225
+ onboarding: cosmosdbOnboarding,
114226
+ systemPrompt: {
114227
+ en: `### Tools
114228
+
114229
+ - \`cosmosdb_listContainers\`: Lists all containers in the configured database, with their partition key paths. Use this first to explore available data.
114230
+ - \`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).
114231
+
114232
+ ### Business Logic
114233
+
114234
+ 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.
114235
+
114236
+ \u26A0\uFE0F **The client returned by \`connection(connectionId)\` is NOT the raw \`@azure/cosmos\` \`CosmosClient\`.** It is a thin wrapper exposing only two methods:
114237
+ - \`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 }\`.
114238
+ - \`client.listContainers() => Promise<{ id: string; partitionKey?: string[] }[]>\` \u2014 lists containers in the configured database.
114239
+
114240
+ 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\`.
114241
+
114242
+ \`\`\`ts
114243
+ import type { Context } from "hono";
114244
+ import { connection } from "@squadbase/vite-server/connectors/cosmosdb";
114245
+
114246
+ const cosmos = connection("<connectionId>");
114247
+
114248
+ export default async function handler(_c: Context) {
114249
+ // \`query\` returns the items array directly \u2014 no \`.resources\` to unwrap.
114250
+ const rows = await cosmos.query<{ prod: string; orderCount: number }>(
114251
+ "<containerName>",
114252
+ "SELECT c.prod, COUNT(1) AS orderCount FROM c GROUP BY c.prod",
114253
+ // Optional: scope to a single partition to save RUs.
114254
+ // { partitionKey: "<partitionKeyValue>" },
114255
+ );
114256
+
114257
+ rows.sort((a, b) => Number(b.orderCount) - Number(a.orderCount));
114258
+
114259
+ return new Response(JSON.stringify(rows), {
114260
+ headers: { "Content-Type": "application/json" },
114261
+ });
114262
+ }
114263
+ \`\`\`
114264
+
114265
+ ### Cosmos DB SQL Reference
114266
+ - Cosmos DB stores schema-flexible JSON items in **containers** organised under a **database**. Items are partitioned by a per-container partition key path.
114267
+ - 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'\`).
114268
+ - 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.
114269
+ - System fields are prefixed with an underscore (\`c.id\`, \`c._ts\` for the modification timestamp, \`c._etag\`).
114270
+ - 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\`).
114271
+ - Joins: only **intra-document** joins via \`JOIN\` over arrays inside the same item; there is no cross-container/cross-document join.
114272
+ - Always bound results with \`TOP n\` and prefer scoped queries with a \`partitionKey\` value when possible \u2014 cross-partition queries cost more RUs.`,
114273
+ ja: `### \u30C4\u30FC\u30EB
114274
+
114275
+ - \`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
114276
+ - \`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
114277
+
114278
+ ### Business Logic
114279
+
114280
+ \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
114281
+
114282
+ \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
114283
+ - \`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
114284
+ - \`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
114285
+
114286
+ \`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
114287
+
114288
+ \`\`\`ts
114289
+ import type { Context } from "hono";
114290
+ import { connection } from "@squadbase/vite-server/connectors/cosmosdb";
114291
+
114292
+ const cosmos = connection("<connectionId>");
114293
+
114294
+ export default async function handler(_c: Context) {
114295
+ // \`query\` \u306F items \u914D\u5217\u3092\u305D\u306E\u307E\u307E\u8FD4\u3059 \u2014 \`.resources\` \u306E\u5C55\u958B\u306F\u4E0D\u8981\u3002
114296
+ const rows = await cosmos.query<{ prod: string; orderCount: number }>(
114297
+ "<containerName>",
114298
+ "SELECT c.prod, COUNT(1) AS orderCount FROM c GROUP BY c.prod",
114299
+ // \u4EFB\u610F: \u5358\u4E00\u30D1\u30FC\u30C6\u30A3\u30B7\u30E7\u30F3\u306B\u30B9\u30B3\u30FC\u30D7\u3057\u3066 RU \u3092\u7BC0\u7D04\u3002
114300
+ // { partitionKey: "<partitionKeyValue>" },
114301
+ );
114302
+
114303
+ rows.sort((a, b) => Number(b.orderCount) - Number(a.orderCount));
114304
+
114305
+ return new Response(JSON.stringify(rows), {
114306
+ headers: { "Content-Type": "application/json" },
114307
+ });
114308
+ }
114309
+ \`\`\`
114310
+
114311
+ ### Cosmos DB SQL \u30EA\u30D5\u30A1\u30EC\u30F3\u30B9
114312
+ - 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
114313
+ - \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
114314
+ - \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
114315
+ - \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
114316
+ - \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
114317
+ - \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
114318
+ - \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`
114319
+ },
114320
+ tools: tools74,
114321
+ async checkConnection(params, _config) {
114322
+ try {
114323
+ const { CosmosClient } = await import("@azure/cosmos");
114324
+ const client = new CosmosClient({
114325
+ endpoint: params[parameters74.endpoint.slug],
114326
+ key: params[parameters74.key.slug]
114327
+ });
114328
+ const database = params[parameters74.database.slug];
114329
+ await client.database(database).read();
114330
+ return { success: true };
114331
+ } catch (error2) {
114332
+ const msg = error2 instanceof Error ? error2.message : String(error2);
114333
+ const key = params[parameters74.key.slug];
114334
+ return {
114335
+ success: false,
114336
+ error: key ? msg.replaceAll(key, "***") : msg
114337
+ };
114338
+ }
113870
114339
  }
113871
114340
  });
113872
114341
 
@@ -113887,7 +114356,7 @@ var oracleOnboarding = new ConnectorOnboarding({
113887
114356
  });
113888
114357
 
113889
114358
  // ../connectors/src/connectors/oracle/parameters.ts
113890
- var parameters74 = {
114359
+ var parameters75 = {
113891
114360
  jdbcUrl: new ParameterDefinition({
113892
114361
  slug: "jdbc-url",
113893
114362
  name: "Oracle JDBC URL",
@@ -113914,31 +114383,32 @@ var parameters74 = {
113914
114383
  type: "text",
113915
114384
  secret: true,
113916
114385
  required: false
113917
- })
114386
+ }),
114387
+ ...sshTunnelParameters
113918
114388
  };
113919
114389
 
113920
114390
  // ../connectors/src/connectors/oracle/tools/execute-query.ts
113921
- import { z as z90 } from "zod";
114391
+ import { z as z92 } from "zod";
113922
114392
  var MAX_ROWS16 = 500;
113923
- var inputSchema90 = z90.object({
113924
- toolUseIntent: z90.string().optional().describe(
114393
+ var inputSchema92 = z92.object({
114394
+ toolUseIntent: z92.string().optional().describe(
113925
114395
  "Brief description of what you intend to accomplish with this tool call"
113926
114396
  ),
113927
- connectionId: z90.string().describe("ID of the Oracle connection to use"),
113928
- sql: z90.string().describe(
114397
+ connectionId: z92.string().describe("ID of the Oracle connection to use"),
114398
+ sql: z92.string().describe(
113929
114399
  "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."
113930
114400
  )
113931
114401
  });
113932
- var outputSchema90 = z90.discriminatedUnion("success", [
113933
- z90.object({
113934
- success: z90.literal(true),
113935
- rowCount: z90.number(),
113936
- truncated: z90.boolean(),
113937
- rows: z90.array(z90.record(z90.string(), z90.unknown()))
114402
+ var outputSchema92 = z92.discriminatedUnion("success", [
114403
+ z92.object({
114404
+ success: z92.literal(true),
114405
+ rowCount: z92.number(),
114406
+ truncated: z92.boolean(),
114407
+ rows: z92.array(z92.record(z92.string(), z92.unknown()))
113938
114408
  }),
113939
- z90.object({
113940
- success: z90.literal(false),
113941
- error: z90.string()
114409
+ z92.object({
114410
+ success: z92.literal(false),
114411
+ error: z92.string()
113942
114412
  })
113943
114413
  ]);
113944
114414
  var executeQueryTool16 = new ConnectorTool({
@@ -113948,8 +114418,8 @@ Use for: schema exploration via \`USER_TABLES\` / \`USER_TAB_COLUMNS\` / \`ALL_T
113948
114418
  Oracle uses \`FETCH FIRST n ROWS ONLY\` (12c+) or \`ROWNUM\` for row limiting \u2014 there is no \`LIMIT\` keyword.
113949
114419
  Unquoted identifiers are stored upper-case (\`SELECT * FROM employees\` resolves to \`EMPLOYEES\`).
113950
114420
  Do NOT terminate statements with a semicolon; the driver rejects trailing terminators.`,
113951
- inputSchema: inputSchema90,
113952
- outputSchema: outputSchema90,
114421
+ inputSchema: inputSchema92,
114422
+ outputSchema: outputSchema92,
113953
114423
  async execute({ connectionId, sql }, connections) {
113954
114424
  const connection = connections.find((c6) => c6.id === connectionId);
113955
114425
  if (!connection) {
@@ -113958,9 +114428,9 @@ Do NOT terminate statements with a semicolon; the driver rejects trailing termin
113958
114428
  error: `Connection ${connectionId} not found`
113959
114429
  };
113960
114430
  }
113961
- const jdbcUrl = parameters74.jdbcUrl.getValue(connection);
113962
- const username = parameters74.username.tryGetValue(connection);
113963
- const password = parameters74.password.tryGetValue(connection);
114431
+ const jdbcUrl = parameters75.jdbcUrl.getValue(connection);
114432
+ const username = parameters75.username.tryGetValue(connection);
114433
+ const password = parameters75.password.tryGetValue(connection);
113964
114434
  console.log(
113965
114435
  `[connector-query] oracle/${connection.name} (${redactOracleUrl(jdbcUrl)}): ${sql}`
113966
114436
  );
@@ -113975,7 +114445,9 @@ Do NOT terminate statements with a semicolon; the driver rejects trailing termin
113975
114445
  }
113976
114446
  try {
113977
114447
  const cleanSql = sql.replace(/;\s*$/, "");
113978
- const { rows } = await runOracleQuery(parsed, cleanSql);
114448
+ const { rows } = await runOracleQuery(parsed, cleanSql, {
114449
+ tunnelParams: connectionParamsToRecord(connection)
114450
+ });
113979
114451
  const truncated = rows.length > MAX_ROWS16;
113980
114452
  return {
113981
114453
  success: true,
@@ -113992,14 +114464,14 @@ Do NOT terminate statements with a semicolon; the driver rejects trailing termin
113992
114464
  });
113993
114465
 
113994
114466
  // ../connectors/src/connectors/oracle/index.ts
113995
- var tools74 = { executeQuery: executeQueryTool16 };
114467
+ var tools75 = { executeQuery: executeQueryTool16 };
113996
114468
  var oracleConnector = new ConnectorPlugin({
113997
114469
  slug: "oracle",
113998
114470
  authType: AUTH_TYPES.USER_PASSWORD,
113999
114471
  name: "Oracle Database",
114000
114472
  description: "Connect to Oracle Database using a JDBC-style URL via the pure-JS Thin driver (no Oracle Instant Client required).",
114001
114473
  iconUrl: "https://images.ctfassets.net/9ncizv60xc5y/3iGEdzvGHncU5bYqFOROiV/9e7bdda7230d7ca6b34e7f6a862de876/oracle-icon.webp",
114002
- parameters: parameters74,
114474
+ parameters: parameters75,
114003
114475
  releaseFlag: { dev1: true, dev2: false, prod: false },
114004
114476
  categories: ["database"],
114005
114477
  onboarding: oracleOnboarding,
@@ -114043,26 +114515,32 @@ The business logic type for this connector is "sql".
114043
114515
  - \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
114044
114516
  - \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`
114045
114517
  },
114046
- tools: tools74,
114518
+ tools: tools75,
114047
114519
  async checkConnection(params, _config) {
114048
- return checkOracleConnection(params[parameters74.jdbcUrl.slug], {
114049
- username: params[parameters74.username.slug],
114050
- password: params[parameters74.password.slug]
114051
- });
114520
+ return checkOracleConnection(
114521
+ params[parameters75.jdbcUrl.slug],
114522
+ {
114523
+ username: params[parameters75.username.slug],
114524
+ password: params[parameters75.password.slug]
114525
+ },
114526
+ { tunnelParams: params }
114527
+ );
114052
114528
  },
114053
114529
  async query(params, sql, _namedParams) {
114054
- const parsed = parseOracleJdbcUrl(params[parameters74.jdbcUrl.slug], {
114055
- username: params[parameters74.username.slug],
114056
- password: params[parameters74.password.slug]
114530
+ const parsed = parseOracleJdbcUrl(params[parameters75.jdbcUrl.slug], {
114531
+ username: params[parameters75.username.slug],
114532
+ password: params[parameters75.password.slug]
114057
114533
  });
114058
114534
  const sample = unwrapSampleLimit(sql);
114059
114535
  if (sample) {
114060
114536
  const inner = sample.inner.replace(/;\s*$/, "");
114061
- const result = await runOracleQuery(parsed, inner);
114537
+ const result = await runOracleQuery(parsed, inner, {
114538
+ tunnelParams: params
114539
+ });
114062
114540
  return { rows: result.rows.slice(0, sample.limit) };
114063
114541
  }
114064
114542
  const cleanSql = sql.replace(/;\s*$/, "");
114065
- return runOracleQuery(parsed, cleanSql);
114543
+ return runOracleQuery(parsed, cleanSql, { tunnelParams: params });
114066
114544
  }
114067
114545
  });
114068
114546
 
@@ -114083,7 +114561,7 @@ var freshserviceOnboarding = new ConnectorOnboarding({
114083
114561
  });
114084
114562
 
114085
114563
  // ../connectors/src/connectors/freshservice/parameters.ts
114086
- var parameters75 = {
114564
+ var parameters76 = {
114087
114565
  domain: new ParameterDefinition({
114088
114566
  slug: "domain",
114089
114567
  name: "Freshservice Domain",
@@ -114105,7 +114583,7 @@ var parameters75 = {
114105
114583
  };
114106
114584
 
114107
114585
  // ../connectors/src/connectors/freshservice/tools/request.ts
114108
- import { z as z91 } from "zod";
114586
+ import { z as z93 } from "zod";
114109
114587
  var BASE_PATH_SEGMENT12 = "/api/v2";
114110
114588
  var REQUEST_TIMEOUT_MS70 = 6e4;
114111
114589
  function buildBaseUrl(domain) {
@@ -114116,33 +114594,33 @@ function buildBaseUrl(domain) {
114116
114594
  function basicAuthHeader(apiKey) {
114117
114595
  return `Basic ${Buffer.from(`${apiKey}:X`).toString("base64")}`;
114118
114596
  }
114119
- var inputSchema91 = z91.object({
114120
- toolUseIntent: z91.string().optional().describe(
114597
+ var inputSchema93 = z93.object({
114598
+ toolUseIntent: z93.string().optional().describe(
114121
114599
  "Brief description of what you intend to accomplish with this tool call"
114122
114600
  ),
114123
- connectionId: z91.string().describe("ID of the Freshservice connection to use"),
114124
- method: z91.enum(["GET", "POST", "PUT", "DELETE"]).describe(
114601
+ connectionId: z93.string().describe("ID of the Freshservice connection to use"),
114602
+ method: z93.enum(["GET", "POST", "PUT", "DELETE"]).describe(
114125
114603
  "HTTP method. GET for reading resources, POST for creating, PUT for updating, DELETE for removing."
114126
114604
  ),
114127
- path: z91.string().describe(
114605
+ path: z93.string().describe(
114128
114606
  "API path (e.g., '/tickets', '/tickets/123', '/agents'). Append query parameters such as '?per_page=100&page=1' for pagination."
114129
114607
  ),
114130
- body: z91.record(z91.string(), z91.unknown()).optional().describe(
114608
+ body: z93.record(z93.string(), z93.unknown()).optional().describe(
114131
114609
  'Request body (JSON) for POST/PUT requests. Example: { "subject": "...", "description": "...", "email": "...", "priority": 2, "status": 2, "source": 2 }.'
114132
114610
  )
114133
114611
  });
114134
- var outputSchema91 = z91.discriminatedUnion("success", [
114135
- z91.object({
114136
- success: z91.literal(true),
114137
- status: z91.number(),
114138
- data: z91.union([
114139
- z91.record(z91.string(), z91.unknown()),
114140
- z91.array(z91.unknown())
114612
+ var outputSchema93 = z93.discriminatedUnion("success", [
114613
+ z93.object({
114614
+ success: z93.literal(true),
114615
+ status: z93.number(),
114616
+ data: z93.union([
114617
+ z93.record(z93.string(), z93.unknown()),
114618
+ z93.array(z93.unknown())
114141
114619
  ])
114142
114620
  }),
114143
- z91.object({
114144
- success: z91.literal(false),
114145
- error: z91.string()
114621
+ z93.object({
114622
+ success: z93.literal(false),
114623
+ error: z93.string()
114146
114624
  })
114147
114625
  ]);
114148
114626
  var requestTool52 = new ConnectorTool({
@@ -114173,8 +114651,8 @@ Field codes:
114173
114651
  - ticket priority: 1 Low, 2 Medium, 3 High, 4 Urgent
114174
114652
  - ticket status: 2 Open, 3 Pending, 4 Resolved, 5 Closed
114175
114653
  - ticket source: 1 Email, 2 Portal, 3 Phone, 4 Chat, 5 Feedback widget, 7 Yammer, 8 AwsCloudwatch, 9 Pagerduty, 10 Walkup, 11 Slack`,
114176
- inputSchema: inputSchema91,
114177
- outputSchema: outputSchema91,
114654
+ inputSchema: inputSchema93,
114655
+ outputSchema: outputSchema93,
114178
114656
  async execute({ connectionId, method, path: path4, body }, connections) {
114179
114657
  const connection = connections.find((c6) => c6.id === connectionId);
114180
114658
  if (!connection) {
@@ -114187,8 +114665,8 @@ Field codes:
114187
114665
  `[connector-request] freshservice/${connection.name}: ${method} ${path4}`
114188
114666
  );
114189
114667
  try {
114190
- const apiKey = parameters75.apiKey.getValue(connection);
114191
- const domain = parameters75.domain.getValue(connection);
114668
+ const apiKey = parameters76.apiKey.getValue(connection);
114669
+ const domain = parameters76.domain.getValue(connection);
114192
114670
  const baseUrl = buildBaseUrl(domain);
114193
114671
  const normalizedPath = normalizeRequestPath(path4, BASE_PATH_SEGMENT12);
114194
114672
  const url = `${baseUrl}${normalizedPath}`;
@@ -114227,14 +114705,14 @@ Field codes:
114227
114705
  });
114228
114706
 
114229
114707
  // ../connectors/src/connectors/freshservice/index.ts
114230
- var tools75 = { request: requestTool52 };
114708
+ var tools76 = { request: requestTool52 };
114231
114709
  var freshserviceConnector = new ConnectorPlugin({
114232
114710
  slug: "freshservice",
114233
114711
  authType: AUTH_TYPES.API_KEY,
114234
114712
  name: "Freshservice",
114235
114713
  description: "Connect to Freshservice (ITSM) for ticket, agent, asset, and ITIL workflow data via API key.",
114236
114714
  iconUrl: "https://images.ctfassets.net/9ncizv60xc5y/6Tj64HZOoIrGgQYDayBosY/3f45b29d3479726b5d245ac38d5a7036/freshservice-icon.svg",
114237
- parameters: parameters75,
114715
+ parameters: parameters76,
114238
114716
  releaseFlag: { dev1: true, dev2: true, prod: true },
114239
114717
  categories: ["productivity"],
114240
114718
  onboarding: freshserviceOnboarding,
@@ -114392,7 +114870,7 @@ export default async function handler(c: Context) {
114392
114870
  - \`status\`: 2=Open, 3=Pending, 4=Resolved, 5=Closed
114393
114871
  - \`source\`: 1=Email, 2=Portal, 3=Phone, 4=Chat, 5=Feedback widget, 7=Yammer, 8=AwsCloudwatch, 9=Pagerduty, 10=Walkup, 11=Slack`
114394
114872
  },
114395
- tools: tools75
114873
+ tools: tools76
114396
114874
  });
114397
114875
 
114398
114876
  // ../connectors/src/connectors/freshdesk/setup.ts
@@ -114412,7 +114890,7 @@ var freshdeskOnboarding = new ConnectorOnboarding({
114412
114890
  });
114413
114891
 
114414
114892
  // ../connectors/src/connectors/freshdesk/parameters.ts
114415
- var parameters76 = {
114893
+ var parameters77 = {
114416
114894
  domain: new ParameterDefinition({
114417
114895
  slug: "domain",
114418
114896
  name: "Freshdesk Domain",
@@ -114434,7 +114912,7 @@ var parameters76 = {
114434
114912
  };
114435
114913
 
114436
114914
  // ../connectors/src/connectors/freshdesk/tools/request.ts
114437
- import { z as z92 } from "zod";
114915
+ import { z as z94 } from "zod";
114438
114916
  var BASE_PATH_SEGMENT13 = "/api/v2";
114439
114917
  var REQUEST_TIMEOUT_MS71 = 6e4;
114440
114918
  function buildBaseUrl2(domain) {
@@ -114445,33 +114923,33 @@ function buildBaseUrl2(domain) {
114445
114923
  function basicAuthHeader2(apiKey) {
114446
114924
  return `Basic ${Buffer.from(`${apiKey}:X`).toString("base64")}`;
114447
114925
  }
114448
- var inputSchema92 = z92.object({
114449
- toolUseIntent: z92.string().optional().describe(
114926
+ var inputSchema94 = z94.object({
114927
+ toolUseIntent: z94.string().optional().describe(
114450
114928
  "Brief description of what you intend to accomplish with this tool call"
114451
114929
  ),
114452
- connectionId: z92.string().describe("ID of the Freshdesk connection to use"),
114453
- method: z92.enum(["GET", "POST", "PUT", "DELETE"]).describe(
114930
+ connectionId: z94.string().describe("ID of the Freshdesk connection to use"),
114931
+ method: z94.enum(["GET", "POST", "PUT", "DELETE"]).describe(
114454
114932
  "HTTP method. GET for reading resources, POST for creating, PUT for updating, DELETE for removing."
114455
114933
  ),
114456
- path: z92.string().describe(
114934
+ path: z94.string().describe(
114457
114935
  "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'."
114458
114936
  ),
114459
- body: z92.record(z92.string(), z92.unknown()).optional().describe(
114937
+ body: z94.record(z94.string(), z94.unknown()).optional().describe(
114460
114938
  'Request body (JSON) for POST/PUT requests. Example creating a ticket: { "subject": "...", "description": "...", "email": "...", "priority": 2, "status": 2, "source": 1 }.'
114461
114939
  )
114462
114940
  });
114463
- var outputSchema92 = z92.discriminatedUnion("success", [
114464
- z92.object({
114465
- success: z92.literal(true),
114466
- status: z92.number(),
114467
- data: z92.union([
114468
- z92.record(z92.string(), z92.unknown()),
114469
- z92.array(z92.unknown())
114941
+ var outputSchema94 = z94.discriminatedUnion("success", [
114942
+ z94.object({
114943
+ success: z94.literal(true),
114944
+ status: z94.number(),
114945
+ data: z94.union([
114946
+ z94.record(z94.string(), z94.unknown()),
114947
+ z94.array(z94.unknown())
114470
114948
  ])
114471
114949
  }),
114472
- z92.object({
114473
- success: z92.literal(false),
114474
- error: z92.string()
114950
+ z94.object({
114951
+ success: z94.literal(false),
114952
+ error: z94.string()
114475
114953
  })
114476
114954
  ]);
114477
114955
  var requestTool53 = new ConnectorTool({
@@ -114502,8 +114980,8 @@ Field codes (tickets):
114502
114980
  - priority: 1 Low, 2 Medium, 3 High, 4 Urgent
114503
114981
  - status: 2 Open, 3 Pending, 4 Resolved, 5 Closed
114504
114982
  - source: 1 Email, 2 Portal, 3 Phone, 7 Chat, 9 Feedback widget, 10 Outbound email`,
114505
- inputSchema: inputSchema92,
114506
- outputSchema: outputSchema92,
114983
+ inputSchema: inputSchema94,
114984
+ outputSchema: outputSchema94,
114507
114985
  async execute({ connectionId, method, path: path4, body }, connections) {
114508
114986
  const connection = connections.find((c6) => c6.id === connectionId);
114509
114987
  if (!connection) {
@@ -114516,8 +114994,8 @@ Field codes (tickets):
114516
114994
  `[connector-request] freshdesk/${connection.name}: ${method} ${path4}`
114517
114995
  );
114518
114996
  try {
114519
- const apiKey = parameters76.apiKey.getValue(connection);
114520
- const domain = parameters76.domain.getValue(connection);
114997
+ const apiKey = parameters77.apiKey.getValue(connection);
114998
+ const domain = parameters77.domain.getValue(connection);
114521
114999
  const baseUrl = buildBaseUrl2(domain);
114522
115000
  const normalizedPath = normalizeRequestPath(path4, BASE_PATH_SEGMENT13);
114523
115001
  const url = `${baseUrl}${normalizedPath}`;
@@ -114556,14 +115034,14 @@ Field codes (tickets):
114556
115034
  });
114557
115035
 
114558
115036
  // ../connectors/src/connectors/freshdesk/index.ts
114559
- var tools76 = { request: requestTool53 };
115037
+ var tools77 = { request: requestTool53 };
114560
115038
  var freshdeskConnector = new ConnectorPlugin({
114561
115039
  slug: "freshdesk",
114562
115040
  authType: AUTH_TYPES.API_KEY,
114563
115041
  name: "Freshdesk",
114564
115042
  description: "Connect to Freshdesk for customer support ticket, contact, and company data via API key.",
114565
115043
  iconUrl: "https://images.ctfassets.net/9ncizv60xc5y/1PSjIfQJgTYmiWriNTx4uE/26905f4120713bda0afd0b23d02a154e/freshdesk-icon.png",
114566
- parameters: parameters76,
115044
+ parameters: parameters77,
114567
115045
  releaseFlag: { dev1: true, dev2: true, prod: true },
114568
115046
  categories: ["crm"],
114569
115047
  onboarding: freshdeskOnboarding,
@@ -114723,7 +115201,7 @@ export default async function handler(c: Context) {
114723
115201
  - \`status\`: 2=Open, 3=Pending, 4=Resolved, 5=Closed
114724
115202
  - \`source\`: 1=Email, 2=Portal, 3=Phone, 7=Chat, 9=Feedback widget, 10=Outbound email`
114725
115203
  },
114726
- tools: tools76
115204
+ tools: tools77
114727
115205
  });
114728
115206
 
114729
115207
  // ../connectors/src/connectors/freshsales/setup.ts
@@ -114743,7 +115221,7 @@ var freshsalesOnboarding = new ConnectorOnboarding({
114743
115221
  });
114744
115222
 
114745
115223
  // ../connectors/src/connectors/freshsales/parameters.ts
114746
- var parameters77 = {
115224
+ var parameters78 = {
114747
115225
  bundleAlias: new ParameterDefinition({
114748
115226
  slug: "bundle-alias",
114749
115227
  name: "Freshsales Bundle Alias",
@@ -114765,7 +115243,7 @@ var parameters77 = {
114765
115243
  };
114766
115244
 
114767
115245
  // ../connectors/src/connectors/freshsales/tools/request.ts
114768
- import { z as z93 } from "zod";
115246
+ import { z as z95 } from "zod";
114769
115247
  var BASE_PATH_SEGMENT14 = "/crm/sales/api";
114770
115248
  var REQUEST_TIMEOUT_MS72 = 6e4;
114771
115249
  function buildBaseUrl3(bundleAlias) {
@@ -114773,33 +115251,33 @@ function buildBaseUrl3(bundleAlias) {
114773
115251
  const subdomain = trimmed.split(".")[0];
114774
115252
  return `https://${subdomain}.myfreshworks.com${BASE_PATH_SEGMENT14}`;
114775
115253
  }
114776
- var inputSchema93 = z93.object({
114777
- toolUseIntent: z93.string().optional().describe(
115254
+ var inputSchema95 = z95.object({
115255
+ toolUseIntent: z95.string().optional().describe(
114778
115256
  "Brief description of what you intend to accomplish with this tool call"
114779
115257
  ),
114780
- connectionId: z93.string().describe("ID of the Freshsales connection to use"),
114781
- method: z93.enum(["GET", "POST", "PUT", "DELETE"]).describe(
115258
+ connectionId: z95.string().describe("ID of the Freshsales connection to use"),
115259
+ method: z95.enum(["GET", "POST", "PUT", "DELETE"]).describe(
114782
115260
  "HTTP method. GET for reading resources (including /lookup), POST for creating, PUT for updating, DELETE for removing."
114783
115261
  ),
114784
- path: z93.string().describe(
115262
+ path: z95.string().describe(
114785
115263
  "API path (e.g., '/contacts', '/contacts/filters', '/contacts/view/{view_id}', '/deals/{id}', '/lookup'). Append query parameters such as '?page=1&per_page=100'."
114786
115264
  ),
114787
- body: z93.record(z93.string(), z93.unknown()).optional().describe(
115265
+ body: z95.record(z95.string(), z95.unknown()).optional().describe(
114788
115266
  'Request body (JSON). For creating a contact: { "contact": { "first_name": "...", "last_name": "...", "email": "..." } }. For lookup: { "q": "john@example.com", "f": "email", "entities": "contact" }.'
114789
115267
  )
114790
115268
  });
114791
- var outputSchema93 = z93.discriminatedUnion("success", [
114792
- z93.object({
114793
- success: z93.literal(true),
114794
- status: z93.number(),
114795
- data: z93.union([
114796
- z93.record(z93.string(), z93.unknown()),
114797
- z93.array(z93.unknown())
115269
+ var outputSchema95 = z95.discriminatedUnion("success", [
115270
+ z95.object({
115271
+ success: z95.literal(true),
115272
+ status: z95.number(),
115273
+ data: z95.union([
115274
+ z95.record(z95.string(), z95.unknown()),
115275
+ z95.array(z95.unknown())
114798
115276
  ])
114799
115277
  }),
114800
- z93.object({
114801
- success: z93.literal(false),
114802
- error: z93.string()
115278
+ z95.object({
115279
+ success: z95.literal(false),
115280
+ error: z95.string()
114803
115281
  })
114804
115282
  ]);
114805
115283
  var requestTool54 = new ConnectorTool({
@@ -114832,8 +115310,8 @@ Common endpoints:
114832
115310
  Pagination: 1-indexed \`page\` + \`per_page\` (default 25, max 100). View endpoints return \`{ contacts/sales_accounts/deals: [...], meta: { total_pages, total } }\`.
114833
115311
 
114834
115312
  Includes: most GET endpoints accept \`?include=\` with a comma-separated list (\`owner\`, \`creator\`, \`deals\`, \`contacts\`, etc.) to inline related records.`,
114835
- inputSchema: inputSchema93,
114836
- outputSchema: outputSchema93,
115313
+ inputSchema: inputSchema95,
115314
+ outputSchema: outputSchema95,
114837
115315
  async execute({ connectionId, method, path: path4, body }, connections) {
114838
115316
  const connection = connections.find((c6) => c6.id === connectionId);
114839
115317
  if (!connection) {
@@ -114846,8 +115324,8 @@ Includes: most GET endpoints accept \`?include=\` with a comma-separated list (\
114846
115324
  `[connector-request] freshsales/${connection.name}: ${method} ${path4}`
114847
115325
  );
114848
115326
  try {
114849
- const apiKey = parameters77.apiKey.getValue(connection);
114850
- const bundle = parameters77.bundleAlias.getValue(connection);
115327
+ const apiKey = parameters78.apiKey.getValue(connection);
115328
+ const bundle = parameters78.bundleAlias.getValue(connection);
114851
115329
  const baseUrl = buildBaseUrl3(bundle);
114852
115330
  const normalizedPath = normalizeRequestPath(path4, BASE_PATH_SEGMENT14);
114853
115331
  const url = `${baseUrl}${normalizedPath}`;
@@ -114885,14 +115363,14 @@ Includes: most GET endpoints accept \`?include=\` with a comma-separated list (\
114885
115363
  });
114886
115364
 
114887
115365
  // ../connectors/src/connectors/freshsales/index.ts
114888
- var tools77 = { request: requestTool54 };
115366
+ var tools78 = { request: requestTool54 };
114889
115367
  var freshsalesConnector = new ConnectorPlugin({
114890
115368
  slug: "freshsales",
114891
115369
  authType: AUTH_TYPES.API_KEY,
114892
115370
  name: "Freshsales",
114893
115371
  description: "Connect to Freshsales / Freshworks CRM for contact, account, and deal data via API key.",
114894
115372
  iconUrl: "https://images.ctfassets.net/9ncizv60xc5y/4UDOrFPM6wOFekbMVljjgl/4acc6060c3a1ff703980e6f4e76a3cd4/629b6c6f7c5cd817694c321f.png",
114895
- parameters: parameters77,
115373
+ parameters: parameters78,
114896
115374
  releaseFlag: { dev1: true, dev2: true, prod: true },
114897
115375
  categories: ["crm"],
114898
115376
  onboarding: freshsalesOnboarding,
@@ -115064,7 +115542,7 @@ export default async function handler(c: Context) {
115064
115542
  - GET \`/selector/lifecycle_stages\` \u2014 \u30E9\u30A4\u30D5\u30B5\u30A4\u30AF\u30EB\u30B9\u30C6\u30FC\u30B8
115065
115543
  - GET \`/selector/territories\` / \`/selector/business_types\` / \`/selector/industry_types\` / \`/selector/contact_statuses\` / \`/selector/sales_activity_types\``
115066
115544
  },
115067
- tools: tools77
115545
+ tools: tools78
115068
115546
  });
115069
115547
 
115070
115548
  // ../connectors/src/connectors/github/setup.ts
@@ -115090,7 +115568,7 @@ var githubOnboarding = new ConnectorOnboarding({
115090
115568
  });
115091
115569
 
115092
115570
  // ../connectors/src/connectors/github/parameters.ts
115093
- var parameters78 = {
115571
+ var parameters79 = {
115094
115572
  personalAccessToken: new ParameterDefinition({
115095
115573
  slug: "personal-access-token",
115096
115574
  name: "GitHub Personal Access Token",
@@ -115113,42 +115591,42 @@ var parameters78 = {
115113
115591
  var DEFAULT_BASE_URL = "https://api.github.com";
115114
115592
 
115115
115593
  // ../connectors/src/connectors/github/tools/request.ts
115116
- import { z as z94 } from "zod";
115594
+ import { z as z96 } from "zod";
115117
115595
  var REQUEST_TIMEOUT_MS73 = 6e4;
115118
115596
  function resolveBaseUrl(connectionBaseUrl) {
115119
115597
  const trimmed = connectionBaseUrl?.trim();
115120
115598
  return trimmed && trimmed.replace(/\/+$/, "") || DEFAULT_BASE_URL;
115121
115599
  }
115122
- var inputSchema94 = z94.object({
115123
- toolUseIntent: z94.string().optional().describe(
115600
+ var inputSchema96 = z96.object({
115601
+ toolUseIntent: z96.string().optional().describe(
115124
115602
  "Brief description of what you intend to accomplish with this tool call"
115125
115603
  ),
115126
- connectionId: z94.string().describe("ID of the GitHub connection to use"),
115127
- method: z94.enum(["GET", "POST", "PUT", "PATCH", "DELETE"]).describe(
115604
+ connectionId: z96.string().describe("ID of the GitHub connection to use"),
115605
+ method: z96.enum(["GET", "POST", "PUT", "PATCH", "DELETE"]).describe(
115128
115606
  "HTTP method. GET for reading, POST for creating, PATCH for partial updates, PUT for replacement (e.g. starring), DELETE for removal."
115129
115607
  ),
115130
- path: z94.string().describe(
115608
+ path: z96.string().describe(
115131
115609
  "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'."
115132
115610
  ),
115133
- body: z94.union([
115134
- z94.record(z94.string(), z94.unknown()),
115135
- z94.array(z94.unknown())
115611
+ body: z96.union([
115612
+ z96.record(z96.string(), z96.unknown()),
115613
+ z96.array(z96.unknown())
115136
115614
  ]).optional().describe(
115137
115615
  'Request body (JSON). Example creating an issue: { "title": "...", "body": "...", "labels": ["bug"] }.'
115138
115616
  )
115139
115617
  });
115140
- var outputSchema94 = z94.discriminatedUnion("success", [
115141
- z94.object({
115142
- success: z94.literal(true),
115143
- status: z94.number(),
115144
- data: z94.union([
115145
- z94.record(z94.string(), z94.unknown()),
115146
- z94.array(z94.unknown())
115618
+ var outputSchema96 = z96.discriminatedUnion("success", [
115619
+ z96.object({
115620
+ success: z96.literal(true),
115621
+ status: z96.number(),
115622
+ data: z96.union([
115623
+ z96.record(z96.string(), z96.unknown()),
115624
+ z96.array(z96.unknown())
115147
115625
  ])
115148
115626
  }),
115149
- z94.object({
115150
- success: z94.literal(false),
115151
- error: z94.string()
115627
+ z96.object({
115628
+ success: z96.literal(false),
115629
+ error: z96.string()
115152
115630
  })
115153
115631
  ]);
115154
115632
  var requestTool55 = new ConnectorTool({
@@ -115186,8 +115664,8 @@ Common endpoints:
115186
115664
  Pagination: 1-indexed \`page\` + \`per_page\` (max 100). The \`Link\` response header exposes \`rel="next"\`/\`rel="last"\` URLs.
115187
115665
 
115188
115666
  Rate limits: 5,000 req/hr on REST endpoints, 30 req/min on /search/*. Inspect \`X-RateLimit-Remaining\` to throttle.`,
115189
- inputSchema: inputSchema94,
115190
- outputSchema: outputSchema94,
115667
+ inputSchema: inputSchema96,
115668
+ outputSchema: outputSchema96,
115191
115669
  async execute({ connectionId, method, path: path4, body }, connections) {
115192
115670
  const connection = connections.find((c6) => c6.id === connectionId);
115193
115671
  if (!connection) {
@@ -115200,8 +115678,8 @@ Rate limits: 5,000 req/hr on REST endpoints, 30 req/min on /search/*. Inspect \`
115200
115678
  `[connector-request] github/${connection.name}: ${method} ${path4}`
115201
115679
  );
115202
115680
  try {
115203
- const token = parameters78.personalAccessToken.getValue(connection);
115204
- const baseUrl = resolveBaseUrl(parameters78.baseUrl.tryGetValue(connection));
115681
+ const token = parameters79.personalAccessToken.getValue(connection);
115682
+ const baseUrl = resolveBaseUrl(parameters79.baseUrl.tryGetValue(connection));
115205
115683
  const trimmedPath = path4.trim().replace(/^\/+/, "/");
115206
115684
  const url = `${baseUrl}${trimmedPath.startsWith("/") ? "" : "/"}${trimmedPath}`;
115207
115685
  const controller = new AbortController();
@@ -115241,14 +115719,14 @@ Rate limits: 5,000 req/hr on REST endpoints, 30 req/min on /search/*. Inspect \`
115241
115719
  });
115242
115720
 
115243
115721
  // ../connectors/src/connectors/github/index.ts
115244
- var tools78 = { request: requestTool55 };
115722
+ var tools79 = { request: requestTool55 };
115245
115723
  var githubConnector = new ConnectorPlugin({
115246
115724
  slug: "github",
115247
115725
  authType: AUTH_TYPES.PAT,
115248
115726
  name: "GitHub",
115249
115727
  description: "Connect to GitHub for repository, issue, pull request, commit, and search data via Personal Access Token (Classic or fine-grained).",
115250
115728
  iconUrl: "https://images.ctfassets.net/9ncizv60xc5y/2flOAufkhDrLKuOQqEVS3/1f9dcf145680ef77aef149709263e2d4/github-icon.svg",
115251
- parameters: parameters78,
115729
+ parameters: parameters79,
115252
115730
  releaseFlag: { dev1: true, dev2: true, prod: true },
115253
115731
  categories: ["productivity"],
115254
115732
  onboarding: githubOnboarding,
@@ -115468,7 +115946,7 @@ export default async function handler(c: Context) {
115468
115946
  **\u30AF\u30A9\u30FC\u30BF**
115469
115947
  - GET \`/rate_limit\` \u2014 REST / GraphQL / search \u306E\u6B8B\u30EC\u30FC\u30C8\u78BA\u8A8D`
115470
115948
  },
115471
- tools: tools78
115949
+ tools: tools79
115472
115950
  });
115473
115951
 
115474
115952
  // ../connectors/src/connectors/registry.ts
@@ -115546,6 +116024,7 @@ var plugins = {
115546
116024
  clickup: clickupConnector,
115547
116025
  sqlserver: sqlserverConnector,
115548
116026
  azureSql: azureSqlConnector,
116027
+ cosmosdb: cosmosdbConnector,
115549
116028
  oracle: oracleConnector,
115550
116029
  freshservice: freshserviceConnector,
115551
116030
  freshdesk: freshdeskConnector,
@@ -115761,62 +116240,62 @@ function resolveParams2(entry, connectionId, plugin) {
115761
116240
  var { getQuery, loadConnections, reloadEnvFile, watchConnectionsFile } = createConnectorRegistry();
115762
116241
 
115763
116242
  // src/types/server-logic.ts
115764
- import { z as z95 } from "zod";
115765
- var parameterMetaSchema = z95.object({
115766
- name: z95.string(),
115767
- type: z95.enum(["string", "number", "boolean"]),
115768
- description: z95.string(),
115769
- required: z95.boolean().optional(),
115770
- default: z95.union([z95.string(), z95.number(), z95.boolean()]).optional()
115771
- });
115772
- var serverLogicCacheConfigSchema = z95.object({
115773
- ttl: z95.number(),
115774
- staleWhileRevalidate: z95.boolean().optional()
115775
- });
115776
- var serverLogicSchemaObjectSchema = z95.lazy(
115777
- () => z95.object({
115778
- type: z95.enum(["string", "number", "integer", "boolean", "object", "array", "null"]).optional(),
115779
- format: z95.string().optional(),
115780
- description: z95.string().optional(),
115781
- nullable: z95.boolean().optional(),
115782
- enum: z95.array(z95.union([z95.string(), z95.number(), z95.boolean(), z95.null()])).optional(),
116243
+ import { z as z97 } from "zod";
116244
+ var parameterMetaSchema = z97.object({
116245
+ name: z97.string(),
116246
+ type: z97.enum(["string", "number", "boolean"]),
116247
+ description: z97.string(),
116248
+ required: z97.boolean().optional(),
116249
+ default: z97.union([z97.string(), z97.number(), z97.boolean()]).optional()
116250
+ });
116251
+ var serverLogicCacheConfigSchema = z97.object({
116252
+ ttl: z97.number(),
116253
+ staleWhileRevalidate: z97.boolean().optional()
116254
+ });
116255
+ var serverLogicSchemaObjectSchema = z97.lazy(
116256
+ () => z97.object({
116257
+ type: z97.enum(["string", "number", "integer", "boolean", "object", "array", "null"]).optional(),
116258
+ format: z97.string().optional(),
116259
+ description: z97.string().optional(),
116260
+ nullable: z97.boolean().optional(),
116261
+ enum: z97.array(z97.union([z97.string(), z97.number(), z97.boolean(), z97.null()])).optional(),
115783
116262
  items: serverLogicSchemaObjectSchema.optional(),
115784
- properties: z95.record(z95.string(), serverLogicSchemaObjectSchema).optional(),
115785
- required: z95.array(z95.string()).optional(),
115786
- additionalProperties: z95.union([z95.boolean(), serverLogicSchemaObjectSchema]).optional(),
115787
- minimum: z95.number().optional(),
115788
- maximum: z95.number().optional(),
115789
- minLength: z95.number().optional(),
115790
- maxLength: z95.number().optional(),
115791
- pattern: z95.string().optional()
116263
+ properties: z97.record(z97.string(), serverLogicSchemaObjectSchema).optional(),
116264
+ required: z97.array(z97.string()).optional(),
116265
+ additionalProperties: z97.union([z97.boolean(), serverLogicSchemaObjectSchema]).optional(),
116266
+ minimum: z97.number().optional(),
116267
+ maximum: z97.number().optional(),
116268
+ minLength: z97.number().optional(),
116269
+ maxLength: z97.number().optional(),
116270
+ pattern: z97.string().optional()
115792
116271
  })
115793
116272
  );
115794
- var serverLogicMediaTypeSchema = z95.object({
116273
+ var serverLogicMediaTypeSchema = z97.object({
115795
116274
  schema: serverLogicSchemaObjectSchema.optional(),
115796
- example: z95.unknown().optional()
116275
+ example: z97.unknown().optional()
115797
116276
  });
115798
- var serverLogicResponseSchema = z95.object({
115799
- description: z95.string().optional(),
115800
- content: z95.record(z95.string(), serverLogicMediaTypeSchema).optional()
116277
+ var serverLogicResponseSchema = z97.object({
116278
+ description: z97.string().optional(),
116279
+ content: z97.record(z97.string(), serverLogicMediaTypeSchema).optional()
115801
116280
  });
115802
116281
  var jsonBaseFields = {
115803
- description: z95.string(),
115804
- parameters: z95.array(parameterMetaSchema).optional(),
116282
+ description: z97.string(),
116283
+ parameters: z97.array(parameterMetaSchema).optional(),
115805
116284
  response: serverLogicResponseSchema.optional(),
115806
116285
  cache: serverLogicCacheConfigSchema.optional()
115807
116286
  };
115808
- var jsonSqlServerLogicSchema = z95.object({
116287
+ var jsonSqlServerLogicSchema = z97.object({
115809
116288
  ...jsonBaseFields,
115810
- type: z95.literal("sql").optional(),
115811
- query: z95.string(),
115812
- connectionId: z95.string()
116289
+ type: z97.literal("sql").optional(),
116290
+ query: z97.string(),
116291
+ connectionId: z97.string()
115813
116292
  });
115814
- var jsonTypeScriptServerLogicSchema = z95.object({
116293
+ var jsonTypeScriptServerLogicSchema = z97.object({
115815
116294
  ...jsonBaseFields,
115816
- type: z95.literal("typescript"),
115817
- handlerPath: z95.string()
116295
+ type: z97.literal("typescript"),
116296
+ handlerPath: z97.string()
115818
116297
  });
115819
- var anyJsonServerLogicSchema = z95.union([
116298
+ var anyJsonServerLogicSchema = z97.union([
115820
116299
  jsonTypeScriptServerLogicSchema,
115821
116300
  jsonSqlServerLogicSchema
115822
116301
  ]);