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