@squadbase/vite-server 0.1.19-dev.2880e8d → 0.1.19-dev.40d2ebd
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/build-entry/server-entry.mjs +13 -18
- package/dist/cli/index.js +460 -417
- package/dist/connectors/google-analytics-oauth.js +192 -96
- package/dist/index.d.ts +5 -22
- package/dist/index.js +617 -499
- package/dist/main.d.ts +1 -1
- package/dist/main.js +620 -502
- package/dist/types/server-logic.d.ts +0 -3
- package/dist/vite-plugin.d.ts +1 -7
- package/dist/vite-plugin.js +47523 -41
- package/package.json +2 -1
package/dist/cli/index.js
CHANGED
|
@@ -436,15 +436,15 @@ function parseOracleJdbcUrl(jdbcUrl, options = {}) {
|
|
|
436
436
|
}
|
|
437
437
|
if (URL_PREFIX_RE.test(trimmed)) {
|
|
438
438
|
const url = new URL(trimmed);
|
|
439
|
-
const
|
|
440
|
-
if (!url.hostname || !
|
|
439
|
+
const path5 = url.pathname.replace(/^\//, "");
|
|
440
|
+
if (!url.hostname || !path5) {
|
|
441
441
|
throw new Error(
|
|
442
442
|
`Invalid Oracle URL "${redactOracleUrl(trimmed)}". Expected oracle://[user:password@]host:port/service`
|
|
443
443
|
);
|
|
444
444
|
}
|
|
445
445
|
const port = url.port || "1521";
|
|
446
446
|
return {
|
|
447
|
-
connectString: `${url.hostname}:${port}/${
|
|
447
|
+
connectString: `${url.hostname}:${port}/${path5}`,
|
|
448
448
|
user: url.username ? decodeURIComponent(url.username) : options.username,
|
|
449
449
|
password: url.password ? decodeURIComponent(url.password) : options.password
|
|
450
450
|
};
|
|
@@ -689,8 +689,8 @@ var init_interactive = __esm({
|
|
|
689
689
|
|
|
690
690
|
// src/cli/index.ts
|
|
691
691
|
import { parseArgs } from "util";
|
|
692
|
-
import
|
|
693
|
-
import { readFile as
|
|
692
|
+
import path4 from "path";
|
|
693
|
+
import { readFile as readFile4 } from "fs/promises";
|
|
694
694
|
|
|
695
695
|
// src/connector-client/registry.ts
|
|
696
696
|
import { readFileSync, watch as fsWatch } from "fs";
|
|
@@ -8141,12 +8141,12 @@ var parameters13 = {
|
|
|
8141
8141
|
|
|
8142
8142
|
// ../connectors/src/connectors/airtable/utils.ts
|
|
8143
8143
|
var BASE_URL = "https://api.airtable.com/v0";
|
|
8144
|
-
async function apiFetch(params,
|
|
8144
|
+
async function apiFetch(params, path5, init) {
|
|
8145
8145
|
const apiKey = params[parameters13.apiKey.slug];
|
|
8146
8146
|
if (!apiKey) {
|
|
8147
8147
|
throw new Error("airtable: missing required parameter: api-key");
|
|
8148
8148
|
}
|
|
8149
|
-
const url = `${BASE_URL}${
|
|
8149
|
+
const url = `${BASE_URL}${path5.startsWith("/") ? "" : "/"}${path5}`;
|
|
8150
8150
|
const headers = new Headers(init?.headers);
|
|
8151
8151
|
headers.set("Authorization", `Bearer ${apiKey}`);
|
|
8152
8152
|
return fetch(url, { ...init, headers });
|
|
@@ -8348,16 +8348,16 @@ Authentication is handled automatically using the API Key.
|
|
|
8348
8348
|
{baseId} in the path is automatically replaced with the connection's base-id.`,
|
|
8349
8349
|
inputSchema: inputSchema19,
|
|
8350
8350
|
outputSchema: outputSchema19,
|
|
8351
|
-
async execute({ connectionId, method, path:
|
|
8351
|
+
async execute({ connectionId, method, path: path5, body }, connections) {
|
|
8352
8352
|
const connection = connections.find((c) => c.id === connectionId);
|
|
8353
8353
|
if (!connection) {
|
|
8354
8354
|
return { success: false, error: `Connection ${connectionId} not found` };
|
|
8355
8355
|
}
|
|
8356
|
-
console.log(`[connector-request] airtable/${connection.name}: ${method} ${
|
|
8356
|
+
console.log(`[connector-request] airtable/${connection.name}: ${method} ${path5}`);
|
|
8357
8357
|
try {
|
|
8358
8358
|
const apiKey = parameters13.apiKey.getValue(connection);
|
|
8359
8359
|
const baseId = parameters13.baseId.getValue(connection);
|
|
8360
|
-
const resolvedPath =
|
|
8360
|
+
const resolvedPath = path5.replace(/\{baseId\}/g, baseId);
|
|
8361
8361
|
const url = `${BASE_URL2}${resolvedPath}`;
|
|
8362
8362
|
const controller = new AbortController();
|
|
8363
8363
|
const timeout = setTimeout(() => controller.abort(), REQUEST_TIMEOUT_MS7);
|
|
@@ -9052,7 +9052,7 @@ Authentication is handled automatically via OAuth proxy.
|
|
|
9052
9052
|
{customerId} in the path is automatically replaced with the connection's customer ID (hyphens removed).`,
|
|
9053
9053
|
inputSchema: inputSchema21,
|
|
9054
9054
|
outputSchema: outputSchema21,
|
|
9055
|
-
async execute({ connectionId, method, path:
|
|
9055
|
+
async execute({ connectionId, method, path: path5, body }, connections, config) {
|
|
9056
9056
|
const connection = connections.find((c) => c.id === connectionId);
|
|
9057
9057
|
if (!connection) {
|
|
9058
9058
|
return {
|
|
@@ -9061,12 +9061,12 @@ Authentication is handled automatically via OAuth proxy.
|
|
|
9061
9061
|
};
|
|
9062
9062
|
}
|
|
9063
9063
|
console.log(
|
|
9064
|
-
`[connector-request] google-ads/${connection.name}: ${method} ${
|
|
9064
|
+
`[connector-request] google-ads/${connection.name}: ${method} ${path5}`
|
|
9065
9065
|
);
|
|
9066
9066
|
try {
|
|
9067
9067
|
const rawCustomerId = parameters14.customerId.tryGetValue(connection);
|
|
9068
9068
|
const customerId = rawCustomerId?.replace(/-/g, "") ?? "";
|
|
9069
|
-
const resolvedPath = customerId ?
|
|
9069
|
+
const resolvedPath = customerId ? path5.replace(/\{customerId\}/g, customerId) : path5;
|
|
9070
9070
|
const token = await getProxyToken5(config.oauthProxy);
|
|
9071
9071
|
const proxyUrl = `https://${config.oauthProxy.sandboxId}.${config.oauthProxy.previewBaseDomain}/_sqcore/connections/${connectionId}/request`;
|
|
9072
9072
|
const controller = new AbortController();
|
|
@@ -9413,7 +9413,7 @@ async function getAccessToken(serviceAccountKey) {
|
|
|
9413
9413
|
const data = await response.json();
|
|
9414
9414
|
return data.access_token;
|
|
9415
9415
|
}
|
|
9416
|
-
async function adminFetch(params,
|
|
9416
|
+
async function adminFetch(params, path5, init) {
|
|
9417
9417
|
const keyJsonBase64 = params[parameters15.serviceAccountKeyJsonBase64.slug];
|
|
9418
9418
|
if (!keyJsonBase64) {
|
|
9419
9419
|
throw new Error(
|
|
@@ -9422,12 +9422,12 @@ async function adminFetch(params, path4, init) {
|
|
|
9422
9422
|
}
|
|
9423
9423
|
const serviceAccountKey = decodeServiceAccount(keyJsonBase64);
|
|
9424
9424
|
const accessToken = await getAccessToken(serviceAccountKey);
|
|
9425
|
-
const url = `${ADMIN_BASE_URL}${
|
|
9425
|
+
const url = `${ADMIN_BASE_URL}${path5.startsWith("/") ? "" : "/"}${path5}`;
|
|
9426
9426
|
const headers = new Headers(init?.headers);
|
|
9427
9427
|
headers.set("Authorization", `Bearer ${accessToken}`);
|
|
9428
9428
|
return fetch(url, { ...init, headers });
|
|
9429
9429
|
}
|
|
9430
|
-
async function dataFetch(params,
|
|
9430
|
+
async function dataFetch(params, path5, init) {
|
|
9431
9431
|
const keyJsonBase64 = params[parameters15.serviceAccountKeyJsonBase64.slug];
|
|
9432
9432
|
if (!keyJsonBase64) {
|
|
9433
9433
|
throw new Error(
|
|
@@ -9436,7 +9436,7 @@ async function dataFetch(params, path4, init) {
|
|
|
9436
9436
|
}
|
|
9437
9437
|
const serviceAccountKey = decodeServiceAccount(keyJsonBase64);
|
|
9438
9438
|
const accessToken = await getAccessToken(serviceAccountKey);
|
|
9439
|
-
const url = `${DATA_BASE_URL}${
|
|
9439
|
+
const url = `${DATA_BASE_URL}${path5.startsWith("/") ? "" : "/"}${path5}`;
|
|
9440
9440
|
const headers = new Headers(init?.headers);
|
|
9441
9441
|
headers.set("Authorization", `Bearer ${accessToken}`);
|
|
9442
9442
|
return fetch(url, { ...init, headers });
|
|
@@ -9460,8 +9460,8 @@ async function listAccountSummaries(params) {
|
|
|
9460
9460
|
const summaries = [];
|
|
9461
9461
|
let pageToken;
|
|
9462
9462
|
do {
|
|
9463
|
-
const
|
|
9464
|
-
const res = await adminFetch(params,
|
|
9463
|
+
const path5 = pageToken ? `/accountSummaries?pageToken=${encodeURIComponent(pageToken)}` : `/accountSummaries`;
|
|
9464
|
+
const res = await adminFetch(params, path5);
|
|
9465
9465
|
if (!res.ok) {
|
|
9466
9466
|
const body = await res.text().catch(() => res.statusText);
|
|
9467
9467
|
throw new Error(
|
|
@@ -9700,9 +9700,9 @@ function renderTopPages(sections, report) {
|
|
|
9700
9700
|
sections.push("| Path | Page views | Active users | Avg session duration |");
|
|
9701
9701
|
sections.push("|------|------------|--------------|----------------------|");
|
|
9702
9702
|
for (const row of rows.slice(0, TOP_N_PAGES)) {
|
|
9703
|
-
const
|
|
9703
|
+
const path5 = truncate(row.dimensionValues?.[0]?.value, PAGE_PATH_MAX) || "-";
|
|
9704
9704
|
sections.push(
|
|
9705
|
-
`| ${escapePipe(
|
|
9705
|
+
`| ${escapePipe(path5)} | ${formatNumber(row.metricValues?.[0]?.value)} | ${formatNumber(
|
|
9706
9706
|
row.metricValues?.[1]?.value
|
|
9707
9707
|
)} | ${formatDuration(row.metricValues?.[2]?.value)} |`
|
|
9708
9708
|
);
|
|
@@ -10076,12 +10076,12 @@ var requestTool3 = new ConnectorTool({
|
|
|
10076
10076
|
Authentication is handled automatically using a service account.`,
|
|
10077
10077
|
inputSchema: inputSchema22,
|
|
10078
10078
|
outputSchema: outputSchema22,
|
|
10079
|
-
async execute({ connectionId, method, path:
|
|
10079
|
+
async execute({ connectionId, method, path: path5, body }, connections) {
|
|
10080
10080
|
const connection = connections.find((c) => c.id === connectionId);
|
|
10081
10081
|
if (!connection) {
|
|
10082
10082
|
return { success: false, error: `Connection ${connectionId} not found` };
|
|
10083
10083
|
}
|
|
10084
|
-
console.log(`[connector-request] google-analytics/${connection.name}: ${method} ${
|
|
10084
|
+
console.log(`[connector-request] google-analytics/${connection.name}: ${method} ${path5}`);
|
|
10085
10085
|
try {
|
|
10086
10086
|
const { GoogleAuth } = await import("google-auth-library");
|
|
10087
10087
|
const keyJsonBase64 = parameters15.serviceAccountKeyJsonBase64.getValue(connection);
|
|
@@ -10096,7 +10096,7 @@ Authentication is handled automatically using a service account.`,
|
|
|
10096
10096
|
if (!token) {
|
|
10097
10097
|
return { success: false, error: "Failed to obtain access token" };
|
|
10098
10098
|
}
|
|
10099
|
-
const url = `${BASE_URL3}${
|
|
10099
|
+
const url = `${BASE_URL3}${path5}`;
|
|
10100
10100
|
const controller = new AbortController();
|
|
10101
10101
|
const timeout = setTimeout(() => controller.abort(), REQUEST_TIMEOUT_MS10);
|
|
10102
10102
|
try {
|
|
@@ -10570,11 +10570,11 @@ var googleAnalyticsOauthOnboarding = new ConnectorOnboarding({
|
|
|
10570
10570
|
- \u30A2\u30AB\u30A6\u30F3\u30C8\u304C **1\u4EF6\u306E\u307F**: \`askUserQuestion\` \u306F\u30B9\u30AD\u30C3\u30D7\u3057\u3001\u305D\u306E\u30A2\u30AB\u30A6\u30F3\u30C8\u3092\u9078\u629E\u6E08\u307F\u3068\u3057\u3066\u6B21\u3078\u9032\u3080
|
|
10571
10571
|
- \u30A2\u30AB\u30A6\u30F3\u30C8\u304C **0\u4EF6**: \u30BB\u30C3\u30C8\u30A2\u30C3\u30D7\u3092\u4E2D\u65AD\u3057\u3001\u30E6\u30FC\u30B6\u30FC\u306B\u30A2\u30AF\u30BB\u30B9\u53EF\u80FD\u306A\u30A2\u30AB\u30A6\u30F3\u30C8\u304C\u306A\u3044\u65E8\u3092\u4F1D\u3048\u308B
|
|
10572
10572
|
3. \`${listPropertiesToolName}\` \u3092\u547C\u3073\u51FA\u3057\u3066\u3001\u9078\u629E\u3055\u308C\u305F\u30A2\u30AB\u30A6\u30F3\u30C8\u306E\u30D7\u30ED\u30D1\u30C6\u30A3\u4E00\u89A7\u3092\u53D6\u5F97\u3059\u308B
|
|
10573
|
-
4. \
|
|
10574
|
-
-
|
|
10575
|
-
- \u30D7\u30ED\u30D1\u30C6\u30A3\
|
|
10576
|
-
- \u30D7\u30ED\u30D1\u30C6\u30A3\u304C **0\u4EF6
|
|
10577
|
-
5. \u9078\u629E\
|
|
10573
|
+
4. \`updateConnectionParameters\` \u3092\u547C\u3073\u51FA\u3059:
|
|
10574
|
+
- \`parameterSlug\`: \`"property-id"\`
|
|
10575
|
+
- \`options\`: \u30D7\u30ED\u30D1\u30C6\u30A3\u4E00\u89A7\u3002\u5404 option \u306E \`label\` \u306F \`\u8868\u793A\u540D (id: \u30D7\u30ED\u30D1\u30C6\u30A3ID)\` \u306E\u5F62\u5F0F\u3001\`value\` \u306F\u30D7\u30ED\u30D1\u30C6\u30A3ID
|
|
10576
|
+
- \u30D7\u30ED\u30D1\u30C6\u30A3\u304C **0\u4EF6** \u306E\u5834\u5408\u306F\u30BB\u30C3\u30C8\u30A2\u30C3\u30D7\u3092\u4E2D\u65AD\u3057\u3001\u30E6\u30FC\u30B6\u30FC\u306B\u30A2\u30AF\u30BB\u30B9\u53EF\u80FD\u306A\u30D7\u30ED\u30D1\u30C6\u30A3\u304C\u306A\u3044\u65E8\u3092\u4F1D\u3048\u308B
|
|
10577
|
+
5. \u30E6\u30FC\u30B6\u30FC\u304C\u9078\u629E\u3057\u305F\u30D7\u30ED\u30D1\u30C6\u30A3\u306E \`label\` \u304C\u30E1\u30C3\u30BB\u30FC\u30B8\u3068\u3057\u3066\u5C4A\u304F\u306E\u3067\u3001\u6B21\u306E\u30B9\u30C6\u30C3\u30D7\u306B\u9032\u3080
|
|
10578
10578
|
|
|
10579
10579
|
#### \u5236\u7D04
|
|
10580
10580
|
- **\u30BB\u30C3\u30C8\u30A2\u30C3\u30D7\u4E2D\u306B\u30EC\u30DD\u30FC\u30C8\u30C7\u30FC\u30BF\u3092\u53D6\u5F97\u3057\u306A\u3044\u3053\u3068**\u3002\u5B9F\u884C\u3057\u3066\u3088\u3044\u306E\u306F\u4E0A\u8A18\u624B\u9806\u3067\u6307\u5B9A\u3055\u308C\u305F\u30E1\u30BF\u30C7\u30FC\u30BF\u53D6\u5F97\u306E\u307F
|
|
@@ -10588,11 +10588,11 @@ var googleAnalyticsOauthOnboarding = new ConnectorOnboarding({
|
|
|
10588
10588
|
- **Only 1 account**: Skip \`askUserQuestion\` and proceed using that account as the selection
|
|
10589
10589
|
- **0 accounts**: Abort setup and inform the user that no accessible accounts are available
|
|
10590
10590
|
3. Call \`${listPropertiesToolName}\` to get the list of properties for the selected account
|
|
10591
|
-
4.
|
|
10592
|
-
-
|
|
10593
|
-
-
|
|
10594
|
-
- **0 properties
|
|
10595
|
-
5.
|
|
10591
|
+
4. Call \`updateConnectionParameters\`:
|
|
10592
|
+
- \`parameterSlug\`: \`"property-id"\`
|
|
10593
|
+
- \`options\`: The property list. Each option's \`label\` should be \`Display Name (id: propertyId)\`, \`value\` should be the property ID
|
|
10594
|
+
- If **0 properties** are returned, abort setup and inform the user that no accessible properties are available
|
|
10595
|
+
5. The \`label\` of the user's selected property will arrive as a message. Proceed to the next step
|
|
10596
10596
|
|
|
10597
10597
|
#### Constraints
|
|
10598
10598
|
- **Do NOT fetch report data during setup**. Only the metadata requests specified in the steps above are allowed
|
|
@@ -10600,17 +10600,26 @@ var googleAnalyticsOauthOnboarding = new ConnectorOnboarding({
|
|
|
10600
10600
|
- Write only 1 sentence between tool calls, then immediately call the next tool. Skip unnecessary explanations and proceed efficiently`
|
|
10601
10601
|
},
|
|
10602
10602
|
dataOverviewInstructions: {
|
|
10603
|
-
en: `
|
|
10604
|
-
|
|
10605
|
-
|
|
10606
|
-
|
|
10607
|
-
1. connector_google-analytics-oauth_request \u3067 GET properties/<propertyId>/metadata \u3092\u547C\u3073\u51FA\u3057\u3001\u5229\u7528\u53EF\u80FD\u306A\u30C7\u30A3\u30E1\u30F3\u30B7\u30E7\u30F3\u3068\u30E1\u30C8\u30EA\u30AF\u30B9\u306E\u4E00\u89A7\u3092\u53D6\u5F97
|
|
10608
|
-
2. connector_google-analytics-oauth_request \u3067 POST properties/<propertyId>:runReport \u3092\u77ED\u3044\u671F\u9593\u3068\u57FA\u672C\u30E1\u30C8\u30EA\u30AF\u30B9\u3067\u547C\u3073\u51FA\u3057\u3001\u30C7\u30FC\u30BF\u306E\u53EF\u7528\u6027\u3092\u78BA\u8A8D`
|
|
10603
|
+
en: `1. Call connector_google-analytics-oauth_request with GET properties/{propertyId}/metadata to list available dimensions and metrics
|
|
10604
|
+
2. Call connector_google-analytics-oauth_request with POST properties/{propertyId}:runReport using a small date range and basic metrics to verify data availability`,
|
|
10605
|
+
ja: `1. connector_google-analytics-oauth_request \u3067 GET properties/{propertyId}/metadata \u3092\u547C\u3073\u51FA\u3057\u3001\u5229\u7528\u53EF\u80FD\u306A\u30C7\u30A3\u30E1\u30F3\u30B7\u30E7\u30F3\u3068\u30E1\u30C8\u30EA\u30AF\u30B9\u306E\u4E00\u89A7\u3092\u53D6\u5F97
|
|
10606
|
+
2. connector_google-analytics-oauth_request \u3067 POST properties/{propertyId}:runReport \u3092\u77ED\u3044\u671F\u9593\u3068\u57FA\u672C\u30E1\u30C8\u30EA\u30AF\u30B9\u3067\u547C\u3073\u51FA\u3057\u3001\u30C7\u30FC\u30BF\u306E\u53EF\u7528\u6027\u3092\u78BA\u8A8D`
|
|
10609
10607
|
}
|
|
10610
10608
|
});
|
|
10611
10609
|
|
|
10612
10610
|
// ../connectors/src/connectors/google-analytics-oauth/parameters.ts
|
|
10613
|
-
|
|
10611
|
+
init_parameter_definition();
|
|
10612
|
+
var parameters16 = {
|
|
10613
|
+
propertyId: new ParameterDefinition({
|
|
10614
|
+
slug: "property-id",
|
|
10615
|
+
name: "Default Property ID",
|
|
10616
|
+
description: "Optional default Google Analytics 4 property ID (e.g., 123456789) used when a request does not specify one. Can be found in GA4 Admin > Property Settings. Leave empty to always pass the property ID per request.",
|
|
10617
|
+
envVarBaseKey: "GA_OAUTH_PROPERTY_ID",
|
|
10618
|
+
type: "text",
|
|
10619
|
+
secret: false,
|
|
10620
|
+
required: false
|
|
10621
|
+
})
|
|
10622
|
+
};
|
|
10614
10623
|
|
|
10615
10624
|
// ../connectors/src/connectors/google-analytics-oauth/setup-flow.ts
|
|
10616
10625
|
var ADMIN_BASE_URL4 = "https://analyticsadmin.googleapis.com/v1beta";
|
|
@@ -10917,7 +10926,7 @@ var inputSchema25 = z25.object({
|
|
|
10917
10926
|
connectionId: z25.string().describe("ID of the Google Analytics OAuth connection to use"),
|
|
10918
10927
|
method: z25.enum(["GET", "POST"]).describe("HTTP method"),
|
|
10919
10928
|
path: z25.string().describe(
|
|
10920
|
-
"API path appended to https://analyticsdata.googleapis.com/v1beta/ (e.g., 'properties/123456789:runReport'). Write the numeric property id directly
|
|
10929
|
+
"API path appended to https://analyticsdata.googleapis.com/v1beta/ (e.g., 'properties/123456789:runReport'). Write the numeric property id directly; the {propertyId} placeholder is only substituted when a default property is configured on the connection."
|
|
10921
10930
|
),
|
|
10922
10931
|
body: z25.record(z25.string(), z25.unknown()).optional().describe("POST request body (JSON)")
|
|
10923
10932
|
});
|
|
@@ -10936,10 +10945,10 @@ var requestTool4 = new ConnectorTool({
|
|
|
10936
10945
|
name: "request",
|
|
10937
10946
|
description: `Send authenticated requests to the Google Analytics Data API v1beta.
|
|
10938
10947
|
Authentication is handled automatically via OAuth proxy.
|
|
10939
|
-
Write the numeric property id directly into the path (e.g. properties/123456789:runReport).`,
|
|
10948
|
+
Write the numeric property id directly into the path (e.g. properties/123456789:runReport). The {propertyId} placeholder is only substituted when a default property is configured on the connection.`,
|
|
10940
10949
|
inputSchema: inputSchema25,
|
|
10941
10950
|
outputSchema: outputSchema25,
|
|
10942
|
-
async execute({ connectionId, method, path:
|
|
10951
|
+
async execute({ connectionId, method, path: path5, body }, connections, config) {
|
|
10943
10952
|
const connection = connections.find((c) => c.id === connectionId);
|
|
10944
10953
|
if (!connection) {
|
|
10945
10954
|
return {
|
|
@@ -10948,10 +10957,12 @@ Write the numeric property id directly into the path (e.g. properties/123456789:
|
|
|
10948
10957
|
};
|
|
10949
10958
|
}
|
|
10950
10959
|
console.log(
|
|
10951
|
-
`[connector-request] google-analytics-oauth/${connection.name}: ${method} ${
|
|
10960
|
+
`[connector-request] google-analytics-oauth/${connection.name}: ${method} ${path5}`
|
|
10952
10961
|
);
|
|
10953
10962
|
try {
|
|
10954
|
-
const
|
|
10963
|
+
const propertyId = parameters16.propertyId.tryGetValue(connection);
|
|
10964
|
+
const resolvedPath = propertyId ? path5.replace(/\{propertyId\}/g, propertyId) : path5;
|
|
10965
|
+
const url = `${BASE_URL4}${resolvedPath}`;
|
|
10955
10966
|
const token = await getProxyToken8(config.oauthProxy);
|
|
10956
10967
|
const proxyUrl = `https://${config.oauthProxy.sandboxId}.${config.oauthProxy.previewBaseDomain}/_sqcore/connections/${connectionId}/request`;
|
|
10957
10968
|
const controller = new AbortController();
|
|
@@ -11021,20 +11032,24 @@ var googleAnalyticsOauthConnector = new ConnectorPlugin({
|
|
|
11021
11032
|
systemPrompt: {
|
|
11022
11033
|
en: `### Tools
|
|
11023
11034
|
|
|
11024
|
-
- \`connector_google-analytics-oauth_request\`: Send authenticated requests to the GA4 Data API. Use it for running reports, getting metadata, and realtime reports. Write the target property into the path as \`properties/{numericPropertyId}
|
|
11035
|
+
- \`connector_google-analytics-oauth_request\`: Send authenticated requests to the GA4 Data API. Use it for running reports, getting metadata, and realtime reports. Write the target property into the path as \`properties/{numericPropertyId}\` (the \`{propertyId}\` placeholder is only substituted when a default property is configured on the connection). Authentication is configured automatically via OAuth.
|
|
11025
11036
|
- \`connector_google-analytics-oauth_listAccounts\`: List accessible Google Analytics accounts. Use during setup to discover available accounts.
|
|
11026
11037
|
- \`connector_google-analytics-oauth_listProperties\`: List GA4 properties for a given account. Use during setup to select the target property.
|
|
11027
11038
|
|
|
11028
|
-
### GA4 Data API Reference
|
|
11029
|
-
|
|
11030
|
-
These raw HTTP shapes describe the discovery **tool** above. **In server-logic (Business Logic below) do NOT hand-build these HTTP requests \u2014 call the SDK method on the same line, which takes the same body fields and returns already-parsed JSON:**
|
|
11039
|
+
### GA4 Data API Reference
|
|
11031
11040
|
|
|
11032
|
-
|
|
11033
|
-
|
|
11034
|
-
| \`GET properties/{propertyId}/metadata\` | \`await client.getMetadata(propertyId)\` |
|
|
11035
|
-
| \`POST properties/{propertyId}:runReport\` with body \`{ dateRanges, dimensions, metrics, limit }\` | \`await client.runReport({ propertyId, dateRanges, dimensions, metrics, limit })\` \u2192 \`{ rows, rowCount }\` |
|
|
11041
|
+
#### Get Metadata (Check available dimensions and metrics)
|
|
11042
|
+
- GET properties/{propertyId}/metadata
|
|
11036
11043
|
|
|
11037
|
-
|
|
11044
|
+
### Get Report
|
|
11045
|
+
- POST properties/{propertyId}:runReport
|
|
11046
|
+
- Body example:
|
|
11047
|
+
{
|
|
11048
|
+
"dateRanges": [{"startDate": "7daysAgo", "endDate": "today"}],
|
|
11049
|
+
"dimensions": [{"name": "date"}],
|
|
11050
|
+
"metrics": [{"name": "activeUsers"}],
|
|
11051
|
+
"limit": 100
|
|
11052
|
+
}
|
|
11038
11053
|
|
|
11039
11054
|
### Common Dimensions
|
|
11040
11055
|
date, country, city, deviceCategory, browser, pagePath, pageTitle,
|
|
@@ -11052,14 +11067,13 @@ averageSessionDuration, conversions, totalRevenue
|
|
|
11052
11067
|
|
|
11053
11068
|
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 and do NOT read \`INTERNAL_SQUADBASE_*\` env vars \u2014 the SDK takes care of OAuth.
|
|
11054
11069
|
|
|
11055
|
-
SDK surface (client created via \`connection(connectionId)\`)
|
|
11056
|
-
- \`client.
|
|
11057
|
-
- \`client.
|
|
11058
|
-
- \`client.
|
|
11059
|
-
|
|
11060
|
-
**Anti-pattern \u2014 do NOT do this.** \`client.request(...)\` is a low-level escape hatch that returns a raw \`Response\`; it is NOT how you run a report. In particular, **never call \`client.request({ method, path, body })\`** \u2014 that object shape belongs to the discovery *tool*, not the SDK. It will not run the report, and \`(await client.request({...})).rows\` is always \`undefined\`. Use \`client.runReport({ propertyId, ... })\` instead.
|
|
11070
|
+
SDK surface (client created via \`connection(connectionId)\`):
|
|
11071
|
+
- \`client.request(path, init?)\` \u2014 low-level authenticated fetch (\`path\` is appended to \`https://analyticsdata.googleapis.com/v1beta/\`; \`{propertyId}\` placeholders are auto-replaced only when a default property is configured on the connection).
|
|
11072
|
+
- \`client.runReport(request)\` \u2014 run a GA4 report. Set \`propertyId\` (bare numeric id) on the request object to target a property; required when no default is configured.
|
|
11073
|
+
- \`client.runRealtimeReport(request)\` \u2014 run a realtime report. \`propertyId\` works the same as \`runReport\`.
|
|
11074
|
+
- \`client.getMetadata(propertyId?)\` \u2014 fetch available dimensions and metrics for a property.
|
|
11061
11075
|
|
|
11062
|
-
|
|
11076
|
+
**Always pass \`propertyId\` explicitly** (the numeric id from the data overview) \u2014 the connection does not necessarily store a default property.
|
|
11063
11077
|
|
|
11064
11078
|
If a handler test fails with \`Connection proxy is not configured\`, retry \u2014 the sandbox is still initializing. Do NOT abandon the SDK and construct OAuth proxy URLs manually.
|
|
11065
11079
|
|
|
@@ -11068,42 +11082,51 @@ If a handler test fails with \`Connection proxy is not configured\`, retry \u201
|
|
|
11068
11082
|
\`\`\`ts
|
|
11069
11083
|
import { connection } from "@squadbase/vite-server/connectors/google-analytics-oauth";
|
|
11070
11084
|
|
|
11071
|
-
|
|
11072
|
-
|
|
11073
|
-
const propertyId = "123456789"; // numeric GA4 property id from the data overview
|
|
11074
|
-
|
|
11075
|
-
const { rows } = await client.runReport({
|
|
11076
|
-
propertyId,
|
|
11077
|
-
dateRanges: [{ startDate: "28daysAgo", endDate: "today" }],
|
|
11078
|
-
dimensions: [{ name: "date" }, { name: "sessionDefaultChannelGroup" }],
|
|
11079
|
-
metrics: [{ name: "sessions" }],
|
|
11080
|
-
});
|
|
11085
|
+
const ga = connection("<connectionId>");
|
|
11086
|
+
const propertyId = "123456789"; // numeric GA4 property id from the data overview
|
|
11081
11087
|
|
|
11082
|
-
|
|
11083
|
-
|
|
11084
|
-
|
|
11085
|
-
|
|
11086
|
-
}
|
|
11088
|
+
// Convenience methods (pass propertyId explicitly)
|
|
11089
|
+
const { rows, rowCount } = await ga.runReport({
|
|
11090
|
+
propertyId,
|
|
11091
|
+
dateRanges: [{ startDate: "7daysAgo", endDate: "today" }],
|
|
11092
|
+
dimensions: [{ name: "date" }],
|
|
11093
|
+
metrics: [{ name: "activeUsers" }, { name: "sessions" }],
|
|
11094
|
+
limit: 100,
|
|
11095
|
+
});
|
|
11096
|
+
const metadata = await ga.getMetadata(propertyId);
|
|
11097
|
+
const realtime = await ga.runRealtimeReport({
|
|
11098
|
+
propertyId,
|
|
11099
|
+
metrics: [{ name: "activeUsers" }],
|
|
11100
|
+
dimensions: [{ name: "country" }],
|
|
11101
|
+
});
|
|
11087
11102
|
|
|
11088
|
-
|
|
11089
|
-
}
|
|
11103
|
+
// Low-level authenticated fetch (write the numeric property id into the path)
|
|
11104
|
+
const res = await ga.request(\`properties/\${propertyId}:runReport\`, {
|
|
11105
|
+
method: "POST",
|
|
11106
|
+
body: JSON.stringify({ dateRanges: [{ startDate: "7daysAgo", endDate: "today" }], metrics: [{ name: "activeUsers" }] }),
|
|
11107
|
+
});
|
|
11108
|
+
const data = await res.json();
|
|
11090
11109
|
\`\`\``,
|
|
11091
11110
|
ja: `### \u30C4\u30FC\u30EB
|
|
11092
11111
|
|
|
11093
|
-
- \`connector_google-analytics-oauth_request\`: GA4 Data API\u3078\u8A8D\u8A3C\u6E08\u307F\u30EA\u30AF\u30A8\u30B9\u30C8\u3092\u9001\u4FE1\u3057\u307E\u3059\u3002\u30EC\u30DD\u30FC\u30C8\u306E\u5B9F\u884C\u3001\u30E1\u30BF\u30C7\u30FC\u30BF\u306E\u53D6\u5F97\u3001\u30EA\u30A2\u30EB\u30BF\u30A4\u30E0\u30EC\u30DD\u30FC\u30C8\u306B\u4F7F\u7528\u3057\u307E\u3059\u3002\u5BFE\u8C61\u30D7\u30ED\u30D1\u30C6\u30A3\u306F\u30D1\u30B9\u306B \`properties/{\u6570\u5024\u306E\u30D7\u30ED\u30D1\u30C6\u30A3ID}\` \u306E\u5F62\u3067\u76F4\u63A5\u8A18\u8FF0\u3057\u3066\u304F\u3060\u3055\u3044\u3002OAuth\u7D4C\u7531\u3067\u8A8D\u8A3C\u306F\u81EA\u52D5\u8A2D\u5B9A\u3055\u308C\u307E\u3059\u3002
|
|
11112
|
+
- \`connector_google-analytics-oauth_request\`: GA4 Data API\u3078\u8A8D\u8A3C\u6E08\u307F\u30EA\u30AF\u30A8\u30B9\u30C8\u3092\u9001\u4FE1\u3057\u307E\u3059\u3002\u30EC\u30DD\u30FC\u30C8\u306E\u5B9F\u884C\u3001\u30E1\u30BF\u30C7\u30FC\u30BF\u306E\u53D6\u5F97\u3001\u30EA\u30A2\u30EB\u30BF\u30A4\u30E0\u30EC\u30DD\u30FC\u30C8\u306B\u4F7F\u7528\u3057\u307E\u3059\u3002\u5BFE\u8C61\u30D7\u30ED\u30D1\u30C6\u30A3\u306F\u30D1\u30B9\u306B \`properties/{\u6570\u5024\u306E\u30D7\u30ED\u30D1\u30C6\u30A3ID}\` \u306E\u5F62\u3067\u76F4\u63A5\u8A18\u8FF0\u3057\u3066\u304F\u3060\u3055\u3044\uFF08\`{propertyId}\` \u30D7\u30EC\u30FC\u30B9\u30DB\u30EB\u30C0\u30FC\u306F\u30B3\u30CD\u30AF\u30B7\u30E7\u30F3\u306B\u30C7\u30D5\u30A9\u30EB\u30C8\u30D7\u30ED\u30D1\u30C6\u30A3\u304C\u8A2D\u5B9A\u3055\u308C\u3066\u3044\u308B\u5834\u5408\u306E\u307F\u7F6E\u63DB\u3055\u308C\u307E\u3059\uFF09\u3002OAuth\u7D4C\u7531\u3067\u8A8D\u8A3C\u306F\u81EA\u52D5\u8A2D\u5B9A\u3055\u308C\u307E\u3059\u3002
|
|
11094
11113
|
- \`connector_google-analytics-oauth_listAccounts\`: \u30A2\u30AF\u30BB\u30B9\u53EF\u80FD\u306AGoogle Analytics\u30A2\u30AB\u30A6\u30F3\u30C8\u306E\u4E00\u89A7\u3092\u53D6\u5F97\u3057\u307E\u3059\u3002\u30BB\u30C3\u30C8\u30A2\u30C3\u30D7\u6642\u306B\u5229\u7528\u53EF\u80FD\u306A\u30A2\u30AB\u30A6\u30F3\u30C8\u3092\u78BA\u8A8D\u3059\u308B\u305F\u3081\u306B\u4F7F\u7528\u3057\u307E\u3059\u3002
|
|
11095
11114
|
- \`connector_google-analytics-oauth_listProperties\`: \u6307\u5B9A\u30A2\u30AB\u30A6\u30F3\u30C8\u306EGA4\u30D7\u30ED\u30D1\u30C6\u30A3\u4E00\u89A7\u3092\u53D6\u5F97\u3057\u307E\u3059\u3002\u30BB\u30C3\u30C8\u30A2\u30C3\u30D7\u6642\u306B\u30BF\u30FC\u30B2\u30C3\u30C8\u30D7\u30ED\u30D1\u30C6\u30A3\u3092\u9078\u629E\u3059\u308B\u305F\u3081\u306B\u4F7F\u7528\u3057\u307E\u3059\u3002
|
|
11096
11115
|
|
|
11097
|
-
### GA4 Data API \u30EA\u30D5\u30A1\u30EC\u30F3\u30B9
|
|
11098
|
-
|
|
11099
|
-
\u4EE5\u4E0B\u306E\u751F\u306E HTTP \u5F62\u5F0F\u306F\u63A2\u7D22\u7528**\u30C4\u30FC\u30EB**\u306E\u3082\u306E\u3067\u3059\u3002**server-logic\uFF08\u4E0B\u8A18 Business Logic\uFF09\u3067\u306F\u3001\u3053\u308C\u3089\u306E HTTP \u30EA\u30AF\u30A8\u30B9\u30C8\u3092\u624B\u7D44\u307F\u3057\u306A\u3044\u3067\u304F\u3060\u3055\u3044 \u2014 \u540C\u3058 body \u30D5\u30A3\u30FC\u30EB\u30C9\u3092\u53D6\u308A\u3001\u30D1\u30FC\u30B9\u6E08\u307F JSON \u3092\u8FD4\u3059 SDK \u30E1\u30BD\u30C3\u30C9\u3092\u547C\u3093\u3067\u304F\u3060\u3055\u3044:**
|
|
11116
|
+
### GA4 Data API \u30EA\u30D5\u30A1\u30EC\u30F3\u30B9
|
|
11100
11117
|
|
|
11101
|
-
|
|
11102
|
-
|
|
11103
|
-
| \`GET properties/{propertyId}/metadata\` | \`await client.getMetadata(propertyId)\` |
|
|
11104
|
-
| \`POST properties/{propertyId}:runReport\`\uFF08body: \`{ dateRanges, dimensions, metrics, limit }\`\uFF09 | \`await client.runReport({ propertyId, dateRanges, dimensions, metrics, limit })\` \u2192 \`{ rows, rowCount }\` |
|
|
11118
|
+
#### \u30E1\u30BF\u30C7\u30FC\u30BF\u306E\u53D6\u5F97\uFF08\u5229\u7528\u53EF\u80FD\u306A\u30C7\u30A3\u30E1\u30F3\u30B7\u30E7\u30F3\u3068\u30E1\u30C8\u30EA\u30AF\u30B9\u306E\u78BA\u8A8D\uFF09
|
|
11119
|
+
- GET properties/{propertyId}/metadata
|
|
11105
11120
|
|
|
11106
|
-
\u30EC\u30DD\u30FC\u30C8\u306E
|
|
11121
|
+
### \u30EC\u30DD\u30FC\u30C8\u306E\u53D6\u5F97
|
|
11122
|
+
- POST properties/{propertyId}:runReport
|
|
11123
|
+
- Body\u4F8B:
|
|
11124
|
+
{
|
|
11125
|
+
"dateRanges": [{"startDate": "7daysAgo", "endDate": "today"}],
|
|
11126
|
+
"dimensions": [{"name": "date"}],
|
|
11127
|
+
"metrics": [{"name": "activeUsers"}],
|
|
11128
|
+
"limit": 100
|
|
11129
|
+
}
|
|
11107
11130
|
|
|
11108
11131
|
### \u4E3B\u8981\u306A\u30C7\u30A3\u30E1\u30F3\u30B7\u30E7\u30F3
|
|
11109
11132
|
date, country, city, deviceCategory, browser, pagePath, pageTitle,
|
|
@@ -11121,14 +11144,13 @@ averageSessionDuration, conversions, totalRevenue
|
|
|
11121
11144
|
|
|
11122
11145
|
\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\u30BF SDK \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\`INTERNAL_SQUADBASE_*\` \u306E\u74B0\u5883\u5909\u6570\u3092\u4F7F\u3063\u3066\u624B\u52D5\u3067 OAuth \u30D7\u30ED\u30AD\u30B7\u3092\u53E9\u304F\u3053\u3068\u3082\u3057\u306A\u3044\u3067\u304F\u3060\u3055\u3044 \u2014 SDK \u304C OAuth \u3092\u51E6\u7406\u3057\u307E\u3059\u3002
|
|
11123
11146
|
|
|
11124
|
-
SDK\uFF08\`connection(connectionId)\` \u3067\u4F5C\u6210\u3057\u305F\u30AF\u30E9\u30A4\u30A2\u30F3\u30C8\uFF09
|
|
11125
|
-
- \`client.
|
|
11126
|
-
- \`client.
|
|
11127
|
-
- \`client.
|
|
11128
|
-
|
|
11129
|
-
**\u30A2\u30F3\u30C1\u30D1\u30BF\u30FC\u30F3 \u2014 \u3053\u308C\u306F\u7D76\u5BFE\u306B\u3084\u3089\u306A\u3044\u3067\u304F\u3060\u3055\u3044\u3002** \`client.request(...)\` \u306F\u751F\u306E \`Response\` \u3092\u8FD4\u3059\u4F4E\u30EC\u30D9\u30EB\u306E\u9003\u3052\u9053\u3067\u3042\u308A\u3001\u30EC\u30DD\u30FC\u30C8\u5B9F\u884C\u306E\u624B\u6BB5\u3067\u306F\u3042\u308A\u307E\u305B\u3093\u3002\u7279\u306B **\`client.request({ method, path, body })\` \u306F\u7D76\u5BFE\u306B\u547C\u3070\u306A\u3044\u3067\u304F\u3060\u3055\u3044** \u2014 \u305D\u306E\u30AA\u30D6\u30B8\u30A7\u30AF\u30C8\u5F62\u306F\u63A2\u7D22\u7528*\u30C4\u30FC\u30EB*\u306E\u5F62\u3067\u3042\u3063\u3066 SDK \u306E\u3082\u306E\u3067\u306F\u3042\u308A\u307E\u305B\u3093\u3002\u30EC\u30DD\u30FC\u30C8\u306F\u5B9F\u884C\u3055\u308C\u305A\u3001\`(await client.request({...})).rows\` \u306F\u5E38\u306B \`undefined\` \u306B\u306A\u308A\u307E\u3059\u3002\u4EE3\u308F\u308A\u306B \`client.runReport({ propertyId, ... })\` \u3092\u4F7F\u3063\u3066\u304F\u3060\u3055\u3044\u3002
|
|
11147
|
+
SDK\uFF08\`connection(connectionId)\` \u3067\u4F5C\u6210\u3057\u305F\u30AF\u30E9\u30A4\u30A2\u30F3\u30C8\uFF09:
|
|
11148
|
+
- \`client.request(path, init?)\` \u2014 \u4F4E\u30EC\u30D9\u30EB\u306E\u8A8D\u8A3C\u4ED8\u304D fetch\uFF08\`path\` \u306F \`https://analyticsdata.googleapis.com/v1beta/\` \u306B\u8FFD\u52A0\u3055\u308C\u307E\u3059\u3002\`{propertyId}\` \u30D7\u30EC\u30FC\u30B9\u30DB\u30EB\u30C0\u306F\u30B3\u30CD\u30AF\u30B7\u30E7\u30F3\u306B\u30C7\u30D5\u30A9\u30EB\u30C8\u30D7\u30ED\u30D1\u30C6\u30A3\u304C\u8A2D\u5B9A\u3055\u308C\u3066\u3044\u308B\u5834\u5408\u306E\u307F\u81EA\u52D5\u7F6E\u63DB\u3055\u308C\u307E\u3059\uFF09\u3002
|
|
11149
|
+
- \`client.runReport(request)\` \u2014 GA4 \u30EC\u30DD\u30FC\u30C8\u3092\u5B9F\u884C\u3002\u30EA\u30AF\u30A8\u30B9\u30C8\u30AA\u30D6\u30B8\u30A7\u30AF\u30C8\u306B \`propertyId\`\uFF08\u6570\u5024\u306E\u30D7\u30ED\u30D1\u30C6\u30A3ID\uFF09\u3092\u6307\u5B9A\u3057\u3066\u5BFE\u8C61\u30D7\u30ED\u30D1\u30C6\u30A3\u3092\u6C7A\u3081\u307E\u3059\u3002\u30C7\u30D5\u30A9\u30EB\u30C8\u672A\u8A2D\u5B9A\u306E\u5834\u5408\u306F\u5FC5\u9808\u3067\u3059\u3002
|
|
11150
|
+
- \`client.runRealtimeReport(request)\` \u2014 \u30EA\u30A2\u30EB\u30BF\u30A4\u30E0\u30EC\u30DD\u30FC\u30C8\u3092\u5B9F\u884C\u3002\`propertyId\` \u306E\u6271\u3044\u306F \`runReport\` \u3068\u540C\u3058\u3067\u3059\u3002
|
|
11151
|
+
- \`client.getMetadata(propertyId?)\` \u2014 \u6307\u5B9A\u30D7\u30ED\u30D1\u30C6\u30A3\u306E\u5229\u7528\u53EF\u80FD\u306A\u30C7\u30A3\u30E1\u30F3\u30B7\u30E7\u30F3\u3068\u30E1\u30C8\u30EA\u30AF\u30B9\u3092\u53D6\u5F97\u3002
|
|
11130
11152
|
|
|
11131
|
-
**\`propertyId\` \u306F\
|
|
11153
|
+
**\`propertyId\` \u306F\u5FC5\u305A\u660E\u793A\u7684\u306B\u6E21\u3057\u3066\u304F\u3060\u3055\u3044**\uFF08\u30C7\u30FC\u30BF\u6982\u8981\u306B\u8F09\u3063\u3066\u3044\u308B\u6570\u5024ID\uFF09\u3002\u30B3\u30CD\u30AF\u30B7\u30E7\u30F3\u306B\u30C7\u30D5\u30A9\u30EB\u30C8\u30D7\u30ED\u30D1\u30C6\u30A3\u304C\u4FDD\u5B58\u3055\u308C\u3066\u3044\u308B\u3068\u306F\u9650\u308A\u307E\u305B\u3093\u3002
|
|
11132
11154
|
|
|
11133
11155
|
\u30CF\u30F3\u30C9\u30E9\u306E\u30C6\u30B9\u30C8\u304C \`Connection proxy is not configured\` \u3067\u5931\u6557\u3059\u308B\u5834\u5408\u306F\u518D\u8A66\u884C\u3057\u3066\u304F\u3060\u3055\u3044\u3002\u901A\u5E38\u306F\u30B5\u30F3\u30C9\u30DC\u30C3\u30AF\u30B9\u306E\u521D\u671F\u5316\u4E2D\u306B\u8D77\u304D\u307E\u3059\u3002SDK \u3092\u8AE6\u3081\u3066 OAuth \u30D7\u30ED\u30AD\u30B7\u306E URL \u3092\u81EA\u5206\u3067\u7D44\u307F\u7ACB\u3066\u308B\u3053\u3068\u306F **\u3057\u306A\u3044\u3067\u304F\u3060\u3055\u3044**\u3002
|
|
11134
11156
|
|
|
@@ -11137,32 +11159,41 @@ SDK\uFF08\`connection(connectionId)\` \u3067\u4F5C\u6210\u3057\u305F\u30AF\u30E9
|
|
|
11137
11159
|
\`\`\`ts
|
|
11138
11160
|
import { connection } from "@squadbase/vite-server/connectors/google-analytics-oauth";
|
|
11139
11161
|
|
|
11140
|
-
|
|
11141
|
-
|
|
11142
|
-
const propertyId = "123456789"; // \u30C7\u30FC\u30BF\u6982\u8981\u306B\u8F09\u3063\u3066\u3044\u308B\u6570\u5024\u306E GA4 \u30D7\u30ED\u30D1\u30C6\u30A3ID
|
|
11143
|
-
|
|
11144
|
-
const { rows } = await client.runReport({
|
|
11145
|
-
propertyId,
|
|
11146
|
-
dateRanges: [{ startDate: "28daysAgo", endDate: "today" }],
|
|
11147
|
-
dimensions: [{ name: "date" }, { name: "sessionDefaultChannelGroup" }],
|
|
11148
|
-
metrics: [{ name: "sessions" }],
|
|
11149
|
-
});
|
|
11162
|
+
const ga = connection("<connectionId>");
|
|
11163
|
+
const propertyId = "123456789"; // \u30C7\u30FC\u30BF\u6982\u8981\u306B\u8F09\u3063\u3066\u3044\u308B\u6570\u5024\u306E GA4 \u30D7\u30ED\u30D1\u30C6\u30A3ID
|
|
11150
11164
|
|
|
11151
|
-
|
|
11152
|
-
|
|
11153
|
-
|
|
11154
|
-
|
|
11155
|
-
}
|
|
11165
|
+
// \u4FBF\u5229\u30E1\u30BD\u30C3\u30C9\uFF08propertyId \u3092\u660E\u793A\u7684\u306B\u6E21\u3059\uFF09
|
|
11166
|
+
const { rows, rowCount } = await ga.runReport({
|
|
11167
|
+
propertyId,
|
|
11168
|
+
dateRanges: [{ startDate: "7daysAgo", endDate: "today" }],
|
|
11169
|
+
dimensions: [{ name: "date" }],
|
|
11170
|
+
metrics: [{ name: "activeUsers" }, { name: "sessions" }],
|
|
11171
|
+
limit: 100,
|
|
11172
|
+
});
|
|
11173
|
+
const metadata = await ga.getMetadata(propertyId);
|
|
11174
|
+
const realtime = await ga.runRealtimeReport({
|
|
11175
|
+
propertyId,
|
|
11176
|
+
metrics: [{ name: "activeUsers" }],
|
|
11177
|
+
dimensions: [{ name: "country" }],
|
|
11178
|
+
});
|
|
11156
11179
|
|
|
11157
|
-
|
|
11158
|
-
}
|
|
11180
|
+
// \u4F4E\u30EC\u30D9\u30EB\u306E\u8A8D\u8A3C\u4ED8\u304D fetch\uFF08\u6570\u5024\u306E\u30D7\u30ED\u30D1\u30C6\u30A3ID\u3092\u30D1\u30B9\u306B\u76F4\u63A5\u66F8\u304F\uFF09
|
|
11181
|
+
const res = await ga.request(\`properties/\${propertyId}:runReport\`, {
|
|
11182
|
+
method: "POST",
|
|
11183
|
+
body: JSON.stringify({ dateRanges: [{ startDate: "7daysAgo", endDate: "today" }], metrics: [{ name: "activeUsers" }] }),
|
|
11184
|
+
});
|
|
11185
|
+
const data = await res.json();
|
|
11159
11186
|
\`\`\``
|
|
11160
11187
|
},
|
|
11161
11188
|
tools: tools16,
|
|
11162
11189
|
setup: (params, ctx, config) => runSetupFlow(googleAnalyticsOauthSetupFlow, params, ctx, config),
|
|
11163
|
-
async checkConnection(
|
|
11190
|
+
async checkConnection(params, config) {
|
|
11164
11191
|
const { proxyFetch } = config;
|
|
11165
|
-
const
|
|
11192
|
+
const propertyId = params[parameters16.propertyId.slug];
|
|
11193
|
+
if (!propertyId) {
|
|
11194
|
+
return { success: true };
|
|
11195
|
+
}
|
|
11196
|
+
const url = `https://analyticsdata.googleapis.com/v1beta/properties/${propertyId}/metadata`;
|
|
11166
11197
|
try {
|
|
11167
11198
|
const res = await proxyFetch(url, { method: "GET" });
|
|
11168
11199
|
if (!res.ok) {
|
|
@@ -11186,8 +11217,8 @@ export default async function handler(c) {
|
|
|
11186
11217
|
import { z as z26 } from "zod";
|
|
11187
11218
|
|
|
11188
11219
|
// ../connectors/src/lib/normalize-path.ts
|
|
11189
|
-
function normalizeRequestPath(
|
|
11190
|
-
let p =
|
|
11220
|
+
function normalizeRequestPath(path5, basePathSegment) {
|
|
11221
|
+
let p = path5.trim();
|
|
11191
11222
|
if (!p.startsWith("/")) p = "/" + p;
|
|
11192
11223
|
if (p === basePathSegment || p.startsWith(basePathSegment + "/")) {
|
|
11193
11224
|
p = p.slice(basePathSegment.length) || "/";
|
|
@@ -11251,7 +11282,7 @@ var requestTool5 = new ConnectorTool({
|
|
|
11251
11282
|
description: "Call the Google Calendar API as the service account itself (no delegation). Read-only operations only. Only calendars explicitly shared with the service account email are accessible. Pass `scopes` as a read-only Calendar scope (e.g., ['https://www.googleapis.com/auth/calendar.readonly']). Use this tool when the project knowledge records the calendar with `(service-account, ...)` (no `subject`).",
|
|
11252
11283
|
inputSchema: inputSchema26,
|
|
11253
11284
|
outputSchema: outputSchema26,
|
|
11254
|
-
async execute({ connectionId, method, path:
|
|
11285
|
+
async execute({ connectionId, method, path: path5, scopes, queryParams, body }, connections) {
|
|
11255
11286
|
const connection = connections.find((c) => c.id === connectionId);
|
|
11256
11287
|
if (!connection) {
|
|
11257
11288
|
return {
|
|
@@ -11272,7 +11303,7 @@ var requestTool5 = new ConnectorTool({
|
|
|
11272
11303
|
}
|
|
11273
11304
|
const serviceAccountEmail = serviceAccount.client_email;
|
|
11274
11305
|
console.log(
|
|
11275
|
-
`[connector-request] google-calendar/${connection.name}: ${method} ${
|
|
11306
|
+
`[connector-request] google-calendar/${connection.name}: ${method} ${path5} (service account)`
|
|
11276
11307
|
);
|
|
11277
11308
|
try {
|
|
11278
11309
|
const { GoogleAuth } = await import("google-auth-library");
|
|
@@ -11291,7 +11322,7 @@ var requestTool5 = new ConnectorTool({
|
|
|
11291
11322
|
serviceAccountEmail
|
|
11292
11323
|
};
|
|
11293
11324
|
}
|
|
11294
|
-
const normalizedPath = normalizeRequestPath(
|
|
11325
|
+
const normalizedPath = normalizeRequestPath(path5, BASE_PATH_SEGMENT);
|
|
11295
11326
|
let url = `${BASE_URL5}${normalizedPath}`;
|
|
11296
11327
|
if (queryParams) {
|
|
11297
11328
|
const searchParams = new URLSearchParams(queryParams);
|
|
@@ -11388,7 +11419,7 @@ var requestWithDelegationTool = new ConnectorTool({
|
|
|
11388
11419
|
description: "Call the Google Calendar API on behalf of the specified Workspace user via Domain-wide Delegation. Read-only operations only. Pass `subject` as the target user email and `scopes` as a read-only Calendar scope (e.g., ['https://www.googleapis.com/auth/calendar.readonly']). Use this tool when the project knowledge records the calendar with `(delegation, subject: <email>, ...)`. Requires Domain-wide Delegation to be authorized for the service account in the Workspace admin console.",
|
|
11389
11420
|
inputSchema: inputSchema27,
|
|
11390
11421
|
outputSchema: outputSchema27,
|
|
11391
|
-
async execute({ connectionId, method, path:
|
|
11422
|
+
async execute({ connectionId, method, path: path5, subject, scopes, queryParams, body }, connections) {
|
|
11392
11423
|
const connection = connections.find((c) => c.id === connectionId);
|
|
11393
11424
|
if (!connection) {
|
|
11394
11425
|
return {
|
|
@@ -11409,7 +11440,7 @@ var requestWithDelegationTool = new ConnectorTool({
|
|
|
11409
11440
|
}
|
|
11410
11441
|
const serviceAccountEmail = serviceAccount.client_email;
|
|
11411
11442
|
console.log(
|
|
11412
|
-
`[connector-request] google-calendar/${connection.name}: ${method} ${
|
|
11443
|
+
`[connector-request] google-calendar/${connection.name}: ${method} ${path5} subject=${subject}`
|
|
11413
11444
|
);
|
|
11414
11445
|
try {
|
|
11415
11446
|
const { GoogleAuth } = await import("google-auth-library");
|
|
@@ -11429,7 +11460,7 @@ var requestWithDelegationTool = new ConnectorTool({
|
|
|
11429
11460
|
serviceAccountEmail
|
|
11430
11461
|
};
|
|
11431
11462
|
}
|
|
11432
|
-
const normalizedPath = normalizeRequestPath(
|
|
11463
|
+
const normalizedPath = normalizeRequestPath(path5, BASE_PATH_SEGMENT2);
|
|
11433
11464
|
let url = `${BASE_URL6}${normalizedPath}`;
|
|
11434
11465
|
if (queryParams) {
|
|
11435
11466
|
const searchParams = new URLSearchParams(queryParams);
|
|
@@ -12511,7 +12542,7 @@ Authentication is handled automatically via OAuth proxy.
|
|
|
12511
12542
|
{calendarId} in the path is automatically replaced with the connection's default calendar ID.`,
|
|
12512
12543
|
inputSchema: inputSchema29,
|
|
12513
12544
|
outputSchema: outputSchema29,
|
|
12514
|
-
async execute({ connectionId, method, path:
|
|
12545
|
+
async execute({ connectionId, method, path: path5, queryParams, body }, connections, config) {
|
|
12515
12546
|
const connection = connections.find((c) => c.id === connectionId);
|
|
12516
12547
|
if (!connection) {
|
|
12517
12548
|
return {
|
|
@@ -12520,11 +12551,11 @@ Authentication is handled automatically via OAuth proxy.
|
|
|
12520
12551
|
};
|
|
12521
12552
|
}
|
|
12522
12553
|
console.log(
|
|
12523
|
-
`[connector-request] google-calendar-oauth/${connection.name}: ${method} ${
|
|
12554
|
+
`[connector-request] google-calendar-oauth/${connection.name}: ${method} ${path5}`
|
|
12524
12555
|
);
|
|
12525
12556
|
try {
|
|
12526
12557
|
const calendarId = parameters18.calendarId.tryGetValue(connection) ?? "primary";
|
|
12527
|
-
const resolvedPath =
|
|
12558
|
+
const resolvedPath = path5.replace(/\{calendarId\}/g, calendarId);
|
|
12528
12559
|
const normalizedPath = normalizeRequestPath(
|
|
12529
12560
|
resolvedPath,
|
|
12530
12561
|
BASE_PATH_SEGMENT3
|
|
@@ -12930,7 +12961,7 @@ Supports GET (read) and POST (create/update) methods.
|
|
|
12930
12961
|
Authentication is handled automatically via OAuth proxy.`,
|
|
12931
12962
|
inputSchema: inputSchema30,
|
|
12932
12963
|
outputSchema: outputSchema30,
|
|
12933
|
-
async execute({ connectionId, method, path:
|
|
12964
|
+
async execute({ connectionId, method, path: path5, body, queryParams }, connections, config) {
|
|
12934
12965
|
const connection = connections.find((c) => c.id === connectionId);
|
|
12935
12966
|
if (!connection) {
|
|
12936
12967
|
return {
|
|
@@ -12939,11 +12970,11 @@ Authentication is handled automatically via OAuth proxy.`,
|
|
|
12939
12970
|
};
|
|
12940
12971
|
}
|
|
12941
12972
|
console.log(
|
|
12942
|
-
`[connector-request] google-docs/${connection.name}: ${method} ${
|
|
12973
|
+
`[connector-request] google-docs/${connection.name}: ${method} ${path5}`
|
|
12943
12974
|
);
|
|
12944
12975
|
try {
|
|
12945
12976
|
const normalizedPath = normalizeRequestPath(
|
|
12946
|
-
|
|
12977
|
+
path5,
|
|
12947
12978
|
DOCS_BASE_PATH_SEGMENT
|
|
12948
12979
|
);
|
|
12949
12980
|
let url = `${DOCS_BASE_URL}${normalizedPath === "/" ? "" : normalizedPath}`;
|
|
@@ -13395,7 +13426,7 @@ Supports GET (read/list/download), POST (create/copy), and PATCH (update) method
|
|
|
13395
13426
|
Authentication is handled automatically via OAuth proxy.`,
|
|
13396
13427
|
inputSchema: inputSchema31,
|
|
13397
13428
|
outputSchema: outputSchema31,
|
|
13398
|
-
async execute({ connectionId, method, path:
|
|
13429
|
+
async execute({ connectionId, method, path: path5, body, queryParams }, connections, config) {
|
|
13399
13430
|
const connection = connections.find((c) => c.id === connectionId);
|
|
13400
13431
|
if (!connection) {
|
|
13401
13432
|
return {
|
|
@@ -13404,10 +13435,10 @@ Authentication is handled automatically via OAuth proxy.`,
|
|
|
13404
13435
|
};
|
|
13405
13436
|
}
|
|
13406
13437
|
console.log(
|
|
13407
|
-
`[connector-request] google-drive/${connection.name}: ${method} ${
|
|
13438
|
+
`[connector-request] google-drive/${connection.name}: ${method} ${path5}`
|
|
13408
13439
|
);
|
|
13409
13440
|
try {
|
|
13410
|
-
const normalizedPath = normalizeRequestPath(
|
|
13441
|
+
const normalizedPath = normalizeRequestPath(path5, BASE_PATH_SEGMENT4);
|
|
13411
13442
|
let url = `${BASE_URL9}${normalizedPath}`;
|
|
13412
13443
|
if (queryParams) {
|
|
13413
13444
|
const searchParams = new URLSearchParams(queryParams);
|
|
@@ -13836,7 +13867,7 @@ The caller must include the target spreadsheetId in the path explicitly.
|
|
|
13836
13867
|
Authentication is handled automatically via OAuth proxy.`,
|
|
13837
13868
|
inputSchema: inputSchema32,
|
|
13838
13869
|
outputSchema: outputSchema32,
|
|
13839
|
-
async execute({ connectionId, method, path:
|
|
13870
|
+
async execute({ connectionId, method, path: path5, queryParams }, connections, config) {
|
|
13840
13871
|
const connection = connections.find((c) => c.id === connectionId);
|
|
13841
13872
|
if (!connection) {
|
|
13842
13873
|
return {
|
|
@@ -13845,11 +13876,11 @@ Authentication is handled automatically via OAuth proxy.`,
|
|
|
13845
13876
|
};
|
|
13846
13877
|
}
|
|
13847
13878
|
console.log(
|
|
13848
|
-
`[connector-request] google-sheets/${connection.name}: ${method} ${
|
|
13879
|
+
`[connector-request] google-sheets/${connection.name}: ${method} ${path5}`
|
|
13849
13880
|
);
|
|
13850
13881
|
try {
|
|
13851
13882
|
const normalizedPath = normalizeRequestPath(
|
|
13852
|
-
|
|
13883
|
+
path5,
|
|
13853
13884
|
SHEETS_BASE_PATH_SEGMENT
|
|
13854
13885
|
);
|
|
13855
13886
|
let url = `${SHEETS_BASE_URL}${normalizedPath === "/" ? "" : normalizedPath}`;
|
|
@@ -14352,7 +14383,7 @@ Supports GET (read) and POST (create/update) methods.
|
|
|
14352
14383
|
Authentication is handled automatically via OAuth proxy.`,
|
|
14353
14384
|
inputSchema: inputSchema33,
|
|
14354
14385
|
outputSchema: outputSchema33,
|
|
14355
|
-
async execute({ connectionId, method, path:
|
|
14386
|
+
async execute({ connectionId, method, path: path5, body, queryParams }, connections, config) {
|
|
14356
14387
|
const connection = connections.find((c) => c.id === connectionId);
|
|
14357
14388
|
if (!connection) {
|
|
14358
14389
|
return {
|
|
@@ -14361,11 +14392,11 @@ Authentication is handled automatically via OAuth proxy.`,
|
|
|
14361
14392
|
};
|
|
14362
14393
|
}
|
|
14363
14394
|
console.log(
|
|
14364
|
-
`[connector-request] google-slides/${connection.name}: ${method} ${
|
|
14395
|
+
`[connector-request] google-slides/${connection.name}: ${method} ${path5}`
|
|
14365
14396
|
);
|
|
14366
14397
|
try {
|
|
14367
14398
|
const normalizedPath = normalizeRequestPath(
|
|
14368
|
-
|
|
14399
|
+
path5,
|
|
14369
14400
|
SLIDES_BASE_PATH_SEGMENT
|
|
14370
14401
|
);
|
|
14371
14402
|
let url = `${SLIDES_BASE_URL}${normalizedPath === "/" ? "" : normalizedPath}`;
|
|
@@ -14656,7 +14687,7 @@ var requestTool11 = new ConnectorTool({
|
|
|
14656
14687
|
Authentication is handled automatically via OAuth proxy.`,
|
|
14657
14688
|
inputSchema: inputSchema34,
|
|
14658
14689
|
outputSchema: outputSchema34,
|
|
14659
|
-
async execute({ connectionId, method, path:
|
|
14690
|
+
async execute({ connectionId, method, path: path5, queryParams, body }, connections, config) {
|
|
14660
14691
|
const connection = connections.find((c) => c.id === connectionId);
|
|
14661
14692
|
if (!connection) {
|
|
14662
14693
|
return {
|
|
@@ -14665,10 +14696,10 @@ Authentication is handled automatically via OAuth proxy.`,
|
|
|
14665
14696
|
};
|
|
14666
14697
|
}
|
|
14667
14698
|
console.log(
|
|
14668
|
-
`[connector-request] hubspot-oauth/${connection.name}: ${method} ${
|
|
14699
|
+
`[connector-request] hubspot-oauth/${connection.name}: ${method} ${path5}`
|
|
14669
14700
|
);
|
|
14670
14701
|
try {
|
|
14671
|
-
let url = `${BASE_URL10}${
|
|
14702
|
+
let url = `${BASE_URL10}${path5.startsWith("/") ? "" : "/"}${path5}`;
|
|
14672
14703
|
if (queryParams) {
|
|
14673
14704
|
const searchParams = new URLSearchParams(queryParams);
|
|
14674
14705
|
url += `?${searchParams.toString()}`;
|
|
@@ -14744,8 +14775,8 @@ var hubspotOnboarding = new ConnectorOnboarding({
|
|
|
14744
14775
|
|
|
14745
14776
|
// ../connectors/src/connectors/hubspot-oauth/utils.ts
|
|
14746
14777
|
var BASE_URL11 = "https://api.hubapi.com";
|
|
14747
|
-
function apiFetch2(proxyFetch,
|
|
14748
|
-
const url = `${BASE_URL11}${
|
|
14778
|
+
function apiFetch2(proxyFetch, path5, init) {
|
|
14779
|
+
const url = `${BASE_URL11}${path5.startsWith("/") ? "" : "/"}${path5}`;
|
|
14749
14780
|
return proxyFetch(url, init);
|
|
14750
14781
|
}
|
|
14751
14782
|
|
|
@@ -15067,7 +15098,7 @@ var requestTool12 = new ConnectorTool({
|
|
|
15067
15098
|
Authentication is handled automatically via OAuth proxy.`,
|
|
15068
15099
|
inputSchema: inputSchema35,
|
|
15069
15100
|
outputSchema: outputSchema35,
|
|
15070
|
-
async execute({ connectionId, method, path:
|
|
15101
|
+
async execute({ connectionId, method, path: path5, queryParams, body }, connections, config) {
|
|
15071
15102
|
const connection = connections.find((c) => c.id === connectionId);
|
|
15072
15103
|
if (!connection) {
|
|
15073
15104
|
return {
|
|
@@ -15076,10 +15107,10 @@ Authentication is handled automatically via OAuth proxy.`,
|
|
|
15076
15107
|
};
|
|
15077
15108
|
}
|
|
15078
15109
|
console.log(
|
|
15079
|
-
`[connector-request] stripe-oauth/${connection.name}: ${method} ${
|
|
15110
|
+
`[connector-request] stripe-oauth/${connection.name}: ${method} ${path5}`
|
|
15080
15111
|
);
|
|
15081
15112
|
try {
|
|
15082
|
-
let url = `${BASE_URL12}${
|
|
15113
|
+
let url = `${BASE_URL12}${path5.startsWith("/") ? "" : "/"}${path5}`;
|
|
15083
15114
|
if (queryParams) {
|
|
15084
15115
|
const searchParams = new URLSearchParams(queryParams);
|
|
15085
15116
|
url += `?${searchParams.toString()}`;
|
|
@@ -15493,7 +15524,7 @@ Authentication is handled automatically using the configured API Key (Bearer tok
|
|
|
15493
15524
|
Use this tool for all Stripe API interactions: querying charges, customers, invoices, subscriptions, products, prices, payment intents, balances, and more.`,
|
|
15494
15525
|
inputSchema: inputSchema36,
|
|
15495
15526
|
outputSchema: outputSchema36,
|
|
15496
|
-
async execute({ connectionId, method, path:
|
|
15527
|
+
async execute({ connectionId, method, path: path5, queryParams, body }, connections) {
|
|
15497
15528
|
const connection = connections.find((c) => c.id === connectionId);
|
|
15498
15529
|
if (!connection) {
|
|
15499
15530
|
return {
|
|
@@ -15502,11 +15533,11 @@ Use this tool for all Stripe API interactions: querying charges, customers, invo
|
|
|
15502
15533
|
};
|
|
15503
15534
|
}
|
|
15504
15535
|
console.log(
|
|
15505
|
-
`[connector-request] stripe-api-key/${connection.name}: ${method} ${
|
|
15536
|
+
`[connector-request] stripe-api-key/${connection.name}: ${method} ${path5}`
|
|
15506
15537
|
);
|
|
15507
15538
|
try {
|
|
15508
15539
|
const apiKey = parameters25.apiKey.getValue(connection);
|
|
15509
|
-
let url = `${BASE_URL14}${
|
|
15540
|
+
let url = `${BASE_URL14}${path5.startsWith("/") ? "" : "/"}${path5}`;
|
|
15510
15541
|
if (queryParams) {
|
|
15511
15542
|
const searchParams = new URLSearchParams(queryParams);
|
|
15512
15543
|
url += `?${searchParams.toString()}`;
|
|
@@ -15586,12 +15617,12 @@ var stripeApiKeyOnboarding = new ConnectorOnboarding({
|
|
|
15586
15617
|
|
|
15587
15618
|
// ../connectors/src/connectors/stripe-api-key/utils.ts
|
|
15588
15619
|
var BASE_URL15 = "https://api.stripe.com";
|
|
15589
|
-
async function apiFetch3(params,
|
|
15620
|
+
async function apiFetch3(params, path5, init) {
|
|
15590
15621
|
const apiKey = params[parameters25.apiKey.slug];
|
|
15591
15622
|
if (!apiKey) {
|
|
15592
15623
|
throw new Error("stripe-api-key: missing required parameter: api-key");
|
|
15593
15624
|
}
|
|
15594
|
-
const url = `${BASE_URL15}${
|
|
15625
|
+
const url = `${BASE_URL15}${path5.startsWith("/") ? "" : "/"}${path5}`;
|
|
15595
15626
|
const headers = new Headers(init?.headers);
|
|
15596
15627
|
headers.set("Authorization", `Bearer ${apiKey}`);
|
|
15597
15628
|
return fetch(url, { ...init, headers });
|
|
@@ -15630,8 +15661,8 @@ var ENTITY_PATHS2 = {
|
|
|
15630
15661
|
paymentIntents: "/v1/payment_intents?limit=3"
|
|
15631
15662
|
};
|
|
15632
15663
|
var ENTITY_VALUES2 = Object.keys(ENTITY_PATHS2);
|
|
15633
|
-
async function defaultFetchEntity(params,
|
|
15634
|
-
return apiFetch3(params,
|
|
15664
|
+
async function defaultFetchEntity(params, path5) {
|
|
15665
|
+
return apiFetch3(params, path5);
|
|
15635
15666
|
}
|
|
15636
15667
|
function createStripeSetupFlow(fetchEntity = defaultFetchEntity, labelPrefix = "Stripe") {
|
|
15637
15668
|
return {
|
|
@@ -15965,7 +15996,7 @@ Authentication is handled automatically via OAuth proxy.
|
|
|
15965
15996
|
{baseId} in the path is automatically replaced with the connection's default base ID if configured.`,
|
|
15966
15997
|
inputSchema: inputSchema37,
|
|
15967
15998
|
outputSchema: outputSchema37,
|
|
15968
|
-
async execute({ connectionId, method, path:
|
|
15999
|
+
async execute({ connectionId, method, path: path5, queryParams, body }, connections, config) {
|
|
15969
16000
|
const connection = connections.find((c) => c.id === connectionId);
|
|
15970
16001
|
if (!connection) {
|
|
15971
16002
|
return {
|
|
@@ -15974,11 +16005,11 @@ Authentication is handled automatically via OAuth proxy.
|
|
|
15974
16005
|
};
|
|
15975
16006
|
}
|
|
15976
16007
|
console.log(
|
|
15977
|
-
`[connector-request] airtable-oauth/${connection.name}: ${method} ${
|
|
16008
|
+
`[connector-request] airtable-oauth/${connection.name}: ${method} ${path5}`
|
|
15978
16009
|
);
|
|
15979
16010
|
try {
|
|
15980
16011
|
const baseId = parameters26.baseId.tryGetValue(connection);
|
|
15981
|
-
const resolvedPath = baseId ?
|
|
16012
|
+
const resolvedPath = baseId ? path5.replace(/\{baseId\}/g, baseId) : path5;
|
|
15982
16013
|
let url = `${BASE_URL16}${resolvedPath.startsWith("/") ? "" : "/"}${resolvedPath}`;
|
|
15983
16014
|
if (queryParams) {
|
|
15984
16015
|
const searchParams = new URLSearchParams(queryParams);
|
|
@@ -16063,8 +16094,8 @@ var airtableOauthOnboarding = new ConnectorOnboarding({
|
|
|
16063
16094
|
|
|
16064
16095
|
// ../connectors/src/connectors/airtable-oauth/utils.ts
|
|
16065
16096
|
var BASE_URL17 = "https://api.airtable.com/v0";
|
|
16066
|
-
function apiFetch4(proxyFetch,
|
|
16067
|
-
const url = `${BASE_URL17}${
|
|
16097
|
+
function apiFetch4(proxyFetch, path5, init) {
|
|
16098
|
+
const url = `${BASE_URL17}${path5.startsWith("/") ? "" : "/"}${path5}`;
|
|
16068
16099
|
return proxyFetch(url, init);
|
|
16069
16100
|
}
|
|
16070
16101
|
|
|
@@ -16403,7 +16434,7 @@ var parameters27 = {
|
|
|
16403
16434
|
};
|
|
16404
16435
|
|
|
16405
16436
|
// ../connectors/src/connectors/kintone/utils.ts
|
|
16406
|
-
async function apiFetch5(params,
|
|
16437
|
+
async function apiFetch5(params, path5, init) {
|
|
16407
16438
|
const baseUrl = params[parameters27.baseUrl.slug];
|
|
16408
16439
|
const username = params[parameters27.username.slug];
|
|
16409
16440
|
const password = params[parameters27.password.slug];
|
|
@@ -16413,7 +16444,7 @@ async function apiFetch5(params, path4, init) {
|
|
|
16413
16444
|
);
|
|
16414
16445
|
}
|
|
16415
16446
|
const authToken = Buffer.from(`${username}:${password}`).toString("base64");
|
|
16416
|
-
const normalizedPath =
|
|
16447
|
+
const normalizedPath = path5.replace(/^\/+/, "");
|
|
16417
16448
|
const url = `${baseUrl.replace(/\/+$/, "")}/k/v1/${normalizedPath}`;
|
|
16418
16449
|
const headers = new Headers(init?.headers);
|
|
16419
16450
|
headers.set("X-Cybozu-Authorization", authToken);
|
|
@@ -16627,18 +16658,18 @@ var requestTool15 = new ConnectorTool({
|
|
|
16627
16658
|
Authentication is handled automatically using username and password.`,
|
|
16628
16659
|
inputSchema: inputSchema38,
|
|
16629
16660
|
outputSchema: outputSchema38,
|
|
16630
|
-
async execute({ connectionId, method, path:
|
|
16661
|
+
async execute({ connectionId, method, path: path5, body }, connections) {
|
|
16631
16662
|
const connection = connections.find((c) => c.id === connectionId);
|
|
16632
16663
|
if (!connection) {
|
|
16633
16664
|
return { success: false, error: `Connection ${connectionId} not found` };
|
|
16634
16665
|
}
|
|
16635
|
-
console.log(`[connector-request] kintone/${connection.name}: ${method} ${
|
|
16666
|
+
console.log(`[connector-request] kintone/${connection.name}: ${method} ${path5}`);
|
|
16636
16667
|
try {
|
|
16637
16668
|
const baseUrl = parameters27.baseUrl.getValue(connection);
|
|
16638
16669
|
const username = parameters27.username.getValue(connection);
|
|
16639
16670
|
const password = parameters27.password.getValue(connection);
|
|
16640
16671
|
const authToken = Buffer.from(`${username}:${password}`).toString("base64");
|
|
16641
|
-
const url = `${baseUrl.replace(/\/+$/, "")}/k/v1/${
|
|
16672
|
+
const url = `${baseUrl.replace(/\/+$/, "")}/k/v1/${path5}`;
|
|
16642
16673
|
const controller = new AbortController();
|
|
16643
16674
|
const timeout = setTimeout(() => controller.abort(), REQUEST_TIMEOUT_MS26);
|
|
16644
16675
|
try {
|
|
@@ -16943,7 +16974,7 @@ var parameters28 = {
|
|
|
16943
16974
|
};
|
|
16944
16975
|
|
|
16945
16976
|
// ../connectors/src/connectors/kintone-api-token/utils.ts
|
|
16946
|
-
async function apiFetch6(params,
|
|
16977
|
+
async function apiFetch6(params, path5, init) {
|
|
16947
16978
|
const baseUrl = params[parameters28.baseUrl.slug];
|
|
16948
16979
|
const apiToken = params[parameters28.apiToken.slug];
|
|
16949
16980
|
if (!baseUrl || !apiToken) {
|
|
@@ -16951,7 +16982,7 @@ async function apiFetch6(params, path4, init) {
|
|
|
16951
16982
|
"kintone-api-token: missing required parameter(s): base-url, api-token"
|
|
16952
16983
|
);
|
|
16953
16984
|
}
|
|
16954
|
-
const normalizedPath =
|
|
16985
|
+
const normalizedPath = path5.replace(/^\/+/, "");
|
|
16955
16986
|
const url = `${baseUrl.replace(/\/+$/, "")}/k/v1/${normalizedPath}`;
|
|
16956
16987
|
const headers = new Headers(init?.headers);
|
|
16957
16988
|
headers.set("X-Cybozu-API-Token", apiToken);
|
|
@@ -17064,8 +17095,8 @@ var APP_PARAM_KEY_BY_ENDPOINT = {
|
|
|
17064
17095
|
"app.json": "id"
|
|
17065
17096
|
};
|
|
17066
17097
|
var DEFAULT_APP_PARAM_KEY = "app";
|
|
17067
|
-
function injectAppIntoPath(
|
|
17068
|
-
const [head, query = ""] =
|
|
17098
|
+
function injectAppIntoPath(path5, appId) {
|
|
17099
|
+
const [head, query = ""] = path5.split("?", 2);
|
|
17069
17100
|
const endpoint = head.toLowerCase();
|
|
17070
17101
|
const paramKey = APP_PARAM_KEY_BY_ENDPOINT[endpoint] ?? DEFAULT_APP_PARAM_KEY;
|
|
17071
17102
|
const params = new URLSearchParams(query);
|
|
@@ -17106,17 +17137,17 @@ var requestTool16 = new ConnectorTool({
|
|
|
17106
17137
|
Authentication is handled automatically using the API token.`,
|
|
17107
17138
|
inputSchema: inputSchema39,
|
|
17108
17139
|
outputSchema: outputSchema39,
|
|
17109
|
-
async execute({ connectionId, method, path:
|
|
17140
|
+
async execute({ connectionId, method, path: path5, body }, connections) {
|
|
17110
17141
|
const connection = connections.find((c) => c.id === connectionId);
|
|
17111
17142
|
if (!connection) {
|
|
17112
17143
|
return { success: false, error: `Connection ${connectionId} not found` };
|
|
17113
17144
|
}
|
|
17114
|
-
console.log(`[connector-request] kintone-api-token/${connection.name}: ${method} ${
|
|
17145
|
+
console.log(`[connector-request] kintone-api-token/${connection.name}: ${method} ${path5}`);
|
|
17115
17146
|
try {
|
|
17116
17147
|
const baseUrl = parameters28.baseUrl.getValue(connection);
|
|
17117
17148
|
const apiToken = parameters28.apiToken.getValue(connection);
|
|
17118
17149
|
const appId = parameters28.appId.getValue(connection);
|
|
17119
|
-
const normalizedPath =
|
|
17150
|
+
const normalizedPath = path5.replace(/^\/+/, "");
|
|
17120
17151
|
const pathHead = normalizedPath.split("?")[0] ?? "";
|
|
17121
17152
|
if (/^apps\.json$/i.test(pathHead)) {
|
|
17122
17153
|
return {
|
|
@@ -17333,8 +17364,8 @@ export default async function handler(c: Context) {
|
|
|
17333
17364
|
};
|
|
17334
17365
|
}
|
|
17335
17366
|
try {
|
|
17336
|
-
const
|
|
17337
|
-
const url = `${baseUrl.replace(/\/+$/, "")}/k/v1/${
|
|
17367
|
+
const path5 = appId ? `app.json?id=${encodeURIComponent(appId)}` : `app/form/fields.json?app=0`;
|
|
17368
|
+
const url = `${baseUrl.replace(/\/+$/, "")}/k/v1/${path5}`;
|
|
17338
17369
|
const res = await fetch(url, {
|
|
17339
17370
|
method: "GET",
|
|
17340
17371
|
headers: {
|
|
@@ -17415,7 +17446,7 @@ var parameters29 = {
|
|
|
17415
17446
|
|
|
17416
17447
|
// ../connectors/src/connectors/wix-store/utils.ts
|
|
17417
17448
|
var BASE_URL18 = "https://www.wixapis.com";
|
|
17418
|
-
async function apiFetch7(params,
|
|
17449
|
+
async function apiFetch7(params, path5, init) {
|
|
17419
17450
|
const apiKey = params[parameters29.apiKey.slug];
|
|
17420
17451
|
const siteId = params[parameters29.siteId.slug];
|
|
17421
17452
|
if (!apiKey || !siteId) {
|
|
@@ -17423,7 +17454,7 @@ async function apiFetch7(params, path4, init) {
|
|
|
17423
17454
|
"wix-store: missing required parameters: api-key and site-id"
|
|
17424
17455
|
);
|
|
17425
17456
|
}
|
|
17426
|
-
const url = `${BASE_URL18}${
|
|
17457
|
+
const url = `${BASE_URL18}${path5.startsWith("/") ? "" : "/"}${path5}`;
|
|
17427
17458
|
const headers = new Headers(init?.headers);
|
|
17428
17459
|
headers.set("Authorization", apiKey);
|
|
17429
17460
|
headers.set("wix-site-id", siteId);
|
|
@@ -17469,8 +17500,8 @@ var QUERY_SPECS = {
|
|
|
17469
17500
|
totalField: "totalResults"
|
|
17470
17501
|
}
|
|
17471
17502
|
};
|
|
17472
|
-
function lookupNumeric(data,
|
|
17473
|
-
const parts =
|
|
17503
|
+
function lookupNumeric(data, path5) {
|
|
17504
|
+
const parts = path5.split(".");
|
|
17474
17505
|
let cur = data;
|
|
17475
17506
|
for (const p of parts) {
|
|
17476
17507
|
if (!cur || typeof cur !== "object") return void 0;
|
|
@@ -17552,16 +17583,16 @@ var requestTool17 = new ConnectorTool({
|
|
|
17552
17583
|
Authentication is handled automatically using the API Key and Site ID.`,
|
|
17553
17584
|
inputSchema: inputSchema40,
|
|
17554
17585
|
outputSchema: outputSchema40,
|
|
17555
|
-
async execute({ connectionId, method, path:
|
|
17586
|
+
async execute({ connectionId, method, path: path5, body }, connections) {
|
|
17556
17587
|
const connection = connections.find((c) => c.id === connectionId);
|
|
17557
17588
|
if (!connection) {
|
|
17558
17589
|
return { success: false, error: `Connection ${connectionId} not found` };
|
|
17559
17590
|
}
|
|
17560
|
-
console.log(`[connector-request] wix-store/${connection.name}: ${method} ${
|
|
17591
|
+
console.log(`[connector-request] wix-store/${connection.name}: ${method} ${path5}`);
|
|
17561
17592
|
try {
|
|
17562
17593
|
const apiKey = parameters29.apiKey.getValue(connection);
|
|
17563
17594
|
const siteId = parameters29.siteId.getValue(connection);
|
|
17564
|
-
const url = `${BASE_URL19}${
|
|
17595
|
+
const url = `${BASE_URL19}${path5}`;
|
|
17565
17596
|
const controller = new AbortController();
|
|
17566
17597
|
const timeout = setTimeout(() => controller.abort(), REQUEST_TIMEOUT_MS28);
|
|
17567
17598
|
try {
|
|
@@ -17859,7 +17890,7 @@ function adminApiBase(host) {
|
|
|
17859
17890
|
}
|
|
17860
17891
|
return `https://${trimmed}`;
|
|
17861
17892
|
}
|
|
17862
|
-
function adminApiFetch(params,
|
|
17893
|
+
function adminApiFetch(params, path5, init) {
|
|
17863
17894
|
const host = params[parameters30.host.slug];
|
|
17864
17895
|
const token = params[parameters30.token.slug];
|
|
17865
17896
|
if (!host) {
|
|
@@ -17868,7 +17899,7 @@ function adminApiFetch(params, path4, init) {
|
|
|
17868
17899
|
if (!token) {
|
|
17869
17900
|
throw new Error(`dbt: missing required parameter: ${parameters30.token.slug}`);
|
|
17870
17901
|
}
|
|
17871
|
-
const trimmedPath =
|
|
17902
|
+
const trimmedPath = path5.startsWith("/") ? path5 : `/${path5}`;
|
|
17872
17903
|
const headers = new Headers(init?.headers);
|
|
17873
17904
|
headers.set("Authorization", `Token ${token}`);
|
|
17874
17905
|
if (!headers.has("Accept")) headers.set("Accept", "application/json");
|
|
@@ -17957,8 +17988,8 @@ async function fetchRecentRunCount(params, projectId2) {
|
|
|
17957
17988
|
const accountId = params[parameters30.accountId.slug];
|
|
17958
17989
|
if (!accountId) return null;
|
|
17959
17990
|
try {
|
|
17960
|
-
const
|
|
17961
|
-
const res = await adminApiFetch(params,
|
|
17991
|
+
const path5 = `/api/v2/accounts/${encodeURIComponent(accountId)}/runs/?project_id=${encodeURIComponent(projectId2)}&limit=1&order_by=-id`;
|
|
17992
|
+
const res = await adminApiFetch(params, path5);
|
|
17962
17993
|
if (!res.ok) return null;
|
|
17963
17994
|
const data = await res.json();
|
|
17964
17995
|
const total = data.extra?.pagination?.total_count;
|
|
@@ -18209,11 +18240,11 @@ function classifyByTags(tags) {
|
|
|
18209
18240
|
function classifyModel(m) {
|
|
18210
18241
|
const fromTags = classifyByTags(m.tags ?? []);
|
|
18211
18242
|
if (fromTags) return fromTags;
|
|
18212
|
-
const
|
|
18213
|
-
if (
|
|
18214
|
-
if (MART_PATH_RE.test(
|
|
18215
|
-
if (INT_PATH_RE.test(
|
|
18216
|
-
if (STG_PATH_RE.test(
|
|
18243
|
+
const path5 = (m.filePath ?? "").toLowerCase();
|
|
18244
|
+
if (path5) {
|
|
18245
|
+
if (MART_PATH_RE.test(path5)) return "mart";
|
|
18246
|
+
if (INT_PATH_RE.test(path5)) return "intermediate";
|
|
18247
|
+
if (STG_PATH_RE.test(path5)) return "staging";
|
|
18217
18248
|
}
|
|
18218
18249
|
const name = (m.name ?? "").toLowerCase();
|
|
18219
18250
|
if (MART_NAME_RE.test(name)) return "mart";
|
|
@@ -19569,7 +19600,7 @@ function getBaseUrl(params) {
|
|
|
19569
19600
|
const region = params[parameters35.region.slug];
|
|
19570
19601
|
return region === "eu" ? "https://analytics.eu.amplitude.com" : "https://amplitude.com";
|
|
19571
19602
|
}
|
|
19572
|
-
async function apiFetch8(params,
|
|
19603
|
+
async function apiFetch8(params, path5, init) {
|
|
19573
19604
|
const apiKey = params[parameters35.apiKey.slug];
|
|
19574
19605
|
const secretKey = params[parameters35.secretKey.slug];
|
|
19575
19606
|
if (!apiKey || !secretKey) {
|
|
@@ -19577,7 +19608,7 @@ async function apiFetch8(params, path4, init) {
|
|
|
19577
19608
|
"amplitude: missing required parameters: api-key and secret-key"
|
|
19578
19609
|
);
|
|
19579
19610
|
}
|
|
19580
|
-
const url = `${getBaseUrl(params)}${
|
|
19611
|
+
const url = `${getBaseUrl(params)}${path5.startsWith("/") ? "" : "/"}${path5}`;
|
|
19581
19612
|
const headers = new Headers(init?.headers);
|
|
19582
19613
|
headers.set("Authorization", `Basic ${btoa(`${apiKey}:${secretKey}`)}`);
|
|
19583
19614
|
return fetch(url, { ...init, headers });
|
|
@@ -19983,12 +20014,12 @@ var parameters36 = {
|
|
|
19983
20014
|
|
|
19984
20015
|
// ../connectors/src/connectors/attio/utils.ts
|
|
19985
20016
|
var BASE_URL20 = "https://api.attio.com/v2";
|
|
19986
|
-
async function apiFetch9(params,
|
|
20017
|
+
async function apiFetch9(params, path5, init) {
|
|
19987
20018
|
const apiKey = params[parameters36.apiKey.slug];
|
|
19988
20019
|
if (!apiKey) {
|
|
19989
20020
|
throw new Error("attio: missing required parameter: api-key");
|
|
19990
20021
|
}
|
|
19991
|
-
const url = `${BASE_URL20}${
|
|
20022
|
+
const url = `${BASE_URL20}${path5.startsWith("/") ? "" : "/"}${path5}`;
|
|
19992
20023
|
const headers = new Headers(init?.headers);
|
|
19993
20024
|
headers.set("Authorization", `Bearer ${apiKey}`);
|
|
19994
20025
|
headers.set("Accept", "application/json");
|
|
@@ -20129,7 +20160,7 @@ Use this tool for every Attio API interaction, including: querying records (peop
|
|
|
20129
20160
|
Record queries use POST /objects/{object}/records/query with a JSON body containing \`filter\`, \`sorts\`, \`limit\`, and \`offset\`. Record updates use PATCH (append multiselect) or PUT (overwrite multiselect). Workspace members, tasks, webhooks, notes, threads, comments, and meetings live at top-level paths \u2014 the workspace-members path uses a snake_case underscore: /workspace_members.`,
|
|
20130
20161
|
inputSchema: inputSchema44,
|
|
20131
20162
|
outputSchema: outputSchema44,
|
|
20132
|
-
async execute({ connectionId, method, path:
|
|
20163
|
+
async execute({ connectionId, method, path: path5, body }, connections) {
|
|
20133
20164
|
const connection = connections.find((c) => c.id === connectionId);
|
|
20134
20165
|
if (!connection) {
|
|
20135
20166
|
return {
|
|
@@ -20138,11 +20169,11 @@ Record queries use POST /objects/{object}/records/query with a JSON body contain
|
|
|
20138
20169
|
};
|
|
20139
20170
|
}
|
|
20140
20171
|
console.log(
|
|
20141
|
-
`[connector-request] attio/${connection.name}: ${method} ${
|
|
20172
|
+
`[connector-request] attio/${connection.name}: ${method} ${path5}`
|
|
20142
20173
|
);
|
|
20143
20174
|
try {
|
|
20144
20175
|
const apiKey = parameters36.apiKey.getValue(connection);
|
|
20145
|
-
const url = `${BASE_URL21}${
|
|
20176
|
+
const url = `${BASE_URL21}${path5}`;
|
|
20146
20177
|
const controller = new AbortController();
|
|
20147
20178
|
const timeout = setTimeout(() => controller.abort(), REQUEST_TIMEOUT_MS31);
|
|
20148
20179
|
try {
|
|
@@ -20598,9 +20629,9 @@ async function getAccessToken3(params) {
|
|
|
20598
20629
|
}
|
|
20599
20630
|
return data.access_token;
|
|
20600
20631
|
}
|
|
20601
|
-
async function apiFetch10(params,
|
|
20632
|
+
async function apiFetch10(params, path5, init) {
|
|
20602
20633
|
const token = await getAccessToken3(params);
|
|
20603
|
-
const url = `${getStoreBaseUrl(params)}${
|
|
20634
|
+
const url = `${getStoreBaseUrl(params)}${path5.startsWith("/") ? "" : "/"}${path5}`;
|
|
20604
20635
|
const headers = new Headers(init?.headers);
|
|
20605
20636
|
headers.set("X-Shopify-Access-Token", token);
|
|
20606
20637
|
if (!headers.has("Content-Type")) {
|
|
@@ -20635,8 +20666,8 @@ var COUNT_PATHS = {
|
|
|
20635
20666
|
inventory: null,
|
|
20636
20667
|
discounts: `/admin/api/${SHOPIFY_API_VERSION}/price_rules/count.json`
|
|
20637
20668
|
};
|
|
20638
|
-
async function defaultFetchCount(params,
|
|
20639
|
-
return apiFetch10(params,
|
|
20669
|
+
async function defaultFetchCount(params, path5) {
|
|
20670
|
+
return apiFetch10(params, path5);
|
|
20640
20671
|
}
|
|
20641
20672
|
function createShopifySetupFlow(fetchCount5 = defaultFetchCount, labelPrefix = "Shopify") {
|
|
20642
20673
|
return {
|
|
@@ -20667,10 +20698,10 @@ function createShopifySetupFlow(fetchCount5 = defaultFetchCount, labelPrefix = "
|
|
|
20667
20698
|
).slice(0, SHOPIFY_SETUP_MAX_ENTITIES);
|
|
20668
20699
|
const sections = [`## ${labelPrefix}`, ""];
|
|
20669
20700
|
for (const entity of selected) {
|
|
20670
|
-
const
|
|
20701
|
+
const path5 = COUNT_PATHS[entity];
|
|
20671
20702
|
let count = "available";
|
|
20672
|
-
if (
|
|
20673
|
-
const res = await fetchCount5(rt.params,
|
|
20703
|
+
if (path5) {
|
|
20704
|
+
const res = await fetchCount5(rt.params, path5);
|
|
20674
20705
|
if (res.ok) {
|
|
20675
20706
|
const data = await res.json();
|
|
20676
20707
|
if (typeof data.count === "number") count = String(data.count);
|
|
@@ -20720,7 +20751,7 @@ The store domain is resolved from the connection \u2014 only provide the path st
|
|
|
20720
20751
|
Use this tool for all Shopify API interactions: listing products, orders, customers, inventory, collections, and more.`,
|
|
20721
20752
|
inputSchema: inputSchema45,
|
|
20722
20753
|
outputSchema: outputSchema45,
|
|
20723
|
-
async execute({ connectionId, method, path:
|
|
20754
|
+
async execute({ connectionId, method, path: path5, body }, connections) {
|
|
20724
20755
|
const connection = connections.find((c) => c.id === connectionId);
|
|
20725
20756
|
if (!connection) {
|
|
20726
20757
|
return {
|
|
@@ -20729,7 +20760,7 @@ Use this tool for all Shopify API interactions: listing products, orders, custom
|
|
|
20729
20760
|
};
|
|
20730
20761
|
}
|
|
20731
20762
|
console.log(
|
|
20732
|
-
`[connector-request] shopify/${connection.name}: ${method} ${
|
|
20763
|
+
`[connector-request] shopify/${connection.name}: ${method} ${path5}`
|
|
20733
20764
|
);
|
|
20734
20765
|
try {
|
|
20735
20766
|
const storeDomain = parameters37.storeDomain.getValue(connection);
|
|
@@ -20761,7 +20792,7 @@ Use this tool for all Shopify API interactions: listing products, orders, custom
|
|
|
20761
20792
|
error: "access_token not found in token response"
|
|
20762
20793
|
};
|
|
20763
20794
|
}
|
|
20764
|
-
const url = `https://${storeDomain}${
|
|
20795
|
+
const url = `https://${storeDomain}${path5}`;
|
|
20765
20796
|
const controller = new AbortController();
|
|
20766
20797
|
const timeout = setTimeout(() => controller.abort(), REQUEST_TIMEOUT_MS32);
|
|
20767
20798
|
try {
|
|
@@ -21076,7 +21107,7 @@ var requestTool22 = new ConnectorTool({
|
|
|
21076
21107
|
Authentication is handled automatically via OAuth proxy.`,
|
|
21077
21108
|
inputSchema: inputSchema46,
|
|
21078
21109
|
outputSchema: outputSchema46,
|
|
21079
|
-
async execute({ connectionId, method, path:
|
|
21110
|
+
async execute({ connectionId, method, path: path5, queryParams, body }, connections, config) {
|
|
21080
21111
|
const connection = connections.find((c) => c.id === connectionId);
|
|
21081
21112
|
if (!connection) {
|
|
21082
21113
|
return {
|
|
@@ -21085,10 +21116,10 @@ Authentication is handled automatically via OAuth proxy.`,
|
|
|
21085
21116
|
};
|
|
21086
21117
|
}
|
|
21087
21118
|
console.log(
|
|
21088
|
-
`[connector-request] shopify-oauth/${connection.name}: ${method} ${
|
|
21119
|
+
`[connector-request] shopify-oauth/${connection.name}: ${method} ${path5}`
|
|
21089
21120
|
);
|
|
21090
21121
|
try {
|
|
21091
|
-
let url =
|
|
21122
|
+
let url = path5;
|
|
21092
21123
|
if (queryParams) {
|
|
21093
21124
|
const searchParams = new URLSearchParams(queryParams);
|
|
21094
21125
|
url += `${url.includes("?") ? "&" : "?"}${searchParams.toString()}`;
|
|
@@ -21223,10 +21254,10 @@ var shopifyOauthSetupFlow = {
|
|
|
21223
21254
|
sections.push("| Entity | Count |");
|
|
21224
21255
|
sections.push("|--------|-------|");
|
|
21225
21256
|
for (const entity of selected) {
|
|
21226
|
-
const
|
|
21257
|
+
const path5 = COUNT_PATHS2[entity];
|
|
21227
21258
|
let count = "available";
|
|
21228
|
-
if (
|
|
21229
|
-
const res = await rt.config.proxyFetch(
|
|
21259
|
+
if (path5) {
|
|
21260
|
+
const res = await rt.config.proxyFetch(path5, { method: "GET" });
|
|
21230
21261
|
if (res.ok) {
|
|
21231
21262
|
const data = await res.json();
|
|
21232
21263
|
if (typeof data.count === "number") count = String(data.count);
|
|
@@ -21439,12 +21470,12 @@ var parameters39 = {
|
|
|
21439
21470
|
|
|
21440
21471
|
// ../connectors/src/connectors/hubspot/utils.ts
|
|
21441
21472
|
var BASE_URL22 = "https://api.hubapi.com";
|
|
21442
|
-
async function apiFetch11(params,
|
|
21473
|
+
async function apiFetch11(params, path5, init) {
|
|
21443
21474
|
const apiKey = params[parameters39.apiKey.slug];
|
|
21444
21475
|
if (!apiKey) {
|
|
21445
21476
|
throw new Error("hubspot: missing required parameter: api-key");
|
|
21446
21477
|
}
|
|
21447
|
-
const url = `${BASE_URL22}${
|
|
21478
|
+
const url = `${BASE_URL22}${path5.startsWith("/") ? "" : "/"}${path5}`;
|
|
21448
21479
|
const headers = new Headers(init?.headers);
|
|
21449
21480
|
headers.set("Authorization", `Bearer ${apiKey}`);
|
|
21450
21481
|
headers.set("Accept", "application/json");
|
|
@@ -21585,7 +21616,7 @@ Use this tool for all HubSpot API interactions: querying contacts, deals, compan
|
|
|
21585
21616
|
Use the search endpoint (POST /crm/v3/objects/{objectType}/search) for complex queries with filters.`,
|
|
21586
21617
|
inputSchema: inputSchema47,
|
|
21587
21618
|
outputSchema: outputSchema47,
|
|
21588
|
-
async execute({ connectionId, method, path:
|
|
21619
|
+
async execute({ connectionId, method, path: path5, body }, connections) {
|
|
21589
21620
|
const connection = connections.find((c) => c.id === connectionId);
|
|
21590
21621
|
if (!connection) {
|
|
21591
21622
|
return {
|
|
@@ -21594,11 +21625,11 @@ Use the search endpoint (POST /crm/v3/objects/{objectType}/search) for complex q
|
|
|
21594
21625
|
};
|
|
21595
21626
|
}
|
|
21596
21627
|
console.log(
|
|
21597
|
-
`[connector-request] hubspot/${connection.name}: ${method} ${
|
|
21628
|
+
`[connector-request] hubspot/${connection.name}: ${method} ${path5}`
|
|
21598
21629
|
);
|
|
21599
21630
|
try {
|
|
21600
21631
|
const apiKey = parameters39.apiKey.getValue(connection);
|
|
21601
|
-
const url = `${BASE_URL23}${
|
|
21632
|
+
const url = `${BASE_URL23}${path5.startsWith("/") ? "" : "/"}${path5}`;
|
|
21602
21633
|
const controller = new AbortController();
|
|
21603
21634
|
const timeout = setTimeout(() => controller.abort(), REQUEST_TIMEOUT_MS34);
|
|
21604
21635
|
try {
|
|
@@ -21856,7 +21887,7 @@ var parameters40 = {
|
|
|
21856
21887
|
};
|
|
21857
21888
|
|
|
21858
21889
|
// ../connectors/src/connectors/jira/utils.ts
|
|
21859
|
-
async function apiFetch12(params,
|
|
21890
|
+
async function apiFetch12(params, path5, init) {
|
|
21860
21891
|
const instanceUrl = params[parameters40.instanceUrl.slug];
|
|
21861
21892
|
const email = params[parameters40.email.slug];
|
|
21862
21893
|
const apiToken = params[parameters40.apiToken.slug];
|
|
@@ -21870,7 +21901,7 @@ async function apiFetch12(params, path4, init) {
|
|
|
21870
21901
|
throw new Error("jira: missing required parameter: api-token");
|
|
21871
21902
|
}
|
|
21872
21903
|
const credentials = Buffer.from(`${email}:${apiToken}`).toString("base64");
|
|
21873
|
-
const trimmedPath =
|
|
21904
|
+
const trimmedPath = path5.replace(/^\/+/, "");
|
|
21874
21905
|
const url = `${instanceUrl.replace(/\/+$/, "")}/rest/api/3/${trimmedPath}`;
|
|
21875
21906
|
const headers = new Headers(init?.headers);
|
|
21876
21907
|
headers.set("Authorization", `Basic ${credentials}`);
|
|
@@ -22056,17 +22087,17 @@ Use this tool for all Jira operations: listing projects, searching issues with J
|
|
|
22056
22087
|
The base URL and authentication credentials are configured per connection \u2014 only specify the API path relative to /rest/api/3/.`,
|
|
22057
22088
|
inputSchema: inputSchema48,
|
|
22058
22089
|
outputSchema: outputSchema48,
|
|
22059
|
-
async execute({ connectionId, method, path:
|
|
22090
|
+
async execute({ connectionId, method, path: path5, body }, connections) {
|
|
22060
22091
|
const connection = connections.find((c) => c.id === connectionId);
|
|
22061
22092
|
if (!connection) {
|
|
22062
22093
|
return { success: false, error: `Connection ${connectionId} not found` };
|
|
22063
22094
|
}
|
|
22064
|
-
console.log(`[connector-request] jira-api-key/${connection.name}: ${method} ${
|
|
22095
|
+
console.log(`[connector-request] jira-api-key/${connection.name}: ${method} ${path5}`);
|
|
22065
22096
|
try {
|
|
22066
22097
|
const instanceUrl = parameters40.instanceUrl.getValue(connection);
|
|
22067
22098
|
const email = parameters40.email.getValue(connection);
|
|
22068
22099
|
const apiToken = parameters40.apiToken.getValue(connection);
|
|
22069
|
-
const baseUrl = `${instanceUrl.replace(/\/+$/, "")}/rest/api/3/${
|
|
22100
|
+
const baseUrl = `${instanceUrl.replace(/\/+$/, "")}/rest/api/3/${path5}`;
|
|
22070
22101
|
const credentials = Buffer.from(`${email}:${apiToken}`).toString("base64");
|
|
22071
22102
|
const controller = new AbortController();
|
|
22072
22103
|
const timeout = setTimeout(() => controller.abort(), REQUEST_TIMEOUT_MS35);
|
|
@@ -22785,12 +22816,12 @@ var parameters42 = {
|
|
|
22785
22816
|
|
|
22786
22817
|
// ../connectors/src/connectors/asana/utils.ts
|
|
22787
22818
|
var BASE_URL26 = "https://app.asana.com/api/1.0";
|
|
22788
|
-
async function apiFetch13(params,
|
|
22819
|
+
async function apiFetch13(params, path5, init) {
|
|
22789
22820
|
const token = params[parameters42.personalAccessToken.slug];
|
|
22790
22821
|
if (!token) {
|
|
22791
22822
|
throw new Error("asana: missing required parameter: personal-access-token");
|
|
22792
22823
|
}
|
|
22793
|
-
const url = `${BASE_URL26}${
|
|
22824
|
+
const url = `${BASE_URL26}${path5.startsWith("/") ? "" : "/"}${path5}`;
|
|
22794
22825
|
const headers = new Headers(init?.headers);
|
|
22795
22826
|
headers.set("Authorization", `Bearer ${token}`);
|
|
22796
22827
|
if (!headers.has("Accept")) headers.set("Accept", "application/json");
|
|
@@ -22985,7 +23016,7 @@ Common endpoints:
|
|
|
22985
23016
|
Pagination: Use limit (1-100) and offset query parameters. The response includes next_page.offset for the next page.`,
|
|
22986
23017
|
inputSchema: inputSchema50,
|
|
22987
23018
|
outputSchema: outputSchema50,
|
|
22988
|
-
async execute({ connectionId, method, path:
|
|
23019
|
+
async execute({ connectionId, method, path: path5, body }, connections) {
|
|
22989
23020
|
const connection = connections.find((c) => c.id === connectionId);
|
|
22990
23021
|
if (!connection) {
|
|
22991
23022
|
return {
|
|
@@ -22994,11 +23025,11 @@ Pagination: Use limit (1-100) and offset query parameters. The response includes
|
|
|
22994
23025
|
};
|
|
22995
23026
|
}
|
|
22996
23027
|
console.log(
|
|
22997
|
-
`[connector-request] asana/${connection.name}: ${method} ${
|
|
23028
|
+
`[connector-request] asana/${connection.name}: ${method} ${path5}`
|
|
22998
23029
|
);
|
|
22999
23030
|
try {
|
|
23000
23031
|
const token = parameters42.personalAccessToken.getValue(connection);
|
|
23001
|
-
const normalizedPath = normalizeRequestPath(
|
|
23032
|
+
const normalizedPath = normalizeRequestPath(path5, BASE_PATH_SEGMENT5);
|
|
23002
23033
|
const url = `${BASE_URL27}${normalizedPath}`;
|
|
23003
23034
|
const controller = new AbortController();
|
|
23004
23035
|
const timeout = setTimeout(() => controller.abort(), REQUEST_TIMEOUT_MS37);
|
|
@@ -24294,12 +24325,12 @@ var parameters45 = {
|
|
|
24294
24325
|
// ../connectors/src/connectors/notion/utils.ts
|
|
24295
24326
|
var BASE_URL28 = "https://api.notion.com/v1";
|
|
24296
24327
|
var NOTION_VERSION = "2022-06-28";
|
|
24297
|
-
async function apiFetch14(params,
|
|
24328
|
+
async function apiFetch14(params, path5, init) {
|
|
24298
24329
|
const apiKey = params[parameters45.apiKey.slug];
|
|
24299
24330
|
if (!apiKey) {
|
|
24300
24331
|
throw new Error("notion: missing required parameter: api-key");
|
|
24301
24332
|
}
|
|
24302
|
-
const url = `${BASE_URL28}${
|
|
24333
|
+
const url = `${BASE_URL28}${path5.startsWith("/") ? "" : "/"}${path5}`;
|
|
24303
24334
|
const headers = new Headers(init?.headers);
|
|
24304
24335
|
headers.set("Authorization", `Bearer ${apiKey}`);
|
|
24305
24336
|
headers.set("Notion-Version", NOTION_VERSION);
|
|
@@ -24534,7 +24565,7 @@ Use this tool for all Notion API interactions: searching pages/databases, queryi
|
|
|
24534
24565
|
Pagination uses cursor-based start_cursor and page_size (max 100).`,
|
|
24535
24566
|
inputSchema: inputSchema55,
|
|
24536
24567
|
outputSchema: outputSchema55,
|
|
24537
|
-
async execute({ connectionId, method, path:
|
|
24568
|
+
async execute({ connectionId, method, path: path5, body }, connections) {
|
|
24538
24569
|
const connection = connections.find((c) => c.id === connectionId);
|
|
24539
24570
|
if (!connection) {
|
|
24540
24571
|
return {
|
|
@@ -24543,11 +24574,11 @@ Pagination uses cursor-based start_cursor and page_size (max 100).`,
|
|
|
24543
24574
|
};
|
|
24544
24575
|
}
|
|
24545
24576
|
console.log(
|
|
24546
|
-
`[connector-request] notion/${connection.name}: ${method} ${
|
|
24577
|
+
`[connector-request] notion/${connection.name}: ${method} ${path5}`
|
|
24547
24578
|
);
|
|
24548
24579
|
try {
|
|
24549
24580
|
const apiKey = parameters45.apiKey.getValue(connection);
|
|
24550
|
-
const url = `${BASE_URL29}${
|
|
24581
|
+
const url = `${BASE_URL29}${path5.startsWith("/") ? "" : "/"}${path5}`;
|
|
24551
24582
|
const controller = new AbortController();
|
|
24552
24583
|
const timeout = setTimeout(() => controller.abort(), REQUEST_TIMEOUT_MS38);
|
|
24553
24584
|
try {
|
|
@@ -24834,7 +24865,7 @@ Use this tool for all Notion API interactions: searching pages/databases, queryi
|
|
|
24834
24865
|
Pagination uses cursor-based start_cursor and page_size (max 100).`,
|
|
24835
24866
|
inputSchema: inputSchema56,
|
|
24836
24867
|
outputSchema: outputSchema56,
|
|
24837
|
-
async execute({ connectionId, method, path:
|
|
24868
|
+
async execute({ connectionId, method, path: path5, body }, connections, config) {
|
|
24838
24869
|
const connection = connections.find((c) => c.id === connectionId);
|
|
24839
24870
|
if (!connection) {
|
|
24840
24871
|
return {
|
|
@@ -24843,10 +24874,10 @@ Pagination uses cursor-based start_cursor and page_size (max 100).`,
|
|
|
24843
24874
|
};
|
|
24844
24875
|
}
|
|
24845
24876
|
console.log(
|
|
24846
|
-
`[connector-request] notion-oauth/${connection.name}: ${method} ${
|
|
24877
|
+
`[connector-request] notion-oauth/${connection.name}: ${method} ${path5}`
|
|
24847
24878
|
);
|
|
24848
24879
|
try {
|
|
24849
|
-
const url = `${BASE_URL30}${
|
|
24880
|
+
const url = `${BASE_URL30}${path5.startsWith("/") ? "" : "/"}${path5}`;
|
|
24850
24881
|
const token = await getProxyToken19(config.oauthProxy);
|
|
24851
24882
|
const proxyUrl = `https://${config.oauthProxy.sandboxId}.${config.oauthProxy.previewBaseDomain}/_sqcore/connections/${connectionId}/request`;
|
|
24852
24883
|
const controller = new AbortController();
|
|
@@ -24925,8 +24956,8 @@ var parameters46 = {};
|
|
|
24925
24956
|
// ../connectors/src/connectors/notion-oauth/utils.ts
|
|
24926
24957
|
var BASE_URL31 = "https://api.notion.com/v1";
|
|
24927
24958
|
var NOTION_VERSION4 = "2022-06-28";
|
|
24928
|
-
function apiFetch15(proxyFetch,
|
|
24929
|
-
const url = `${BASE_URL31}${
|
|
24959
|
+
function apiFetch15(proxyFetch, path5, init) {
|
|
24960
|
+
const url = `${BASE_URL31}${path5.startsWith("/") ? "" : "/"}${path5}`;
|
|
24930
24961
|
const headers = new Headers(init?.headers);
|
|
24931
24962
|
headers.set("Notion-Version", NOTION_VERSION4);
|
|
24932
24963
|
if (init?.body && !headers.has("Content-Type")) {
|
|
@@ -25367,13 +25398,13 @@ var metaAdsOnboarding = new ConnectorOnboarding({
|
|
|
25367
25398
|
|
|
25368
25399
|
// ../connectors/src/connectors/meta-ads/utils.ts
|
|
25369
25400
|
var BASE_URL33 = "https://graph.facebook.com/v21.0";
|
|
25370
|
-
async function apiFetch16(params,
|
|
25401
|
+
async function apiFetch16(params, path5, init) {
|
|
25371
25402
|
const accessToken = params[parameters47.accessToken.slug];
|
|
25372
25403
|
if (!accessToken) {
|
|
25373
25404
|
throw new Error("meta-ads: missing required parameter: access-token");
|
|
25374
25405
|
}
|
|
25375
|
-
const sep =
|
|
25376
|
-
const url = `${BASE_URL33}${
|
|
25406
|
+
const sep = path5.includes("?") ? "&" : "?";
|
|
25407
|
+
const url = `${BASE_URL33}${path5.startsWith("/") ? "" : "/"}${path5}${sep}access_token=${encodeURIComponent(accessToken)}`;
|
|
25377
25408
|
return fetch(url, init);
|
|
25378
25409
|
}
|
|
25379
25410
|
|
|
@@ -25528,7 +25559,7 @@ Authentication is handled via the configured access token.
|
|
|
25528
25559
|
{adAccountId} in the path is automatically replaced with the connection's ad account ID (with act_ prefix added).`,
|
|
25529
25560
|
inputSchema: inputSchema58,
|
|
25530
25561
|
outputSchema: outputSchema58,
|
|
25531
|
-
async execute({ connectionId, method, path:
|
|
25562
|
+
async execute({ connectionId, method, path: path5, queryParams, body }, connections) {
|
|
25532
25563
|
const connection = connections.find((c) => c.id === connectionId);
|
|
25533
25564
|
if (!connection) {
|
|
25534
25565
|
return {
|
|
@@ -25537,12 +25568,12 @@ Authentication is handled via the configured access token.
|
|
|
25537
25568
|
};
|
|
25538
25569
|
}
|
|
25539
25570
|
console.log(
|
|
25540
|
-
`[connector-request] meta-ads/${connection.name}: ${method} ${
|
|
25571
|
+
`[connector-request] meta-ads/${connection.name}: ${method} ${path5}`
|
|
25541
25572
|
);
|
|
25542
25573
|
try {
|
|
25543
25574
|
const accessToken = parameters47.accessToken.getValue(connection);
|
|
25544
25575
|
const adAccountId = parameters47.adAccountId.tryGetValue(connection) ?? "";
|
|
25545
|
-
const resolvedPath = adAccountId ?
|
|
25576
|
+
const resolvedPath = adAccountId ? path5.replace(/\{adAccountId\}/g, adAccountId) : path5;
|
|
25546
25577
|
let url = `${BASE_URL34}${resolvedPath}`;
|
|
25547
25578
|
const params = new URLSearchParams(queryParams ?? {});
|
|
25548
25579
|
params.set("access_token", accessToken);
|
|
@@ -26092,7 +26123,7 @@ Authentication is handled automatically via OAuth proxy.
|
|
|
26092
26123
|
{adAccountId} in the path is automatically replaced with the connection's ad account ID.`,
|
|
26093
26124
|
inputSchema: inputSchema60,
|
|
26094
26125
|
outputSchema: outputSchema60,
|
|
26095
|
-
async execute({ connectionId, method, path:
|
|
26126
|
+
async execute({ connectionId, method, path: path5, queryParams, body }, connections, config) {
|
|
26096
26127
|
const connection = connections.find((c) => c.id === connectionId);
|
|
26097
26128
|
if (!connection) {
|
|
26098
26129
|
return {
|
|
@@ -26101,11 +26132,11 @@ Authentication is handled automatically via OAuth proxy.
|
|
|
26101
26132
|
};
|
|
26102
26133
|
}
|
|
26103
26134
|
console.log(
|
|
26104
|
-
`[connector-request] meta-ads-oauth/${connection.name}: ${method} ${
|
|
26135
|
+
`[connector-request] meta-ads-oauth/${connection.name}: ${method} ${path5}`
|
|
26105
26136
|
);
|
|
26106
26137
|
try {
|
|
26107
26138
|
const adAccountId = parameters48.adAccountId.tryGetValue(connection) ?? "";
|
|
26108
|
-
const resolvedPath = adAccountId ?
|
|
26139
|
+
const resolvedPath = adAccountId ? path5.replace(/\{adAccountId\}/g, adAccountId) : path5;
|
|
26109
26140
|
let url = `${BASE_URL37}${resolvedPath}`;
|
|
26110
26141
|
if (queryParams && Object.keys(queryParams).length > 0) {
|
|
26111
26142
|
const params = new URLSearchParams(queryParams);
|
|
@@ -26676,7 +26707,7 @@ Authentication is handled automatically via OAuth proxy.
|
|
|
26676
26707
|
The advertiser_id is automatically injected if configured.`,
|
|
26677
26708
|
inputSchema: inputSchema62,
|
|
26678
26709
|
outputSchema: outputSchema62,
|
|
26679
|
-
async execute({ connectionId, method, path:
|
|
26710
|
+
async execute({ connectionId, method, path: path5, queryParams, body }, connections, config) {
|
|
26680
26711
|
const connection = connections.find((c) => c.id === connectionId);
|
|
26681
26712
|
if (!connection) {
|
|
26682
26713
|
return {
|
|
@@ -26685,11 +26716,11 @@ The advertiser_id is automatically injected if configured.`,
|
|
|
26685
26716
|
};
|
|
26686
26717
|
}
|
|
26687
26718
|
console.log(
|
|
26688
|
-
`[connector-request] tiktok-ads/${connection.name}: ${method} ${
|
|
26719
|
+
`[connector-request] tiktok-ads/${connection.name}: ${method} ${path5}`
|
|
26689
26720
|
);
|
|
26690
26721
|
try {
|
|
26691
26722
|
const advertiserId = parameters49.advertiserId.tryGetValue(connection) ?? "";
|
|
26692
|
-
const normalizedPath = normalizeRequestPath(
|
|
26723
|
+
const normalizedPath = normalizeRequestPath(path5, BASE_PATH_SEGMENT6);
|
|
26693
26724
|
let url = `${BASE_URL40}${normalizedPath}`;
|
|
26694
26725
|
if (method === "GET") {
|
|
26695
26726
|
const params = new URLSearchParams(queryParams ?? {});
|
|
@@ -26974,14 +27005,14 @@ function extractDatacenter(apiKey) {
|
|
|
26974
27005
|
}
|
|
26975
27006
|
return dc;
|
|
26976
27007
|
}
|
|
26977
|
-
async function apiFetch17(params,
|
|
27008
|
+
async function apiFetch17(params, path5, init) {
|
|
26978
27009
|
const apiKey = params[parameters50.apiKey.slug];
|
|
26979
27010
|
if (!apiKey) {
|
|
26980
27011
|
throw new Error("mailchimp: missing required parameter: api-key");
|
|
26981
27012
|
}
|
|
26982
27013
|
const dc = extractDatacenter(apiKey);
|
|
26983
27014
|
const baseUrl = `https://${dc}.api.mailchimp.com/3.0`;
|
|
26984
|
-
const url = `${baseUrl}${
|
|
27015
|
+
const url = `${baseUrl}${path5.startsWith("/") ? "" : "/"}${path5}`;
|
|
26985
27016
|
const headers = new Headers(init?.headers);
|
|
26986
27017
|
headers.set("Authorization", `Basic ${btoa(`anystring:${apiKey}`)}`);
|
|
26987
27018
|
return fetch(url, { ...init, headers });
|
|
@@ -27114,7 +27145,7 @@ Use this tool for all Mailchimp API interactions: managing audiences/lists, camp
|
|
|
27114
27145
|
The datacenter is automatically extracted from the API key suffix.`,
|
|
27115
27146
|
inputSchema: inputSchema63,
|
|
27116
27147
|
outputSchema: outputSchema63,
|
|
27117
|
-
async execute({ connectionId, method, path:
|
|
27148
|
+
async execute({ connectionId, method, path: path5, queryParams, body }, connections) {
|
|
27118
27149
|
const connection = connections.find((c) => c.id === connectionId);
|
|
27119
27150
|
if (!connection) {
|
|
27120
27151
|
return {
|
|
@@ -27123,13 +27154,13 @@ The datacenter is automatically extracted from the API key suffix.`,
|
|
|
27123
27154
|
};
|
|
27124
27155
|
}
|
|
27125
27156
|
console.log(
|
|
27126
|
-
`[connector-request] mailchimp/${connection.name}: ${method} ${
|
|
27157
|
+
`[connector-request] mailchimp/${connection.name}: ${method} ${path5}`
|
|
27127
27158
|
);
|
|
27128
27159
|
try {
|
|
27129
27160
|
const apiKey = parameters50.apiKey.getValue(connection);
|
|
27130
27161
|
const dc = extractDatacenter2(apiKey);
|
|
27131
27162
|
const baseUrl = `https://${dc}.api.mailchimp.com/3.0`;
|
|
27132
|
-
let url = `${baseUrl}${
|
|
27163
|
+
let url = `${baseUrl}${path5.startsWith("/") ? "" : "/"}${path5}`;
|
|
27133
27164
|
if (queryParams) {
|
|
27134
27165
|
const searchParams = new URLSearchParams(queryParams);
|
|
27135
27166
|
url += `?${searchParams.toString()}`;
|
|
@@ -27442,7 +27473,7 @@ var parameters51 = {
|
|
|
27442
27473
|
};
|
|
27443
27474
|
|
|
27444
27475
|
// ../connectors/src/connectors/mailchimp-oauth/utils.ts
|
|
27445
|
-
function apiFetch18(params, proxyFetch,
|
|
27476
|
+
function apiFetch18(params, proxyFetch, path5, init) {
|
|
27446
27477
|
const serverPrefix = params[parameters51.serverPrefix.slug];
|
|
27447
27478
|
if (!serverPrefix) {
|
|
27448
27479
|
throw new Error(
|
|
@@ -27450,7 +27481,7 @@ function apiFetch18(params, proxyFetch, path4, init) {
|
|
|
27450
27481
|
);
|
|
27451
27482
|
}
|
|
27452
27483
|
const baseUrl = `https://${serverPrefix}.api.mailchimp.com/3.0`;
|
|
27453
|
-
const url = `${baseUrl}${
|
|
27484
|
+
const url = `${baseUrl}${path5.startsWith("/") ? "" : "/"}${path5}`;
|
|
27454
27485
|
return proxyFetch(url, init);
|
|
27455
27486
|
}
|
|
27456
27487
|
|
|
@@ -27598,7 +27629,7 @@ var requestTool33 = new ConnectorTool({
|
|
|
27598
27629
|
Authentication is handled automatically via OAuth proxy.`,
|
|
27599
27630
|
inputSchema: inputSchema64,
|
|
27600
27631
|
outputSchema: outputSchema64,
|
|
27601
|
-
async execute({ connectionId, method, path:
|
|
27632
|
+
async execute({ connectionId, method, path: path5, queryParams, body }, connections, config) {
|
|
27602
27633
|
const connection = connections.find((c) => c.id === connectionId);
|
|
27603
27634
|
if (!connection) {
|
|
27604
27635
|
return {
|
|
@@ -27607,12 +27638,12 @@ Authentication is handled automatically via OAuth proxy.`,
|
|
|
27607
27638
|
};
|
|
27608
27639
|
}
|
|
27609
27640
|
console.log(
|
|
27610
|
-
`[connector-request] mailchimp-oauth/${connection.name}: ${method} ${
|
|
27641
|
+
`[connector-request] mailchimp-oauth/${connection.name}: ${method} ${path5}`
|
|
27611
27642
|
);
|
|
27612
27643
|
try {
|
|
27613
27644
|
const serverPrefix = parameters51.serverPrefix.getValue(connection);
|
|
27614
27645
|
const baseUrl = `https://${serverPrefix}.api.mailchimp.com/3.0`;
|
|
27615
|
-
let url = `${baseUrl}${
|
|
27646
|
+
let url = `${baseUrl}${path5.startsWith("/") ? "" : "/"}${path5}`;
|
|
27616
27647
|
if (queryParams) {
|
|
27617
27648
|
const searchParams = new URLSearchParams(queryParams);
|
|
27618
27649
|
url += `?${searchParams.toString()}`;
|
|
@@ -27855,14 +27886,14 @@ var parameters52 = {
|
|
|
27855
27886
|
};
|
|
27856
27887
|
|
|
27857
27888
|
// ../connectors/src/connectors/customerio/utils.ts
|
|
27858
|
-
async function apiFetch19(params,
|
|
27889
|
+
async function apiFetch19(params, path5, init) {
|
|
27859
27890
|
const apiKey = params[parameters52.appApiKey.slug];
|
|
27860
27891
|
if (!apiKey) {
|
|
27861
27892
|
throw new Error("customerio: missing required parameter: app-api-key");
|
|
27862
27893
|
}
|
|
27863
27894
|
const region = params[parameters52.region.slug];
|
|
27864
27895
|
const baseUrl = region === "eu" ? "https://api-eu.customer.io" : "https://api.customer.io";
|
|
27865
|
-
const url = `${baseUrl}${
|
|
27896
|
+
const url = `${baseUrl}${path5.startsWith("/") ? "" : "/"}${path5}`;
|
|
27866
27897
|
const headers = new Headers(init?.headers);
|
|
27867
27898
|
headers.set("Authorization", `Bearer ${apiKey}`);
|
|
27868
27899
|
return fetch(url, { ...init, headers });
|
|
@@ -27919,10 +27950,10 @@ async function fetchEntityCount(params, entity) {
|
|
|
27919
27950
|
campaigns: "/v1/campaigns",
|
|
27920
27951
|
newsletters: "/v1/newsletters"
|
|
27921
27952
|
};
|
|
27922
|
-
const
|
|
27923
|
-
if (!
|
|
27953
|
+
const path5 = endpoint[entity];
|
|
27954
|
+
if (!path5) return "available";
|
|
27924
27955
|
try {
|
|
27925
|
-
const res = await apiFetch19(params,
|
|
27956
|
+
const res = await apiFetch19(params, path5);
|
|
27926
27957
|
if (!res.ok) return "available";
|
|
27927
27958
|
const data = await res.json();
|
|
27928
27959
|
if (typeof data.count === "number") return String(data.count);
|
|
@@ -28008,7 +28039,7 @@ Use this tool for reading customer data, managing campaigns, segments, broadcast
|
|
|
28008
28039
|
The App API is the read and management path for Customer.io data.`,
|
|
28009
28040
|
inputSchema: inputSchema65,
|
|
28010
28041
|
outputSchema: outputSchema65,
|
|
28011
|
-
async execute({ connectionId, method, path:
|
|
28042
|
+
async execute({ connectionId, method, path: path5, queryParams, body }, connections) {
|
|
28012
28043
|
const connection = connections.find((c) => c.id === connectionId);
|
|
28013
28044
|
if (!connection) {
|
|
28014
28045
|
return {
|
|
@@ -28017,13 +28048,13 @@ The App API is the read and management path for Customer.io data.`,
|
|
|
28017
28048
|
};
|
|
28018
28049
|
}
|
|
28019
28050
|
console.log(
|
|
28020
|
-
`[connector-request] customerio/${connection.name}: ${method} ${
|
|
28051
|
+
`[connector-request] customerio/${connection.name}: ${method} ${path5}`
|
|
28021
28052
|
);
|
|
28022
28053
|
try {
|
|
28023
28054
|
const appApiKey = parameters52.appApiKey.getValue(connection);
|
|
28024
28055
|
const region = parameters52.region.tryGetValue(connection);
|
|
28025
28056
|
const baseUrl = getBaseUrl2(region);
|
|
28026
|
-
let url = `${baseUrl}${
|
|
28057
|
+
let url = `${baseUrl}${path5.startsWith("/") ? "" : "/"}${path5}`;
|
|
28027
28058
|
if (queryParams) {
|
|
28028
28059
|
const searchParams = new URLSearchParams(queryParams);
|
|
28029
28060
|
url += `?${searchParams.toString()}`;
|
|
@@ -28348,7 +28379,7 @@ var requestWithDelegationTool2 = new ConnectorTool({
|
|
|
28348
28379
|
description: "Call the Gmail API on behalf of the specified Workspace user via Domain-wide Delegation. Read-only operations only. Pass `subject` as the target user email and `scopes` as ['https://www.googleapis.com/auth/gmail.readonly']. Paths are relative to https://gmail.googleapis.com/gmail/v1/users \u2014 use '/me' as the userId prefix (e.g., '/me/messages'). Requires Domain-wide Delegation to be authorized for the service account in the Workspace admin console.",
|
|
28349
28380
|
inputSchema: inputSchema66,
|
|
28350
28381
|
outputSchema: outputSchema66,
|
|
28351
|
-
async execute({ connectionId, method, path:
|
|
28382
|
+
async execute({ connectionId, method, path: path5, subject, scopes, queryParams, body }, connections) {
|
|
28352
28383
|
const connection = connections.find((c) => c.id === connectionId);
|
|
28353
28384
|
if (!connection) {
|
|
28354
28385
|
return {
|
|
@@ -28369,7 +28400,7 @@ var requestWithDelegationTool2 = new ConnectorTool({
|
|
|
28369
28400
|
}
|
|
28370
28401
|
const serviceAccountEmail = serviceAccount.client_email;
|
|
28371
28402
|
console.log(
|
|
28372
|
-
`[connector-request] gmail/${connection.name}: ${method} ${
|
|
28403
|
+
`[connector-request] gmail/${connection.name}: ${method} ${path5} subject=${subject}`
|
|
28373
28404
|
);
|
|
28374
28405
|
try {
|
|
28375
28406
|
const { GoogleAuth } = await import("google-auth-library");
|
|
@@ -28389,7 +28420,7 @@ var requestWithDelegationTool2 = new ConnectorTool({
|
|
|
28389
28420
|
serviceAccountEmail
|
|
28390
28421
|
};
|
|
28391
28422
|
}
|
|
28392
|
-
const normalizedPath = normalizeRequestPath(
|
|
28423
|
+
const normalizedPath = normalizeRequestPath(path5, BASE_PATH_SEGMENT7);
|
|
28393
28424
|
let url = `${BASE_URL41}${normalizedPath}`;
|
|
28394
28425
|
if (queryParams) {
|
|
28395
28426
|
const searchParams = new URLSearchParams(queryParams);
|
|
@@ -28952,7 +28983,7 @@ Authentication is handled automatically via OAuth proxy.
|
|
|
28952
28983
|
All paths are relative to https://gmail.googleapis.com/gmail/v1/users. Use '/me' as the userId prefix (e.g., '/me/messages').`,
|
|
28953
28984
|
inputSchema: inputSchema67,
|
|
28954
28985
|
outputSchema: outputSchema67,
|
|
28955
|
-
async execute({ connectionId, method, path:
|
|
28986
|
+
async execute({ connectionId, method, path: path5, queryParams }, connections, config) {
|
|
28956
28987
|
const connection = connections.find((c) => c.id === connectionId);
|
|
28957
28988
|
if (!connection) {
|
|
28958
28989
|
return {
|
|
@@ -28961,10 +28992,10 @@ All paths are relative to https://gmail.googleapis.com/gmail/v1/users. Use '/me'
|
|
|
28961
28992
|
};
|
|
28962
28993
|
}
|
|
28963
28994
|
console.log(
|
|
28964
|
-
`[connector-request] gmail-oauth/${connection.name}: ${method} ${
|
|
28995
|
+
`[connector-request] gmail-oauth/${connection.name}: ${method} ${path5}`
|
|
28965
28996
|
);
|
|
28966
28997
|
try {
|
|
28967
|
-
const normalizedPath = normalizeRequestPath(
|
|
28998
|
+
const normalizedPath = normalizeRequestPath(path5, BASE_PATH_SEGMENT8);
|
|
28968
28999
|
let url = `${BASE_URL42}${normalizedPath}`;
|
|
28969
29000
|
if (queryParams) {
|
|
28970
29001
|
const searchParams = new URLSearchParams(queryParams);
|
|
@@ -29406,7 +29437,7 @@ var requestWithDelegationTool3 = new ConnectorTool({
|
|
|
29406
29437
|
description: "Call the Google Workspace Admin SDK Reports API on behalf of the specified Workspace admin via Domain-wide Delegation. Read-only operations only. Pass `subject` as the admin user email and `scopes` as one or both of ['https://www.googleapis.com/auth/admin.reports.audit.readonly', 'https://www.googleapis.com/auth/admin.reports.usage.readonly']. Paths are relative to https://admin.googleapis.com/admin/reports/v1 (e.g., '/activity/users/all/applications/login', '/usage/users/all/dates/2025-04-01'). Requires Domain-wide Delegation to be authorized for the service account in the Workspace admin console.",
|
|
29407
29438
|
inputSchema: inputSchema68,
|
|
29408
29439
|
outputSchema: outputSchema68,
|
|
29409
|
-
async execute({ connectionId, method, path:
|
|
29440
|
+
async execute({ connectionId, method, path: path5, subject, scopes, queryParams }, connections) {
|
|
29410
29441
|
const connection = connections.find((c) => c.id === connectionId);
|
|
29411
29442
|
if (!connection) {
|
|
29412
29443
|
return {
|
|
@@ -29427,7 +29458,7 @@ var requestWithDelegationTool3 = new ConnectorTool({
|
|
|
29427
29458
|
}
|
|
29428
29459
|
const serviceAccountEmail = serviceAccount.client_email;
|
|
29429
29460
|
console.log(
|
|
29430
|
-
`[connector-request] google-audit-log/${connection.name}: ${method} ${
|
|
29461
|
+
`[connector-request] google-audit-log/${connection.name}: ${method} ${path5} subject=${subject}`
|
|
29431
29462
|
);
|
|
29432
29463
|
try {
|
|
29433
29464
|
const { GoogleAuth } = await import("google-auth-library");
|
|
@@ -29447,7 +29478,7 @@ var requestWithDelegationTool3 = new ConnectorTool({
|
|
|
29447
29478
|
serviceAccountEmail
|
|
29448
29479
|
};
|
|
29449
29480
|
}
|
|
29450
|
-
const normalizedPath = normalizeRequestPath(
|
|
29481
|
+
const normalizedPath = normalizeRequestPath(path5, BASE_PATH_SEGMENT9);
|
|
29451
29482
|
let url = `${BASE_URL43}${normalizedPath}`;
|
|
29452
29483
|
if (queryParams) {
|
|
29453
29484
|
const searchParams = new URLSearchParams(queryParams);
|
|
@@ -30373,7 +30404,7 @@ Authentication is handled automatically via OAuth proxy.
|
|
|
30373
30404
|
Required headers (LinkedIn-Version, X-Restli-Protocol-Version) are set automatically.`,
|
|
30374
30405
|
inputSchema: inputSchema70,
|
|
30375
30406
|
outputSchema: outputSchema70,
|
|
30376
|
-
async execute({ connectionId, method, path:
|
|
30407
|
+
async execute({ connectionId, method, path: path5, queryParams, body }, connections, config) {
|
|
30377
30408
|
const connection = connections.find((c) => c.id === connectionId);
|
|
30378
30409
|
if (!connection) {
|
|
30379
30410
|
return {
|
|
@@ -30382,11 +30413,11 @@ Required headers (LinkedIn-Version, X-Restli-Protocol-Version) are set automatic
|
|
|
30382
30413
|
};
|
|
30383
30414
|
}
|
|
30384
30415
|
console.log(
|
|
30385
|
-
`[connector-request] linkedin-ads/${connection.name}: ${method} ${
|
|
30416
|
+
`[connector-request] linkedin-ads/${connection.name}: ${method} ${path5}`
|
|
30386
30417
|
);
|
|
30387
30418
|
try {
|
|
30388
30419
|
const adAccountId = parameters56.adAccountId.tryGetValue(connection) ?? "";
|
|
30389
|
-
const resolvedPath = adAccountId ?
|
|
30420
|
+
const resolvedPath = adAccountId ? path5.replace(/\{adAccountId\}/g, adAccountId) : path5;
|
|
30390
30421
|
let url = `${BASE_URL46}${resolvedPath}`;
|
|
30391
30422
|
if (queryParams && Object.keys(queryParams).length > 0) {
|
|
30392
30423
|
const params = new URLSearchParams(queryParams);
|
|
@@ -30734,7 +30765,7 @@ function normalizeSubdomain(raw) {
|
|
|
30734
30765
|
function basicAuthHeader(email, apiToken) {
|
|
30735
30766
|
return `Basic ${Buffer.from(`${email}/token:${apiToken}`).toString("base64")}`;
|
|
30736
30767
|
}
|
|
30737
|
-
async function apiFetch20(params,
|
|
30768
|
+
async function apiFetch20(params, path5, init) {
|
|
30738
30769
|
const subdomain = params[parameters57.subdomain.slug];
|
|
30739
30770
|
const email = params[parameters57.email.slug];
|
|
30740
30771
|
const apiToken = params[parameters57.apiToken.slug];
|
|
@@ -30743,7 +30774,7 @@ async function apiFetch20(params, path4, init) {
|
|
|
30743
30774
|
"zendesk: missing required parameter(s) (subdomain, email, api-token)"
|
|
30744
30775
|
);
|
|
30745
30776
|
}
|
|
30746
|
-
const url = `https://${normalizeSubdomain(subdomain)}.zendesk.com${
|
|
30777
|
+
const url = `https://${normalizeSubdomain(subdomain)}.zendesk.com${path5.startsWith("/") ? "" : "/"}${path5}`;
|
|
30747
30778
|
const headers = new Headers(init?.headers);
|
|
30748
30779
|
headers.set("Authorization", basicAuthHeader(email, apiToken));
|
|
30749
30780
|
headers.set("Accept", "application/json");
|
|
@@ -30790,8 +30821,8 @@ async function listBrands(params) {
|
|
|
30790
30821
|
const data = await res.json();
|
|
30791
30822
|
return data.brands ?? [];
|
|
30792
30823
|
}
|
|
30793
|
-
async function fetchCount(params,
|
|
30794
|
-
const res = await apiFetch20(params,
|
|
30824
|
+
async function fetchCount(params, path5, countField) {
|
|
30825
|
+
const res = await apiFetch20(params, path5);
|
|
30795
30826
|
if (!res.ok) return null;
|
|
30796
30827
|
const data = await res.json();
|
|
30797
30828
|
const raw = data[countField];
|
|
@@ -30906,7 +30937,7 @@ Use this tool for all Zendesk API interactions: querying tickets, users, organiz
|
|
|
30906
30937
|
Zendesk uses cursor-based pagination with page[size] and page[after] parameters. All endpoints return .json suffix.`,
|
|
30907
30938
|
inputSchema: inputSchema71,
|
|
30908
30939
|
outputSchema: outputSchema71,
|
|
30909
|
-
async execute({ connectionId, method, path:
|
|
30940
|
+
async execute({ connectionId, method, path: path5, body }, connections) {
|
|
30910
30941
|
const connection = connections.find((c) => c.id === connectionId);
|
|
30911
30942
|
if (!connection) {
|
|
30912
30943
|
return {
|
|
@@ -30915,7 +30946,7 @@ Zendesk uses cursor-based pagination with page[size] and page[after] parameters.
|
|
|
30915
30946
|
};
|
|
30916
30947
|
}
|
|
30917
30948
|
console.log(
|
|
30918
|
-
`[connector-request] zendesk/${connection.name}: ${method} ${
|
|
30949
|
+
`[connector-request] zendesk/${connection.name}: ${method} ${path5}`
|
|
30919
30950
|
);
|
|
30920
30951
|
try {
|
|
30921
30952
|
const subdomain = parameters57.subdomain.getValue(connection);
|
|
@@ -30924,7 +30955,7 @@ Zendesk uses cursor-based pagination with page[size] and page[after] parameters.
|
|
|
30924
30955
|
const authToken = Buffer.from(`${email}/token:${apiToken}`).toString(
|
|
30925
30956
|
"base64"
|
|
30926
30957
|
);
|
|
30927
|
-
const url = `https://${subdomain}.zendesk.com${
|
|
30958
|
+
const url = `https://${subdomain}.zendesk.com${path5.startsWith("/") ? "" : "/"}${path5}`;
|
|
30928
30959
|
const controller = new AbortController();
|
|
30929
30960
|
const timeout = setTimeout(() => controller.abort(), REQUEST_TIMEOUT_MS54);
|
|
30930
30961
|
try {
|
|
@@ -31248,7 +31279,7 @@ Use this tool for all Zendesk API interactions: querying tickets, users, organiz
|
|
|
31248
31279
|
Zendesk uses cursor-based pagination with page[size] and page[after] parameters. All endpoint paths end with .json.`,
|
|
31249
31280
|
inputSchema: inputSchema72,
|
|
31250
31281
|
outputSchema: outputSchema72,
|
|
31251
|
-
async execute({ connectionId, method, path:
|
|
31282
|
+
async execute({ connectionId, method, path: path5, queryParams, body }, connections, config) {
|
|
31252
31283
|
const connection = connections.find((c) => c.id === connectionId);
|
|
31253
31284
|
if (!connection) {
|
|
31254
31285
|
return {
|
|
@@ -31257,10 +31288,10 @@ Zendesk uses cursor-based pagination with page[size] and page[after] parameters.
|
|
|
31257
31288
|
};
|
|
31258
31289
|
}
|
|
31259
31290
|
console.log(
|
|
31260
|
-
`[connector-request] zendesk-oauth/${connection.name}: ${method} ${
|
|
31291
|
+
`[connector-request] zendesk-oauth/${connection.name}: ${method} ${path5}`
|
|
31261
31292
|
);
|
|
31262
31293
|
try {
|
|
31263
|
-
let url =
|
|
31294
|
+
let url = path5;
|
|
31264
31295
|
if (queryParams) {
|
|
31265
31296
|
const searchParams = new URLSearchParams(queryParams);
|
|
31266
31297
|
const separator = url.includes("?") ? "&" : "?";
|
|
@@ -31338,8 +31369,8 @@ var zendeskOauthOnboarding = new ConnectorOnboarding({
|
|
|
31338
31369
|
});
|
|
31339
31370
|
|
|
31340
31371
|
// ../connectors/src/connectors/zendesk-oauth/utils.ts
|
|
31341
|
-
function apiFetch21(proxyFetch,
|
|
31342
|
-
const url =
|
|
31372
|
+
function apiFetch21(proxyFetch, path5, init) {
|
|
31373
|
+
const url = path5.startsWith("/") ? path5 : `/${path5}`;
|
|
31343
31374
|
const headers = new Headers(init?.headers);
|
|
31344
31375
|
headers.set("Accept", "application/json");
|
|
31345
31376
|
return proxyFetch(url, { ...init, headers });
|
|
@@ -31380,8 +31411,8 @@ async function listBrands2(proxyFetch) {
|
|
|
31380
31411
|
const data = await res.json();
|
|
31381
31412
|
return data.brands ?? [];
|
|
31382
31413
|
}
|
|
31383
|
-
async function fetchCount2(proxyFetch,
|
|
31384
|
-
const res = await apiFetch21(proxyFetch,
|
|
31414
|
+
async function fetchCount2(proxyFetch, path5) {
|
|
31415
|
+
const res = await apiFetch21(proxyFetch, path5);
|
|
31385
31416
|
if (!res.ok) return null;
|
|
31386
31417
|
const data = await res.json();
|
|
31387
31418
|
if (typeof data["count"] === "number") return data["count"];
|
|
@@ -31696,12 +31727,12 @@ var parameters59 = {
|
|
|
31696
31727
|
// ../connectors/src/connectors/intercom/utils.ts
|
|
31697
31728
|
var BASE_URL47 = "https://api.intercom.io";
|
|
31698
31729
|
var INTERCOM_VERSION = "2.11";
|
|
31699
|
-
async function apiFetch22(params,
|
|
31730
|
+
async function apiFetch22(params, path5, init) {
|
|
31700
31731
|
const accessToken = params[parameters59.accessToken.slug];
|
|
31701
31732
|
if (!accessToken) {
|
|
31702
31733
|
throw new Error("intercom: missing required parameter: access-token");
|
|
31703
31734
|
}
|
|
31704
|
-
const url = `${BASE_URL47}${
|
|
31735
|
+
const url = `${BASE_URL47}${path5.startsWith("/") ? "" : "/"}${path5}`;
|
|
31705
31736
|
const headers = new Headers(init?.headers);
|
|
31706
31737
|
headers.set("Authorization", `Bearer ${accessToken}`);
|
|
31707
31738
|
headers.set("Accept", "application/json");
|
|
@@ -31722,8 +31753,8 @@ var INTERCOM_SCOPES = [
|
|
|
31722
31753
|
{ value: "articles", label: "Articles", countPath: "/articles?per_page=1" },
|
|
31723
31754
|
{ value: "teams", label: "Teams", countPath: "/teams" }
|
|
31724
31755
|
];
|
|
31725
|
-
async function fetchCount3(params,
|
|
31726
|
-
const res = await apiFetch22(params,
|
|
31756
|
+
async function fetchCount3(params, path5) {
|
|
31757
|
+
const res = await apiFetch22(params, path5);
|
|
31727
31758
|
if (!res.ok) {
|
|
31728
31759
|
return null;
|
|
31729
31760
|
}
|
|
@@ -31826,7 +31857,7 @@ Search endpoints (contacts/search, conversations/search) use POST with a query o
|
|
|
31826
31857
|
The Intercom-Version header is set to 2.11 automatically.`,
|
|
31827
31858
|
inputSchema: inputSchema73,
|
|
31828
31859
|
outputSchema: outputSchema73,
|
|
31829
|
-
async execute({ connectionId, method, path:
|
|
31860
|
+
async execute({ connectionId, method, path: path5, body }, connections) {
|
|
31830
31861
|
const connection = connections.find((c) => c.id === connectionId);
|
|
31831
31862
|
if (!connection) {
|
|
31832
31863
|
return {
|
|
@@ -31835,11 +31866,11 @@ The Intercom-Version header is set to 2.11 automatically.`,
|
|
|
31835
31866
|
};
|
|
31836
31867
|
}
|
|
31837
31868
|
console.log(
|
|
31838
|
-
`[connector-request] intercom/${connection.name}: ${method} ${
|
|
31869
|
+
`[connector-request] intercom/${connection.name}: ${method} ${path5}`
|
|
31839
31870
|
);
|
|
31840
31871
|
try {
|
|
31841
31872
|
const accessToken = parameters59.accessToken.getValue(connection);
|
|
31842
|
-
const url = `${BASE_URL48}${
|
|
31873
|
+
const url = `${BASE_URL48}${path5.startsWith("/") ? "" : "/"}${path5}`;
|
|
31843
31874
|
const controller = new AbortController();
|
|
31844
31875
|
const timeout = setTimeout(() => controller.abort(), REQUEST_TIMEOUT_MS56);
|
|
31845
31876
|
try {
|
|
@@ -32180,7 +32211,7 @@ Use this tool for all Intercom API interactions: querying contacts, conversation
|
|
|
32180
32211
|
Search endpoints (contacts/search, conversations/search) use POST with a query object in the body.`,
|
|
32181
32212
|
inputSchema: inputSchema74,
|
|
32182
32213
|
outputSchema: outputSchema74,
|
|
32183
|
-
async execute({ connectionId, method, path:
|
|
32214
|
+
async execute({ connectionId, method, path: path5, queryParams, body }, connections, config) {
|
|
32184
32215
|
const connection = connections.find((c) => c.id === connectionId);
|
|
32185
32216
|
if (!connection) {
|
|
32186
32217
|
return {
|
|
@@ -32189,10 +32220,10 @@ Search endpoints (contacts/search, conversations/search) use POST with a query o
|
|
|
32189
32220
|
};
|
|
32190
32221
|
}
|
|
32191
32222
|
console.log(
|
|
32192
|
-
`[connector-request] intercom-oauth/${connection.name}: ${method} ${
|
|
32223
|
+
`[connector-request] intercom-oauth/${connection.name}: ${method} ${path5}`
|
|
32193
32224
|
);
|
|
32194
32225
|
try {
|
|
32195
|
-
let url = `${BASE_URL49}${
|
|
32226
|
+
let url = `${BASE_URL49}${path5.startsWith("/") ? "" : "/"}${path5}`;
|
|
32196
32227
|
if (queryParams) {
|
|
32197
32228
|
const searchParams = new URLSearchParams(queryParams);
|
|
32198
32229
|
const separator = url.includes("?") ? "&" : "?";
|
|
@@ -32273,8 +32304,8 @@ var intercomOauthOnboarding = new ConnectorOnboarding({
|
|
|
32273
32304
|
// ../connectors/src/connectors/intercom-oauth/utils.ts
|
|
32274
32305
|
var BASE_URL50 = "https://api.intercom.io";
|
|
32275
32306
|
var INTERCOM_VERSION2 = "2.11";
|
|
32276
|
-
function apiFetch23(proxyFetch,
|
|
32277
|
-
const url = `${BASE_URL50}${
|
|
32307
|
+
function apiFetch23(proxyFetch, path5, init) {
|
|
32308
|
+
const url = `${BASE_URL50}${path5.startsWith("/") ? "" : "/"}${path5}`;
|
|
32278
32309
|
const headers = new Headers(init?.headers);
|
|
32279
32310
|
headers.set("Accept", "application/json");
|
|
32280
32311
|
headers.set("Intercom-Version", INTERCOM_VERSION2);
|
|
@@ -32294,8 +32325,8 @@ var INTERCOM_SCOPES2 = [
|
|
|
32294
32325
|
{ value: "articles", label: "Articles", countPath: "/articles?per_page=1" },
|
|
32295
32326
|
{ value: "teams", label: "Teams", countPath: "/teams" }
|
|
32296
32327
|
];
|
|
32297
|
-
async function fetchCount4(proxyFetch,
|
|
32298
|
-
const res = await apiFetch23(proxyFetch,
|
|
32328
|
+
async function fetchCount4(proxyFetch, path5) {
|
|
32329
|
+
const res = await apiFetch23(proxyFetch, path5);
|
|
32299
32330
|
if (!res.ok) {
|
|
32300
32331
|
return null;
|
|
32301
32332
|
}
|
|
@@ -32654,7 +32685,7 @@ function getQueryBaseUrl(params) {
|
|
|
32654
32685
|
if (region === "in") return "https://in.mixpanel.com/api";
|
|
32655
32686
|
return "https://mixpanel.com/api";
|
|
32656
32687
|
}
|
|
32657
|
-
async function apiFetch24(params,
|
|
32688
|
+
async function apiFetch24(params, path5, init) {
|
|
32658
32689
|
const username = params[parameters61.serviceAccountUsername.slug];
|
|
32659
32690
|
const secret = params[parameters61.serviceAccountSecret.slug];
|
|
32660
32691
|
const projectId2 = params[parameters61.projectId.slug];
|
|
@@ -32664,7 +32695,7 @@ async function apiFetch24(params, path4, init) {
|
|
|
32664
32695
|
);
|
|
32665
32696
|
}
|
|
32666
32697
|
const base = getQueryBaseUrl(params);
|
|
32667
|
-
const url = new URL(`${base}${
|
|
32698
|
+
const url = new URL(`${base}${path5.startsWith("/") ? "" : "/"}${path5}`);
|
|
32668
32699
|
if (!url.searchParams.has("project_id")) {
|
|
32669
32700
|
url.searchParams.set("project_id", projectId2);
|
|
32670
32701
|
}
|
|
@@ -33113,14 +33144,14 @@ var parameters62 = {
|
|
|
33113
33144
|
};
|
|
33114
33145
|
|
|
33115
33146
|
// ../connectors/src/connectors/grafana/utils.ts
|
|
33116
|
-
async function apiFetch25(params,
|
|
33147
|
+
async function apiFetch25(params, path5, init) {
|
|
33117
33148
|
const apiKey = params[parameters62.apiKey.slug];
|
|
33118
33149
|
const rawUrl = params[parameters62.url.slug];
|
|
33119
33150
|
if (!apiKey || !rawUrl) {
|
|
33120
33151
|
throw new Error("grafana: missing required parameters: url and api-key");
|
|
33121
33152
|
}
|
|
33122
33153
|
const baseUrl = rawUrl.replace(/\/+$/, "");
|
|
33123
|
-
const url = `${baseUrl}${
|
|
33154
|
+
const url = `${baseUrl}${path5.startsWith("/") ? path5 : `/${path5}`}`;
|
|
33124
33155
|
const headers = new Headers(init?.headers);
|
|
33125
33156
|
headers.set("Authorization", `Bearer ${apiKey}`);
|
|
33126
33157
|
if (!headers.has("Accept")) headers.set("Accept", "application/json");
|
|
@@ -33305,7 +33336,7 @@ Use this tool to interact with Grafana resources: datasources, dashboards, alert
|
|
|
33305
33336
|
The path must start with '/' and is appended to the configured Grafana instance URL.`,
|
|
33306
33337
|
inputSchema: inputSchema76,
|
|
33307
33338
|
outputSchema: outputSchema76,
|
|
33308
|
-
async execute({ connectionId, method, path:
|
|
33339
|
+
async execute({ connectionId, method, path: path5, body }, connections) {
|
|
33309
33340
|
const connection = connections.find((c) => c.id === connectionId);
|
|
33310
33341
|
if (!connection) {
|
|
33311
33342
|
return {
|
|
@@ -33314,12 +33345,12 @@ The path must start with '/' and is appended to the configured Grafana instance
|
|
|
33314
33345
|
};
|
|
33315
33346
|
}
|
|
33316
33347
|
console.log(
|
|
33317
|
-
`[connector-request] grafana/${connection.name}: ${method} ${
|
|
33348
|
+
`[connector-request] grafana/${connection.name}: ${method} ${path5}`
|
|
33318
33349
|
);
|
|
33319
33350
|
try {
|
|
33320
33351
|
const baseUrl = parameters62.url.getValue(connection).replace(/\/+$/, "");
|
|
33321
33352
|
const apiKey = parameters62.apiKey.getValue(connection);
|
|
33322
|
-
const url = `${baseUrl}${
|
|
33353
|
+
const url = `${baseUrl}${path5}`;
|
|
33323
33354
|
const controller = new AbortController();
|
|
33324
33355
|
const timeout = setTimeout(
|
|
33325
33356
|
() => controller.abort(),
|
|
@@ -33557,7 +33588,7 @@ var parameters63 = {
|
|
|
33557
33588
|
};
|
|
33558
33589
|
|
|
33559
33590
|
// ../connectors/src/connectors/backlog/utils.ts
|
|
33560
|
-
async function apiFetch26(params,
|
|
33591
|
+
async function apiFetch26(params, path5, init) {
|
|
33561
33592
|
const spaceUrl = params[parameters63.spaceUrl.slug];
|
|
33562
33593
|
const apiKey = params[parameters63.apiKey.slug];
|
|
33563
33594
|
if (!spaceUrl) {
|
|
@@ -33566,7 +33597,7 @@ async function apiFetch26(params, path4, init) {
|
|
|
33566
33597
|
if (!apiKey) {
|
|
33567
33598
|
throw new Error("backlog: missing required parameter: api-key");
|
|
33568
33599
|
}
|
|
33569
|
-
const trimmedPath =
|
|
33600
|
+
const trimmedPath = path5.replace(/^\/+/, "");
|
|
33570
33601
|
const separator = trimmedPath.includes("?") ? "&" : "?";
|
|
33571
33602
|
const url = `${spaceUrl.replace(/\/+$/, "")}/api/v2/${trimmedPath}${separator}apiKey=${encodeURIComponent(apiKey)}`;
|
|
33572
33603
|
const headers = new Headers(init?.headers);
|
|
@@ -33719,17 +33750,17 @@ The base URL and API key are configured per connection \u2014 only specify the A
|
|
|
33719
33750
|
Do NOT include the apiKey parameter yourself; it is injected automatically.`,
|
|
33720
33751
|
inputSchema: inputSchema77,
|
|
33721
33752
|
outputSchema: outputSchema77,
|
|
33722
|
-
async execute({ connectionId, method, path:
|
|
33753
|
+
async execute({ connectionId, method, path: path5, body }, connections) {
|
|
33723
33754
|
const connection = connections.find((c) => c.id === connectionId);
|
|
33724
33755
|
if (!connection) {
|
|
33725
33756
|
return { success: false, error: `Connection ${connectionId} not found` };
|
|
33726
33757
|
}
|
|
33727
|
-
console.log(`[connector-request] backlog-api-key/${connection.name}: ${method} ${
|
|
33758
|
+
console.log(`[connector-request] backlog-api-key/${connection.name}: ${method} ${path5}`);
|
|
33728
33759
|
try {
|
|
33729
33760
|
const spaceUrl = parameters63.spaceUrl.getValue(connection);
|
|
33730
33761
|
const apiKey = parameters63.apiKey.getValue(connection);
|
|
33731
|
-
const separator =
|
|
33732
|
-
const url = `${spaceUrl.replace(/\/+$/, "")}/api/v2/${
|
|
33762
|
+
const separator = path5.includes("?") ? "&" : "?";
|
|
33763
|
+
const url = `${spaceUrl.replace(/\/+$/, "")}/api/v2/${path5}${separator}apiKey=${apiKey}`;
|
|
33733
33764
|
const controller = new AbortController();
|
|
33734
33765
|
const timeout = setTimeout(() => controller.abort(), REQUEST_TIMEOUT_MS60);
|
|
33735
33766
|
try {
|
|
@@ -33991,7 +34022,7 @@ var parameters64 = {
|
|
|
33991
34022
|
|
|
33992
34023
|
// ../connectors/src/connectors/gamma/utils.ts
|
|
33993
34024
|
var BASE_URL51 = "https://public-api.gamma.app/v1.0";
|
|
33994
|
-
function apiFetch27(params,
|
|
34025
|
+
function apiFetch27(params, path5, init) {
|
|
33995
34026
|
const apiKey = params[parameters64.apiKey.slug];
|
|
33996
34027
|
if (!apiKey) {
|
|
33997
34028
|
throw new Error(`gamma: missing required parameter: ${parameters64.apiKey.slug}`);
|
|
@@ -33999,7 +34030,7 @@ function apiFetch27(params, path4, init) {
|
|
|
33999
34030
|
const headers = new Headers(init?.headers);
|
|
34000
34031
|
headers.set("X-API-KEY", apiKey);
|
|
34001
34032
|
if (!headers.has("Content-Type")) headers.set("Content-Type", "application/json");
|
|
34002
|
-
const trimmedPath =
|
|
34033
|
+
const trimmedPath = path5.startsWith("/") ? path5 : `/${path5}`;
|
|
34003
34034
|
return fetch(`${BASE_URL51}${trimmedPath}`, { ...init, headers });
|
|
34004
34035
|
}
|
|
34005
34036
|
|
|
@@ -34136,7 +34167,7 @@ Use this tool for listing themes, listing folders, checking generation status, a
|
|
|
34136
34167
|
For creating presentations/documents, prefer the connector_gamma_generate tool instead.`,
|
|
34137
34168
|
inputSchema: inputSchema78,
|
|
34138
34169
|
outputSchema: outputSchema78,
|
|
34139
|
-
async execute({ connectionId, method, path:
|
|
34170
|
+
async execute({ connectionId, method, path: path5, body }, connections) {
|
|
34140
34171
|
const connection = connections.find((c) => c.id === connectionId);
|
|
34141
34172
|
if (!connection) {
|
|
34142
34173
|
return {
|
|
@@ -34145,11 +34176,11 @@ For creating presentations/documents, prefer the connector_gamma_generate tool i
|
|
|
34145
34176
|
};
|
|
34146
34177
|
}
|
|
34147
34178
|
console.log(
|
|
34148
|
-
`[connector-request] gamma/${connection.name}: ${method} ${
|
|
34179
|
+
`[connector-request] gamma/${connection.name}: ${method} ${path5}`
|
|
34149
34180
|
);
|
|
34150
34181
|
try {
|
|
34151
34182
|
const apiKey = parameters64.apiKey.getValue(connection);
|
|
34152
|
-
const url = `${BASE_URL52}${
|
|
34183
|
+
const url = `${BASE_URL52}${path5}`;
|
|
34153
34184
|
const controller = new AbortController();
|
|
34154
34185
|
const timeout = setTimeout(() => controller.abort(), REQUEST_TIMEOUT_MS61);
|
|
34155
34186
|
try {
|
|
@@ -34593,12 +34624,12 @@ var parameters65 = {
|
|
|
34593
34624
|
|
|
34594
34625
|
// ../connectors/src/connectors/sentry/utils.ts
|
|
34595
34626
|
var BASE_URL54 = "https://sentry.io/api/0";
|
|
34596
|
-
async function apiFetch28(params,
|
|
34627
|
+
async function apiFetch28(params, path5, init) {
|
|
34597
34628
|
const authToken = params[parameters65.authToken.slug];
|
|
34598
34629
|
if (!authToken) {
|
|
34599
34630
|
throw new Error("sentry: missing required parameter: auth-token");
|
|
34600
34631
|
}
|
|
34601
|
-
const url = `${BASE_URL54}${
|
|
34632
|
+
const url = `${BASE_URL54}${path5.startsWith("/") ? "" : "/"}${path5}`;
|
|
34602
34633
|
const headers = new Headers(init?.headers);
|
|
34603
34634
|
headers.set("Authorization", `Bearer ${authToken}`);
|
|
34604
34635
|
if (!headers.has("Accept")) headers.set("Accept", "application/json");
|
|
@@ -34763,7 +34794,7 @@ Authentication is handled automatically via Bearer token.
|
|
|
34763
34794
|
{organizationSlug} in the path is automatically replaced with the configured organization slug.`,
|
|
34764
34795
|
inputSchema: inputSchema80,
|
|
34765
34796
|
outputSchema: outputSchema80,
|
|
34766
|
-
async execute({ connectionId, method, path:
|
|
34797
|
+
async execute({ connectionId, method, path: path5, body }, connections) {
|
|
34767
34798
|
const connection = connections.find((c) => c.id === connectionId);
|
|
34768
34799
|
if (!connection) {
|
|
34769
34800
|
return {
|
|
@@ -34772,12 +34803,12 @@ Authentication is handled automatically via Bearer token.
|
|
|
34772
34803
|
};
|
|
34773
34804
|
}
|
|
34774
34805
|
console.log(
|
|
34775
|
-
`[connector-request] sentry/${connection.name}: ${method} ${
|
|
34806
|
+
`[connector-request] sentry/${connection.name}: ${method} ${path5}`
|
|
34776
34807
|
);
|
|
34777
34808
|
try {
|
|
34778
34809
|
const authToken = parameters65.authToken.getValue(connection);
|
|
34779
34810
|
const organizationSlug = parameters65.organizationSlug.getValue(connection);
|
|
34780
|
-
const resolvedPath =
|
|
34811
|
+
const resolvedPath = path5.replace(
|
|
34781
34812
|
/\{organizationSlug\}/g,
|
|
34782
34813
|
organizationSlug
|
|
34783
34814
|
);
|
|
@@ -35114,9 +35145,9 @@ async function getAccessToken4(params) {
|
|
|
35114
35145
|
instanceUrl: tokenJson.instance_url ?? instanceUrl
|
|
35115
35146
|
};
|
|
35116
35147
|
}
|
|
35117
|
-
async function apiFetch29(params,
|
|
35148
|
+
async function apiFetch29(params, path5, init) {
|
|
35118
35149
|
const token = await getAccessToken4(params);
|
|
35119
|
-
const url = `${token.instanceUrl}${
|
|
35150
|
+
const url = `${token.instanceUrl}${path5.startsWith("/") ? "" : "/"}${path5}`;
|
|
35120
35151
|
const headers = new Headers(init?.headers);
|
|
35121
35152
|
headers.set("Authorization", `Bearer ${token.accessToken}`);
|
|
35122
35153
|
headers.set("Accept", "application/json");
|
|
@@ -35340,7 +35371,7 @@ Use this tool for all Salesforce interactions: describing sObjects, running SOQL
|
|
|
35340
35371
|
Prefer SOQL via the /query endpoint for filtered, joined, or aggregated reads rather than paginating /sobjects/{Type} endpoints.`,
|
|
35341
35372
|
inputSchema: inputSchema81,
|
|
35342
35373
|
outputSchema: outputSchema81,
|
|
35343
|
-
async execute({ connectionId, method, path:
|
|
35374
|
+
async execute({ connectionId, method, path: path5, body }, connections) {
|
|
35344
35375
|
const connection = connections.find((c) => c.id === connectionId);
|
|
35345
35376
|
if (!connection) {
|
|
35346
35377
|
return {
|
|
@@ -35349,7 +35380,7 @@ Prefer SOQL via the /query endpoint for filtered, joined, or aggregated reads ra
|
|
|
35349
35380
|
};
|
|
35350
35381
|
}
|
|
35351
35382
|
console.log(
|
|
35352
|
-
`[connector-request] salesforce/${connection.name}: ${method} ${
|
|
35383
|
+
`[connector-request] salesforce/${connection.name}: ${method} ${path5}`
|
|
35353
35384
|
);
|
|
35354
35385
|
try {
|
|
35355
35386
|
const instanceUrlParam = parameters66.instanceUrl.getValue(connection);
|
|
@@ -35383,7 +35414,7 @@ Prefer SOQL via the /query endpoint for filtered, joined, or aggregated reads ra
|
|
|
35383
35414
|
};
|
|
35384
35415
|
}
|
|
35385
35416
|
const resolvedInstanceUrl = tokenJson.instance_url ?? instanceUrl;
|
|
35386
|
-
const url = `${resolvedInstanceUrl}${
|
|
35417
|
+
const url = `${resolvedInstanceUrl}${path5.startsWith("/") ? "" : "/"}${path5}`;
|
|
35387
35418
|
const controller = new AbortController();
|
|
35388
35419
|
const timeout = setTimeout(() => controller.abort(), REQUEST_TIMEOUT_MS63);
|
|
35389
35420
|
try {
|
|
@@ -36029,7 +36060,7 @@ Use this tool for all InfluxDB interactions: running SQL / InfluxQL / Flux queri
|
|
|
36029
36060
|
For read-only data exploration prefer SQL (InfluxDB 3) or InfluxQL queries \u2014 they return JSON that is straightforward to parse. Flux queries return annotated CSV.`,
|
|
36030
36061
|
inputSchema: inputSchema82,
|
|
36031
36062
|
outputSchema: outputSchema82,
|
|
36032
|
-
async execute({ connectionId, method, path:
|
|
36063
|
+
async execute({ connectionId, method, path: path5, body, contentType }, connections) {
|
|
36033
36064
|
const connection = connections.find((c) => c.id === connectionId);
|
|
36034
36065
|
if (!connection) {
|
|
36035
36066
|
return {
|
|
@@ -36038,12 +36069,12 @@ For read-only data exploration prefer SQL (InfluxDB 3) or InfluxQL queries \u201
|
|
|
36038
36069
|
};
|
|
36039
36070
|
}
|
|
36040
36071
|
console.log(
|
|
36041
|
-
`[connector-request] influxdb/${connection.name}: ${method} ${
|
|
36072
|
+
`[connector-request] influxdb/${connection.name}: ${method} ${path5}`
|
|
36042
36073
|
);
|
|
36043
36074
|
try {
|
|
36044
36075
|
const url = parameters67.url.getValue(connection).replace(/\/$/, "");
|
|
36045
36076
|
const token = parameters67.token.getValue(connection);
|
|
36046
|
-
const fullUrl = `${url}${
|
|
36077
|
+
const fullUrl = `${url}${path5.startsWith("/") ? "" : "/"}${path5}`;
|
|
36047
36078
|
const controller = new AbortController();
|
|
36048
36079
|
const timeout = setTimeout(() => controller.abort(), REQUEST_TIMEOUT_MS64);
|
|
36049
36080
|
const resolvedContentType = contentType ?? (typeof body === "string" ? "text/plain; charset=utf-8" : "application/json");
|
|
@@ -36080,7 +36111,7 @@ For read-only data exploration prefer SQL (InfluxDB 3) or InfluxQL queries \u201
|
|
|
36080
36111
|
} else if (bodyText) {
|
|
36081
36112
|
errorMessage = isHtml ? bodyText.replace(/\s+/g, " ").slice(0, 200) : bodyText;
|
|
36082
36113
|
}
|
|
36083
|
-
const hitsV3Path =
|
|
36114
|
+
const hitsV3Path = path5.includes("/api/v3/");
|
|
36084
36115
|
const looksLikeMissingV3 = hitsV3Path && (response.status === 405 || response.status === 404 || isHtml);
|
|
36085
36116
|
if (looksLikeMissingV3) {
|
|
36086
36117
|
errorMessage += " \u2014 This InfluxDB instance does not support the v3 API at this path. It is likely InfluxDB 2 (e.g. InfluxDB Cloud on '*.cloud2.influxdata.com'). Retry via Flux on '/api/v2/query?org={org}' with contentType 'application/vnd.flux'.";
|
|
@@ -37856,7 +37887,7 @@ Errors from the Standard API are returned as a plain text body starting with "ER
|
|
|
37856
37887
|
async execute({
|
|
37857
37888
|
connectionId,
|
|
37858
37889
|
method,
|
|
37859
|
-
path:
|
|
37890
|
+
path: path5,
|
|
37860
37891
|
queryParams,
|
|
37861
37892
|
body,
|
|
37862
37893
|
contentType,
|
|
@@ -37870,13 +37901,13 @@ Errors from the Standard API are returned as a plain text body starting with "ER
|
|
|
37870
37901
|
};
|
|
37871
37902
|
}
|
|
37872
37903
|
console.log(
|
|
37873
|
-
`[connector-request] semrush/${connection.name}: ${method} ${
|
|
37904
|
+
`[connector-request] semrush/${connection.name}: ${method} ${path5}`
|
|
37874
37905
|
);
|
|
37875
37906
|
try {
|
|
37876
37907
|
const apiKey = parameters70.apiKey.getValue(connection);
|
|
37877
|
-
const isAbsolute = /^https?:\/\//i.test(
|
|
37908
|
+
const isAbsolute = /^https?:\/\//i.test(path5);
|
|
37878
37909
|
if (isAbsolute) {
|
|
37879
|
-
const host = new URL(
|
|
37910
|
+
const host = new URL(path5).hostname.toLowerCase();
|
|
37880
37911
|
if (host !== "api.semrush.com" && host !== "www.semrush.com") {
|
|
37881
37912
|
return {
|
|
37882
37913
|
success: false,
|
|
@@ -37885,7 +37916,7 @@ Errors from the Standard API are returned as a plain text body starting with "ER
|
|
|
37885
37916
|
}
|
|
37886
37917
|
}
|
|
37887
37918
|
const url = new URL(
|
|
37888
|
-
isAbsolute ?
|
|
37919
|
+
isAbsolute ? path5 : `${BASE_URL58}${path5.startsWith("/") ? "" : "/"}${path5}`
|
|
37889
37920
|
);
|
|
37890
37921
|
if (queryParams) {
|
|
37891
37922
|
for (const [k, v] of Object.entries(queryParams)) {
|
|
@@ -37991,14 +38022,14 @@ var semrushOnboarding = new ConnectorOnboarding({
|
|
|
37991
38022
|
// ../connectors/src/connectors/semrush/utils.ts
|
|
37992
38023
|
var BASE_URL59 = "https://api.semrush.com";
|
|
37993
38024
|
var PROJECTS_BASE_URL = `${BASE_URL59}/management/v1`;
|
|
37994
|
-
function projectsApiFetch(params,
|
|
38025
|
+
function projectsApiFetch(params, path5, init) {
|
|
37995
38026
|
const apiKey = params[parameters70.apiKey.slug];
|
|
37996
38027
|
if (!apiKey) {
|
|
37997
38028
|
throw new Error(
|
|
37998
38029
|
`semrush: missing required parameter: ${parameters70.apiKey.slug}`
|
|
37999
38030
|
);
|
|
38000
38031
|
}
|
|
38001
|
-
const trimmedPath =
|
|
38032
|
+
const trimmedPath = path5.startsWith("/") ? path5 : `/${path5}`;
|
|
38002
38033
|
const url = new URL(`${PROJECTS_BASE_URL}${trimmedPath}`);
|
|
38003
38034
|
if (!url.searchParams.has("key")) {
|
|
38004
38035
|
url.searchParams.set("key", apiKey);
|
|
@@ -39106,7 +39137,7 @@ Authentication is handled automatically via OAuth proxy.
|
|
|
39106
39137
|
For URL Inspection API requests, use the absolute path '/v1/urlInspection/index:inspect' \u2014 the leading /webmasters/v3 prefix will be stripped if you accidentally include it.`,
|
|
39107
39138
|
inputSchema: inputSchema87,
|
|
39108
39139
|
outputSchema: outputSchema87,
|
|
39109
|
-
async execute({ connectionId, method, path:
|
|
39140
|
+
async execute({ connectionId, method, path: path5, queryParams, body }, connections, config) {
|
|
39110
39141
|
const connection = connections.find((c) => c.id === connectionId);
|
|
39111
39142
|
if (!connection) {
|
|
39112
39143
|
return {
|
|
@@ -39115,11 +39146,11 @@ For URL Inspection API requests, use the absolute path '/v1/urlInspection/index:
|
|
|
39115
39146
|
};
|
|
39116
39147
|
}
|
|
39117
39148
|
console.log(
|
|
39118
|
-
`[connector-request] google-search-console-oauth/${connection.name}: ${method} ${
|
|
39149
|
+
`[connector-request] google-search-console-oauth/${connection.name}: ${method} ${path5}`
|
|
39119
39150
|
);
|
|
39120
39151
|
try {
|
|
39121
39152
|
const siteUrl = parameters71.siteUrl.tryGetValue(connection);
|
|
39122
|
-
const resolvedPath = siteUrl ?
|
|
39153
|
+
const resolvedPath = siteUrl ? path5.replace(/\{siteUrl\}/g, encodeURIComponent(siteUrl)) : path5;
|
|
39123
39154
|
const normalizedPath = normalizeRequestPath(
|
|
39124
39155
|
resolvedPath,
|
|
39125
39156
|
BASE_PATH_SEGMENT10
|
|
@@ -39775,12 +39806,12 @@ var parameters73 = {
|
|
|
39775
39806
|
|
|
39776
39807
|
// ../connectors/src/connectors/clickup/utils.ts
|
|
39777
39808
|
var BASE_URL62 = "https://api.clickup.com/api/v2";
|
|
39778
|
-
async function apiFetch30(params,
|
|
39809
|
+
async function apiFetch30(params, path5, init) {
|
|
39779
39810
|
const token = params[parameters73.apiToken.slug];
|
|
39780
39811
|
if (!token) {
|
|
39781
39812
|
throw new Error("clickup: missing required parameter: api-token");
|
|
39782
39813
|
}
|
|
39783
|
-
const url = `${BASE_URL62}${
|
|
39814
|
+
const url = `${BASE_URL62}${path5.startsWith("/") ? "" : "/"}${path5}`;
|
|
39784
39815
|
const headers = new Headers(init?.headers);
|
|
39785
39816
|
headers.set("Authorization", token);
|
|
39786
39817
|
if (!headers.has("Accept")) headers.set("Accept", "application/json");
|
|
@@ -40007,7 +40038,7 @@ Common endpoints:
|
|
|
40007
40038
|
Pagination: ClickUp uses zero-indexed \`page\` query parameter on list endpoints (page=0, page=1, ...). Each page returns up to 100 tasks; you must increment \`page\` until the response array is empty.`,
|
|
40008
40039
|
inputSchema: inputSchema89,
|
|
40009
40040
|
outputSchema: outputSchema89,
|
|
40010
|
-
async execute({ connectionId, method, path:
|
|
40041
|
+
async execute({ connectionId, method, path: path5, body }, connections) {
|
|
40011
40042
|
const connection = connections.find((c) => c.id === connectionId);
|
|
40012
40043
|
if (!connection) {
|
|
40013
40044
|
return {
|
|
@@ -40016,11 +40047,11 @@ Pagination: ClickUp uses zero-indexed \`page\` query parameter on list endpoints
|
|
|
40016
40047
|
};
|
|
40017
40048
|
}
|
|
40018
40049
|
console.log(
|
|
40019
|
-
`[connector-request] clickup/${connection.name}: ${method} ${
|
|
40050
|
+
`[connector-request] clickup/${connection.name}: ${method} ${path5}`
|
|
40020
40051
|
);
|
|
40021
40052
|
try {
|
|
40022
40053
|
const token = parameters73.apiToken.getValue(connection);
|
|
40023
|
-
const normalizedPath = normalizeRequestPath(
|
|
40054
|
+
const normalizedPath = normalizeRequestPath(path5, BASE_PATH_SEGMENT11);
|
|
40024
40055
|
const url = `${BASE_URL63}${normalizedPath}`;
|
|
40025
40056
|
const controller = new AbortController();
|
|
40026
40057
|
const timeout = setTimeout(() => controller.abort(), REQUEST_TIMEOUT_MS69);
|
|
@@ -41901,7 +41932,7 @@ function buildBaseUrl(domain) {
|
|
|
41901
41932
|
function basicAuthHeader2(apiKey) {
|
|
41902
41933
|
return `Basic ${Buffer.from(`${apiKey}:X`).toString("base64")}`;
|
|
41903
41934
|
}
|
|
41904
|
-
async function apiFetch31(params,
|
|
41935
|
+
async function apiFetch31(params, path5, init) {
|
|
41905
41936
|
const apiKey = params[parameters78.apiKey.slug];
|
|
41906
41937
|
const domain = params[parameters78.domain.slug];
|
|
41907
41938
|
if (!apiKey || !domain) {
|
|
@@ -41910,7 +41941,7 @@ async function apiFetch31(params, path4, init) {
|
|
|
41910
41941
|
);
|
|
41911
41942
|
}
|
|
41912
41943
|
const baseUrl = buildBaseUrl(domain);
|
|
41913
|
-
const url = `${baseUrl}${
|
|
41944
|
+
const url = `${baseUrl}${path5.startsWith("/") ? "" : "/"}${path5}`;
|
|
41914
41945
|
const headers = new Headers(init?.headers);
|
|
41915
41946
|
headers.set("Authorization", basicAuthHeader2(apiKey));
|
|
41916
41947
|
headers.set("Accept", "application/json");
|
|
@@ -41971,8 +42002,8 @@ var FRESHSERVICE_ENTITIES = [
|
|
|
41971
42002
|
countPath: "/service_catalog/items?per_page=1"
|
|
41972
42003
|
}
|
|
41973
42004
|
];
|
|
41974
|
-
async function fetchEntityCount2(params,
|
|
41975
|
-
const res = await apiFetch31(params,
|
|
42005
|
+
async function fetchEntityCount2(params, path5) {
|
|
42006
|
+
const res = await apiFetch31(params, path5);
|
|
41976
42007
|
if (!res.ok) return null;
|
|
41977
42008
|
const data = await res.json();
|
|
41978
42009
|
if (typeof data["total"] === "number") return data["total"];
|
|
@@ -42105,7 +42136,7 @@ Field codes:
|
|
|
42105
42136
|
- ticket source: 1 Email, 2 Portal, 3 Phone, 4 Chat, 5 Feedback widget, 7 Yammer, 8 AwsCloudwatch, 9 Pagerduty, 10 Walkup, 11 Slack`,
|
|
42106
42137
|
inputSchema: inputSchema95,
|
|
42107
42138
|
outputSchema: outputSchema95,
|
|
42108
|
-
async execute({ connectionId, method, path:
|
|
42139
|
+
async execute({ connectionId, method, path: path5, body }, connections) {
|
|
42109
42140
|
const connection = connections.find((c) => c.id === connectionId);
|
|
42110
42141
|
if (!connection) {
|
|
42111
42142
|
return {
|
|
@@ -42114,13 +42145,13 @@ Field codes:
|
|
|
42114
42145
|
};
|
|
42115
42146
|
}
|
|
42116
42147
|
console.log(
|
|
42117
|
-
`[connector-request] freshservice/${connection.name}: ${method} ${
|
|
42148
|
+
`[connector-request] freshservice/${connection.name}: ${method} ${path5}`
|
|
42118
42149
|
);
|
|
42119
42150
|
try {
|
|
42120
42151
|
const apiKey = parameters78.apiKey.getValue(connection);
|
|
42121
42152
|
const domain = parameters78.domain.getValue(connection);
|
|
42122
42153
|
const baseUrl = buildBaseUrl2(domain);
|
|
42123
|
-
const normalizedPath = normalizeRequestPath(
|
|
42154
|
+
const normalizedPath = normalizeRequestPath(path5, BASE_PATH_SEGMENT13);
|
|
42124
42155
|
const url = `${baseUrl}${normalizedPath}`;
|
|
42125
42156
|
const controller = new AbortController();
|
|
42126
42157
|
const timeout = setTimeout(() => controller.abort(), REQUEST_TIMEOUT_MS70);
|
|
@@ -42413,7 +42444,7 @@ function buildBaseUrl3(domain) {
|
|
|
42413
42444
|
function basicAuthHeader4(apiKey) {
|
|
42414
42445
|
return `Basic ${Buffer.from(`${apiKey}:X`).toString("base64")}`;
|
|
42415
42446
|
}
|
|
42416
|
-
async function apiFetch32(params,
|
|
42447
|
+
async function apiFetch32(params, path5, init) {
|
|
42417
42448
|
const apiKey = params[parameters79.apiKey.slug];
|
|
42418
42449
|
const domain = params[parameters79.domain.slug];
|
|
42419
42450
|
if (!apiKey || !domain) {
|
|
@@ -42422,7 +42453,7 @@ async function apiFetch32(params, path4, init) {
|
|
|
42422
42453
|
);
|
|
42423
42454
|
}
|
|
42424
42455
|
const baseUrl = buildBaseUrl3(domain);
|
|
42425
|
-
const url = `${baseUrl}${
|
|
42456
|
+
const url = `${baseUrl}${path5.startsWith("/") ? "" : "/"}${path5}`;
|
|
42426
42457
|
const headers = new Headers(init?.headers);
|
|
42427
42458
|
headers.set("Authorization", basicAuthHeader4(apiKey));
|
|
42428
42459
|
headers.set("Accept", "application/json");
|
|
@@ -42459,8 +42490,8 @@ var FRESHDESK_ENTITIES = [
|
|
|
42459
42490
|
countPath: "/groups?per_page=1"
|
|
42460
42491
|
}
|
|
42461
42492
|
];
|
|
42462
|
-
async function fetchEntityCount3(params,
|
|
42463
|
-
const res = await apiFetch32(params,
|
|
42493
|
+
async function fetchEntityCount3(params, path5, countField) {
|
|
42494
|
+
const res = await apiFetch32(params, path5);
|
|
42464
42495
|
if (!res.ok) return null;
|
|
42465
42496
|
const data = await res.json();
|
|
42466
42497
|
if (Array.isArray(data)) return null;
|
|
@@ -42672,7 +42703,7 @@ Field codes (tickets):
|
|
|
42672
42703
|
- source: 1 Email, 2 Portal, 3 Phone, 7 Chat, 9 Feedback widget, 10 Outbound email`,
|
|
42673
42704
|
inputSchema: inputSchema96,
|
|
42674
42705
|
outputSchema: outputSchema96,
|
|
42675
|
-
async execute({ connectionId, method, path:
|
|
42706
|
+
async execute({ connectionId, method, path: path5, body }, connections) {
|
|
42676
42707
|
const connection = connections.find((c) => c.id === connectionId);
|
|
42677
42708
|
if (!connection) {
|
|
42678
42709
|
return {
|
|
@@ -42681,13 +42712,13 @@ Field codes (tickets):
|
|
|
42681
42712
|
};
|
|
42682
42713
|
}
|
|
42683
42714
|
console.log(
|
|
42684
|
-
`[connector-request] freshdesk/${connection.name}: ${method} ${
|
|
42715
|
+
`[connector-request] freshdesk/${connection.name}: ${method} ${path5}`
|
|
42685
42716
|
);
|
|
42686
42717
|
try {
|
|
42687
42718
|
const apiKey = parameters79.apiKey.getValue(connection);
|
|
42688
42719
|
const domain = parameters79.domain.getValue(connection);
|
|
42689
42720
|
const baseUrl = buildBaseUrl4(domain);
|
|
42690
|
-
const normalizedPath = normalizeRequestPath(
|
|
42721
|
+
const normalizedPath = normalizeRequestPath(path5, BASE_PATH_SEGMENT15);
|
|
42691
42722
|
const url = `${baseUrl}${normalizedPath}`;
|
|
42692
42723
|
const controller = new AbortController();
|
|
42693
42724
|
const timeout = setTimeout(() => controller.abort(), REQUEST_TIMEOUT_MS71);
|
|
@@ -42979,7 +43010,7 @@ function buildBaseUrl5(bundleAlias) {
|
|
|
42979
43010
|
const subdomain = trimmed.split(".")[0];
|
|
42980
43011
|
return `https://${subdomain}.myfreshworks.com${BASE_PATH_SEGMENT16}`;
|
|
42981
43012
|
}
|
|
42982
|
-
async function apiFetch33(params,
|
|
43013
|
+
async function apiFetch33(params, path5, init) {
|
|
42983
43014
|
const apiKey = params[parameters80.apiKey.slug];
|
|
42984
43015
|
const bundle = params[parameters80.bundleAlias.slug];
|
|
42985
43016
|
if (!apiKey || !bundle) {
|
|
@@ -42988,7 +43019,7 @@ async function apiFetch33(params, path4, init) {
|
|
|
42988
43019
|
);
|
|
42989
43020
|
}
|
|
42990
43021
|
const baseUrl = buildBaseUrl5(bundle);
|
|
42991
|
-
const url = `${baseUrl}${
|
|
43022
|
+
const url = `${baseUrl}${path5.startsWith("/") ? "" : "/"}${path5}`;
|
|
42992
43023
|
const headers = new Headers(init?.headers);
|
|
42993
43024
|
headers.set("Authorization", `Token token=${apiKey}`);
|
|
42994
43025
|
headers.set("Accept", "application/json");
|
|
@@ -43161,7 +43192,7 @@ Pagination: 1-indexed \`page\` + \`per_page\` (default 25, max 100). View endpoi
|
|
|
43161
43192
|
Includes: most GET endpoints accept \`?include=\` with a comma-separated list (\`owner\`, \`creator\`, \`deals\`, \`contacts\`, etc.) to inline related records.`,
|
|
43162
43193
|
inputSchema: inputSchema97,
|
|
43163
43194
|
outputSchema: outputSchema97,
|
|
43164
|
-
async execute({ connectionId, method, path:
|
|
43195
|
+
async execute({ connectionId, method, path: path5, body }, connections) {
|
|
43165
43196
|
const connection = connections.find((c) => c.id === connectionId);
|
|
43166
43197
|
if (!connection) {
|
|
43167
43198
|
return {
|
|
@@ -43170,13 +43201,13 @@ Includes: most GET endpoints accept \`?include=\` with a comma-separated list (\
|
|
|
43170
43201
|
};
|
|
43171
43202
|
}
|
|
43172
43203
|
console.log(
|
|
43173
|
-
`[connector-request] freshsales/${connection.name}: ${method} ${
|
|
43204
|
+
`[connector-request] freshsales/${connection.name}: ${method} ${path5}`
|
|
43174
43205
|
);
|
|
43175
43206
|
try {
|
|
43176
43207
|
const apiKey = parameters80.apiKey.getValue(connection);
|
|
43177
43208
|
const bundle = parameters80.bundleAlias.getValue(connection);
|
|
43178
43209
|
const baseUrl = buildBaseUrl6(bundle);
|
|
43179
|
-
const normalizedPath = normalizeRequestPath(
|
|
43210
|
+
const normalizedPath = normalizeRequestPath(path5, BASE_PATH_SEGMENT17);
|
|
43180
43211
|
const url = `${baseUrl}${normalizedPath}`;
|
|
43181
43212
|
const controller = new AbortController();
|
|
43182
43213
|
const timeout = setTimeout(() => controller.abort(), REQUEST_TIMEOUT_MS72);
|
|
@@ -43481,7 +43512,7 @@ function resolveBaseUrl(connectionBaseUrl) {
|
|
|
43481
43512
|
const trimmed = connectionBaseUrl?.trim();
|
|
43482
43513
|
return trimmed && trimmed.replace(/\/+$/, "") || DEFAULT_BASE_URL;
|
|
43483
43514
|
}
|
|
43484
|
-
async function apiFetch34(params,
|
|
43515
|
+
async function apiFetch34(params, path5, init) {
|
|
43485
43516
|
const token = params[parameters81.personalAccessToken.slug];
|
|
43486
43517
|
if (!token) {
|
|
43487
43518
|
throw new Error(
|
|
@@ -43489,7 +43520,7 @@ async function apiFetch34(params, path4, init) {
|
|
|
43489
43520
|
);
|
|
43490
43521
|
}
|
|
43491
43522
|
const baseUrl = resolveBaseUrl(params[parameters81.baseUrl.slug]);
|
|
43492
|
-
const trimmedPath =
|
|
43523
|
+
const trimmedPath = path5.replace(/^\/+/, "/");
|
|
43493
43524
|
const url = `${baseUrl}${trimmedPath.startsWith("/") ? "" : "/"}${trimmedPath}`;
|
|
43494
43525
|
const headers = new Headers(init?.headers);
|
|
43495
43526
|
headers.set("Authorization", `Bearer ${token}`);
|
|
@@ -43727,7 +43758,7 @@ Pagination: 1-indexed \`page\` + \`per_page\` (max 100). The \`Link\` response h
|
|
|
43727
43758
|
Rate limits: 5,000 req/hr on REST endpoints, 30 req/min on /search/*. Inspect \`X-RateLimit-Remaining\` to throttle.`,
|
|
43728
43759
|
inputSchema: inputSchema98,
|
|
43729
43760
|
outputSchema: outputSchema98,
|
|
43730
|
-
async execute({ connectionId, method, path:
|
|
43761
|
+
async execute({ connectionId, method, path: path5, body }, connections) {
|
|
43731
43762
|
const connection = connections.find((c) => c.id === connectionId);
|
|
43732
43763
|
if (!connection) {
|
|
43733
43764
|
return {
|
|
@@ -43736,12 +43767,12 @@ Rate limits: 5,000 req/hr on REST endpoints, 30 req/min on /search/*. Inspect \`
|
|
|
43736
43767
|
};
|
|
43737
43768
|
}
|
|
43738
43769
|
console.log(
|
|
43739
|
-
`[connector-request] github/${connection.name}: ${method} ${
|
|
43770
|
+
`[connector-request] github/${connection.name}: ${method} ${path5}`
|
|
43740
43771
|
);
|
|
43741
43772
|
try {
|
|
43742
43773
|
const token = parameters81.personalAccessToken.getValue(connection);
|
|
43743
43774
|
const baseUrl = resolveBaseUrl2(parameters81.baseUrl.tryGetValue(connection));
|
|
43744
|
-
const trimmedPath =
|
|
43775
|
+
const trimmedPath = path5.trim().replace(/^\/+/, "/");
|
|
43745
43776
|
const url = `${baseUrl}${trimmedPath.startsWith("/") ? "" : "/"}${trimmedPath}`;
|
|
43746
43777
|
const controller = new AbortController();
|
|
43747
43778
|
const timeout = setTimeout(() => controller.abort(), REQUEST_TIMEOUT_MS73);
|
|
@@ -44119,7 +44150,7 @@ All paths are relative to https://api.powerbi.com/v1.0/myorg. Use the executeQue
|
|
|
44119
44150
|
The signed-in user must have access to the workspace; unlike Service Principals, OAuth users can also access "My workspace" via the \`/datasets\` (without \`/groups/\`) endpoints.`,
|
|
44120
44151
|
inputSchema: inputSchema99,
|
|
44121
44152
|
outputSchema: outputSchema99,
|
|
44122
|
-
async execute({ connectionId, method, path:
|
|
44153
|
+
async execute({ connectionId, method, path: path5, queryParams, body }, connections, config) {
|
|
44123
44154
|
const connection = connections.find((c) => c.id === connectionId);
|
|
44124
44155
|
if (!connection) {
|
|
44125
44156
|
return {
|
|
@@ -44128,10 +44159,10 @@ The signed-in user must have access to the workspace; unlike Service Principals,
|
|
|
44128
44159
|
};
|
|
44129
44160
|
}
|
|
44130
44161
|
console.log(
|
|
44131
|
-
`[connector-request] powerbi-oauth/${connection.name}: ${method} ${
|
|
44162
|
+
`[connector-request] powerbi-oauth/${connection.name}: ${method} ${path5}`
|
|
44132
44163
|
);
|
|
44133
44164
|
try {
|
|
44134
|
-
const normalizedPath = normalizeRequestPath(
|
|
44165
|
+
const normalizedPath = normalizeRequestPath(path5, BASE_PATH_SEGMENT18);
|
|
44135
44166
|
let url = `${BASE_URL64}${normalizedPath}`;
|
|
44136
44167
|
if (queryParams) {
|
|
44137
44168
|
const searchParams = new URLSearchParams(queryParams);
|
|
@@ -44216,8 +44247,8 @@ var parameters82 = {};
|
|
|
44216
44247
|
|
|
44217
44248
|
// ../connectors/src/connectors/powerbi-oauth/utils.ts
|
|
44218
44249
|
var BASE_URL65 = "https://api.powerbi.com/v1.0/myorg";
|
|
44219
|
-
function apiFetch35(proxyFetch,
|
|
44220
|
-
const url = `${BASE_URL65}${
|
|
44250
|
+
function apiFetch35(proxyFetch, path5, init) {
|
|
44251
|
+
const url = `${BASE_URL65}${path5.startsWith("/") ? "" : "/"}${path5}`;
|
|
44221
44252
|
return proxyFetch(url, init);
|
|
44222
44253
|
}
|
|
44223
44254
|
|
|
@@ -44242,8 +44273,8 @@ async function listGroups(proxyFetch) {
|
|
|
44242
44273
|
return data.value ?? [];
|
|
44243
44274
|
}
|
|
44244
44275
|
async function listResource(proxyFetch, groupId, resource) {
|
|
44245
|
-
const
|
|
44246
|
-
const res = await apiFetch35(proxyFetch,
|
|
44276
|
+
const path5 = groupId === MY_WORKSPACE ? `/${resource}` : `/groups/${encodeURIComponent(groupId)}/${resource}`;
|
|
44277
|
+
const res = await apiFetch35(proxyFetch, path5);
|
|
44247
44278
|
if (!res.ok) {
|
|
44248
44279
|
const body = await res.text().catch(() => res.statusText);
|
|
44249
44280
|
throw new Error(
|
|
@@ -44844,9 +44875,9 @@ function buildTableauBaseUrl(params) {
|
|
|
44844
44875
|
}
|
|
44845
44876
|
return `${serverUrl.replace(/\/$/, "")}/api/${apiVersion}`;
|
|
44846
44877
|
}
|
|
44847
|
-
async function tableauProxyApiFetch(proxyFetch, params,
|
|
44878
|
+
async function tableauProxyApiFetch(proxyFetch, params, path5, init) {
|
|
44848
44879
|
const baseUrl = buildTableauBaseUrl(params);
|
|
44849
|
-
const trimmedPath =
|
|
44880
|
+
const trimmedPath = path5.replace(/^([^/])/, "/$1");
|
|
44850
44881
|
return proxyFetch(`${baseUrl}${trimmedPath}`, init);
|
|
44851
44882
|
}
|
|
44852
44883
|
|
|
@@ -45205,7 +45236,7 @@ All paths are relative to {serverUrl}/api/{apiVersion}. Use the literal placehol
|
|
|
45205
45236
|
Accept and Content-Type headers default to application/json so list responses come back as JSON instead of Tableau's default XML.`,
|
|
45206
45237
|
inputSchema: inputSchema100,
|
|
45207
45238
|
outputSchema: outputSchema100,
|
|
45208
|
-
async execute({ connectionId, method, path:
|
|
45239
|
+
async execute({ connectionId, method, path: path5, queryParams, body }, connections, config) {
|
|
45209
45240
|
const connection = connections.find((c) => c.id === connectionId);
|
|
45210
45241
|
if (!connection) {
|
|
45211
45242
|
return {
|
|
@@ -45214,12 +45245,12 @@ Accept and Content-Type headers default to application/json so list responses co
|
|
|
45214
45245
|
};
|
|
45215
45246
|
}
|
|
45216
45247
|
console.log(
|
|
45217
|
-
`[connector-request] tableau/${connection.name}: ${method} ${
|
|
45248
|
+
`[connector-request] tableau/${connection.name}: ${method} ${path5}`
|
|
45218
45249
|
);
|
|
45219
45250
|
try {
|
|
45220
45251
|
const serverUrl = parameters83.serverUrl.getValue(connection);
|
|
45221
45252
|
const apiVersion = parameters83.apiVersion.tryGetValue(connection) || DEFAULT_API_VERSION2;
|
|
45222
|
-
const trimmedPath =
|
|
45253
|
+
const trimmedPath = path5.trim().replace(/^([^/])/, "/$1");
|
|
45223
45254
|
const baseUrl = buildBaseUrl7(serverUrl, apiVersion);
|
|
45224
45255
|
let url = `${baseUrl}${trimmedPath}`;
|
|
45225
45256
|
if (queryParams) {
|
|
@@ -45513,7 +45544,7 @@ Covers mailbox (\`/me/messages\`, \`/me/mailFolders\`), threads (\`/me/messages?
|
|
|
45513
45544
|
For full-text search use the \`$search\` query parameter (must be wrapped in double quotes); for filtering use \`$filter\` with OData syntax (e.g., \`receivedDateTime ge 2025-01-01T00:00:00Z\`).`,
|
|
45514
45545
|
inputSchema: inputSchema101,
|
|
45515
45546
|
outputSchema: outputSchema101,
|
|
45516
|
-
async execute({ connectionId, method, path:
|
|
45547
|
+
async execute({ connectionId, method, path: path5, queryParams }, connections, config) {
|
|
45517
45548
|
const connection = connections.find((c) => c.id === connectionId);
|
|
45518
45549
|
if (!connection) {
|
|
45519
45550
|
return {
|
|
@@ -45522,10 +45553,10 @@ For full-text search use the \`$search\` query parameter (must be wrapped in dou
|
|
|
45522
45553
|
};
|
|
45523
45554
|
}
|
|
45524
45555
|
console.log(
|
|
45525
|
-
`[connector-request] outlook-oauth/${connection.name}: ${method} ${
|
|
45556
|
+
`[connector-request] outlook-oauth/${connection.name}: ${method} ${path5}`
|
|
45526
45557
|
);
|
|
45527
45558
|
try {
|
|
45528
|
-
const normalizedPath = normalizeRequestPath(
|
|
45559
|
+
const normalizedPath = normalizeRequestPath(path5, BASE_PATH_SEGMENT19);
|
|
45529
45560
|
let url = `${BASE_URL66}${normalizedPath}`;
|
|
45530
45561
|
if (queryParams) {
|
|
45531
45562
|
const searchParams = new URLSearchParams(queryParams);
|
|
@@ -46094,7 +46125,7 @@ Use this tool for X API v2 reads such as looking up users, fetching posts, retri
|
|
|
46094
46125
|
X rate limits are endpoint-specific and commonly reset on fixed windows. This tool returns x-rate-limit-limit, x-rate-limit-remaining, and x-rate-limit-reset when X sends them. Before making repeated calls or adding pagination, inspect these values and keep dashboard requests small. Do not use this tool for frequent polling; if a request returns 429, wait until the reset timestamp instead of retrying immediately.`,
|
|
46095
46126
|
inputSchema: inputSchema102,
|
|
46096
46127
|
outputSchema: outputSchema102,
|
|
46097
|
-
async execute({ connectionId, method, path:
|
|
46128
|
+
async execute({ connectionId, method, path: path5, queryParams, body }, connections) {
|
|
46098
46129
|
const connection = connections.find((c) => c.id === connectionId);
|
|
46099
46130
|
if (!connection) {
|
|
46100
46131
|
return {
|
|
@@ -46102,9 +46133,9 @@ X rate limits are endpoint-specific and commonly reset on fixed windows. This to
|
|
|
46102
46133
|
error: `Connection ${connectionId} not found`
|
|
46103
46134
|
};
|
|
46104
46135
|
}
|
|
46105
|
-
console.log(`[connector-request] x/${connection.name}: ${method} ${
|
|
46136
|
+
console.log(`[connector-request] x/${connection.name}: ${method} ${path5}`);
|
|
46106
46137
|
try {
|
|
46107
|
-
if (/^https?:\/\//i.test(
|
|
46138
|
+
if (/^https?:\/\//i.test(path5)) {
|
|
46108
46139
|
return {
|
|
46109
46140
|
success: false,
|
|
46110
46141
|
error: "Absolute URLs are not allowed. Pass a path such as /2/users/me."
|
|
@@ -46112,7 +46143,7 @@ X rate limits are endpoint-specific and commonly reset on fixed windows. This to
|
|
|
46112
46143
|
}
|
|
46113
46144
|
const bearerToken = parameters85.bearerToken.getValue(connection);
|
|
46114
46145
|
const url = new URL(
|
|
46115
|
-
`${BASE_URL67}${
|
|
46146
|
+
`${BASE_URL67}${path5.startsWith("/") ? "" : "/"}${path5}`
|
|
46116
46147
|
);
|
|
46117
46148
|
if (queryParams) {
|
|
46118
46149
|
for (const [k, v] of Object.entries(queryParams)) {
|
|
@@ -46484,7 +46515,7 @@ Use this tool for normal dashboard data: top/new/best/ask/show/job story IDs, in
|
|
|
46484
46515
|
This connector does not require API credentials, but a connectionId is still required to select the Hacker News data source. Keep dashboard calls bounded: fetch list IDs first, then fetch only the small slice of item details needed for the current view. Use searchAlgolia only when keyword, tag, or historical search is necessary.`,
|
|
46485
46516
|
inputSchema: inputSchema103,
|
|
46486
46517
|
outputSchema: outputSchema103,
|
|
46487
|
-
async execute({ connectionId, path:
|
|
46518
|
+
async execute({ connectionId, path: path5, printPretty }, connections) {
|
|
46488
46519
|
const connection = connections.find((c) => c.id === connectionId);
|
|
46489
46520
|
if (!connection) {
|
|
46490
46521
|
return {
|
|
@@ -46493,17 +46524,17 @@ This connector does not require API credentials, but a connectionId is still req
|
|
|
46493
46524
|
};
|
|
46494
46525
|
}
|
|
46495
46526
|
console.log(
|
|
46496
|
-
`[connector-request] hackernews/${connection.name}: GET ${
|
|
46527
|
+
`[connector-request] hackernews/${connection.name}: GET ${path5}`
|
|
46497
46528
|
);
|
|
46498
46529
|
try {
|
|
46499
|
-
if (/^https?:\/\//i.test(
|
|
46530
|
+
if (/^https?:\/\//i.test(path5)) {
|
|
46500
46531
|
return {
|
|
46501
46532
|
success: false,
|
|
46502
46533
|
error: "Absolute URLs are not allowed. Pass a Firebase path such as /topstories.json."
|
|
46503
46534
|
};
|
|
46504
46535
|
}
|
|
46505
46536
|
const url = new URL(
|
|
46506
|
-
`${BASE_URL68}${
|
|
46537
|
+
`${BASE_URL68}${path5.startsWith("/") ? "" : "/"}${path5}`
|
|
46507
46538
|
);
|
|
46508
46539
|
if (printPretty) url.searchParams.set("print", "pretty");
|
|
46509
46540
|
const controller = new AbortController();
|
|
@@ -46590,7 +46621,7 @@ Avoid frequent repeated Algolia searches from dashboards. Keep hitsPerPage small
|
|
|
46590
46621
|
`[connector-request] hackernews/${connection.name}: Algolia ${endpoint}`
|
|
46591
46622
|
);
|
|
46592
46623
|
try {
|
|
46593
|
-
let
|
|
46624
|
+
let path5 = `/${endpoint}`;
|
|
46594
46625
|
if (endpoint === "items" || endpoint === "users") {
|
|
46595
46626
|
if (!idOrUsername) {
|
|
46596
46627
|
return {
|
|
@@ -46598,9 +46629,9 @@ Avoid frequent repeated Algolia searches from dashboards. Keep hitsPerPage small
|
|
|
46598
46629
|
error: `idOrUsername is required for endpoint ${endpoint}`
|
|
46599
46630
|
};
|
|
46600
46631
|
}
|
|
46601
|
-
|
|
46632
|
+
path5 += `/${encodeURIComponent(idOrUsername)}`;
|
|
46602
46633
|
}
|
|
46603
|
-
const url = new URL(`${BASE_URL69}${
|
|
46634
|
+
const url = new URL(`${BASE_URL69}${path5}`);
|
|
46604
46635
|
if (queryParams) {
|
|
46605
46636
|
for (const [k, v] of Object.entries(queryParams)) {
|
|
46606
46637
|
url.searchParams.set(k, v);
|
|
@@ -46862,7 +46893,7 @@ Use this tool for all Slack API interactions: listing channels, reading channel
|
|
|
46862
46893
|
Pagination is cursor-based: pass 'cursor' from 'response_metadata.next_cursor' of the previous response. Message timestamps ('ts', 'oldest', 'latest') are Unix epoch seconds as strings.`,
|
|
46863
46894
|
inputSchema: inputSchema105,
|
|
46864
46895
|
outputSchema: outputSchema105,
|
|
46865
|
-
async execute({ connectionId, method, path:
|
|
46896
|
+
async execute({ connectionId, method, path: path5, body }, connections, config) {
|
|
46866
46897
|
const connection = connections.find((c) => c.id === connectionId);
|
|
46867
46898
|
if (!connection) {
|
|
46868
46899
|
return {
|
|
@@ -46871,10 +46902,10 @@ Pagination is cursor-based: pass 'cursor' from 'response_metadata.next_cursor' o
|
|
|
46871
46902
|
};
|
|
46872
46903
|
}
|
|
46873
46904
|
console.log(
|
|
46874
|
-
`[connector-request] slack/${connection.name}: ${method} ${
|
|
46905
|
+
`[connector-request] slack/${connection.name}: ${method} ${path5}`
|
|
46875
46906
|
);
|
|
46876
46907
|
try {
|
|
46877
|
-
const url = `${BASE_URL70}${
|
|
46908
|
+
const url = `${BASE_URL70}${path5.startsWith("/") ? "" : "/"}${path5}`;
|
|
46878
46909
|
const token = await getProxyToken35(config.oauthProxy);
|
|
46879
46910
|
const proxyUrl = `https://${config.oauthProxy.sandboxId}.${config.oauthProxy.previewBaseDomain}/_sqcore/connections/${connectionId}/request`;
|
|
46880
46911
|
const controller = new AbortController();
|
|
@@ -47406,7 +47437,12 @@ function loadEnvFile(envPath) {
|
|
|
47406
47437
|
|
|
47407
47438
|
// src/cli/runner.ts
|
|
47408
47439
|
import { pathToFileURL } from "url";
|
|
47409
|
-
import { readFile as
|
|
47440
|
+
import { readFile as readFile3, readdir as readdir2 } from "fs/promises";
|
|
47441
|
+
import path3 from "path";
|
|
47442
|
+
|
|
47443
|
+
// src/registry.ts
|
|
47444
|
+
import { readdir, readFile as readFile2, mkdir } from "fs/promises";
|
|
47445
|
+
import { watch as fsWatch2 } from "fs";
|
|
47410
47446
|
import path2 from "path";
|
|
47411
47447
|
|
|
47412
47448
|
// src/types/server-logic.ts
|
|
@@ -47472,14 +47508,21 @@ var anyJsonServerLogicSchema = z106.union([
|
|
|
47472
47508
|
|
|
47473
47509
|
// src/registry.ts
|
|
47474
47510
|
function applyDefaults(parameterMeta, runtimeParams) {
|
|
47475
|
-
const defaults = new Map(
|
|
47511
|
+
const defaults = new Map(
|
|
47512
|
+
parameterMeta.map((p) => [p.name, p.default ?? null])
|
|
47513
|
+
);
|
|
47476
47514
|
const result = {};
|
|
47477
|
-
for (const [key, value] of Object.entries(runtimeParams))
|
|
47515
|
+
for (const [key, value] of Object.entries(runtimeParams)) {
|
|
47516
|
+
result[key] = value;
|
|
47517
|
+
}
|
|
47478
47518
|
for (const [key, defaultVal] of defaults) {
|
|
47479
|
-
if (!(key in result))
|
|
47519
|
+
if (!(key in result)) {
|
|
47520
|
+
result[key] = defaultVal;
|
|
47521
|
+
}
|
|
47480
47522
|
}
|
|
47481
47523
|
return result;
|
|
47482
47524
|
}
|
|
47525
|
+
var defaultServerLogicDir = path2.join(process.cwd(), "server-logic");
|
|
47483
47526
|
|
|
47484
47527
|
// src/cli/runner.ts
|
|
47485
47528
|
function createStubContext(params) {
|
|
@@ -47569,10 +47612,10 @@ async function runTypescriptServerLogic(slug, handlerPath, params) {
|
|
|
47569
47612
|
}
|
|
47570
47613
|
}
|
|
47571
47614
|
async function runServerLogic(slug, dirPath, params, limit) {
|
|
47572
|
-
const jsonPath =
|
|
47615
|
+
const jsonPath = path3.join(dirPath, `${slug}.json`);
|
|
47573
47616
|
let def;
|
|
47574
47617
|
try {
|
|
47575
|
-
const raw = await
|
|
47618
|
+
const raw = await readFile3(jsonPath, "utf-8");
|
|
47576
47619
|
const parsed = anyJsonServerLogicSchema.safeParse(JSON.parse(raw));
|
|
47577
47620
|
if (!parsed.success) {
|
|
47578
47621
|
return {
|
|
@@ -47594,14 +47637,14 @@ async function runServerLogic(slug, dirPath, params, limit) {
|
|
|
47594
47637
|
};
|
|
47595
47638
|
}
|
|
47596
47639
|
if (def.type === "typescript") {
|
|
47597
|
-
const absolutePath =
|
|
47640
|
+
const absolutePath = path3.resolve(dirPath, def.handlerPath);
|
|
47598
47641
|
return runTypescriptServerLogic(slug, absolutePath, params);
|
|
47599
47642
|
}
|
|
47600
47643
|
return runSqlServerLogic(slug, def, params, limit);
|
|
47601
47644
|
}
|
|
47602
47645
|
async function listSlugs(dirPath) {
|
|
47603
47646
|
try {
|
|
47604
|
-
const files = await
|
|
47647
|
+
const files = await readdir2(dirPath);
|
|
47605
47648
|
return files.filter((f) => f.endsWith(".json")).map((f) => f.replace(/\.json$/, ""));
|
|
47606
47649
|
} catch {
|
|
47607
47650
|
return [];
|
|
@@ -47731,8 +47774,8 @@ async function main() {
|
|
|
47731
47774
|
process.exit(0);
|
|
47732
47775
|
}
|
|
47733
47776
|
const cwd = process.cwd();
|
|
47734
|
-
const dirPath = values.dir ?
|
|
47735
|
-
const envPath = values.env ?
|
|
47777
|
+
const dirPath = values.dir ? path4.resolve(cwd, values.dir) : path4.join(cwd, "server-logic");
|
|
47778
|
+
const envPath = values.env ? path4.resolve(cwd, values.env) : path4.join(cwd, "../../.env");
|
|
47736
47779
|
const limit = parseInt(values.limit ?? "50", 10);
|
|
47737
47780
|
const format = values.format ?? "table";
|
|
47738
47781
|
loadEnvFile(envPath);
|
|
@@ -47785,10 +47828,10 @@ Total: ${results.length}, Failed: ${failed}`);
|
|
|
47785
47828
|
console.log("Cancelled.");
|
|
47786
47829
|
process.exit(0);
|
|
47787
47830
|
}
|
|
47788
|
-
const jsonPath =
|
|
47831
|
+
const jsonPath = path4.join(dirPath, `${slug}.json`);
|
|
47789
47832
|
let paramMeta = [];
|
|
47790
47833
|
try {
|
|
47791
|
-
const raw = await
|
|
47834
|
+
const raw = await readFile4(jsonPath, "utf-8");
|
|
47792
47835
|
const parsed = anyJsonServerLogicSchema.safeParse(JSON.parse(raw));
|
|
47793
47836
|
if (parsed.success) paramMeta = parsed.data.parameters ?? [];
|
|
47794
47837
|
} catch {
|