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