@squadbase/vite-server 0.1.7-dev.7 → 0.1.8-dev.468a970

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli/index.js CHANGED
@@ -2806,22 +2806,22 @@ var require_nacl_fast = __commonJS({
2806
2806
  randombytes = fn;
2807
2807
  };
2808
2808
  (function() {
2809
- var crypto9 = typeof self !== "undefined" ? self.crypto || self.msCrypto : null;
2810
- if (crypto9 && crypto9.getRandomValues) {
2809
+ var crypto8 = typeof self !== "undefined" ? self.crypto || self.msCrypto : null;
2810
+ if (crypto8 && crypto8.getRandomValues) {
2811
2811
  var QUOTA = 65536;
2812
2812
  nacl.setPRNG(function(x6, n6) {
2813
2813
  var i6, v7 = new Uint8Array(n6);
2814
2814
  for (i6 = 0; i6 < n6; i6 += QUOTA) {
2815
- crypto9.getRandomValues(v7.subarray(i6, i6 + Math.min(n6 - i6, QUOTA)));
2815
+ crypto8.getRandomValues(v7.subarray(i6, i6 + Math.min(n6 - i6, QUOTA)));
2816
2816
  }
2817
2817
  for (i6 = 0; i6 < n6; i6++) x6[i6] = v7[i6];
2818
2818
  cleanup(v7);
2819
2819
  });
2820
2820
  } else if (typeof __require !== "undefined") {
2821
- crypto9 = __require("crypto");
2822
- if (crypto9 && crypto9.randomBytes) {
2821
+ crypto8 = __require("crypto");
2822
+ if (crypto8 && crypto8.randomBytes) {
2823
2823
  nacl.setPRNG(function(x6, n6) {
2824
- var i6, v7 = crypto9.randomBytes(n6);
2824
+ var i6, v7 = crypto8.randomBytes(n6);
2825
2825
  for (i6 = 0; i6 < n6; i6++) x6[i6] = v7[i6];
2826
2826
  cleanup(v7);
2827
2827
  });
@@ -4089,13 +4089,13 @@ var require_bcrypt_pbkdf = __commonJS({
4089
4089
  var cpufeatures_default;
4090
4090
  var init_cpufeatures = __esm({
4091
4091
  "../../node_modules/cpu-features/build/Release/cpufeatures.node"() {
4092
- cpufeatures_default = "./cpufeatures-244TQC2T.node";
4092
+ cpufeatures_default = "./cpufeatures-ORCDQN2Y.node";
4093
4093
  }
4094
4094
  });
4095
4095
 
4096
- // node-file:/Users/shibatanaoto/project/squadbase/squadbase-monorepo/node_modules/cpu-features/build/Release/cpufeatures.node
4096
+ // node-file:/home/runner/work/squadbase-monorepo/squadbase-monorepo/node_modules/cpu-features/build/Release/cpufeatures.node
4097
4097
  var require_cpufeatures = __commonJS({
4098
- "node-file:/Users/shibatanaoto/project/squadbase/squadbase-monorepo/node_modules/cpu-features/build/Release/cpufeatures.node"(exports2, module) {
4098
+ "node-file:/home/runner/work/squadbase-monorepo/squadbase-monorepo/node_modules/cpu-features/build/Release/cpufeatures.node"(exports2, module) {
4099
4099
  "use strict";
4100
4100
  init_cpufeatures();
4101
4101
  try {
@@ -4118,7 +4118,7 @@ var require_lib2 = __commonJS({
4118
4118
  var require_constants = __commonJS({
4119
4119
  "../../node_modules/ssh2/lib/protocol/constants.js"(exports2, module) {
4120
4120
  "use strict";
4121
- var crypto9 = __require("crypto");
4121
+ var crypto8 = __require("crypto");
4122
4122
  var cpuInfo;
4123
4123
  try {
4124
4124
  cpuInfo = require_lib2()();
@@ -4126,21 +4126,21 @@ var require_constants = __commonJS({
4126
4126
  }
4127
4127
  var { bindingAvailable, CIPHER_INFO, MAC_INFO } = require_crypto();
4128
4128
  var eddsaSupported = (() => {
4129
- if (typeof crypto9.sign === "function" && typeof crypto9.verify === "function") {
4129
+ if (typeof crypto8.sign === "function" && typeof crypto8.verify === "function") {
4130
4130
  const key = "-----BEGIN PRIVATE KEY-----\r\nMC4CAQAwBQYDK2VwBCIEIHKj+sVa9WcD/q2DJUJaf43Kptc8xYuUQA4bOFj9vC8T\r\n-----END PRIVATE KEY-----";
4131
4131
  const data = Buffer.from("a");
4132
4132
  let sig;
4133
4133
  let verified;
4134
4134
  try {
4135
- sig = crypto9.sign(null, data, key);
4136
- verified = crypto9.verify(null, data, key, sig);
4135
+ sig = crypto8.sign(null, data, key);
4136
+ verified = crypto8.verify(null, data, key, sig);
4137
4137
  } catch {
4138
4138
  }
4139
4139
  return Buffer.isBuffer(sig) && sig.length === 64 && verified === true;
4140
4140
  }
4141
4141
  return false;
4142
4142
  })();
4143
- var curve25519Supported = typeof crypto9.diffieHellman === "function" && typeof crypto9.generateKeyPairSync === "function" && typeof crypto9.createPublicKey === "function";
4143
+ var curve25519Supported = typeof crypto8.diffieHellman === "function" && typeof crypto8.generateKeyPairSync === "function" && typeof crypto8.createPublicKey === "function";
4144
4144
  var DEFAULT_KEX = [
4145
4145
  // https://tools.ietf.org/html/rfc5656#section-10.1
4146
4146
  "ecdh-sha2-nistp256",
@@ -4183,7 +4183,7 @@ var require_constants = __commonJS({
4183
4183
  "ssh-dss"
4184
4184
  ]);
4185
4185
  var canUseCipher = (() => {
4186
- const ciphers = crypto9.getCiphers();
4186
+ const ciphers = crypto8.getCiphers();
4187
4187
  return (name) => ciphers.includes(CIPHER_INFO[name].sslName);
4188
4188
  })();
4189
4189
  var DEFAULT_CIPHER = [
@@ -4221,7 +4221,7 @@ var require_constants = __commonJS({
4221
4221
  "arcfour"
4222
4222
  ].filter(canUseCipher));
4223
4223
  var canUseMAC = (() => {
4224
- const hashes = crypto9.getHashes();
4224
+ const hashes = crypto8.getHashes();
4225
4225
  return (name) => hashes.includes(MAC_INFO[name].sslName);
4226
4226
  })();
4227
4227
  var DEFAULT_MAC = [
@@ -4827,13 +4827,13 @@ var require_utils = __commonJS({
4827
4827
  var sshcrypto_default;
4828
4828
  var init_sshcrypto = __esm({
4829
4829
  "../../node_modules/ssh2/lib/protocol/crypto/build/Release/sshcrypto.node"() {
4830
- sshcrypto_default = "./sshcrypto-JMJD77BG.node";
4830
+ sshcrypto_default = "./sshcrypto-P3UBA7BP.node";
4831
4831
  }
4832
4832
  });
4833
4833
 
4834
- // node-file:/Users/shibatanaoto/project/squadbase/squadbase-monorepo/node_modules/ssh2/lib/protocol/crypto/build/Release/sshcrypto.node
4834
+ // node-file:/home/runner/work/squadbase-monorepo/squadbase-monorepo/node_modules/ssh2/lib/protocol/crypto/build/Release/sshcrypto.node
4835
4835
  var require_sshcrypto = __commonJS({
4836
- "node-file:/Users/shibatanaoto/project/squadbase/squadbase-monorepo/node_modules/ssh2/lib/protocol/crypto/build/Release/sshcrypto.node"(exports2, module) {
4836
+ "node-file:/home/runner/work/squadbase-monorepo/squadbase-monorepo/node_modules/ssh2/lib/protocol/crypto/build/Release/sshcrypto.node"(exports2, module) {
4837
4837
  "use strict";
4838
4838
  init_sshcrypto();
4839
4839
  try {
@@ -6605,7 +6605,7 @@ var require_keyParser = __commonJS({
6605
6605
  createECDH,
6606
6606
  createHash: createHash4,
6607
6607
  createHmac: createHmac2,
6608
- createSign: createSign2,
6608
+ createSign,
6609
6609
  createVerify,
6610
6610
  getCiphers,
6611
6611
  sign: sign_,
@@ -6906,7 +6906,7 @@ ${formatted}-----END ${type} KEY-----`;
6906
6906
  return new Error("No private key available");
6907
6907
  if (!algo || typeof algo !== "string")
6908
6908
  algo = this[SYM_HASH_ALGO];
6909
- const signature = createSign2(algo);
6909
+ const signature = createSign(algo);
6910
6910
  signature.update(data);
6911
6911
  try {
6912
6912
  return signature.sign(pem);
@@ -20415,8 +20415,8 @@ var require_bson = __commonJS({
20415
20415
  return crypto.getRandomValues(nodeJsByteUtils.allocate(byteLength));
20416
20416
  }
20417
20417
  var nodejsRandomBytes = (() => {
20418
- const { crypto: crypto9 } = globalThis;
20419
- if (crypto9 != null && typeof crypto9.getRandomValues === "function") {
20418
+ const { crypto: crypto8 } = globalThis;
20419
+ if (crypto8 != null && typeof crypto8.getRandomValues === "function") {
20420
20420
  return nodejsSecureRandomBytes;
20421
20421
  } else {
20422
20422
  return nodejsMathRandomBytes;
@@ -20521,10 +20521,10 @@ var require_bson = __commonJS({
20521
20521
  return webByteUtils.fromNumberArray(Array.from({ length: byteLength }, () => Math.floor(Math.random() * 256)));
20522
20522
  }
20523
20523
  var webRandomBytes = (() => {
20524
- const { crypto: crypto9 } = globalThis;
20525
- if (crypto9 != null && typeof crypto9.getRandomValues === "function") {
20524
+ const { crypto: crypto8 } = globalThis;
20525
+ if (crypto8 != null && typeof crypto8.getRandomValues === "function") {
20526
20526
  return (byteLength) => {
20527
- return crypto9.getRandomValues(webByteUtils.allocate(byteLength));
20527
+ return crypto8.getRandomValues(webByteUtils.allocate(byteLength));
20528
20528
  };
20529
20529
  } else {
20530
20530
  if (isReactNative()) {
@@ -27026,7 +27026,7 @@ var require_utils3 = __commonJS({
27026
27026
  exports2.decorateDecryptionResult = decorateDecryptionResult;
27027
27027
  exports2.addAbortListener = addAbortListener;
27028
27028
  exports2.abortable = abortable;
27029
- var crypto9 = __require("crypto");
27029
+ var crypto8 = __require("crypto");
27030
27030
  var fs_1 = __require("fs");
27031
27031
  var http2 = __require("http");
27032
27032
  var process2 = __require("process");
@@ -27186,7 +27186,7 @@ var require_utils3 = __commonJS({
27186
27186
  }
27187
27187
  }
27188
27188
  function uuidV4() {
27189
- const result = crypto9.randomBytes(16);
27189
+ const result = crypto8.randomBytes(16);
27190
27190
  result[6] = result[6] & 15 | 64;
27191
27191
  result[8] = result[8] & 63 | 128;
27192
27192
  return result;
@@ -27738,7 +27738,7 @@ var require_utils3 = __commonJS({
27738
27738
  }
27739
27739
  var randomBytes = (size) => {
27740
27740
  return new Promise((resolve, reject) => {
27741
- crypto9.randomBytes(size, (error2, buf) => {
27741
+ crypto8.randomBytes(size, (error2, buf) => {
27742
27742
  if (error2)
27743
27743
  return reject(error2);
27744
27744
  resolve(buf);
@@ -39491,12 +39491,12 @@ var init_date_utils = __esm({
39491
39491
  });
39492
39492
 
39493
39493
  // ../../node_modules/@smithy/uuid/dist-es/randomUUID.js
39494
- import crypto4 from "crypto";
39494
+ import crypto3 from "crypto";
39495
39495
  var randomUUID;
39496
39496
  var init_randomUUID = __esm({
39497
39497
  "../../node_modules/@smithy/uuid/dist-es/randomUUID.js"() {
39498
39498
  "use strict";
39499
- randomUUID = crypto4.randomUUID.bind(crypto4);
39499
+ randomUUID = crypto3.randomUUID.bind(crypto3);
39500
39500
  }
39501
39501
  });
39502
39502
 
@@ -61430,10 +61430,10 @@ var require_retry = __commonJS({
61430
61430
  });
61431
61431
 
61432
61432
  // ../../node_modules/gaxios/node_modules/uuid/dist/esm-node/rng.js
61433
- import crypto5 from "crypto";
61433
+ import crypto4 from "crypto";
61434
61434
  function rng() {
61435
61435
  if (poolPtr > rnds8Pool.length - 16) {
61436
- crypto5.randomFillSync(rnds8Pool);
61436
+ crypto4.randomFillSync(rnds8Pool);
61437
61437
  poolPtr = 0;
61438
61438
  }
61439
61439
  return rnds8Pool.slice(poolPtr, poolPtr += 16);
@@ -61644,14 +61644,14 @@ var init_v35 = __esm({
61644
61644
  });
61645
61645
 
61646
61646
  // ../../node_modules/gaxios/node_modules/uuid/dist/esm-node/md5.js
61647
- import crypto6 from "crypto";
61647
+ import crypto5 from "crypto";
61648
61648
  function md5(bytes) {
61649
61649
  if (Array.isArray(bytes)) {
61650
61650
  bytes = Buffer.from(bytes);
61651
61651
  } else if (typeof bytes === "string") {
61652
61652
  bytes = Buffer.from(bytes, "utf8");
61653
61653
  }
61654
- return crypto6.createHash("md5").update(bytes).digest();
61654
+ return crypto5.createHash("md5").update(bytes).digest();
61655
61655
  }
61656
61656
  var md5_default;
61657
61657
  var init_md5 = __esm({
@@ -61674,13 +61674,13 @@ var init_v3 = __esm({
61674
61674
  });
61675
61675
 
61676
61676
  // ../../node_modules/gaxios/node_modules/uuid/dist/esm-node/native.js
61677
- import crypto7 from "crypto";
61677
+ import crypto6 from "crypto";
61678
61678
  var native_default;
61679
61679
  var init_native = __esm({
61680
61680
  "../../node_modules/gaxios/node_modules/uuid/dist/esm-node/native.js"() {
61681
61681
  "use strict";
61682
61682
  native_default = {
61683
- randomUUID: crypto7.randomUUID
61683
+ randomUUID: crypto6.randomUUID
61684
61684
  };
61685
61685
  }
61686
61686
  });
@@ -61715,14 +61715,14 @@ var init_v42 = __esm({
61715
61715
  });
61716
61716
 
61717
61717
  // ../../node_modules/gaxios/node_modules/uuid/dist/esm-node/sha1.js
61718
- import crypto8 from "crypto";
61718
+ import crypto7 from "crypto";
61719
61719
  function sha1(bytes) {
61720
61720
  if (Array.isArray(bytes)) {
61721
61721
  bytes = Buffer.from(bytes);
61722
61722
  } else if (typeof bytes === "string") {
61723
61723
  bytes = Buffer.from(bytes, "utf8");
61724
61724
  }
61725
- return crypto8.createHash("sha1").update(bytes).digest();
61725
+ return crypto7.createHash("sha1").update(bytes).digest();
61726
61726
  }
61727
61727
  var sha1_default;
61728
61728
  var init_sha1 = __esm({
@@ -82406,7 +82406,7 @@ var require_scram = __commonJS({
82406
82406
  Object.defineProperty(exports2, "__esModule", { value: true });
82407
82407
  exports2.ScramSHA256 = exports2.ScramSHA1 = void 0;
82408
82408
  var saslprep_1 = require_node2();
82409
- var crypto9 = __require("crypto");
82409
+ var crypto8 = __require("crypto");
82410
82410
  var bson_1 = require_bson2();
82411
82411
  var error_1 = require_error();
82412
82412
  var utils_1 = require_utils3();
@@ -82559,9 +82559,9 @@ var require_scram = __commonJS({
82559
82559
  }
82560
82560
  let md52;
82561
82561
  try {
82562
- md52 = crypto9.createHash("md5");
82562
+ md52 = crypto8.createHash("md5");
82563
82563
  } catch (err) {
82564
- if (crypto9.getFips()) {
82564
+ if (crypto8.getFips()) {
82565
82565
  throw new Error("Auth mechanism SCRAM-SHA-1 is not supported in FIPS mode");
82566
82566
  }
82567
82567
  throw err;
@@ -82584,10 +82584,10 @@ var require_scram = __commonJS({
82584
82584
  return Buffer.from(res).toString("base64");
82585
82585
  }
82586
82586
  function H2(method, text) {
82587
- return crypto9.createHash(method).update(text).digest();
82587
+ return crypto8.createHash(method).update(text).digest();
82588
82588
  }
82589
82589
  function HMAC(method, key, text) {
82590
- return crypto9.createHmac(method, key).update(text).digest();
82590
+ return crypto8.createHmac(method, key).update(text).digest();
82591
82591
  }
82592
82592
  var _hiCache = {};
82593
82593
  var _hiCacheCount = 0;
@@ -82604,7 +82604,7 @@ var require_scram = __commonJS({
82604
82604
  if (_hiCache[key] != null) {
82605
82605
  return _hiCache[key];
82606
82606
  }
82607
- const saltedData = crypto9.pbkdf2Sync(data, salt, iterations, hiLengthMap[cryptoMethod], cryptoMethod);
82607
+ const saltedData = crypto8.pbkdf2Sync(data, salt, iterations, hiLengthMap[cryptoMethod], cryptoMethod);
82608
82608
  if (_hiCacheCount >= 200) {
82609
82609
  _hiCachePurge();
82610
82610
  }
@@ -82616,8 +82616,8 @@ var require_scram = __commonJS({
82616
82616
  if (lhs.length !== rhs.length) {
82617
82617
  return false;
82618
82618
  }
82619
- if (typeof crypto9.timingSafeEqual === "function") {
82620
- return crypto9.timingSafeEqual(lhs, rhs);
82619
+ if (typeof crypto8.timingSafeEqual === "function") {
82620
+ return crypto8.timingSafeEqual(lhs, rhs);
82621
82621
  }
82622
82622
  let result = 0;
82623
82623
  for (let i6 = 0; i6 < lhs.length; i6++) {
@@ -91332,8 +91332,7 @@ const realtime = await ga.runRealtimeReport({
91332
91332
  }
91333
91333
  });
91334
91334
 
91335
- // ../connectors/src/connectors/google-calendar/tools/list-calendars.ts
91336
- import * as crypto3 from "crypto";
91335
+ // ../connectors/src/connectors/google-calendar/tools/request.ts
91337
91336
  import { z as z21 } from "zod";
91338
91337
 
91339
91338
  // ../connectors/src/connectors/google-calendar/parameters.ts
@@ -91341,121 +91340,54 @@ var parameters14 = {
91341
91340
  serviceAccountKeyJsonBase64: new ParameterDefinition({
91342
91341
  slug: "service-account-key-json-base64",
91343
91342
  name: "Google Cloud Service Account JSON",
91344
- description: "The service account JSON key used to authenticate with Google Cloud Platform. Ensure that the service account has the necessary permissions to access Google Calendar, and that calendars are shared with the service account email.",
91343
+ description: "The service account JSON key. Used for both Domain-wide Delegation (impersonating a Workspace user) and direct service-account access (calendars explicitly shared with the SA email). The authentication path is selected per call by the tool used.",
91345
91344
  envVarBaseKey: "GOOGLE_CALENDAR_SERVICE_ACCOUNT_JSON_BASE64",
91346
91345
  type: "base64EncodedJson",
91347
91346
  secret: true,
91348
91347
  required: true
91349
91348
  })
91350
91349
  };
91351
- var impersonateEmailParameter = new ParameterDefinition({
91352
- slug: "impersonate-email",
91353
- name: "User Email Address(es)",
91354
- description: "The email address(es) of the Google Workspace user(s) whose calendar is accessed via Domain-wide Delegation. Collected during the setup flow.",
91355
- envVarBaseKey: "GOOGLE_CALENDAR_IMPERSONATE_EMAIL",
91356
- type: "text",
91357
- secret: false,
91358
- required: false
91359
- });
91360
- var calendarIdParameter = new ParameterDefinition({
91361
- slug: "calendar-id",
91362
- name: "Default Calendar ID",
91363
- description: "The default Google Calendar ID to use (e.g., 'primary' or an email address like 'user@example.com'). If not set, 'primary' is used.",
91364
- envVarBaseKey: "GOOGLE_CALENDAR_CALENDAR_ID",
91365
- type: "text",
91366
- secret: false,
91367
- required: false
91368
- });
91369
-
91370
- // ../connectors/src/connectors/google-calendar/tools/list-calendars.ts
91371
- var TOKEN_URL = "https://oauth2.googleapis.com/token";
91350
+
91351
+ // ../connectors/src/connectors/google-calendar/tools/request.ts
91372
91352
  var BASE_URL6 = "https://www.googleapis.com/calendar/v3";
91373
- var SCOPE = "https://www.googleapis.com/auth/calendar.readonly https://www.googleapis.com/auth/calendar.events.readonly";
91374
91353
  var REQUEST_TIMEOUT_MS11 = 6e4;
91375
- function base64url(input) {
91376
- const buf = typeof input === "string" ? Buffer.from(input) : input;
91377
- return buf.toString("base64url");
91378
- }
91379
- function buildJwt(clientEmail, privateKey, nowSec, subject) {
91380
- const header = base64url(JSON.stringify({ alg: "RS256", typ: "JWT" }));
91381
- const payload = base64url(
91382
- JSON.stringify({
91383
- iss: clientEmail,
91384
- sub: subject,
91385
- scope: SCOPE,
91386
- aud: TOKEN_URL,
91387
- iat: nowSec,
91388
- exp: nowSec + 3600
91389
- })
91390
- );
91391
- const signingInput = `${header}.${payload}`;
91392
- const sign2 = crypto3.createSign("RSA-SHA256");
91393
- sign2.update(signingInput);
91394
- sign2.end();
91395
- const signature = base64url(sign2.sign(privateKey));
91396
- return `${signingInput}.${signature}`;
91397
- }
91398
- async function getAccessToken(serviceAccount, subject) {
91399
- const nowSec = Math.floor(Date.now() / 1e3);
91400
- const jwt = buildJwt(
91401
- serviceAccount.client_email,
91402
- serviceAccount.private_key,
91403
- nowSec,
91404
- subject
91405
- );
91406
- const response = await fetch(TOKEN_URL, {
91407
- method: "POST",
91408
- headers: { "Content-Type": "application/x-www-form-urlencoded" },
91409
- body: new URLSearchParams({
91410
- grant_type: "urn:ietf:params:oauth:grant-type:jwt-bearer",
91411
- assertion: jwt
91412
- })
91413
- });
91414
- if (!response.ok) {
91415
- const text = await response.text();
91416
- throw new Error(
91417
- `token exchange failed for ${subject} (${response.status}): ${text}`
91418
- );
91419
- }
91420
- const data = await response.json();
91421
- return data.access_token;
91354
+ function decodeServiceAccount(keyJsonBase64) {
91355
+ const decoded = Buffer.from(keyJsonBase64, "base64").toString("utf-8");
91356
+ return JSON.parse(decoded);
91422
91357
  }
91423
91358
  var inputSchema21 = z21.object({
91424
91359
  toolUseIntent: z21.string().optional().describe(
91425
91360
  "Brief description of what you intend to accomplish with this tool call"
91426
91361
  ),
91427
- connectionId: z21.string().describe("ID of the Google Calendar connection to use")
91362
+ connectionId: z21.string().describe("ID of the Google Calendar connection to use"),
91363
+ method: z21.enum(["GET", "POST", "PUT", "PATCH", "DELETE"]).describe("HTTP method"),
91364
+ path: z21.string().describe(
91365
+ "API path appended to https://www.googleapis.com/calendar/v3 (e.g., '/users/me/calendarList', '/calendars/team@example.com/events'). Write the calendar ID directly into the path \u2014 there is no placeholder substitution."
91366
+ ),
91367
+ scopes: z21.array(z21.string()).describe(
91368
+ "OAuth scopes the token must include. This connector currently supports read-only operations only \u2014 pass one of ['https://www.googleapis.com/auth/calendar.readonly'] (calendars + events read), ['https://www.googleapis.com/auth/calendar.events.readonly'] (events read only), or ['https://www.googleapis.com/auth/calendar.freebusy'] (busy/free queries only). Per-endpoint scope reference: https://developers.google.com/calendar/api/auth"
91369
+ ),
91370
+ queryParams: z21.record(z21.string(), z21.string()).optional().describe("Query parameters to append to the URL"),
91371
+ body: z21.record(z21.string(), z21.unknown()).optional().describe("JSON request body for POST/PUT/PATCH")
91428
91372
  });
91429
91373
  var outputSchema21 = z21.discriminatedUnion("success", [
91430
91374
  z21.object({
91431
91375
  success: z21.literal(true),
91432
- calendars: z21.array(
91433
- z21.object({
91434
- impersonateEmail: z21.string(),
91435
- id: z21.string(),
91436
- summary: z21.string(),
91437
- primary: z21.boolean().optional(),
91438
- accessRole: z21.string()
91439
- })
91440
- ),
91441
- errors: z21.array(
91442
- z21.object({
91443
- impersonateEmail: z21.string(),
91444
- error: z21.string()
91445
- })
91446
- )
91376
+ status: z21.number(),
91377
+ data: z21.record(z21.string(), z21.unknown())
91447
91378
  }),
91448
91379
  z21.object({
91449
91380
  success: z21.literal(false),
91450
- error: z21.string()
91381
+ error: z21.string(),
91382
+ serviceAccountEmail: z21.string().optional()
91451
91383
  })
91452
91384
  ]);
91453
- var listCalendarsTool = new ConnectorTool({
91454
- name: "listCalendars",
91455
- description: "List Google Calendars accessible via Domain-wide Delegation by impersonating the Google Workspace user(s) configured on the connection's `impersonate-email` parameter (comma-separated list supported). Use during setup to aggregate calendars across the configured emails.",
91385
+ var requestTool5 = new ConnectorTool({
91386
+ name: "request",
91387
+ 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`).",
91456
91388
  inputSchema: inputSchema21,
91457
91389
  outputSchema: outputSchema21,
91458
- async execute({ connectionId }, connections) {
91390
+ async execute({ connectionId, method, path: path5, scopes, queryParams, body }, connections) {
91459
91391
  const connection = connections.find((c6) => c6.id === connectionId);
91460
91392
  if (!connection) {
91461
91393
  return {
@@ -91463,144 +91395,89 @@ var listCalendarsTool = new ConnectorTool({
91463
91395
  error: `Connection ${connectionId} not found`
91464
91396
  };
91465
91397
  }
91466
- const impersonateEmailRaw = impersonateEmailParameter.getValue(connection);
91467
- const emails = impersonateEmailRaw.split(",").map((e6) => e6.trim()).filter((e6) => e6.length > 0);
91468
- if (emails.length === 0) {
91469
- return {
91470
- success: false,
91471
- error: "impersonate-email parameter is empty"
91472
- };
91473
- }
91474
- console.log(
91475
- `[connector-request] google-calendar/${connection.name}: listCalendars for ${emails.join(",")}`
91476
- );
91398
+ const keyJsonBase64 = parameters14.serviceAccountKeyJsonBase64.getValue(connection);
91477
91399
  let serviceAccount;
91478
91400
  try {
91479
- const keyJsonBase64 = parameters14.serviceAccountKeyJsonBase64.getValue(connection);
91480
- const decoded = Buffer.from(keyJsonBase64, "base64").toString("utf-8");
91481
- serviceAccount = JSON.parse(decoded);
91401
+ serviceAccount = decodeServiceAccount(keyJsonBase64);
91482
91402
  } catch (err) {
91483
91403
  const msg = err instanceof Error ? err.message : String(err);
91484
91404
  return {
91485
91405
  success: false,
91486
- error: `failed to decode service account key: ${msg}`
91406
+ error: `Failed to decode service account key: ${msg}`
91487
91407
  };
91488
91408
  }
91489
- if (!serviceAccount.client_email || !serviceAccount.private_key) {
91490
- return {
91491
- success: false,
91492
- error: "service account key JSON must contain client_email and private_key"
91493
- };
91494
- }
91495
- const aggregated = [];
91496
- const errors2 = [];
91497
- for (const email of emails) {
91409
+ const serviceAccountEmail = serviceAccount.client_email;
91410
+ console.log(
91411
+ `[connector-request] google-calendar/${connection.name}: ${method} ${path5} (service account)`
91412
+ );
91413
+ try {
91414
+ const { GoogleAuth } = await import("google-auth-library");
91415
+ const auth = new GoogleAuth({
91416
+ credentials: {
91417
+ client_email: serviceAccount.client_email,
91418
+ private_key: serviceAccount.private_key
91419
+ },
91420
+ scopes
91421
+ });
91422
+ const token = await auth.getAccessToken();
91423
+ if (!token) {
91424
+ return {
91425
+ success: false,
91426
+ error: "Failed to obtain access token",
91427
+ serviceAccountEmail
91428
+ };
91429
+ }
91430
+ let url = `${BASE_URL6}${path5.startsWith("/") ? "" : "/"}${path5}`;
91431
+ if (queryParams) {
91432
+ const searchParams = new URLSearchParams(queryParams);
91433
+ url += `?${searchParams.toString()}`;
91434
+ }
91498
91435
  const controller = new AbortController();
91499
91436
  const timeout = setTimeout(() => controller.abort(), REQUEST_TIMEOUT_MS11);
91500
91437
  try {
91501
- const token = await getAccessToken(serviceAccount, email);
91502
- const response = await fetch(`${BASE_URL6}/users/me/calendarList`, {
91503
- method: "GET",
91504
- headers: { Authorization: `Bearer ${token}` },
91438
+ const hasBody = body != null && ["POST", "PUT", "PATCH"].includes(method);
91439
+ const response = await fetch(url, {
91440
+ method,
91441
+ headers: {
91442
+ Authorization: `Bearer ${token}`,
91443
+ "Content-Type": "application/json"
91444
+ },
91445
+ body: hasBody ? JSON.stringify(body) : void 0,
91505
91446
  signal: controller.signal
91506
91447
  });
91507
- const data = await response.json();
91448
+ const data = await response.json().catch(() => ({}));
91508
91449
  if (!response.ok) {
91509
91450
  const errorObj = data?.error;
91510
- errors2.push({
91511
- impersonateEmail: email,
91512
- error: errorObj?.message ?? `HTTP ${response.status} ${response.statusText}`
91513
- });
91514
- continue;
91515
- }
91516
- const items = data.items ?? [];
91517
- for (const c6 of items) {
91518
- aggregated.push({
91519
- impersonateEmail: email,
91520
- id: c6.id,
91521
- summary: c6.summary,
91522
- primary: c6.primary,
91523
- accessRole: c6.accessRole
91524
- });
91451
+ const errorMessage = errorObj?.message ?? (typeof data?.message === "string" ? data.message : `HTTP ${response.status} ${response.statusText}`);
91452
+ return {
91453
+ success: false,
91454
+ error: errorMessage,
91455
+ serviceAccountEmail
91456
+ };
91525
91457
  }
91526
- } catch (err) {
91527
- const msg = err instanceof Error ? err.message : String(err);
91528
- errors2.push({ impersonateEmail: email, error: msg });
91458
+ return { success: true, status: response.status, data };
91529
91459
  } finally {
91530
91460
  clearTimeout(timeout);
91531
91461
  }
91462
+ } catch (err) {
91463
+ const msg = err instanceof Error ? err.message : String(err);
91464
+ return {
91465
+ success: false,
91466
+ error: msg,
91467
+ serviceAccountEmail
91468
+ };
91532
91469
  }
91533
- return {
91534
- success: true,
91535
- calendars: aggregated,
91536
- errors: errors2
91537
- };
91538
- }
91539
- });
91540
-
91541
- // ../connectors/src/connectors/google-calendar/setup.ts
91542
- var listCalendarsToolName = `google-calendar-service-account_${listCalendarsTool.name}`;
91543
- var googleCalendarOnboarding = new ConnectorOnboarding({
91544
- connectionSetupInstructions: {
91545
- ja: `\u4EE5\u4E0B\u306E\u624B\u9806\u3067Google Calendar\u30B3\u30CD\u30AF\u30B7\u30E7\u30F3\u306E\u30BB\u30C3\u30C8\u30A2\u30C3\u30D7\u3092\u884C\u3063\u3066\u304F\u3060\u3055\u3044\u3002\u63A5\u7D9A\u4F5C\u6210\u6642\u306B\u306F\u30B5\u30FC\u30D3\u30B9\u30A2\u30AB\u30A6\u30F3\u30C8JSON\u306E\u307F\u304C\u8A2D\u5B9A\u6E08\u307F\u3067\u3001\u5BFE\u8C61\u30E6\u30FC\u30B6\u30FC\u306E\u30E1\u30FC\u30EB\u30A2\u30C9\u30EC\u30B9\u3084\u30AB\u30EC\u30F3\u30C0\u30FCID\u306F\u3053\u306E\u30BB\u30C3\u30C8\u30A2\u30C3\u30D7\u4E2D\u306B\u53D6\u5F97\u3057\u307E\u3059\u3002
91546
-
91547
- 1. \`askUserQuestion\` \u3067\u30E6\u30FC\u30B6\u30FC\u306B\u3001\u30B5\u30FC\u30D3\u30B9\u30A2\u30AB\u30A6\u30F3\u30C8\u304CDomain-wide Delegation\u3067\u4EE3\u7406\u30A2\u30AF\u30BB\u30B9\u3059\u308BGoogle Workspace\u30E6\u30FC\u30B6\u30FC\u306E\u30E1\u30FC\u30EB\u30A2\u30C9\u30EC\u30B9\u3092\u30D2\u30A2\u30EA\u30F3\u30B0\u3059\u308B:
91548
- - \`type\`: \`"freeText"\`
91549
- - \`question\`: \u300C\u30A2\u30AF\u30BB\u30B9\u3057\u305F\u3044\u30AB\u30EC\u30F3\u30C0\u30FC\u3092\u6301\u3064\u30E6\u30FC\u30B6\u30FC\u306E\u30E1\u30FC\u30EB\u30A2\u30C9\u30EC\u30B9\u3092\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044\uFF08\u8907\u6570\u3042\u308B\u5834\u5408\u306F\u30AB\u30F3\u30DE\u533A\u5207\u308A\u3067\u5165\u529B\u53EF\uFF09\u300D
91550
- - \`placeholder\`: \`"user@example.com, admin@example.com"\`
91551
- 2. \u30E6\u30FC\u30B6\u30FC\u304B\u3089\u53D7\u3051\u53D6\u3063\u305F\u30E1\u30FC\u30EB\u30A2\u30C9\u30EC\u30B9\uFF08\u30AB\u30F3\u30DE\u533A\u5207\u308A\u5BFE\u5FDC\uFF09\u3092 \`updateConnectionParameters\` \u3067\u4FDD\u5B58\u3059\u308B:
91552
- - \`parameterSlug\`: \`"impersonate-email"\`
91553
- - \`options\`: \`[{ value: <\u5165\u529B\u3055\u308C\u305F\u30E1\u30FC\u30EB\u30A2\u30C9\u30EC\u30B9\u6587\u5B57\u5217>, label: <\u540C\u3058\u5024> }]\`\uFF081\u4EF6\u306E\u307F\u306E\u30AA\u30D7\u30B7\u30E7\u30F3\u306F\u81EA\u52D5\u9078\u629E\u3055\u308C\u308B\uFF09
91554
- 3. \`${listCalendarsToolName}\` \u3092\u547C\u3073\u51FA\u3057\u3001\u4FDD\u5B58\u3057\u305F\u30E1\u30FC\u30EB\u30A2\u30C9\u30EC\u30B9\u3067\u30A2\u30AF\u30BB\u30B9\u53EF\u80FD\u306A\u30AB\u30EC\u30F3\u30C0\u30FC\u4E00\u89A7\u3092\u53D6\u5F97\u3059\u308B\u3002
91555
- - \`errors\` \u306B\u30A8\u30E9\u30FC\u304C\u3042\u308A \`calendars\` \u304C\u7A7A\u306E\u5834\u5408\uFF08\u3059\u3079\u3066\u306E\u30E1\u30FC\u30EB\u30A2\u30C9\u30EC\u30B9\u3067\u5931\u6557\uFF09\u3001\u5165\u529B\u3055\u308C\u305F\u30E1\u30FC\u30EB\u30A2\u30C9\u30EC\u30B9\u304C\u5B58\u5728\u3057\u306A\u3044\u53EF\u80FD\u6027\u304C\u3042\u308B\u3002\`askUserQuestion\` \u3067\u300C{\u5165\u529B\u3057\u305F\u30E1\u30FC\u30EB\u30A2\u30C9\u30EC\u30B9} \u306E\u30AB\u30EC\u30F3\u30C0\u30FC\u306B\u30A2\u30AF\u30BB\u30B9\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\u3002\u30A2\u30C9\u30EC\u30B9\u306B\u8AA4\u308A\u304C\u3042\u308B\u53EF\u80FD\u6027\u304C\u3042\u308A\u307E\u3059\u3002\u4F3C\u305F\u30A2\u30C9\u30EC\u30B9\u3067\u306F\u3042\u308A\u307E\u305B\u3093\u304B\uFF1F\u300D\u3068\u805E\u304D\u8FD4\u3057\u3001\u30B9\u30C6\u30C3\u30D72\u304B\u3089\u518D\u5EA6\u5B9F\u884C\u3059\u308B
91556
- 4. \u8FD4\u5374\u3055\u308C\u305F \`calendars\` \u914D\u5217\uFF08\u5404\u8981\u7D20: \`{ impersonateEmail, id, summary, primary, accessRole }\`\uFF09\u3092\u5143\u306B\u300C\u4F7F\u7528\u3059\u308B\u30AB\u30EC\u30F3\u30C0\u30FC\u3092\u9078\u629E\u3057\u3066\u304F\u3060\u3055\u3044\u3002\u300D\u3068\u77ED\u304F\u4F1D\u3048\u305F\u4E0A\u3067\u3001\`updateConnectionParameters\` \u3092\u547C\u3073\u51FA\u3059:
91557
- - \`parameterSlug\`: \`"calendar-id"\`
91558
- - \`options\`: \u5404 option \u306E \`label\` \u306F \`\u30AB\u30EC\u30F3\u30C0\u30FC\u540D (owner: impersonateEmail)\` \u306E\u5F62\u5F0F\u3001\`value\` \u306F\u30AB\u30EC\u30F3\u30C0\u30FCID
91559
- - \`errors\` \u306B\u5931\u6557\u3057\u305F\u30E1\u30FC\u30EB\u30A2\u30C9\u30EC\u30B9\u304C\u3042\u308B\u5834\u5408\u306F\u3001\u305D\u306E\u65E8\u3092\u77ED\u304F\u4F1D\u3048\u308B
91560
- 5. \u30E6\u30FC\u30B6\u30FC\u304C\u9078\u629E\u3057\u305F\u30AB\u30EC\u30F3\u30C0\u30FC\u306E \`label\` \u304B\u3089 owner \u306E\u30E1\u30FC\u30EB\u30A2\u30C9\u30EC\u30B9\u3092\u62BD\u51FA\u3057\u3001\`updateConnectionParameters\` \u3092\u547C\u3073\u51FA\u3057\u3066 \`impersonate-email\` \u3092\u6700\u7D42\u5024\u3067\u4E0A\u66F8\u304D\u3059\u308B:
91561
- - \`parameterSlug\`: \`"impersonate-email"\`
91562
- - \`options\`: \`[{ value: <ownerEmail>, label: <ownerEmail> }]\`
91563
-
91564
- #### \u5236\u7D04
91565
- - **\u30B5\u30FC\u30D3\u30B9\u30A2\u30AB\u30A6\u30F3\u30C8\u306E\u30C9\u30E1\u30A4\u30F3\u5168\u4F53\u306E\u59D4\u4EFB\u8A2D\u5B9A\u304C\u5FC5\u8981\u3067\u3059**\u3002\`${listCalendarsToolName}\` \u306E \`errors\` \u306B\u6A29\u9650\u30A8\u30E9\u30FC\u304C\u51FA\u308B\u5834\u5408\u3001Google Workspace\u7BA1\u7406\u8005\u306BDomain-wide Delegation\u306E\u8A2D\u5B9A\u78BA\u8A8D\u3092\u4FC3\u3057\u3066\u304F\u3060\u3055\u3044
91566
- - \u30C4\u30FC\u30EB\u9593\u306F1\u6587\u3060\u3051\u66F8\u3044\u3066\u5373\u6B21\u306E\u30C4\u30FC\u30EB\u547C\u3073\u51FA\u3057\u3002\u4E0D\u8981\u306A\u8AAC\u660E\u306F\u7701\u7565\u3057\u3001\u52B9\u7387\u7684\u306B\u9032\u3081\u308B`,
91567
- en: `Follow these steps to set up the Google Calendar connection. Only the service account JSON is provided at connection creation time \u2014 the target user email and calendar ID are collected during this setup flow.
91568
-
91569
- 1. Call \`askUserQuestion\` to ask the user for the Google Workspace user email the service account will impersonate via Domain-wide Delegation:
91570
- - \`type\`: \`"freeText"\`
91571
- - \`question\`: "Please enter the email address of the user whose calendar you want to access (comma-separated list allowed for multiple users)"
91572
- - \`placeholder\`: \`"user@example.com, admin@example.com"\`
91573
- 2. Save the email(s) the user provided (comma-separated supported) via \`updateConnectionParameters\`:
91574
- - \`parameterSlug\`: \`"impersonate-email"\`
91575
- - \`options\`: \`[{ value: <the email string entered>, label: <same value> }]\` (a single option is auto-selected)
91576
- 3. Call \`${listCalendarsToolName}\` to list calendars accessible via the saved email(s).
91577
- - If \`errors\` is non-empty and \`calendars\` is empty (all emails failed), the entered address may not exist. Use \`askUserQuestion\` to ask: "Could not access the calendar for {entered email}. The address may be incorrect \u2014 did you mean a similar address?" Then re-run from step 2 with the new input
91578
- 4. Using the returned \`calendars\` array (each item: \`{ impersonateEmail, id, summary, primary, accessRole }\`), briefly say "Please select a calendar." then call \`updateConnectionParameters\`:
91579
- - \`parameterSlug\`: \`"calendar-id"\`
91580
- - \`options\`: Each option's \`label\` should be \`Calendar Name (owner: impersonateEmail)\`, \`value\` should be the calendar ID
91581
- - If \`errors\` contains failing email addresses, briefly mention them
91582
- 5. Extract the owner email from the \`label\` of the user's selected calendar, then call \`updateConnectionParameters\` to overwrite \`impersonate-email\` with the final value:
91583
- - \`parameterSlug\`: \`"impersonate-email"\`
91584
- - \`options\`: \`[{ value: <ownerEmail>, label: <ownerEmail> }]\`
91585
-
91586
- #### Constraints
91587
- - **Domain-wide Delegation must be configured on the service account**. If \`${listCalendarsToolName}\` returns permission errors in the \`errors\` field, ask the user to verify the Domain-wide Delegation setup with their Google Workspace administrator
91588
- - Write only 1 sentence between tool calls, then immediately call the next tool. Skip unnecessary explanations and proceed efficiently`
91589
- },
91590
- dataOverviewInstructions: {
91591
- en: `1. Call google-calendar-service-account_request with GET /calendars/{calendarId} to get the default calendar's metadata
91592
- 2. Call google-calendar-service-account_request with GET /users/me/calendarList to list all accessible calendars
91593
- 3. Call google-calendar-service-account_request with GET /calendars/{calendarId}/events with query params timeMin (RFC3339) and maxResults=10 to sample upcoming events`,
91594
- ja: `1. google-calendar-service-account_request \u3067 GET /calendars/{calendarId} \u3092\u547C\u3073\u51FA\u3057\u3001\u30C7\u30D5\u30A9\u30EB\u30C8\u30AB\u30EC\u30F3\u30C0\u30FC\u306E\u30E1\u30BF\u30C7\u30FC\u30BF\u3092\u53D6\u5F97
91595
- 2. google-calendar-service-account_request \u3067 GET /users/me/calendarList \u3092\u547C\u3073\u51FA\u3057\u3001\u30A2\u30AF\u30BB\u30B9\u53EF\u80FD\u306A\u5168\u30AB\u30EC\u30F3\u30C0\u30FC\u306E\u4E00\u89A7\u3092\u53D6\u5F97
91596
- 3. google-calendar-service-account_request \u3067 GET /calendars/{calendarId}/events \u3092\u30AF\u30A8\u30EA\u30D1\u30E9\u30E1\u30FC\u30BF timeMin\uFF08RFC3339\u5F62\u5F0F\uFF09\u3068 maxResults=10 \u3067\u547C\u3073\u51FA\u3057\u3001\u76F4\u8FD1\u306E\u30A4\u30D9\u30F3\u30C8\u3092\u30B5\u30F3\u30D7\u30EA\u30F3\u30B0`
91597
91470
  }
91598
91471
  });
91599
91472
 
91600
- // ../connectors/src/connectors/google-calendar/tools/request.ts
91473
+ // ../connectors/src/connectors/google-calendar/tools/request-with-delegation.ts
91601
91474
  import { z as z22 } from "zod";
91602
91475
  var BASE_URL7 = "https://www.googleapis.com/calendar/v3";
91603
91476
  var REQUEST_TIMEOUT_MS12 = 6e4;
91477
+ function decodeServiceAccount2(keyJsonBase64) {
91478
+ const decoded = Buffer.from(keyJsonBase64, "base64").toString("utf-8");
91479
+ return JSON.parse(decoded);
91480
+ }
91604
91481
  var inputSchema22 = z22.object({
91605
91482
  toolUseIntent: z22.string().optional().describe(
91606
91483
  "Brief description of what you intend to accomplish with this tool call"
@@ -91608,13 +91485,18 @@ var inputSchema22 = z22.object({
91608
91485
  connectionId: z22.string().describe("ID of the Google Calendar connection to use"),
91609
91486
  method: z22.enum(["GET", "POST", "PUT", "PATCH", "DELETE"]).describe("HTTP method"),
91610
91487
  path: z22.string().describe(
91611
- "API path appended to https://www.googleapis.com/calendar/v3 (e.g., '/calendars/{calendarId}/events'). {calendarId} is automatically replaced."
91488
+ "API path appended to https://www.googleapis.com/calendar/v3 (e.g., '/users/me/calendarList', '/calendars/alice@example.com/events'). Write the calendar ID directly into the path \u2014 there is no placeholder substitution."
91612
91489
  ),
91613
- queryParams: z22.record(z22.string(), z22.string()).optional().describe("Query parameters to append to the URL"),
91614
- body: z22.record(z22.string(), z22.unknown()).optional().describe("Request body (JSON) for POST/PUT/PATCH methods"),
91615
- subject: z22.string().optional().describe(
91616
- "Override the email address of the user to impersonate via Domain-wide Delegation. If omitted, the connection's configured user email is used."
91617
- )
91490
+ subject: z22.string().describe(
91491
+ "Email of the Workspace user to impersonate via Domain-wide Delegation. The token will be issued as this user."
91492
+ ),
91493
+ scopes: z22.array(z22.string()).describe(
91494
+ "OAuth scopes the token must include. This connector currently supports read-only operations only \u2014 pass one of ['https://www.googleapis.com/auth/calendar.readonly'] (calendars + events read), ['https://www.googleapis.com/auth/calendar.events.readonly'] (events read only), or ['https://www.googleapis.com/auth/calendar.freebusy'] (busy/free queries only). Per-endpoint scope reference: https://developers.google.com/calendar/api/auth"
91495
+ ),
91496
+ queryParams: z22.record(z22.string(), z22.string()).optional().describe(
91497
+ "Query parameters to append to the URL (e.g., { timeMin: '2025-01-01T00:00:00Z', maxResults: '10' })"
91498
+ ),
91499
+ body: z22.record(z22.string(), z22.unknown()).optional().describe("JSON request body for POST/PUT/PATCH")
91618
91500
  });
91619
91501
  var outputSchema22 = z22.discriminatedUnion("success", [
91620
91502
  z22.object({
@@ -91624,17 +91506,16 @@ var outputSchema22 = z22.discriminatedUnion("success", [
91624
91506
  }),
91625
91507
  z22.object({
91626
91508
  success: z22.literal(false),
91627
- error: z22.string()
91509
+ error: z22.string(),
91510
+ serviceAccountEmail: z22.string().optional()
91628
91511
  })
91629
91512
  ]);
91630
- var requestTool5 = new ConnectorTool({
91631
- name: "request",
91632
- description: `Send authenticated requests to the Google Calendar API v3.
91633
- Authentication is handled automatically using a service account.
91634
- {calendarId} in the path is automatically replaced with the connection's default calendar ID.`,
91513
+ var requestWithDelegationTool = new ConnectorTool({
91514
+ name: "request_with_delegation",
91515
+ 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 DwD to be authorized for the service account in the Workspace admin console.",
91635
91516
  inputSchema: inputSchema22,
91636
91517
  outputSchema: outputSchema22,
91637
- async execute({ connectionId, method, path: path5, queryParams, body, subject }, connections) {
91518
+ async execute({ connectionId, method, path: path5, subject, scopes, queryParams, body }, connections) {
91638
91519
  const connection = connections.find((c6) => c6.id === connectionId);
91639
91520
  if (!connection) {
91640
91521
  return {
@@ -91642,41 +91523,40 @@ Authentication is handled automatically using a service account.
91642
91523
  error: `Connection ${connectionId} not found`
91643
91524
  };
91644
91525
  }
91526
+ const keyJsonBase64 = parameters14.serviceAccountKeyJsonBase64.getValue(connection);
91527
+ let serviceAccount;
91528
+ try {
91529
+ serviceAccount = decodeServiceAccount2(keyJsonBase64);
91530
+ } catch (err) {
91531
+ const msg = err instanceof Error ? err.message : String(err);
91532
+ return {
91533
+ success: false,
91534
+ error: `Failed to decode service account key: ${msg}`
91535
+ };
91536
+ }
91537
+ const serviceAccountEmail = serviceAccount.client_email;
91645
91538
  console.log(
91646
- `[connector-request] google-calendar/${connection.name}: ${method} ${path5}`
91539
+ `[connector-request] google-calendar/${connection.name}: ${method} ${path5} subject=${subject}`
91647
91540
  );
91648
91541
  try {
91649
91542
  const { GoogleAuth } = await import("google-auth-library");
91650
- const keyJsonBase64 = parameters14.serviceAccountKeyJsonBase64.getValue(connection);
91651
- const impersonateEmail = impersonateEmailParameter.tryGetValue(connection);
91652
- const calendarId = calendarIdParameter.tryGetValue(connection) ?? "primary";
91653
- const resolvedSubject = subject ?? impersonateEmail;
91654
- if (!resolvedSubject) {
91655
- return {
91656
- success: false,
91657
- error: `Missing required parameter: ${impersonateEmailParameter.slug}. Configure the user email for this connection.`
91658
- };
91659
- }
91660
- const credentials = JSON.parse(
91661
- Buffer.from(keyJsonBase64, "base64").toString("utf-8")
91662
- );
91663
91543
  const auth = new GoogleAuth({
91664
- credentials,
91665
- scopes: [
91666
- "https://www.googleapis.com/auth/calendar.readonly",
91667
- "https://www.googleapis.com/auth/calendar.events.readonly"
91668
- ],
91669
- clientOptions: { subject: resolvedSubject }
91544
+ credentials: {
91545
+ client_email: serviceAccount.client_email,
91546
+ private_key: serviceAccount.private_key
91547
+ },
91548
+ scopes,
91549
+ clientOptions: { subject }
91670
91550
  });
91671
91551
  const token = await auth.getAccessToken();
91672
91552
  if (!token) {
91673
91553
  return {
91674
91554
  success: false,
91675
- error: "Failed to obtain access token"
91555
+ error: "Failed to obtain access token",
91556
+ serviceAccountEmail
91676
91557
  };
91677
91558
  }
91678
- const resolvedPath = path5.replace(/\{calendarId\}/g, calendarId);
91679
- let url = `${BASE_URL7}${resolvedPath.startsWith("/") ? "" : "/"}${resolvedPath}`;
91559
+ let url = `${BASE_URL7}${path5.startsWith("/") ? "" : "/"}${path5}`;
91680
91560
  if (queryParams) {
91681
91561
  const searchParams = new URLSearchParams(queryParams);
91682
91562
  url += `?${searchParams.toString()}`;
@@ -91684,28 +91564,24 @@ Authentication is handled automatically using a service account.
91684
91564
  const controller = new AbortController();
91685
91565
  const timeout = setTimeout(() => controller.abort(), REQUEST_TIMEOUT_MS12);
91686
91566
  try {
91567
+ const hasBody = body != null && ["POST", "PUT", "PATCH"].includes(method);
91687
91568
  const response = await fetch(url, {
91688
91569
  method,
91689
91570
  headers: {
91690
91571
  Authorization: `Bearer ${token}`,
91691
91572
  "Content-Type": "application/json"
91692
91573
  },
91693
- body: body && ["POST", "PUT", "PATCH"].includes(method) ? JSON.stringify(body) : void 0,
91574
+ body: hasBody ? JSON.stringify(body) : void 0,
91694
91575
  signal: controller.signal
91695
91576
  });
91696
- if (method === "DELETE" && response.status === 204) {
91697
- return {
91698
- success: true,
91699
- status: 204,
91700
- data: { message: "Deleted successfully" }
91701
- };
91702
- }
91703
- const data = await response.json();
91577
+ const data = await response.json().catch(() => ({}));
91704
91578
  if (!response.ok) {
91705
91579
  const errorObj = data?.error;
91580
+ const errorMessage = errorObj?.message ?? (typeof data?.message === "string" ? data.message : `HTTP ${response.status} ${response.statusText}`);
91706
91581
  return {
91707
91582
  success: false,
91708
- error: errorObj?.message ?? `HTTP ${response.status} ${response.statusText}`
91583
+ error: errorMessage,
91584
+ serviceAccountEmail
91709
91585
  };
91710
91586
  }
91711
91587
  return { success: true, status: response.status, data };
@@ -91714,13 +91590,121 @@ Authentication is handled automatically using a service account.
91714
91590
  }
91715
91591
  } catch (err) {
91716
91592
  const msg = err instanceof Error ? err.message : String(err);
91717
- return { success: false, error: msg };
91593
+ return {
91594
+ success: false,
91595
+ error: msg,
91596
+ serviceAccountEmail
91597
+ };
91718
91598
  }
91719
91599
  }
91720
91600
  });
91721
91601
 
91602
+ // ../connectors/src/connectors/google-calendar/setup.ts
91603
+ var requestToolName = `google-calendar-service-account_${requestTool5.name}`;
91604
+ var requestWithDelegationToolName = `google-calendar-service-account_${requestWithDelegationTool.name}`;
91605
+ var READONLY_SCOPES = '["https://www.googleapis.com/auth/calendar.readonly"]';
91606
+ var googleCalendarOnboarding = new ConnectorOnboarding({
91607
+ connectionSetupInstructions: {
91608
+ ja: `Google Calendar \u30B3\u30CD\u30AF\u30B7\u30E7\u30F3\u306E\u30BB\u30C3\u30C8\u30A2\u30C3\u30D7\u3092\u884C\u3044\u307E\u3059\u3002\u30A2\u30AF\u30BB\u30B9\u3057\u305F\u3044\u30AB\u30EC\u30F3\u30C0\u30FC\u3092\u30E6\u30FC\u30B6\u30FC\u304B\u3089\u805E\u304D\u3001\u5229\u7528\u53EF\u80FD\u306A\u3082\u306E\u3092\u767A\u898B\u3057\u3066 Project Knowledge \u306B\u8A18\u9332\u3057\u307E\u3059\u3002
91609
+
91610
+ 1. \`askUserQuestion\` \u3067\u5BFE\u8C61\u30E6\u30FC\u30B6\u30FC\u306E\u30E1\u30FC\u30EB\u30A2\u30C9\u30EC\u30B9\u3092\u805E\u304F:
91611
+ - \`type\`: \`"freeText"\`
91612
+ - \`question\`: \u300C\u30A2\u30AF\u30BB\u30B9\u3057\u305F\u3044\u30AB\u30EC\u30F3\u30C0\u30FC\u306E\u6240\u6709\u8005\u306E\u30E1\u30FC\u30EB\u30A2\u30C9\u30EC\u30B9\u3092\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044\uFF08\u8907\u6570\u53EF\u3001\u30AB\u30F3\u30DE\u533A\u5207\u308A\uFF09\u300D
91613
+ - \`placeholder\`: \`"alice@example.com, bob@example.com"\`
91614
+
91615
+ 2. \u30E6\u30FC\u30B6\u30FC\u304B\u3089\u53D7\u3051\u53D6\u3063\u305F\u6587\u5B57\u5217\u304B\u3089\u30E1\u30FC\u30EB\u30A2\u30C9\u30EC\u30B9\u3092\u62BD\u51FA\u3059\u308B\u3002\u4E26\u884C\u3057\u3066\u4E21\u65B9\u306E\u30C4\u30FC\u30EB\u3067\u30AB\u30EC\u30F3\u30C0\u30FC\u3092\u767A\u898B\u3059\u308B:
91616
+ a. \`${requestToolName}\` \u3092\u4EE5\u4E0B\u306E\u5F15\u6570\u3067\u547C\u3073\u3001Service Account \u81EA\u8EAB\u306B\u5171\u6709\u3055\u308C\u3066\u3044\u308B\u30AB\u30EC\u30F3\u30C0\u30FC\u3092\u53D6\u5F97\u3059\u308B\u3002\`success: false\` \u306A\u3089\u305D\u306E\u65E8\u8A18\u9332\u3057\u3066\u6B21\u3078:
91617
+ - \`method\`: \`"GET"\`
91618
+ - \`path\`: \`"/users/me/calendarList"\`
91619
+ - \`scopes\`: \`${READONLY_SCOPES}\`
91620
+ b. \u5404\u30E1\u30FC\u30EB\u30A2\u30C9\u30EC\u30B9 \`<email>\` \u306B\u3064\u3044\u3066 \`${requestWithDelegationToolName}\` \u3092\u4EE5\u4E0B\u306E\u5F15\u6570\u3067\u547C\u3073\u3001\u305D\u306E\u30E6\u30FC\u30B6\u30FC\u304C\u30A2\u30AF\u30BB\u30B9\u53EF\u80FD\u306A\u30AB\u30EC\u30F3\u30C0\u30FC\u3092\u53D6\u5F97\u3059\u308B:
91621
+ - \`method\`: \`"GET"\`
91622
+ - \`path\`: \`"/users/me/calendarList"\`
91623
+ - \`subject\`: \`<email>\`
91624
+ - \`scopes\`: \`${READONLY_SCOPES}\`
91625
+
91626
+ 3. \u30B9\u30C6\u30C3\u30D7 2 \u306E\u767A\u898B\u7D50\u679C (a \u3068 b \u306E\u5168\u30AB\u30EC\u30F3\u30C0\u30FC) \u3092\u7D71\u5408\u3057\u3001\`askUserQuestion\` \u3067\u30AB\u30EC\u30F3\u30C0\u30FC\u9078\u629E\u3092\u6C42\u3081\u308B:
91627
+ - 1 \u4EF6\u3082\u898B\u3064\u304B\u3089\u306A\u304B\u3063\u305F\u5834\u5408: \u5931\u6557\u3057\u305F\u30C4\u30FC\u30EB\u306E\u30A8\u30E9\u30FC\u30EC\u30B9\u30DD\u30F3\u30B9\u304B\u3089 \`serviceAccountEmail\` \u3092\u53D6\u308A\u51FA\u3057\u3001\`askUserQuestion\` \u3067\u6B21\u306E\u9078\u629E\u80A2\u3092\u63D0\u793A\u3059\u308B\u3002\`question\` \u306B\u306F\u6B21\u306E\u6848\u5185\u6587\u3092\u542B\u3081\u308B: \u300C\u30A2\u30AF\u30BB\u30B9\u53EF\u80FD\u306A\u30AB\u30EC\u30F3\u30C0\u30FC\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093\u3067\u3057\u305F\u3002\u30B5\u30FC\u30D3\u30B9\u30A2\u30AB\u30A6\u30F3\u30C8 \`<serviceAccountEmail>\` \u3067\u6B21\u306E\u3044\u305A\u308C\u304B\u3092\u884C\u3063\u3066\u304B\u3089\u7D9A\u884C\u3057\u3066\u304F\u3060\u3055\u3044: (1) Workspace \u7BA1\u7406\u8005\u306B Domain-wide Delegation \u306E\u8A2D\u5B9A\u3092\u4F9D\u983C\u3059\u308B\uFF08[\u8A2D\u5B9A\u30AC\u30A4\u30C9](https://support.google.com/a/answer/162106)\uFF09\u3001(2) \u5BFE\u8C61\u30AB\u30EC\u30F3\u30C0\u30FC\u3092 \`<serviceAccountEmail>\` \u306B\u5171\u6709\u8A2D\u5B9A\u3067\u62DB\u5F85\u3059\u308B\uFF08[\u5171\u6709\u624B\u9806](https://support.google.com/calendar/answer/37082)\uFF09\u300D\u3002
91628
+ - \`options\`: \`[{ label: "\u6E96\u5099\u3067\u304D\u305F\u306E\u3067\u30EA\u30C8\u30E9\u30A4", value: "retry" }, { label: "\u30E1\u30FC\u30EB\u30A2\u30C9\u30EC\u30B9\u3092\u5165\u529B\u3057\u76F4\u3059", value: "restart" }]\`
91629
+ - \u300C\u30EA\u30C8\u30E9\u30A4\u300D: \u76F4\u524D\u306E\u30E1\u30FC\u30EB\u30A2\u30C9\u30EC\u30B9\u30EA\u30B9\u30C8\u3067\u30B9\u30C6\u30C3\u30D7 2 \u3092\u518D\u5B9F\u884C
91630
+ - \u300C\u5165\u529B\u3057\u76F4\u3059\u300D: \u30B9\u30C6\u30C3\u30D7 1 \u304B\u3089\u518D\u5B9F\u884C
91631
+ - \u5931\u6557\u304C\u3042\u3063\u305F\u5834\u5408: \u305D\u306E\u65E8\u3092 1 \u6587\u3067\u4F1D\u3048\u3066\u304B\u3089\u6B21\u306B\u9032\u3080
91632
+ - \u30AB\u30EC\u30F3\u30C0\u30FC\u9078\u629E:
91633
+ - \`type\`: \`"multiSelect"\`
91634
+ - \`question\`: \u300C\u4F7F\u7528\u3059\u308B\u30AB\u30EC\u30F3\u30C0\u30FC\u3092\u9078\u629E\u3057\u3066\u304F\u3060\u3055\u3044\uFF08\u8907\u6570\u53EF\uFF09\u300D
91635
+ - \`options\`: \u5404\u30AB\u30EC\u30F3\u30C0\u30FC\u306B\u3064\u3044\u3066 \`label\`: \`"<\u30AB\u30EC\u30F3\u30C0\u30FC\u540D> (\u30A2\u30AF\u30BB\u30B9\u7D4C\u8DEF)"\`\u3001\`value\`: \`"<calendarId>"\` \u306E\u5F62\u5F0F\u3067\u69CB\u7BC9\u3002\u30A2\u30AF\u30BB\u30B9\u7D4C\u8DEF\u306F a \u3067\u898B\u3064\u304B\u3063\u305F\u3082\u306E\u306F \`"\u5171\u6709"\`\u3001b \u3067\u898B\u3064\u304B\u3063\u305F\u3082\u306E\u306F \`"DwD: <\u305D\u306E\u3068\u304D\u306E subject>"\` \u306E\u3088\u3046\u306B\u4EBA\u9593\u304C\u5224\u5225\u3067\u304D\u308B\u6587\u5B57\u5217\u306B\u3059\u308B
91636
+
91637
+ 4. \u30E6\u30FC\u30B6\u30FC\u304C\u9078\u629E\u3057\u305F calendarId \u96C6\u5408\u3092\u3001\u30B9\u30C6\u30C3\u30D7 2 \u306E\u30C7\u30A3\u30B9\u30AB\u30D0\u30EA\u7D50\u679C\u3068\u7A81\u304D\u5408\u308F\u305B\u3066\u7D4C\u8DEF\u3068 subject \u3092\u7279\u5B9A\u3059\u308B\u3002\`finalizeSetup\` \u3092\u547C\u3073\u3001\`projectKnowledge\` \u306E \`#### \u30B9\u30B3\u30FC\u30D7\` \u7BC0\u306B\u5404\u30AB\u30EC\u30F3\u30C0\u30FC\u3092 1 \u884C\u305A\u3064\u5217\u6319\u3059\u308B:
91638
+ - DwD \u7D4C\u7531\u3067\u30A2\u30AF\u30BB\u30B9\u3059\u308B\u5834\u5408: \`- calendar: <calendarId> (delegation, subject: <subject>, name: "<\u30AB\u30EC\u30F3\u30C0\u30FC\u540D>")\`
91639
+ - Service Account \u81EA\u8EAB\u306B\u5171\u6709\u3055\u308C\u3066\u3044\u308B\u5834\u5408: \`- calendar: <calendarId> (service-account, name: "<\u30AB\u30EC\u30F3\u30C0\u30FC\u540D>")\`
91640
+
91641
+ #### \u5236\u7D04
91642
+ - \u4E0A\u8A18\u4EE5\u5916\u306E API \u547C\u3073\u51FA\u3057\u3092 setup \u4E2D\u306B\u884C\u308F\u306A\u3044
91643
+ - \u30C4\u30FC\u30EB\u547C\u3073\u51FA\u3057\u306E\u9593\u306F 1 \u6587\u3060\u3051\u66F8\u3044\u3066\u5373\u6B21\u306E\u30C4\u30FC\u30EB\u547C\u3073\u51FA\u3057`,
91644
+ en: `Set up the Google Calendar connection. Ask the user which calendars they want to access, discover the available ones, and record them in Project Knowledge.
91645
+
91646
+ 1. Call \`askUserQuestion\` to collect target user emails:
91647
+ - \`type\`: \`"freeText"\`
91648
+ - \`question\`: "Enter the email addresses of the calendar owners you want to access (comma-separated for multiple)"
91649
+ - \`placeholder\`: \`"alice@example.com, bob@example.com"\`
91650
+
91651
+ 2. Extract individual emails from the response. Discover calendars using both tools in parallel:
91652
+ a. Call \`${requestToolName}\` to list calendars shared directly with the service account. If \`success: false\`, record the failure and continue:
91653
+ - \`method\`: \`"GET"\`
91654
+ - \`path\`: \`"/users/me/calendarList"\`
91655
+ - \`scopes\`: \`${READONLY_SCOPES}\`
91656
+ b. For each email \`<email>\`, call \`${requestWithDelegationToolName}\` to list calendars accessible by that user via Domain-wide Delegation:
91657
+ - \`method\`: \`"GET"\`
91658
+ - \`path\`: \`"/users/me/calendarList"\`
91659
+ - \`subject\`: \`<email>\`
91660
+ - \`scopes\`: \`${READONLY_SCOPES}\`
91661
+
91662
+ 3. Aggregate the discovery results from step 2 and call \`askUserQuestion\` for calendar selection:
91663
+ - If no calendars were found: take \`serviceAccountEmail\` from any failed tool response and call \`askUserQuestion\`. Include this guidance in \`question\`: "No accessible calendars found. With service account \`<serviceAccountEmail>\`, please do one of the following before continuing: (1) Ask your Workspace admin to authorize Domain-wide Delegation ([setup guide](https://support.google.com/a/answer/162106)), or (2) Share the target calendars with \`<serviceAccountEmail>\` ([sharing guide](https://support.google.com/calendar/answer/37082))".
91664
+ - \`options\`: \`[{ label: "Ready \u2014 retry", value: "retry" }, { label: "Re-enter the email addresses", value: "restart" }]\`
91665
+ - On "retry" \u2192 re-run step 2 with the previously entered email list
91666
+ - On "Re-enter" \u2192 re-run step 1
91667
+ - If there were partial failures: briefly mention them and proceed.
91668
+ - Calendar selection:
91669
+ - \`type\`: \`"multiSelect"\`
91670
+ - \`question\`: "Select the calendars to use (multiple allowed)"
91671
+ - \`options\`: For each calendar, \`label\`: \`"<calendar name> (access path)"\`, \`value\`: \`"<calendarId>"\`. Make the access path human-readable: \`"shared"\` for calendars found via 2a, \`"DwD: <the subject used>"\` for calendars found via 2b
91672
+
91673
+ 4. Cross-reference the selected calendarIds with the step 2 discovery results to recover each calendar's access path and subject. Call \`finalizeSetup\`. Under \`#### \u30B9\u30B3\u30FC\u30D7\` in \`projectKnowledge\`, list each calendar on its own line:
91674
+ - Accessed via Domain-wide Delegation: \`- calendar: <calendarId> (delegation, subject: <subject>, name: "<calendar name>")\`
91675
+ - Shared directly with the service account: \`- calendar: <calendarId> (service-account, name: "<calendar name>")\`
91676
+
91677
+ #### Constraints
91678
+ - Do not call any other API endpoints during setup
91679
+ - Write at most 1 sentence between tool calls`
91680
+ },
91681
+ dataOverviewInstructions: {
91682
+ en: `For each calendar recorded under \`#### \u30B9\u30B3\u30FC\u30D7\`, fetch metadata and a small sample of upcoming events. The annotation on each line tells you which tool to use:
91683
+ - \`(delegation, subject: <email>, ...)\` \u2192 \`${requestWithDelegationToolName}\` with \`subject: <email>\`
91684
+ - \`(service-account, ...)\` \u2192 \`${requestToolName}\`
91685
+
91686
+ Pass \`scopes: ${READONLY_SCOPES}\` for every call.
91687
+
91688
+ For each calendar:
91689
+ 1. \`method=GET\`, \`path=/calendars/<id>\` to fetch metadata.
91690
+ 2. \`method=GET\`, \`path=/calendars/<id>/events\`, \`queryParams={ timeMin: <RFC3339 now>, maxResults: "10", singleEvents: "true", orderBy: "startTime" }\`.`,
91691
+ ja: `\`#### \u30B9\u30B3\u30FC\u30D7\` \u306E\u5404\u30AB\u30EC\u30F3\u30C0\u30FC\u306B\u3064\u3044\u3066\u3001\u30E1\u30BF\u30C7\u30FC\u30BF\u3068\u76F4\u8FD1\u306E\u30A4\u30D9\u30F3\u30C8\u3092\u5C11\u91CF\u53D6\u5F97\u3057\u3066\u304F\u3060\u3055\u3044\u3002\u5404\u884C\u306E\u6CE8\u91C8\u3067\u4F7F\u7528\u3059\u308B\u30C4\u30FC\u30EB\u3092\u9078\u3073\u307E\u3059:
91692
+ - \`(delegation, subject: <email>, ...)\` \u2192 \`${requestWithDelegationToolName}\` \u3092 \`subject: <email>\` \u4ED8\u304D\u3067\u547C\u3076
91693
+ - \`(service-account, ...)\` \u2192 \`${requestToolName}\` \u3092\u547C\u3076
91694
+
91695
+ \`scopes\` \u306F\u6BCE\u56DE \`${READONLY_SCOPES}\` \u3092\u6E21\u3057\u3066\u304F\u3060\u3055\u3044\u3002
91696
+
91697
+ \u5404\u30AB\u30EC\u30F3\u30C0\u30FC\u306B\u3064\u3044\u3066:
91698
+ 1. \`method=GET\`\u3001\`path=/calendars/<id>\` \u3067\u30E1\u30BF\u30C7\u30FC\u30BF\u3092\u53D6\u5F97
91699
+ 2. \`method=GET\`\u3001\`path=/calendars/<id>/events\`\u3001\`queryParams={ timeMin: <RFC3339 \u306E\u73FE\u5728\u6642\u523B>, maxResults: "10", singleEvents: "true", orderBy: "startTime" }\``
91700
+ }
91701
+ });
91702
+
91722
91703
  // ../connectors/src/connectors/google-calendar/index.ts
91723
- var tools14 = { request: requestTool5, listCalendars: listCalendarsTool };
91704
+ var tools14 = {
91705
+ request: requestTool5,
91706
+ request_with_delegation: requestWithDelegationTool
91707
+ };
91724
91708
  var googleCalendarConnector = new ConnectorPlugin({
91725
91709
  slug: "google-calendar",
91726
91710
  authType: AUTH_TYPES.SERVICE_ACCOUNT,
@@ -91733,58 +91717,45 @@ var googleCalendarConnector = new ConnectorPlugin({
91733
91717
  systemPrompt: {
91734
91718
  en: `### Tools
91735
91719
 
91736
- - \`google-calendar-service-account_request\`: The only way to call the Google Calendar API. Use it to list calendars, get events, and manage calendar data. Authentication is handled automatically using a service account with Domain-wide Delegation \u2014 the service account impersonates the user configured on the connection (\`impersonate-email\` parameter). The {calendarId} placeholder in paths is automatically replaced with the configured default calendar ID. Pass an optional \`subject\` only if you need to override the configured user for a specific request.
91720
+ This connector exposes two request tools that correspond to the two ways a Service Account can authenticate against the Google Calendar API:
91737
91721
 
91738
- ### Business Logic
91722
+ - \`google-calendar-service-account_request_with_delegation\`: Call the Calendar API on behalf of the specified Workspace user via Domain-wide Delegation. Pass \`subject\` as the target user email. Requires DwD to be authorized for the service account in the Workspace admin console.
91723
+ - \`google-calendar-service-account_request\`: Call the Calendar API as the service account itself (no delegation). Only calendars explicitly shared with the service account email are accessible.
91739
91724
 
91740
- The business logic type for this connector is "typescript". Use the connector SDK in your handler. Do NOT read credentials from environment variables.
91725
+ Both tools require a \`scopes\` argument.
91741
91726
 
91742
- SDK methods (client created via \`connection(connectionId)\` \u2014 the connection's \`impersonate-email\` parameter is used automatically for Domain-wide Delegation):
91743
- - \`client.listCalendars()\` \u2014 list all accessible calendars
91744
- - \`client.listEvents(options?, calendarId?)\` \u2014 list events with optional filters
91745
- - \`client.getEvent(eventId, calendarId?)\` \u2014 get a single event by ID
91746
- - \`client.request(path, init?)\` \u2014 low-level authenticated fetch
91727
+ ### OAuth Scopes (pass as \`scopes\` argument)
91747
91728
 
91748
- #### Domain-wide Delegation
91729
+ This connector is currently read-only. Pass one of:
91749
91730
 
91750
- The target user email is configured on the connection (\`impersonate-email\` parameter), so \`connection()\` automatically uses it. Pass \`subject\` only to override it:
91731
+ - \`https://www.googleapis.com/auth/calendar.readonly\` \u2014 read-only on calendars and events
91732
+ - \`https://www.googleapis.com/auth/calendar.events.readonly\` \u2014 read-only on events (no calendar metadata)
91733
+ - \`https://www.googleapis.com/auth/calendar.freebusy\` \u2014 busy/free time queries only
91751
91734
 
91752
- \`\`\`ts
91753
- const calendar = connection("<connectionId>", { subject: "other-user@example.com" });
91754
- \`\`\`
91735
+ For \`request_with_delegation\`, the Workspace admin must have authorized the requested scope for the service account in the Domain-wide Delegation settings, otherwise token issuance will fail with \`unauthorized_client\`.
91755
91736
 
91756
- \`\`\`ts
91757
- import type { Context } from "hono";
91758
- import { connection } from "@squadbase/vite-server/connectors/google-calendar";
91737
+ Per-endpoint scope reference: https://developers.google.com/calendar/api/auth
91759
91738
 
91760
- const calendar = connection("<connectionId>");
91739
+ ### Choosing the right tool
91761
91740
 
91762
- export default async function handler(c: Context) {
91763
- const now = new Date().toISOString();
91764
- const { items } = await calendar.listEvents({
91765
- timeMin: now,
91766
- maxResults: 10,
91767
- singleEvents: true,
91768
- orderBy: "startTime",
91769
- });
91741
+ Read \`#### \u30B9\u30B3\u30FC\u30D7\` in the project knowledge for this connection. Each calendar appears as a \`- calendar: <id> (...)\` line whose annotation tells you which tool to use:
91770
91742
 
91771
- return c.json(
91772
- items.map((event) => ({
91773
- id: event.id,
91774
- summary: event.summary,
91775
- start: event.start.dateTime ?? event.start.date,
91776
- end: event.end.dateTime ?? event.end.date,
91777
- location: event.location,
91778
- })),
91779
- );
91780
- }
91781
- \`\`\`
91743
+ - \`(delegation, subject: <email>, name: "...")\` \u2192 use \`request_with_delegation\` and pass \`subject: <email>\`
91744
+ - \`(service-account, name: "...")\` \u2192 use \`request\` (no \`subject\`)
91745
+
91746
+ ### Path conventions
91747
+
91748
+ Write the calendar ID directly into the path \u2014 there is no placeholder substitution. Examples:
91749
+
91750
+ - \`/users/me/calendarList\` \u2014 list calendars accessible to the authenticated identity
91751
+ - \`/calendars/alice@example.com/events\` \u2014 events on alice's primary calendar
91752
+ - \`/calendars/c_abc123@group.calendar.google.com/events\` \u2014 events on a secondary calendar
91782
91753
 
91783
91754
  ### Google Calendar API v3 Reference
91784
91755
 
91785
91756
  #### Available Endpoints
91786
91757
  - GET \`/calendars/{calendarId}\` \u2014 Get calendar metadata
91787
- - GET \`/users/me/calendarList\` \u2014 List all calendars accessible by the authenticated user
91758
+ - GET \`/users/me/calendarList\` \u2014 List all calendars accessible by the authenticated identity
91788
91759
  - GET \`/calendars/{calendarId}/events\` \u2014 List events on a calendar
91789
91760
  - GET \`/calendars/{calendarId}/events/{eventId}\` \u2014 Get a single event
91790
91761
 
@@ -91796,66 +91767,93 @@ export default async function handler(c: Context) {
91796
91767
  - \`orderBy=startTime\` \u2014 Order by start time (requires singleEvents=true)
91797
91768
  - \`q\` \u2014 Free text search terms
91798
91769
 
91799
- #### Tips
91800
- - Use \`{calendarId}\` placeholder in paths \u2014 it is automatically replaced with the configured default calendar ID
91801
- - Set \`singleEvents=true\` to expand recurring events into individual instances
91802
- - When using \`orderBy=startTime\`, you must also set \`singleEvents=true\`
91803
- - Use RFC3339 format for time parameters (e.g., "2024-01-15T09:00:00Z" or "2024-01-15T09:00:00+09:00")
91804
- - The default calendar ID is "primary" if not configured`,
91805
- ja: `### \u30C4\u30FC\u30EB
91806
-
91807
- - \`google-calendar-service-account_request\`: Google Calendar API\u3092\u547C\u3073\u51FA\u3059\u552F\u4E00\u306E\u624B\u6BB5\u3067\u3059\u3002\u30AB\u30EC\u30F3\u30C0\u30FC\u306E\u4E00\u89A7\u53D6\u5F97\u3001\u30A4\u30D9\u30F3\u30C8\u306E\u53D6\u5F97\u3001\u30AB\u30EC\u30F3\u30C0\u30FC\u30C7\u30FC\u30BF\u306E\u7BA1\u7406\u306B\u4F7F\u7528\u3057\u307E\u3059\u3002\u30B5\u30FC\u30D3\u30B9\u30A2\u30AB\u30A6\u30F3\u30C8\uFF0BDomain-wide Delegation\u3067\u8A8D\u8A3C\u304C\u81EA\u52D5\u7684\u306B\u51E6\u7406\u3055\u308C\u3001\u30B3\u30CD\u30AF\u30B7\u30E7\u30F3\u306B\u8A2D\u5B9A\u3055\u308C\u305F\u30E6\u30FC\u30B6\u30FC\uFF08\`impersonate-email\`\u30D1\u30E9\u30E1\u30FC\u30BF\uFF09\u3068\u3057\u3066\u52D5\u4F5C\u3057\u307E\u3059\u3002\u30D1\u30B9\u5185\u306E{calendarId}\u30D7\u30EC\u30FC\u30B9\u30DB\u30EB\u30C0\u30FC\u306F\u8A2D\u5B9A\u6E08\u307F\u306E\u30C7\u30D5\u30A9\u30EB\u30C8\u30AB\u30EC\u30F3\u30C0\u30FCID\u3067\u81EA\u52D5\u7684\u306B\u7F6E\u63DB\u3055\u308C\u307E\u3059\u3002\u7279\u5B9A\u30EA\u30AF\u30A8\u30B9\u30C8\u3067\u8A2D\u5B9A\u30E6\u30FC\u30B6\u30FC\u3092\u4E0A\u66F8\u304D\u3057\u305F\u3044\u5834\u5408\u306E\u307F\u3001\u30AA\u30D7\u30B7\u30E7\u30F3\u306E\`subject\`\u30D1\u30E9\u30E1\u30FC\u30BF\u3092\u6E21\u3057\u3066\u304F\u3060\u3055\u3044\u3002
91808
-
91809
91770
  ### Business Logic
91810
91771
 
91811
- \u3053\u306E\u30B3\u30CD\u30AF\u30BF\u306E\u30D3\u30B8\u30CD\u30B9\u30ED\u30B8\u30C3\u30AF\u30BF\u30A4\u30D7\u306F "typescript" \u3067\u3059\u3002\u30CF\u30F3\u30C9\u30E9\u5185\u3067\u306F\u30B3\u30CD\u30AF\u30BFSDK\u3092\u4F7F\u7528\u3057\u3066\u304F\u3060\u3055\u3044\u3002\u74B0\u5883\u5909\u6570\u304B\u3089\u8A8D\u8A3C\u60C5\u5831\u3092\u8AAD\u307F\u53D6\u3089\u306A\u3044\u3067\u304F\u3060\u3055\u3044\u3002
91772
+ The business logic type for this connector is "typescript". Use the connector SDK in your handler. Do NOT read credentials from environment variables.
91812
91773
 
91813
- SDK\u30E1\u30BD\u30C3\u30C9 (\`connection(connectionId)\` \u3067\u4F5C\u6210\u3057\u305F\u30AF\u30E9\u30A4\u30A2\u30F3\u30C8 \u2014 \u30B3\u30CD\u30AF\u30B7\u30E7\u30F3\u306E\`impersonate-email\`\u30D1\u30E9\u30E1\u30FC\u30BF\u304C\u81EA\u52D5\u7684\u306BDomain-wide Delegation\u306Esubject\u3068\u3057\u3066\u4F7F\u308F\u308C\u307E\u3059):
91814
- - \`client.listCalendars()\` \u2014 \u30A2\u30AF\u30BB\u30B9\u53EF\u80FD\u306A\u5168\u30AB\u30EC\u30F3\u30C0\u30FC\u306E\u4E00\u89A7\u53D6\u5F97
91815
- - \`client.listEvents(options?, calendarId?)\` \u2014 \u30D5\u30A3\u30EB\u30BF\u30FC\u4ED8\u304D\u30A4\u30D9\u30F3\u30C8\u4E00\u89A7\u53D6\u5F97
91816
- - \`client.getEvent(eventId, calendarId?)\` \u2014 ID\u306B\u3088\u308B\u5358\u4E00\u30A4\u30D9\u30F3\u30C8\u53D6\u5F97
91817
- - \`client.request(path, init?)\` \u2014 \u4F4E\u30EC\u30D9\u30EB\u306E\u8A8D\u8A3C\u4ED8\u304Dfetch
91774
+ SDK methods (client created via \`connection(connectionId)\`):
91818
91775
 
91819
- #### Domain-wide Delegation
91776
+ - \`client.requestWithDelegation(path, { subject, scopes, init? })\` \u2014 call the API as the impersonated Workspace user via Domain-wide Delegation
91777
+ - \`client.request(path, { scopes, init? })\` \u2014 call the API as the service account itself (only calendars shared with the SA email are accessible)
91820
91778
 
91821
- \u5BFE\u8C61\u30E6\u30FC\u30B6\u30FC\u306E\u30E1\u30FC\u30EB\u30A2\u30C9\u30EC\u30B9\u306F\u30B3\u30CD\u30AF\u30B7\u30E7\u30F3\uFF08\`impersonate-email\`\u30D1\u30E9\u30E1\u30FC\u30BF\uFF09\u306B\u8A2D\u5B9A\u3055\u308C\u3066\u3044\u308B\u305F\u3081\u3001\`connection()\`\u306F\u81EA\u52D5\u7684\u306B\u305D\u308C\u3092\u4F7F\u3044\u307E\u3059\u3002\u4E0A\u66F8\u304D\u3057\u305F\u3044\u5834\u5408\u306E\u307F\`subject\`\u3092\u6E21\u3057\u307E\u3059\uFF1A
91779
+ Both methods take \`scopes\` \u2014 pass the minimum scope(s) for the endpoint. Both return a standard \`Response\`. Read the body with \`.json()\`. Same path conventions as the tools.
91822
91780
 
91823
- \`\`\`ts
91824
- const calendar = connection("<connectionId>", { subject: "other-user@example.com" });
91825
- \`\`\`
91781
+ #### Example
91826
91782
 
91827
91783
  \`\`\`ts
91828
91784
  import type { Context } from "hono";
91829
91785
  import { connection } from "@squadbase/vite-server/connectors/google-calendar";
91830
91786
 
91831
91787
  const calendar = connection("<connectionId>");
91788
+ const READ = ["https://www.googleapis.com/auth/calendar.readonly"];
91832
91789
 
91833
91790
  export default async function handler(c: Context) {
91834
91791
  const now = new Date().toISOString();
91835
- const { items } = await calendar.listEvents({
91792
+ const qs = new URLSearchParams({
91836
91793
  timeMin: now,
91837
- maxResults: 10,
91838
- singleEvents: true,
91794
+ maxResults: "10",
91795
+ singleEvents: "true",
91839
91796
  orderBy: "startTime",
91840
91797
  });
91841
91798
 
91842
- return c.json(
91843
- items.map((event) => ({
91844
- id: event.id,
91845
- summary: event.summary,
91846
- start: event.start.dateTime ?? event.start.date,
91847
- end: event.end.dateTime ?? event.end.date,
91848
- location: event.location,
91849
- })),
91799
+ // Project knowledge says: alice@example.com is reachable via delegation
91800
+ const aliceRes = await calendar.requestWithDelegation(
91801
+ \`/calendars/alice@example.com/events?\${qs}\`,
91802
+ { subject: "alice@example.com", scopes: READ },
91850
91803
  );
91804
+ const alice = await aliceRes.json();
91805
+
91806
+ // Project knowledge says: team@example.com is shared with the SA
91807
+ const teamRes = await calendar.request(
91808
+ \`/calendars/team@example.com/events?\${qs}\`,
91809
+ { scopes: READ },
91810
+ );
91811
+ const team = await teamRes.json();
91812
+
91813
+ return c.json({ alice: alice.items, team: team.items });
91851
91814
  }
91852
- \`\`\`
91815
+ \`\`\``,
91816
+ ja: `### \u30C4\u30FC\u30EB
91817
+
91818
+ \u3053\u306E\u30B3\u30CD\u30AF\u30BF\u30FC\u306F\u3001Service Account \u304C Google Calendar API \u306B\u8A8D\u8A3C\u3059\u308B 2 \u3064\u306E\u65B9\u6CD5\u306B\u5BFE\u5FDC\u3059\u308B 2 \u3064\u306E request \u30C4\u30FC\u30EB\u3092\u516C\u958B\u3057\u307E\u3059:
91819
+
91820
+ - \`google-calendar-service-account_request_with_delegation\`: \u6307\u5B9A\u3055\u308C\u305F Workspace \u30E6\u30FC\u30B6\u30FC\u306B\u4EE3\u308F\u3063\u3066 Domain-wide Delegation \u7D4C\u7531\u3067 Calendar API \u3092\u547C\u3073\u51FA\u3057\u307E\u3059\u3002\u4EE3\u7406\u5BFE\u8C61\u306E\u30E1\u30FC\u30EB\u30A2\u30C9\u30EC\u30B9\u3092 \`subject\` \u3068\u3057\u3066\u6E21\u3057\u3066\u304F\u3060\u3055\u3044\u3002Workspace \u7BA1\u7406\u30B3\u30F3\u30BD\u30FC\u30EB\u3067 Service Account \u306E DwD \u304C\u627F\u8A8D\u3055\u308C\u3066\u3044\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059\u3002
91821
+ - \`google-calendar-service-account_request\`: Service Account \u81EA\u8EAB\u3068\u3057\u3066 Calendar API \u3092\u547C\u3073\u51FA\u3057\u307E\u3059\uFF08DwD \u306A\u3057\uFF09\u3002Service Account \u306E\u30E1\u30A2\u30C9\u306B\u660E\u793A\u7684\u306B\u5171\u6709\u3055\u308C\u3066\u3044\u308B\u30AB\u30EC\u30F3\u30C0\u30FC\u306E\u307F\u30A2\u30AF\u30BB\u30B9\u53EF\u80FD\u3067\u3059\u3002
91822
+
91823
+ \u4E21\u30C4\u30FC\u30EB\u3068\u3082 \`scopes\` \u5F15\u6570\u304C\u5FC5\u9808\u3067\u3059\u3002
91824
+
91825
+ ### OAuth \u30B9\u30B3\u30FC\u30D7 (\`scopes\` \u5F15\u6570\u3067\u6E21\u3059)
91826
+
91827
+ \u3053\u306E\u30B3\u30CD\u30AF\u30BF\u30FC\u306F\u73FE\u72B6\u8AAD\u307F\u53D6\u308A\u5C02\u7528\u3067\u3059\u3002\u6B21\u306E\u3044\u305A\u308C\u304B\u3092\u6E21\u3057\u3066\u304F\u3060\u3055\u3044:
91828
+
91829
+ - \`https://www.googleapis.com/auth/calendar.readonly\` \u2014 \u30AB\u30EC\u30F3\u30C0\u30FC\u3068\u30A4\u30D9\u30F3\u30C8\u306E\u8AAD\u307F\u53D6\u308A
91830
+ - \`https://www.googleapis.com/auth/calendar.events.readonly\` \u2014 \u30A4\u30D9\u30F3\u30C8\u306E\u307F\u8AAD\u307F\u53D6\u308A\uFF08\u30AB\u30EC\u30F3\u30C0\u30FC\u30E1\u30BF\u30C7\u30FC\u30BF\u4E0D\u53EF\uFF09
91831
+ - \`https://www.googleapis.com/auth/calendar.freebusy\` \u2014 \u7A7A\u304D\u72B6\u6CC1\u30AF\u30A8\u30EA\u306E\u307F
91832
+
91833
+ \`request_with_delegation\` \u306E\u5834\u5408\u3001\u8981\u6C42\u3059\u308B scope \u306F Workspace \u7BA1\u7406\u8005\u304C Domain-wide Delegation \u8A2D\u5B9A\u3067\u5F53\u8A72 Service Account \u306B\u5BFE\u3057\u3066\u627F\u8A8D\u3057\u3066\u3044\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059\u3002\u627F\u8A8D\u3055\u308C\u3066\u3044\u306A\u3044\u5834\u5408\u30C8\u30FC\u30AF\u30F3\u767A\u884C\u304C \`unauthorized_client\` \u3067\u5931\u6557\u3057\u307E\u3059\u3002
91834
+
91835
+ \u30A8\u30F3\u30C9\u30DD\u30A4\u30F3\u30C8\u5225\u306E\u6B63\u78BA\u306A scope \u30EA\u30D5\u30A1\u30EC\u30F3\u30B9: https://developers.google.com/calendar/api/auth
91836
+
91837
+ ### \u9069\u5207\u306A\u30C4\u30FC\u30EB\u306E\u9078\u3073\u65B9
91838
+
91839
+ \u3053\u306E\u30B3\u30CD\u30AF\u30B7\u30E7\u30F3\u306E Project Knowledge \u306E \`#### \u30B9\u30B3\u30FC\u30D7\` \u3092\u8AAD\u3093\u3067\u304F\u3060\u3055\u3044\u3002\u5404\u30AB\u30EC\u30F3\u30C0\u30FC\u306F \`- calendar: <id> (...)\` \u5F62\u5F0F\u306E\u884C\u3068\u3057\u3066\u8A18\u9332\u3055\u308C\u3066\u304A\u308A\u3001\u6CE8\u91C8\u304C\u3069\u3061\u3089\u306E\u30C4\u30FC\u30EB\u3092\u4F7F\u3046\u3079\u304D\u304B\u3092\u793A\u3057\u307E\u3059:
91840
+
91841
+ - \`(delegation, subject: <email>, name: "...")\` \u2192 \`request_with_delegation\` \u3092\u4F7F\u3044\u3001\`subject: <email>\` \u3092\u6E21\u3059
91842
+ - \`(service-account, name: "...")\` \u2192 \`request\` \u3092\u4F7F\u3046\uFF08\`subject\` \u4E0D\u8981\uFF09
91843
+
91844
+ ### \u30D1\u30B9\u306E\u66F8\u304D\u65B9
91845
+
91846
+ calendar ID \u3092\u30D1\u30B9\u306B\u76F4\u63A5\u66F8\u3044\u3066\u304F\u3060\u3055\u3044\u3002\u30D7\u30EC\u30FC\u30B9\u30DB\u30EB\u30C0\u30FC\u306E\u7F6E\u63DB\u306F\u3042\u308A\u307E\u305B\u3093\u3002\u4F8B:
91847
+
91848
+ - \`/users/me/calendarList\` \u2014 \u8A8D\u8A3C\u3055\u308C\u305F\u8B58\u5225\u5B50\u304C\u30A2\u30AF\u30BB\u30B9\u53EF\u80FD\u306A\u30AB\u30EC\u30F3\u30C0\u30FC\u4E00\u89A7
91849
+ - \`/calendars/alice@example.com/events\` \u2014 alice \u306E\u30D7\u30E9\u30A4\u30DE\u30EA\u30AB\u30EC\u30F3\u30C0\u30FC\u306E\u30A4\u30D9\u30F3\u30C8
91850
+ - \`/calendars/c_abc123@group.calendar.google.com/events\` \u2014 \u4E8C\u6B21\u30AB\u30EC\u30F3\u30C0\u30FC\u306E\u30A4\u30D9\u30F3\u30C8
91853
91851
 
91854
91852
  ### Google Calendar API v3 \u30EA\u30D5\u30A1\u30EC\u30F3\u30B9
91855
91853
 
91856
91854
  #### \u5229\u7528\u53EF\u80FD\u306A\u30A8\u30F3\u30C9\u30DD\u30A4\u30F3\u30C8
91857
91855
  - GET \`/calendars/{calendarId}\` \u2014 \u30AB\u30EC\u30F3\u30C0\u30FC\u306E\u30E1\u30BF\u30C7\u30FC\u30BF\u3092\u53D6\u5F97
91858
- - GET \`/users/me/calendarList\` \u2014 \u8A8D\u8A3C\u30E6\u30FC\u30B6\u30FC\u304C\u30A2\u30AF\u30BB\u30B9\u53EF\u80FD\u306A\u5168\u30AB\u30EC\u30F3\u30C0\u30FC\u306E\u4E00\u89A7
91856
+ - GET \`/users/me/calendarList\` \u2014 \u8A8D\u8A3C\u3055\u308C\u305F\u8B58\u5225\u5B50\u304C\u30A2\u30AF\u30BB\u30B9\u53EF\u80FD\u306A\u5168\u30AB\u30EC\u30F3\u30C0\u30FC\u306E\u4E00\u89A7
91859
91857
  - GET \`/calendars/{calendarId}/events\` \u2014 \u30AB\u30EC\u30F3\u30C0\u30FC\u4E0A\u306E\u30A4\u30D9\u30F3\u30C8\u4E00\u89A7
91860
91858
  - GET \`/calendars/{calendarId}/events/{eventId}\` \u2014 \u5358\u4E00\u30A4\u30D9\u30F3\u30C8\u306E\u53D6\u5F97
91861
91859
 
@@ -91867,12 +91865,52 @@ export default async function handler(c: Context) {
91867
91865
  - \`orderBy=startTime\` \u2014 \u958B\u59CB\u6642\u9593\u9806\u306B\u4E26\u3079\u66FF\u3048\uFF08singleEvents=true\u304C\u5FC5\u8981\uFF09
91868
91866
  - \`q\` \u2014 \u30D5\u30EA\u30FC\u30C6\u30AD\u30B9\u30C8\u691C\u7D22\u8A9E
91869
91867
 
91870
- #### \u30D2\u30F3\u30C8
91871
- - \u30D1\u30B9\u306B \`{calendarId}\` \u30D7\u30EC\u30FC\u30B9\u30DB\u30EB\u30C0\u30FC\u3092\u4F7F\u7528 \u2014 \u8A2D\u5B9A\u6E08\u307F\u306E\u30C7\u30D5\u30A9\u30EB\u30C8\u30AB\u30EC\u30F3\u30C0\u30FCID\u3067\u81EA\u52D5\u7684\u306B\u7F6E\u63DB\u3055\u308C\u307E\u3059
91872
- - \`singleEvents=true\` \u3092\u8A2D\u5B9A\u3059\u308B\u3068\u3001\u7E70\u308A\u8FD4\u3057\u30A4\u30D9\u30F3\u30C8\u304C\u500B\u5225\u306E\u30A4\u30F3\u30B9\u30BF\u30F3\u30B9\u306B\u5C55\u958B\u3055\u308C\u307E\u3059
91873
- - \`orderBy=startTime\` \u3092\u4F7F\u7528\u3059\u308B\u5834\u5408\u3001\`singleEvents=true\` \u3082\u8A2D\u5B9A\u3059\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059
91874
- - \u6642\u9593\u30D1\u30E9\u30E1\u30FC\u30BF\u306B\u306FRFC3339\u5F62\u5F0F\u3092\u4F7F\u7528\u3057\u3066\u304F\u3060\u3055\u3044\uFF08\u4F8B: "2024-01-15T09:00:00Z" \u3084 "2024-01-15T09:00:00+09:00"\uFF09
91875
- - \u30C7\u30D5\u30A9\u30EB\u30C8\u30AB\u30EC\u30F3\u30C0\u30FCID\u306F\u8A2D\u5B9A\u3055\u308C\u3066\u3044\u306A\u3044\u5834\u5408 "primary" \u304C\u4F7F\u7528\u3055\u308C\u307E\u3059`
91868
+ ### Business Logic
91869
+
91870
+ \u3053\u306E\u30B3\u30CD\u30AF\u30BF\u306E\u30D3\u30B8\u30CD\u30B9\u30ED\u30B8\u30C3\u30AF\u30BF\u30A4\u30D7\u306F "typescript" \u3067\u3059\u3002\u30CF\u30F3\u30C9\u30E9\u5185\u3067\u306F\u30B3\u30CD\u30AF\u30BFSDK\u3092\u4F7F\u7528\u3057\u3066\u304F\u3060\u3055\u3044\u3002\u74B0\u5883\u5909\u6570\u304B\u3089\u8A8D\u8A3C\u60C5\u5831\u3092\u8AAD\u307F\u53D6\u3089\u306A\u3044\u3067\u304F\u3060\u3055\u3044\u3002
91871
+
91872
+ SDK\u30E1\u30BD\u30C3\u30C9 (\`connection(connectionId)\` \u3067\u4F5C\u6210\u3057\u305F\u30AF\u30E9\u30A4\u30A2\u30F3\u30C8):
91873
+
91874
+ - \`client.requestWithDelegation(path, { subject, scopes, init? })\` \u2014 DwD \u3067 Workspace \u30E6\u30FC\u30B6\u30FC\u306B\u306A\u308A\u3059\u307E\u3057\u3066 API \u3092\u547C\u3076
91875
+ - \`client.request(path, { scopes, init? })\` \u2014 SA \u81EA\u8EAB\u3068\u3057\u3066 API \u3092\u547C\u3076\uFF08SA \u306B\u5171\u6709\u3055\u308C\u305F\u30AB\u30EC\u30F3\u30C0\u30FC\u306E\u307F\u30A2\u30AF\u30BB\u30B9\u53EF\u80FD\uFF09
91876
+
91877
+ \u4E21\u30E1\u30BD\u30C3\u30C9\u3068\u3082 \`scopes\` \u3092\u53D7\u3051\u53D6\u308A\u307E\u3059\u3002\u30A8\u30F3\u30C9\u30DD\u30A4\u30F3\u30C8\u306B\u5FC5\u8981\u306A\u6700\u5C0F scope \u3092\u6E21\u3057\u3066\u304F\u3060\u3055\u3044\u3002\u6A19\u6E96\u306E \`Response\` \u3092\u8FD4\u3059\u306E\u3067 \`response.json()\` \u3067\u30DC\u30C7\u30A3\u3092\u53D6\u5F97\u3057\u307E\u3059\u3002\u30D1\u30B9\u306E\u66F8\u304D\u65B9\u306F\u30C4\u30FC\u30EB\u3068\u540C\u3058\u3002
91878
+
91879
+ #### Example
91880
+
91881
+ \`\`\`ts
91882
+ import type { Context } from "hono";
91883
+ import { connection } from "@squadbase/vite-server/connectors/google-calendar";
91884
+
91885
+ const calendar = connection("<connectionId>");
91886
+ const READ = ["https://www.googleapis.com/auth/calendar.readonly"];
91887
+
91888
+ export default async function handler(c: Context) {
91889
+ const now = new Date().toISOString();
91890
+ const qs = new URLSearchParams({
91891
+ timeMin: now,
91892
+ maxResults: "10",
91893
+ singleEvents: "true",
91894
+ orderBy: "startTime",
91895
+ });
91896
+
91897
+ // Project Knowledge: alice@example.com \u306F delegation \u7D4C\u8DEF\u3067\u30A2\u30AF\u30BB\u30B9\u53EF\u80FD
91898
+ const aliceRes = await calendar.requestWithDelegation(
91899
+ \`/calendars/alice@example.com/events?\${qs}\`,
91900
+ { subject: "alice@example.com", scopes: READ },
91901
+ );
91902
+ const alice = await aliceRes.json();
91903
+
91904
+ // Project Knowledge: team@example.com \u306F SA \u306B\u5171\u6709\u3055\u308C\u3066\u3044\u308B
91905
+ const teamRes = await calendar.request(
91906
+ \`/calendars/team@example.com/events?\${qs}\`,
91907
+ { scopes: READ },
91908
+ );
91909
+ const team = await teamRes.json();
91910
+
91911
+ return c.json({ alice: alice.items, team: team.items });
91912
+ }
91913
+ \`\`\``
91876
91914
  },
91877
91915
  tools: tools14
91878
91916
  });
@@ -91935,7 +91973,7 @@ var outputSchema23 = z23.discriminatedUnion("success", [
91935
91973
  error: z23.string()
91936
91974
  })
91937
91975
  ]);
91938
- var listCalendarsTool2 = new ConnectorTool({
91976
+ var listCalendarsTool = new ConnectorTool({
91939
91977
  name: "listCalendars",
91940
91978
  description: "List all Google Calendars accessible with the OAuth credentials. Use during setup to discover available calendars.",
91941
91979
  inputSchema: inputSchema23,
@@ -91996,12 +92034,12 @@ var listCalendarsTool2 = new ConnectorTool({
91996
92034
  });
91997
92035
 
91998
92036
  // ../connectors/src/connectors/google-calendar-oauth/setup.ts
91999
- var listCalendarsToolName2 = `google-calendar-oauth_${listCalendarsTool2.name}`;
92037
+ var listCalendarsToolName = `google-calendar-oauth_${listCalendarsTool.name}`;
92000
92038
  var googleCalendarOauthOnboarding = new ConnectorOnboarding({
92001
92039
  connectionSetupInstructions: {
92002
92040
  ja: `\u4EE5\u4E0B\u306E\u624B\u9806\u3067Google Calendar (OAuth) \u30B3\u30CD\u30AF\u30B7\u30E7\u30F3\u306E\u30BB\u30C3\u30C8\u30A2\u30C3\u30D7\u3092\u884C\u3063\u3066\u304F\u3060\u3055\u3044\u3002
92003
92041
 
92004
- 1. \`${listCalendarsToolName2}\` \u3092\u547C\u3073\u51FA\u3057\u3066\u3001OAuth\u3067\u30A2\u30AF\u30BB\u30B9\u53EF\u80FD\u306A\u30AB\u30EC\u30F3\u30C0\u30FC\u4E00\u89A7\u3092\u53D6\u5F97\u3059\u308B
92042
+ 1. \`${listCalendarsToolName}\` \u3092\u547C\u3073\u51FA\u3057\u3066\u3001OAuth\u3067\u30A2\u30AF\u30BB\u30B9\u53EF\u80FD\u306A\u30AB\u30EC\u30F3\u30C0\u30FC\u4E00\u89A7\u3092\u53D6\u5F97\u3059\u308B
92005
92043
  2. \u300C\u4F7F\u7528\u3059\u308B\u30AB\u30EC\u30F3\u30C0\u30FC\u3092\u9078\u629E\u3057\u3066\u304F\u3060\u3055\u3044\u3002\u300D\u3068\u30E6\u30FC\u30B6\u30FC\u306B\u4F1D\u3048\u305F\u4E0A\u3067\u3001\`askUserQuestion\` \u3092\u547C\u3073\u51FA\u3059:
92006
92044
  - \`options\`: \u30AB\u30EC\u30F3\u30C0\u30FC\u4E00\u89A7\u3002\u5404 option \u306E \`label\` \u306F \`\u30AB\u30EC\u30F3\u30C0\u30FC\u540D (id: \u30AB\u30EC\u30F3\u30C0\u30FCID)\` \u306E\u5F62\u5F0F\u3001\`value\` \u306F\u30AB\u30EC\u30F3\u30C0\u30FCID
92007
92045
  3. \`updateConnectionParameters\` \u3092\u547C\u3073\u51FA\u3059:
@@ -92013,7 +92051,7 @@ var googleCalendarOauthOnboarding = new ConnectorOnboarding({
92013
92051
  - \u30C4\u30FC\u30EB\u9593\u306F1\u6587\u3060\u3051\u66F8\u3044\u3066\u5373\u6B21\u306E\u30C4\u30FC\u30EB\u547C\u3073\u51FA\u3057\u3002\u4E0D\u8981\u306A\u8AAC\u660E\u306F\u7701\u7565\u3057\u3001\u52B9\u7387\u7684\u306B\u9032\u3081\u308B`,
92014
92052
  en: `Follow these steps to set up the Google Calendar (OAuth) connection.
92015
92053
 
92016
- 1. Call \`${listCalendarsToolName2}\` to get the list of calendars accessible with the OAuth credentials
92054
+ 1. Call \`${listCalendarsToolName}\` to get the list of calendars accessible with the OAuth credentials
92017
92055
  2. Tell the user "Please select a calendar.", then call \`askUserQuestion\`:
92018
92056
  - \`options\`: The calendar list. Each option's \`label\` should be \`Calendar Name (id: calendarId)\`, \`value\` should be the calendar ID
92019
92057
  3. Call \`updateConnectionParameters\`:
@@ -92169,7 +92207,7 @@ Authentication is handled automatically via OAuth proxy.
92169
92207
  // ../connectors/src/connectors/google-calendar-oauth/index.ts
92170
92208
  var tools15 = {
92171
92209
  request: requestTool6,
92172
- listCalendars: listCalendarsTool2
92210
+ listCalendars: listCalendarsTool
92173
92211
  };
92174
92212
  var googleCalendarOauthConnector = new ConnectorPlugin({
92175
92213
  slug: "google-calendar",
@@ -93205,7 +93243,7 @@ Authentication is handled automatically via OAuth proxy.`,
93205
93243
  });
93206
93244
 
93207
93245
  // ../connectors/src/connectors/google-sheets/setup.ts
93208
- var requestToolName = `google-sheets-oauth_${requestTool9.name}`;
93246
+ var requestToolName2 = `google-sheets-oauth_${requestTool9.name}`;
93209
93247
  var googleSheetsOnboarding = new ConnectorOnboarding({
93210
93248
  connectionSetupInstructions: {
93211
93249
  ja: `\u4EE5\u4E0B\u306E\u624B\u9806\u3067Google Sheets (OAuth) \u30B3\u30CD\u30AF\u30B7\u30E7\u30F3\u306E\u30BB\u30C3\u30C8\u30A2\u30C3\u30D7\u3092\u884C\u3063\u3066\u304F\u3060\u3055\u3044\u3002\u3053\u306E\u30B3\u30CD\u30AF\u30BF\u306F\u8AAD\u307F\u66F8\u304D\u53EF\u80FD\u306A\u30B9\u30B3\u30FC\u30D7 (\`spreadsheets\`) \u3067\u63A5\u7D9A\u3055\u308C\u3001OAuth\u8A8D\u8A3C\u3057\u305FGoogle\u30A2\u30AB\u30A6\u30F3\u30C8\u304C\u6A29\u9650\u3092\u6301\u3064\u4EFB\u610F\u306E\u30B9\u30D7\u30EC\u30C3\u30C9\u30B7\u30FC\u30C8\u306B\u5BFE\u3057\u3066\u8AAD\u307F\u66F8\u304D\u3067\u304D\u307E\u3059\u3002
@@ -93215,12 +93253,12 @@ var googleSheetsOnboarding = new ConnectorOnboarding({
93215
93253
  - \`question\`: \u300C\u64CD\u4F5C\u3057\u305F\u3044Google Sheets\u306EURL\u3092\u8CBC\u308A\u4ED8\u3051\u3066\u304F\u3060\u3055\u3044\uFF08\u8AAD\u307F\u53D6\u308A\u30FB\u7DE8\u96C6\u3069\u3061\u3089\u3082\u53EF\u80FD\u3067\u3059\uFF09\u300D
93216
93254
  - \`placeholder\`: \`"https://docs.google.com/spreadsheets/d/.../edit"\`
93217
93255
  2. \u53D7\u3051\u53D6\u3063\u305FURL\u304B\u3089\u30B9\u30D7\u30EC\u30C3\u30C9\u30B7\u30FC\u30C8ID\u3092\u62BD\u51FA\u3059\u308B\u3002URL\u306E \`/d/\` \u3068 \`/edit\`\uFF08\u307E\u305F\u306F\u672B\u5C3E\uFF09\u306E\u9593\u306B\u3042\u308B\u6587\u5B57\u5217\u304C\u30B9\u30D7\u30EC\u30C3\u30C9\u30B7\u30FC\u30C8ID\u3067\u3059\uFF08\u4F8B: \`https://docs.google.com/spreadsheets/d/1AbCxyz.../edit\` \u2192 \`1AbCxyz...\`\uFF09\u3002URL\u3067\u306F\u306A\u304FID\u3060\u3051\u304C\u6E21\u3055\u308C\u305F\u5834\u5408\u306F\u305D\u306E\u307E\u307E\u5229\u7528\u3057\u307E\u3059\u3002
93218
- 3. \`${requestToolName}\` \u3067\u30A2\u30AF\u30BB\u30B9\u53EF\u80FD\u6027\u3092\u78BA\u8A8D\u3059\u308B:
93256
+ 3. \`${requestToolName2}\` \u3067\u30A2\u30AF\u30BB\u30B9\u53EF\u80FD\u6027\u3092\u78BA\u8A8D\u3059\u308B:
93219
93257
  - \`method\`: \`"GET"\`
93220
93258
  - \`path\`: \`"/<\u62BD\u51FA\u3057\u305FspreadsheetId>"\`
93221
93259
  4. **\u691C\u8A3C\u5931\u6557\u6642\u306E\u518D\u30D2\u30A2\u30EA\u30F3\u30B0**: \u30B9\u30C6\u30C3\u30D73\u304C \`success: false\` \u3092\u8FD4\u3057\u305F\u5834\u5408\uFF08404/403/\u898B\u3064\u304B\u3089\u306A\u3044\u7B49\uFF09\u3001\u4EE5\u4E0B\u306E\u624B\u9806\u3067\u518D\u8A66\u884C\u3059\u308B:
93222
93260
  a. \u30E6\u30FC\u30B6\u30FC\u306B\u539F\u56E0\u306E\u53EF\u80FD\u6027\u3092\u4F1D\u3048\u308B\uFF08URL\u304C\u9593\u9055\u3063\u3066\u3044\u308B\u3001OAuth\u9023\u643A\u3057\u305FGoogle\u30A2\u30AB\u30A6\u30F3\u30C8\u306B\u30A2\u30AF\u30BB\u30B9\u6A29\u9650\u304C\u306A\u3044\u3001\u30D7\u30E9\u30A4\u30D9\u30FC\u30C8\u30B7\u30FC\u30C8\u3067\u5225\u30A2\u30AB\u30A6\u30F3\u30C8\u3068\u5171\u6709\u3055\u308C\u3066\u3044\u308B \u7B49\uFF09
93223
- b. \`askUserQuestion\` \u3067\u3082\u3046\u4E00\u5EA6URL\u3092\u805E\u304D\u76F4\u3057\u3001\u518D\u5EA6 \`${requestToolName}\` \u3067\u691C\u8A3C
93261
+ b. \`askUserQuestion\` \u3067\u3082\u3046\u4E00\u5EA6URL\u3092\u805E\u304D\u76F4\u3057\u3001\u518D\u5EA6 \`${requestToolName2}\` \u3067\u691C\u8A3C
93224
93262
  c. \u6210\u529F\u3059\u308B\u307E\u3067\uFF08\u307E\u305F\u306F\u30E6\u30FC\u30B6\u30FC\u304C\u4E2D\u65AD\u3059\u308B\u307E\u3067\uFF09\u3053\u306E\u30EB\u30FC\u30D7\u3092\u7E70\u308A\u8FD4\u3059
93225
93263
 
93226
93264
  #### \u5236\u7D04
@@ -93234,12 +93272,12 @@ var googleSheetsOnboarding = new ConnectorOnboarding({
93234
93272
  - \`question\`: "Please paste the URL of the Google Sheet you want to work with (both read and edit are supported)."
93235
93273
  - \`placeholder\`: \`"https://docs.google.com/spreadsheets/d/.../edit"\`
93236
93274
  2. Extract the spreadsheet ID from the URL. It is the segment between \`/d/\` and \`/edit\` (or the end of the URL), e.g. \`https://docs.google.com/spreadsheets/d/1AbCxyz.../edit\` \u2192 \`1AbCxyz...\`. If the user pasted just the ID, use it as-is.
93237
- 3. Verify accessibility by calling \`${requestToolName}\`:
93275
+ 3. Verify accessibility by calling \`${requestToolName2}\`:
93238
93276
  - \`method\`: \`"GET"\`
93239
93277
  - \`path\`: \`"/<extracted spreadsheetId>"\`
93240
93278
  4. **Retry on verification failure**: If step 3 returns \`success: false\` (404/403/not found or any other error):
93241
93279
  a. Tell the user the likely causes (wrong URL, OAuth-connected Google account lacks access, private sheet shared with a different account, etc.)
93242
- b. Call \`askUserQuestion\` again to re-ask for the URL and re-verify with \`${requestToolName}\`
93280
+ b. Call \`askUserQuestion\` again to re-ask for the URL and re-verify with \`${requestToolName2}\`
93243
93281
  c. Repeat until verification succeeds (or the user aborts)
93244
93282
 
93245
93283
  #### Constraints
@@ -93248,10 +93286,10 @@ var googleSheetsOnboarding = new ConnectorOnboarding({
93248
93286
  - Write only 1 sentence between tool calls, then immediately call the next tool. Skip unnecessary explanations and proceed efficiently.`
93249
93287
  },
93250
93288
  dataOverviewInstructions: {
93251
- en: `1. Call ${requestToolName} with GET /<spreadsheetId> to fetch spreadsheet metadata (sheet names, grid properties)
93252
- 2. For each sheet of interest, call ${requestToolName} with GET /<spreadsheetId>/values/<SheetName>!A1:Z5 to sample the first rows and understand the column layout`,
93253
- ja: `1. ${requestToolName} \u3067 GET /<spreadsheetId> \u3092\u547C\u3073\u51FA\u3057\u3001\u30B9\u30D7\u30EC\u30C3\u30C9\u30B7\u30FC\u30C8\u306E\u30E1\u30BF\u30C7\u30FC\u30BF\uFF08\u30B7\u30FC\u30C8\u540D\u3001\u30B0\u30EA\u30C3\u30C9\u30D7\u30ED\u30D1\u30C6\u30A3\uFF09\u3092\u53D6\u5F97
93254
- 2. \u4E3B\u8981\u306A\u30B7\u30FC\u30C8\u306B\u3064\u3044\u3066 ${requestToolName} \u3067 GET /<spreadsheetId>/values/<\u30B7\u30FC\u30C8\u540D>!A1:Z5 \u3092\u547C\u3073\u51FA\u3057\u3001\u5148\u982D\u6570\u884C\u3092\u30B5\u30F3\u30D7\u30EA\u30F3\u30B0\u3057\u3066\u30AB\u30E9\u30E0\u69CB\u9020\u3092\u628A\u63E1`
93289
+ en: `1. Call ${requestToolName2} with GET /<spreadsheetId> to fetch spreadsheet metadata (sheet names, grid properties)
93290
+ 2. For each sheet of interest, call ${requestToolName2} with GET /<spreadsheetId>/values/<SheetName>!A1:Z5 to sample the first rows and understand the column layout`,
93291
+ ja: `1. ${requestToolName2} \u3067 GET /<spreadsheetId> \u3092\u547C\u3073\u51FA\u3057\u3001\u30B9\u30D7\u30EC\u30C3\u30C9\u30B7\u30FC\u30C8\u306E\u30E1\u30BF\u30C7\u30FC\u30BF\uFF08\u30B7\u30FC\u30C8\u540D\u3001\u30B0\u30EA\u30C3\u30C9\u30D7\u30ED\u30D1\u30C6\u30A3\uFF09\u3092\u53D6\u5F97
93292
+ 2. \u4E3B\u8981\u306A\u30B7\u30FC\u30C8\u306B\u3064\u3044\u3066 ${requestToolName2} \u3067 GET /<spreadsheetId>/values/<\u30B7\u30FC\u30C8\u540D>!A1:Z5 \u3092\u547C\u3073\u51FA\u3057\u3001\u5148\u982D\u6570\u884C\u3092\u30B5\u30F3\u30D7\u30EA\u30F3\u30B0\u3057\u3066\u30AB\u30E9\u30E0\u69CB\u9020\u3092\u628A\u63E1`
93255
93293
  }
93256
93294
  });
93257
93295
 
@@ -93867,12 +93905,12 @@ Authentication is handled automatically via OAuth proxy.`,
93867
93905
  });
93868
93906
 
93869
93907
  // ../connectors/src/connectors/hubspot-oauth/setup.ts
93870
- var requestToolName2 = `hubspot-oauth_${requestTool11.name}`;
93908
+ var requestToolName3 = `hubspot-oauth_${requestTool11.name}`;
93871
93909
  var hubspotOnboarding = new ConnectorOnboarding({
93872
93910
  connectionSetupInstructions: {
93873
93911
  ja: `\u4EE5\u4E0B\u306E\u624B\u9806\u3067HubSpot\u30B3\u30CD\u30AF\u30B7\u30E7\u30F3\u306E\u30BB\u30C3\u30C8\u30A2\u30C3\u30D7\u3092\u884C\u3063\u3066\u304F\u3060\u3055\u3044\u3002
93874
93912
 
93875
- 1. \`${requestToolName2}\` \u3092\u547C\u3073\u51FA\u3057\u3066\u3001\u30A2\u30AB\u30A6\u30F3\u30C8\u60C5\u5831\u3092\u53D6\u5F97\u3059\u308B:
93913
+ 1. \`${requestToolName3}\` \u3092\u547C\u3073\u51FA\u3057\u3066\u3001\u30A2\u30AB\u30A6\u30F3\u30C8\u60C5\u5831\u3092\u53D6\u5F97\u3059\u308B:
93876
93914
  - \`method\`: \`"GET"\`
93877
93915
  - \`path\`: \`"/account-info/v3/details"\`
93878
93916
  2. \u30A8\u30E9\u30FC\u304C\u8FD4\u3055\u308C\u305F\u5834\u5408\u3001\u30E6\u30FC\u30B6\u30FC\u306BOAuth\u63A5\u7D9A\u306E\u8A2D\u5B9A\u3092\u78BA\u8A8D\u3059\u308B\u3088\u3046\u4F1D\u3048\u308B
@@ -93882,7 +93920,7 @@ var hubspotOnboarding = new ConnectorOnboarding({
93882
93920
  - \u30C4\u30FC\u30EB\u9593\u306F1\u6587\u3060\u3051\u66F8\u3044\u3066\u5373\u6B21\u306E\u30C4\u30FC\u30EB\u547C\u3073\u51FA\u3057\u3002\u4E0D\u8981\u306A\u8AAC\u660E\u306F\u7701\u7565\u3057\u3001\u52B9\u7387\u7684\u306B\u9032\u3081\u308B`,
93883
93921
  en: `Follow these steps to set up the HubSpot connection.
93884
93922
 
93885
- 1. Call \`${requestToolName2}\` to fetch account info:
93923
+ 1. Call \`${requestToolName3}\` to fetch account info:
93886
93924
  - \`method\`: \`"GET"\`
93887
93925
  - \`path\`: \`"/account-info/v3/details"\`
93888
93926
  2. If an error is returned, ask the user to check the OAuth connection settings
@@ -94156,12 +94194,12 @@ Authentication is handled automatically via OAuth proxy.`,
94156
94194
  });
94157
94195
 
94158
94196
  // ../connectors/src/connectors/stripe-oauth/setup.ts
94159
- var requestToolName3 = `stripe-oauth_${requestTool12.name}`;
94197
+ var requestToolName4 = `stripe-oauth_${requestTool12.name}`;
94160
94198
  var stripeOnboarding = new ConnectorOnboarding({
94161
94199
  connectionSetupInstructions: {
94162
94200
  ja: `\u4EE5\u4E0B\u306E\u624B\u9806\u3067Stripe\u30B3\u30CD\u30AF\u30B7\u30E7\u30F3\u306E\u30BB\u30C3\u30C8\u30A2\u30C3\u30D7\u3092\u884C\u3063\u3066\u304F\u3060\u3055\u3044\u3002
94163
94201
 
94164
- 1. \`${requestToolName3}\` \u3092\u547C\u3073\u51FA\u3057\u3066\u3001\u30A2\u30AB\u30A6\u30F3\u30C8\u60C5\u5831\u3092\u53D6\u5F97\u3059\u308B:
94202
+ 1. \`${requestToolName4}\` \u3092\u547C\u3073\u51FA\u3057\u3066\u3001\u30A2\u30AB\u30A6\u30F3\u30C8\u60C5\u5831\u3092\u53D6\u5F97\u3059\u308B:
94165
94203
  - \`method\`: \`"GET"\`
94166
94204
  - \`path\`: \`"/v1/accounts"\`
94167
94205
  2. \u30A8\u30E9\u30FC\u304C\u8FD4\u3055\u308C\u305F\u5834\u5408\u3001\u30E6\u30FC\u30B6\u30FC\u306BOAuth\u63A5\u7D9A\u306E\u8A2D\u5B9A\u3092\u78BA\u8A8D\u3059\u308B\u3088\u3046\u4F1D\u3048\u308B
@@ -94171,7 +94209,7 @@ var stripeOnboarding = new ConnectorOnboarding({
94171
94209
  - \u30C4\u30FC\u30EB\u9593\u306F1\u6587\u3060\u3051\u66F8\u3044\u3066\u5373\u6B21\u306E\u30C4\u30FC\u30EB\u547C\u3073\u51FA\u3057\u3002\u4E0D\u8981\u306A\u8AAC\u660E\u306F\u7701\u7565\u3057\u3001\u52B9\u7387\u7684\u306B\u9032\u3081\u308B`,
94172
94210
  en: `Follow these steps to set up the Stripe connection.
94173
94211
 
94174
- 1. Call \`${requestToolName3}\` to fetch account info:
94212
+ 1. Call \`${requestToolName4}\` to fetch account info:
94175
94213
  - \`method\`: \`"GET"\`
94176
94214
  - \`path\`: \`"/v1/accounts"\`
94177
94215
  2. If an error is returned, ask the user to check the OAuth connection settings
@@ -94446,12 +94484,12 @@ Use this tool for all Stripe API interactions: querying charges, customers, invo
94446
94484
  });
94447
94485
 
94448
94486
  // ../connectors/src/connectors/stripe-api-key/setup.ts
94449
- var requestToolName4 = `stripe-api-key_${requestTool13.name}`;
94487
+ var requestToolName5 = `stripe-api-key_${requestTool13.name}`;
94450
94488
  var stripeApiKeyOnboarding = new ConnectorOnboarding({
94451
94489
  connectionSetupInstructions: {
94452
94490
  ja: `\u4EE5\u4E0B\u306E\u624B\u9806\u3067Stripe\u30B3\u30CD\u30AF\u30B7\u30E7\u30F3\u306E\u30BB\u30C3\u30C8\u30A2\u30C3\u30D7\u3092\u884C\u3063\u3066\u304F\u3060\u3055\u3044\u3002
94453
94491
 
94454
- 1. \`${requestToolName4}\` \u3092\u547C\u3073\u51FA\u3057\u3066\u3001\u30A2\u30AB\u30A6\u30F3\u30C8\u6B8B\u9AD8\u3092\u53D6\u5F97\u3059\u308B:
94492
+ 1. \`${requestToolName5}\` \u3092\u547C\u3073\u51FA\u3057\u3066\u3001\u30A2\u30AB\u30A6\u30F3\u30C8\u6B8B\u9AD8\u3092\u53D6\u5F97\u3059\u308B:
94455
94493
  - \`method\`: \`"GET"\`
94456
94494
  - \`path\`: \`"/v1/balance"\`
94457
94495
  2. \u30A8\u30E9\u30FC\u304C\u8FD4\u3055\u308C\u305F\u5834\u5408\u3001\u30E6\u30FC\u30B6\u30FC\u306BAPI\u30AD\u30FC\u306E\u8A2D\u5B9A\u3092\u78BA\u8A8D\u3059\u308B\u3088\u3046\u4F1D\u3048\u308B\uFF08Secret API Key\u307E\u305F\u306FRestricted API Key\u304C\u6B63\u3057\u304F\u8A2D\u5B9A\u3055\u308C\u3066\u3044\u308B\u304B\uFF09
@@ -94461,7 +94499,7 @@ var stripeApiKeyOnboarding = new ConnectorOnboarding({
94461
94499
  - \u30C4\u30FC\u30EB\u9593\u306F1\u6587\u3060\u3051\u66F8\u3044\u3066\u5373\u6B21\u306E\u30C4\u30FC\u30EB\u547C\u3073\u51FA\u3057\u3002\u4E0D\u8981\u306A\u8AAC\u660E\u306F\u7701\u7565\u3057\u3001\u52B9\u7387\u7684\u306B\u9032\u3081\u308B`,
94462
94500
  en: `Follow these steps to set up the Stripe connection.
94463
94501
 
94464
- 1. Call \`${requestToolName4}\` to fetch account balance:
94502
+ 1. Call \`${requestToolName5}\` to fetch account balance:
94465
94503
  - \`method\`: \`"GET"\`
94466
94504
  - \`path\`: \`"/v1/balance"\`
94467
94505
  2. If an error is returned, ask the user to check the API key settings (verify that the Secret API Key or Restricted API Key is configured correctly)
@@ -94471,11 +94509,11 @@ var stripeApiKeyOnboarding = new ConnectorOnboarding({
94471
94509
  - Write only 1 sentence between tool calls, then immediately call the next tool. Skip unnecessary explanations and proceed efficiently`
94472
94510
  },
94473
94511
  dataOverviewInstructions: {
94474
- en: `1. Call ${requestToolName4} with GET /v1/customers?limit=5 to explore customers structure
94475
- 2. Call ${requestToolName4} with GET /v1/charges?limit=5 to explore charges structure
94512
+ en: `1. Call ${requestToolName5} with GET /v1/customers?limit=5 to explore customers structure
94513
+ 2. Call ${requestToolName5} with GET /v1/charges?limit=5 to explore charges structure
94476
94514
  3. Explore other endpoints (invoices, subscriptions, products) as needed`,
94477
- ja: `1. ${requestToolName4} \u3067 GET /v1/customers?limit=5 \u3092\u547C\u3073\u51FA\u3057\u3001\u9867\u5BA2\u306E\u69CB\u9020\u3092\u78BA\u8A8D
94478
- 2. ${requestToolName4} \u3067 GET /v1/charges?limit=5 \u3092\u547C\u3073\u51FA\u3057\u3001\u8AB2\u91D1\u306E\u69CB\u9020\u3092\u78BA\u8A8D
94515
+ ja: `1. ${requestToolName5} \u3067 GET /v1/customers?limit=5 \u3092\u547C\u3073\u51FA\u3057\u3001\u9867\u5BA2\u306E\u69CB\u9020\u3092\u78BA\u8A8D
94516
+ 2. ${requestToolName5} \u3067 GET /v1/charges?limit=5 \u3092\u547C\u3073\u51FA\u3057\u3001\u8AB2\u91D1\u306E\u69CB\u9020\u3092\u78BA\u8A8D
94479
94517
  3. \u5FC5\u8981\u306B\u5FDC\u3058\u3066\u4ED6\u306E\u30A8\u30F3\u30C9\u30DD\u30A4\u30F3\u30C8\uFF08\u8ACB\u6C42\u66F8\u3001\u30B5\u30D6\u30B9\u30AF\u30EA\u30D7\u30B7\u30E7\u30F3\u3001\u5546\u54C1\uFF09\u3092\u63A2\u7D22`
94480
94518
  }
94481
94519
  });
@@ -94760,7 +94798,7 @@ Authentication is handled automatically via OAuth proxy.
94760
94798
  });
94761
94799
 
94762
94800
  // ../connectors/src/connectors/airtable-oauth/setup.ts
94763
- var requestToolName5 = `airtable-oauth_${requestTool14.name}`;
94801
+ var requestToolName6 = `airtable-oauth_${requestTool14.name}`;
94764
94802
  var airtableOauthOnboarding = new ConnectorOnboarding({
94765
94803
  connectionSetupInstructions: {
94766
94804
  ja: `\u4EE5\u4E0B\u306E\u624B\u9806\u3067Airtable OAuth\u30B3\u30CD\u30AF\u30B7\u30E7\u30F3\u306E\u30BB\u30C3\u30C8\u30A2\u30C3\u30D7\u3092\u884C\u3063\u3066\u304F\u3060\u3055\u3044\u3002
@@ -94770,7 +94808,7 @@ var airtableOauthOnboarding = new ConnectorOnboarding({
94770
94808
  3. \`updateConnectionParameters\` \u3092\u547C\u3073\u51FA\u3059:
94771
94809
  - \`parameterSlug\`: \`"base-id"\`
94772
94810
  - \`value\`: \u62BD\u51FA\u3057\u305F\u30D9\u30FC\u30B9ID
94773
- 4. \`${requestToolName5}\` \u3092\u547C\u3073\u51FA\u3057\u3066\u3001\u30D9\u30FC\u30B9\u306E\u30C6\u30FC\u30D6\u30EB\u4E00\u89A7\u3092\u53D6\u5F97\u3059\u308B:
94811
+ 4. \`${requestToolName6}\` \u3092\u547C\u3073\u51FA\u3057\u3066\u3001\u30D9\u30FC\u30B9\u306E\u30C6\u30FC\u30D6\u30EB\u4E00\u89A7\u3092\u53D6\u5F97\u3059\u308B:
94774
94812
  - \`method\`: \`"GET"\`
94775
94813
  - \`path\`: \`"/meta/bases/{baseId}/tables"\`
94776
94814
  5. \u30A8\u30E9\u30FC\u304C\u8FD4\u3055\u308C\u305F\u5834\u5408\u3001\u30E6\u30FC\u30B6\u30FC\u306B\u30D9\u30FC\u30B9\u306E\u5171\u6709\u8A2D\u5B9A\u3092\u78BA\u8A8D\u3059\u308B\u3088\u3046\u4F1D\u3048\u308B
@@ -94785,7 +94823,7 @@ var airtableOauthOnboarding = new ConnectorOnboarding({
94785
94823
  3. Call \`updateConnectionParameters\`:
94786
94824
  - \`parameterSlug\`: \`"base-id"\`
94787
94825
  - \`value\`: The extracted base ID
94788
- 4. Call \`${requestToolName5}\` to fetch the base's table list:
94826
+ 4. Call \`${requestToolName6}\` to fetch the base's table list:
94789
94827
  - \`method\`: \`"GET"\`
94790
94828
  - \`path\`: \`"/meta/bases/{baseId}/tables"\`
94791
94829
  5. If an error is returned, ask the user to check the base sharing settings
@@ -97687,12 +97725,12 @@ Authentication is handled automatically via OAuth proxy.`,
97687
97725
  });
97688
97726
 
97689
97727
  // ../connectors/src/connectors/shopify-oauth/setup.ts
97690
- var requestToolName6 = `shopify-oauth_${requestTool22.name}`;
97728
+ var requestToolName7 = `shopify-oauth_${requestTool22.name}`;
97691
97729
  var shopifyOauthOnboarding = new ConnectorOnboarding({
97692
97730
  connectionSetupInstructions: {
97693
97731
  ja: `\u4EE5\u4E0B\u306E\u624B\u9806\u3067Shopify\u30B3\u30CD\u30AF\u30B7\u30E7\u30F3\u306E\u30BB\u30C3\u30C8\u30A2\u30C3\u30D7\u3092\u884C\u3063\u3066\u304F\u3060\u3055\u3044\u3002
97694
97732
 
97695
- 1. \`${requestToolName6}\` \u3092\u547C\u3073\u51FA\u3057\u3066\u3001\u30B7\u30E7\u30C3\u30D7\u60C5\u5831\u3092\u53D6\u5F97\u3059\u308B:
97733
+ 1. \`${requestToolName7}\` \u3092\u547C\u3073\u51FA\u3057\u3066\u3001\u30B7\u30E7\u30C3\u30D7\u60C5\u5831\u3092\u53D6\u5F97\u3059\u308B:
97696
97734
  - \`method\`: \`"GET"\`
97697
97735
  - \`path\`: \`"/admin/api/2024-10/shop.json"\`
97698
97736
  2. \u30A8\u30E9\u30FC\u304C\u8FD4\u3055\u308C\u305F\u5834\u5408\u3001\u30E6\u30FC\u30B6\u30FC\u306BOAuth\u63A5\u7D9A\u306E\u8A2D\u5B9A\u3092\u78BA\u8A8D\u3059\u308B\u3088\u3046\u4F1D\u3048\u308B
@@ -97702,7 +97740,7 @@ var shopifyOauthOnboarding = new ConnectorOnboarding({
97702
97740
  - \u30C4\u30FC\u30EB\u9593\u306F1\u6587\u3060\u3051\u66F8\u3044\u3066\u5373\u6B21\u306E\u30C4\u30FC\u30EB\u547C\u3073\u51FA\u3057\u3002\u4E0D\u8981\u306A\u8AAC\u660E\u306F\u7701\u7565\u3057\u3001\u52B9\u7387\u7684\u306B\u9032\u3081\u308B`,
97703
97741
  en: `Follow these steps to set up the Shopify connection.
97704
97742
 
97705
- 1. Call \`${requestToolName6}\` to fetch shop info:
97743
+ 1. Call \`${requestToolName7}\` to fetch shop info:
97706
97744
  - \`method\`: \`"GET"\`
97707
97745
  - \`path\`: \`"/admin/api/2024-10/shop.json"\`
97708
97746
  2. If an error is returned, ask the user to check the OAuth connection settings
@@ -99959,12 +99997,12 @@ Pagination uses cursor-based start_cursor and page_size (max 100).`,
99959
99997
  });
99960
99998
 
99961
99999
  // ../connectors/src/connectors/notion-oauth/setup.ts
99962
- var requestToolName7 = `notion-oauth_${requestTool28.name}`;
100000
+ var requestToolName8 = `notion-oauth_${requestTool28.name}`;
99963
100001
  var notionOauthOnboarding = new ConnectorOnboarding({
99964
100002
  connectionSetupInstructions: {
99965
100003
  ja: `\u4EE5\u4E0B\u306E\u624B\u9806\u3067Notion\u30B3\u30CD\u30AF\u30B7\u30E7\u30F3\u306E\u30BB\u30C3\u30C8\u30A2\u30C3\u30D7\u3092\u884C\u3063\u3066\u304F\u3060\u3055\u3044\u3002
99966
100004
 
99967
- 1. \`${requestToolName7}\` \u3092\u547C\u3073\u51FA\u3057\u3066\u3001\u30DC\u30C3\u30C8\u30E6\u30FC\u30B6\u30FC\u60C5\u5831\u3092\u53D6\u5F97\u3059\u308B:
100005
+ 1. \`${requestToolName8}\` \u3092\u547C\u3073\u51FA\u3057\u3066\u3001\u30DC\u30C3\u30C8\u30E6\u30FC\u30B6\u30FC\u60C5\u5831\u3092\u53D6\u5F97\u3059\u308B:
99968
100006
  - \`method\`: \`"GET"\`
99969
100007
  - \`path\`: \`"/users/me"\`
99970
100008
  2. \u30A8\u30E9\u30FC\u304C\u8FD4\u3055\u308C\u305F\u5834\u5408\u3001\u30E6\u30FC\u30B6\u30FC\u306BOAuth\u63A5\u7D9A\u306E\u8A2D\u5B9A\u3092\u78BA\u8A8D\u3059\u308B\u3088\u3046\u4F1D\u3048\u308B
@@ -99974,7 +100012,7 @@ var notionOauthOnboarding = new ConnectorOnboarding({
99974
100012
  - \u30C4\u30FC\u30EB\u9593\u306F1\u6587\u3060\u3051\u66F8\u3044\u3066\u5373\u6B21\u306E\u30C4\u30FC\u30EB\u547C\u3073\u51FA\u3057\u3002\u4E0D\u8981\u306A\u8AAC\u660E\u306F\u7701\u7565\u3057\u3001\u52B9\u7387\u7684\u306B\u9032\u3081\u308B`,
99975
100013
  en: `Follow these steps to set up the Notion connection.
99976
100014
 
99977
- 1. Call \`${requestToolName7}\` to fetch bot user info:
100015
+ 1. Call \`${requestToolName8}\` to fetch bot user info:
99978
100016
  - \`method\`: \`"GET"\`
99979
100017
  - \`path\`: \`"/users/me"\`
99980
100018
  2. If an error is returned, ask the user to check the OAuth connection settings
@@ -102417,7 +102455,7 @@ export default async function handler(c: Context) {
102417
102455
  tools: tools49
102418
102456
  });
102419
102457
 
102420
- // ../connectors/src/connectors/gmail/tools/request.ts
102458
+ // ../connectors/src/connectors/gmail/tools/request-with-delegation.ts
102421
102459
  import { z as z63 } from "zod";
102422
102460
 
102423
102461
  // ../connectors/src/connectors/gmail/parameters.ts
@@ -102425,38 +102463,40 @@ var parameters50 = {
102425
102463
  serviceAccountKeyJsonBase64: new ParameterDefinition({
102426
102464
  slug: "service-account-key-json-base64",
102427
102465
  name: "Google Cloud Service Account JSON",
102428
- description: "The service account JSON key used to authenticate with Google Cloud Platform. The service account must have domain-wide delegation enabled and be granted the Gmail API scope in Google Workspace admin.",
102466
+ description: "The service account JSON key. Domain-wide Delegation must be authorized in the Google Workspace admin console for the Gmail API scope. The user to impersonate is supplied per call as the `subject` argument.",
102429
102467
  envVarBaseKey: "GMAIL_SERVICE_ACCOUNT_JSON_BASE64",
102430
102468
  type: "base64EncodedJson",
102431
102469
  secret: true,
102432
102470
  required: true
102433
102471
  })
102434
102472
  };
102435
- var delegatedUserEmailParameter = new ParameterDefinition({
102436
- slug: "delegated-user-email",
102437
- name: "Delegated User Email",
102438
- description: "The email address of the Google Workspace user whose Gmail mailbox the service account will access via domain-wide delegation. Collected during the setup flow.",
102439
- envVarBaseKey: "GMAIL_DELEGATED_USER_EMAIL",
102440
- type: "text",
102441
- secret: false,
102442
- required: false
102443
- });
102444
102473
 
102445
- // ../connectors/src/connectors/gmail/tools/request.ts
102474
+ // ../connectors/src/connectors/gmail/tools/request-with-delegation.ts
102446
102475
  var BASE_URL28 = "https://gmail.googleapis.com/gmail/v1/users";
102447
102476
  var REQUEST_TIMEOUT_MS46 = 6e4;
102477
+ function decodeServiceAccount3(keyJsonBase64) {
102478
+ const decoded = Buffer.from(keyJsonBase64, "base64").toString("utf-8");
102479
+ return JSON.parse(decoded);
102480
+ }
102448
102481
  var inputSchema61 = z63.object({
102449
102482
  toolUseIntent: z63.string().optional().describe(
102450
102483
  "Brief description of what you intend to accomplish with this tool call"
102451
102484
  ),
102452
102485
  connectionId: z63.string().describe("ID of the Gmail service account connection to use"),
102453
- method: z63.enum(["GET"]).describe("HTTP method (read-only, GET only)"),
102486
+ method: z63.enum(["GET", "POST", "PUT", "PATCH", "DELETE"]).describe("HTTP method"),
102454
102487
  path: z63.string().describe(
102455
- "API path appended to https://gmail.googleapis.com/gmail/v1/users (e.g., '/me/messages', '/me/messages/{id}', '/me/labels'). Use '/me' as the userId."
102488
+ "API path appended to https://gmail.googleapis.com/gmail/v1/users (e.g., '/me/messages', '/me/messages/{id}', '/me/labels'). Use '/me' as the userId \u2014 the impersonated user."
102489
+ ),
102490
+ subject: z63.string().describe(
102491
+ "Email of the Workspace user to impersonate via Domain-wide Delegation. The token will be issued as this user."
102492
+ ),
102493
+ scopes: z63.array(z63.string()).describe(
102494
+ "OAuth scopes the token must include. This connector currently supports read-only operations only \u2014 pass ['https://www.googleapis.com/auth/gmail.readonly']. Per-endpoint scope reference: https://developers.google.com/gmail/api/auth/scopes"
102456
102495
  ),
102457
102496
  queryParams: z63.record(z63.string(), z63.string()).optional().describe(
102458
102497
  "Query parameters to append to the URL (e.g., { q: 'from:example@gmail.com', maxResults: '10' })"
102459
- )
102498
+ ),
102499
+ body: z63.record(z63.string(), z63.unknown()).optional().describe("JSON request body for POST/PUT/PATCH")
102460
102500
  });
102461
102501
  var outputSchema61 = z63.discriminatedUnion("success", [
102462
102502
  z63.object({
@@ -102466,17 +102506,16 @@ var outputSchema61 = z63.discriminatedUnion("success", [
102466
102506
  }),
102467
102507
  z63.object({
102468
102508
  success: z63.literal(false),
102469
- error: z63.string()
102509
+ error: z63.string(),
102510
+ serviceAccountEmail: z63.string().optional()
102470
102511
  })
102471
102512
  ]);
102472
- var requestTool35 = new ConnectorTool({
102473
- name: "request",
102474
- description: `Send authenticated GET requests to the Gmail API v1.
102475
- Authentication is handled automatically using a service account with domain-wide delegation.
102476
- All paths are relative to https://gmail.googleapis.com/gmail/v1/users. Use '/me' as the userId prefix (e.g., '/me/messages').`,
102513
+ var requestWithDelegationTool2 = new ConnectorTool({
102514
+ name: "request_with_delegation",
102515
+ 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 DwD to be authorized for the service account in the Workspace admin console.",
102477
102516
  inputSchema: inputSchema61,
102478
102517
  outputSchema: outputSchema61,
102479
- async execute({ connectionId, method, path: path5, queryParams }, connections) {
102518
+ async execute({ connectionId, method, path: path5, subject, scopes, queryParams, body }, connections) {
102480
102519
  const connection = connections.find((c6) => c6.id === connectionId);
102481
102520
  if (!connection) {
102482
102521
  return {
@@ -102484,28 +102523,37 @@ All paths are relative to https://gmail.googleapis.com/gmail/v1/users. Use '/me'
102484
102523
  error: `Connection ${connectionId} not found`
102485
102524
  };
102486
102525
  }
102526
+ const keyJsonBase64 = parameters50.serviceAccountKeyJsonBase64.getValue(connection);
102527
+ let serviceAccount;
102528
+ try {
102529
+ serviceAccount = decodeServiceAccount3(keyJsonBase64);
102530
+ } catch (err) {
102531
+ const msg = err instanceof Error ? err.message : String(err);
102532
+ return {
102533
+ success: false,
102534
+ error: `Failed to decode service account key: ${msg}`
102535
+ };
102536
+ }
102537
+ const serviceAccountEmail = serviceAccount.client_email;
102487
102538
  console.log(
102488
- `[connector-request] gmail/${connection.name}: ${method} ${path5}`
102539
+ `[connector-request] gmail/${connection.name}: ${method} ${path5} subject=${subject}`
102489
102540
  );
102490
102541
  try {
102491
102542
  const { GoogleAuth } = await import("google-auth-library");
102492
- const keyJsonBase64 = parameters50.serviceAccountKeyJsonBase64.getValue(connection);
102493
- const delegatedUserEmail = delegatedUserEmailParameter.getValue(connection);
102494
- const credentials = JSON.parse(
102495
- Buffer.from(keyJsonBase64, "base64").toString("utf-8")
102496
- );
102497
102543
  const auth = new GoogleAuth({
102498
- credentials,
102499
- scopes: ["https://www.googleapis.com/auth/gmail.readonly"],
102500
- clientOptions: {
102501
- subject: delegatedUserEmail
102502
- }
102544
+ credentials: {
102545
+ client_email: serviceAccount.client_email,
102546
+ private_key: serviceAccount.private_key
102547
+ },
102548
+ scopes,
102549
+ clientOptions: { subject }
102503
102550
  });
102504
102551
  const token = await auth.getAccessToken();
102505
102552
  if (!token) {
102506
102553
  return {
102507
102554
  success: false,
102508
- error: "Failed to obtain access token"
102555
+ error: "Failed to obtain access token",
102556
+ serviceAccountEmail
102509
102557
  };
102510
102558
  }
102511
102559
  let url = `${BASE_URL28}${path5.startsWith("/") ? "" : "/"}${path5}`;
@@ -102516,18 +102564,25 @@ All paths are relative to https://gmail.googleapis.com/gmail/v1/users. Use '/me'
102516
102564
  const controller = new AbortController();
102517
102565
  const timeout = setTimeout(() => controller.abort(), REQUEST_TIMEOUT_MS46);
102518
102566
  try {
102567
+ const hasBody = body != null && ["POST", "PUT", "PATCH"].includes(method);
102519
102568
  const response = await fetch(url, {
102520
102569
  method,
102521
102570
  headers: {
102522
102571
  Authorization: `Bearer ${token}`,
102523
102572
  "Content-Type": "application/json"
102524
102573
  },
102574
+ body: hasBody ? JSON.stringify(body) : void 0,
102525
102575
  signal: controller.signal
102526
102576
  });
102527
- const data = await response.json();
102577
+ const data = await response.json().catch(() => ({}));
102528
102578
  if (!response.ok) {
102529
- const errorMessage = typeof data?.error === "string" ? data.error : typeof data?.message === "string" ? data.message : `HTTP ${response.status} ${response.statusText}`;
102530
- return { success: false, error: errorMessage };
102579
+ const errorObj = data?.error;
102580
+ const errorMessage = errorObj?.message ?? (typeof data?.message === "string" ? data.message : `HTTP ${response.status} ${response.statusText}`);
102581
+ return {
102582
+ success: false,
102583
+ error: errorMessage,
102584
+ serviceAccountEmail
102585
+ };
102531
102586
  }
102532
102587
  return { success: true, status: response.status, data };
102533
102588
  } finally {
@@ -102535,79 +102590,92 @@ All paths are relative to https://gmail.googleapis.com/gmail/v1/users. Use '/me'
102535
102590
  }
102536
102591
  } catch (err) {
102537
102592
  const msg = err instanceof Error ? err.message : String(err);
102538
- return { success: false, error: msg };
102593
+ return {
102594
+ success: false,
102595
+ error: msg,
102596
+ serviceAccountEmail
102597
+ };
102539
102598
  }
102540
102599
  }
102541
102600
  });
102542
102601
 
102543
102602
  // ../connectors/src/connectors/gmail/setup.ts
102544
- var requestToolName8 = `gmail-service-account_${requestTool35.name}`;
102603
+ var requestWithDelegationToolName2 = `gmail-service-account_${requestWithDelegationTool2.name}`;
102604
+ var READONLY_SCOPES2 = '["https://www.googleapis.com/auth/gmail.readonly"]';
102545
102605
  var gmailOnboarding = new ConnectorOnboarding({
102546
102606
  connectionSetupInstructions: {
102547
- ja: `\u4EE5\u4E0B\u306E\u624B\u9806\u3067Gmail\uFF08\u30B5\u30FC\u30D3\u30B9\u30A2\u30AB\u30A6\u30F3\u30C8\uFF09\u30B3\u30CD\u30AF\u30B7\u30E7\u30F3\u306E\u30BB\u30C3\u30C8\u30A2\u30C3\u30D7\u3092\u884C\u3063\u3066\u304F\u3060\u3055\u3044\u3002\u63A5\u7D9A\u4F5C\u6210\u6642\u306B\u306F\u30B5\u30FC\u30D3\u30B9\u30A2\u30AB\u30A6\u30F3\u30C8JSON\u306E\u307F\u304C\u8A2D\u5B9A\u6E08\u307F\u3067\u3001\u59D4\u4EFB\u5BFE\u8C61\u306E\u30E1\u30FC\u30EB\u30A2\u30C9\u30EC\u30B9\u306F\u3053\u306E\u30BB\u30C3\u30C8\u30A2\u30C3\u30D7\u4E2D\u306B\u53D6\u5F97\u3057\u307E\u3059\u3002
102607
+ ja: `Gmail\uFF08\u30B5\u30FC\u30D3\u30B9\u30A2\u30AB\u30A6\u30F3\u30C8\uFF09\u30B3\u30CD\u30AF\u30B7\u30E7\u30F3\u306E\u30BB\u30C3\u30C8\u30A2\u30C3\u30D7\u3092\u884C\u3044\u307E\u3059\u3002\u30A2\u30AF\u30BB\u30B9\u5BFE\u8C61\u306E Workspace \u30E6\u30FC\u30B6\u30FC\u3092\u30E6\u30FC\u30B6\u30FC\u304B\u3089\u805E\u304D\u3001Project Knowledge \u306B\u8A18\u9332\u3057\u307E\u3059\u3002
102548
102608
 
102549
- 1. \`askUserQuestion\` \u3067\u3001\u30B5\u30FC\u30D3\u30B9\u30A2\u30AB\u30A6\u30F3\u30C8\u304CDomain-wide Delegation\u3067\u4EE3\u7406\u30A2\u30AF\u30BB\u30B9\u3059\u308BGoogle Workspace\u30E6\u30FC\u30B6\u30FC\u306E\u30E1\u30FC\u30EB\u30A2\u30C9\u30EC\u30B9\u3092\u30D2\u30A2\u30EA\u30F3\u30B0\u3059\u308B:
102609
+ 1. \`askUserQuestion\` \u3067\u5BFE\u8C61\u30E1\u30FC\u30EB\u30A2\u30C9\u30EC\u30B9\u3092\u805E\u304F:
102550
102610
  - \`type\`: \`"freeText"\`
102551
- - \`question\`: \u300CGmail\u3092\u53C2\u7167\u3059\u308BGoogle Workspace\u30E6\u30FC\u30B6\u30FC\u306E\u30E1\u30FC\u30EB\u30A2\u30C9\u30EC\u30B9\u3092\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044\u300D
102552
- - \`placeholder\`: \`"user@example.com"\`
102553
- 2. \u53D7\u3051\u53D6\u3063\u305F\u30E1\u30FC\u30EB\u30A2\u30C9\u30EC\u30B9\u3092 \`updateConnectionParameters\` \u3067\u4FDD\u5B58\u3059\u308B:
102554
- - \`parameterSlug\`: \`"delegated-user-email"\`
102555
- - \`options\`: \`[{ value: <\u5165\u529B\u3055\u308C\u305F\u30E1\u30FC\u30EB\u30A2\u30C9\u30EC\u30B9>, label: <\u540C\u3058\u5024> }]\`\uFF081\u4EF6\u306E\u307F\u306E\u30AA\u30D7\u30B7\u30E7\u30F3\u306F\u81EA\u52D5\u9078\u629E\u3055\u308C\u308B\uFF09
102556
- 3. \`${requestToolName8}\` \u3092\u547C\u3073\u51FA\u3057\u3066\u30E6\u30FC\u30B6\u30FC\u306E\u30D7\u30ED\u30D5\u30A3\u30FC\u30EB\u3092\u53D6\u5F97\u3059\u308B:
102611
+ - \`question\`: \u300CGmail \u3092\u53C2\u7167\u3059\u308B Google Workspace \u30E6\u30FC\u30B6\u30FC\u306E\u30E1\u30FC\u30EB\u30A2\u30C9\u30EC\u30B9\u3092\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044\uFF08\u8907\u6570\u53EF\u3001\u30AB\u30F3\u30DE\u533A\u5207\u308A\uFF09\u300D
102612
+ - \`placeholder\`: \`"alice@example.com, bob@example.com"\`
102613
+
102614
+ 2. \u30E6\u30FC\u30B6\u30FC\u304B\u3089\u53D7\u3051\u53D6\u3063\u305F\u6587\u5B57\u5217\u304B\u3089\u30E1\u30FC\u30EB\u30A2\u30C9\u30EC\u30B9\u3092\u62BD\u51FA\u3059\u308B\u3002\u5404 \`<email>\` \u306B\u3064\u3044\u3066 \`${requestWithDelegationToolName2}\` \u3092\u4EE5\u4E0B\u306E\u5F15\u6570\u3067\u547C\u3073\u3001Domain-wide Delegation \u7D4C\u7531\u3067\u30A2\u30AF\u30BB\u30B9\u53EF\u80FD\u304B\u3092\u78BA\u8A8D\u3059\u308B:
102557
102615
  - \`method\`: \`"GET"\`
102558
102616
  - \`path\`: \`"/me/profile"\`
102559
- 4. \u30A8\u30E9\u30FC\u304C\u8FD4\u3055\u308C\u305F\u5834\u5408\u3001\u4EE5\u4E0B\u3092\u78BA\u8A8D\u3059\u308B\u3088\u3046\u30E6\u30FC\u30B6\u30FC\u306B\u4F1D\u3048\u308B:
102560
- - \u30B5\u30FC\u30D3\u30B9\u30A2\u30AB\u30A6\u30F3\u30C8\u306E\u30C9\u30E1\u30A4\u30F3\u5168\u4F53\u306E\u59D4\u4EFB\u304C\u6709\u52B9\u304B
102561
- - Google Workspace\u7BA1\u7406\u30B3\u30F3\u30BD\u30FC\u30EB\u3067Gmail API\u30B9\u30B3\u30FC\u30D7\u304C\u8A31\u53EF\u3055\u308C\u3066\u3044\u308B\u304B
102562
- - \u5165\u529B\u3055\u308C\u305F\u30E1\u30FC\u30EB\u30A2\u30C9\u30EC\u30B9\u304C\u6B63\u3057\u3044\u304B
102563
- 5. \`${requestToolName8}\` \u3092\u547C\u3073\u51FA\u3057\u3066\u30E9\u30D9\u30EB\u4E00\u89A7\u3092\u53D6\u5F97\u3059\u308B:
102564
- - \`method\`: \`"GET"\`
102565
- - \`path\`: \`"/me/labels"\`
102617
+ - \`subject\`: \`<email>\`
102618
+ - \`scopes\`: \`${READONLY_SCOPES2}\`
102619
+
102620
+ 3. \u5931\u6557\u3057\u305F\u30E1\u30FC\u30EB\u30A2\u30C9\u30EC\u30B9\u304C\u3042\u308C\u3070\u3001\u30A8\u30E9\u30FC\u30EC\u30B9\u30DD\u30F3\u30B9\u306E \`serviceAccountEmail\` \u30D5\u30A3\u30FC\u30EB\u30C9\u304B\u3089\u30B5\u30FC\u30D3\u30B9\u30A2\u30AB\u30A6\u30F3\u30C8\u306E\u30E1\u30FC\u30EB\u30A2\u30C9\u30EC\u30B9\u3092\u53D6\u308A\u51FA\u3057\u3001\`askUserQuestion\` \u3067\u6B21\u306E\u9078\u629E\u80A2\u3092\u63D0\u793A\u3059\u308B\u3002\`question\` \u306B\u306F\u6B21\u306E\u6848\u5185\u6587\u3092\u542B\u3081\u308B: \u300C\u6B21\u306E\u30E1\u30FC\u30EB\u30A2\u30C9\u30EC\u30B9\u306B\u30A2\u30AF\u30BB\u30B9\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F: {\u5931\u6557\u30A2\u30C9\u30EC\u30B9\u4E00\u89A7}\u3002\u30B5\u30FC\u30D3\u30B9\u30A2\u30AB\u30A6\u30F3\u30C8 \`<serviceAccountEmail>\` \u306E Domain-wide Delegation \u304C Workspace \u7BA1\u7406\u30B3\u30F3\u30BD\u30FC\u30EB\u3067\u627F\u8A8D\u3055\u308C\u3066\u3044\u308B\u304B\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\uFF08[\u8A2D\u5B9A\u30AC\u30A4\u30C9](https://support.google.com/a/answer/162106)\uFF09\u300D\u3002
102621
+ - \`options\`: \`[{ label: "DwD \u3092\u627F\u8A8D\u3057\u305F\u306E\u3067\u30EA\u30C8\u30E9\u30A4", value: "retry" }, { label: "\u30E1\u30FC\u30EB\u30A2\u30C9\u30EC\u30B9\u3092\u5165\u529B\u3057\u76F4\u3059", value: "restart" }]\`
102622
+ - \u300C\u30EA\u30C8\u30E9\u30A4\u300D: \u76F4\u524D\u306E\u30E1\u30FC\u30EB\u30A2\u30C9\u30EC\u30B9\u30EA\u30B9\u30C8\u3067\u30B9\u30C6\u30C3\u30D7 2 \u3092\u518D\u5B9F\u884C
102623
+ - \u300C\u5165\u529B\u3057\u76F4\u3059\u300D: \u30B9\u30C6\u30C3\u30D7 1 \u304B\u3089\u518D\u5B9F\u884C
102624
+
102625
+ 4. \u5168\u30A2\u30C9\u30EC\u30B9\u304C\u6210\u529F\u3057\u305F\u3089 \`finalizeSetup\` \u3092\u547C\u3076\u3002\`projectKnowledge\` \u306E \`#### \u30B9\u30B3\u30FC\u30D7\` \u7BC0\u306B\u5404\u30E1\u30FC\u30EB\u30A2\u30C9\u30EC\u30B9\u3092 1 \u884C\u305A\u3064\u5217\u6319\u3059\u308B:
102626
+ - \`- subject: alice@example.com\`
102627
+ - \`- subject: bob@example.com\`
102566
102628
 
102567
102629
  #### \u5236\u7D04
102568
- - **\u30BB\u30C3\u30C8\u30A2\u30C3\u30D7\u4E2D\u306B\u30E1\u30C3\u30BB\u30FC\u30B8\u672C\u6587\u3092\u8AAD\u307F\u53D6\u3089\u306A\u3044\u3053\u3068**\u3002\u5B9F\u884C\u3057\u3066\u3088\u3044\u306E\u306F\u4E0A\u8A18\u624B\u9806\u3067\u6307\u5B9A\u3055\u308C\u305F\u30D7\u30ED\u30D5\u30A3\u30FC\u30EB\u53D6\u5F97\u3068\u30E9\u30D9\u30EB\u4E00\u89A7\u53D6\u5F97\u306E\u307F
102569
- - \u30C4\u30FC\u30EB\u9593\u306F1\u6587\u3060\u3051\u66F8\u3044\u3066\u5373\u6B21\u306E\u30C4\u30FC\u30EB\u547C\u3073\u51FA\u3057\u3002\u4E0D\u8981\u306A\u8AAC\u660E\u306F\u7701\u7565\u3057\u3001\u52B9\u7387\u7684\u306B\u9032\u3081\u308B`,
102570
- en: `Follow these steps to set up the Gmail (Service Account) connection. Only the service account JSON is provided at connection creation time \u2014 the delegated user email is collected during this setup flow.
102630
+ - \u30BB\u30C3\u30C8\u30A2\u30C3\u30D7\u4E2D\u306B\u30E1\u30C3\u30BB\u30FC\u30B8\u672C\u6587\u3092\u8AAD\u307F\u53D6\u3089\u306A\u3044\u3053\u3068\u3002\u8A31\u53EF\u3055\u308C\u3066\u3044\u308B\u306E\u306F\u30B9\u30C6\u30C3\u30D7 2 \u306E \`/me/profile\` \u78BA\u8A8D\u306E\u307F
102631
+ - \u30C4\u30FC\u30EB\u547C\u3073\u51FA\u3057\u306E\u9593\u306F 1 \u6587\u3060\u3051\u66F8\u3044\u3066\u5373\u6B21\u306E\u30C4\u30FC\u30EB\u547C\u3073\u51FA\u3057`,
102632
+ en: `Set up the Gmail (Service Account) connection. Ask the user which Workspace users to access, verify each via Domain-wide Delegation, and record them in Project Knowledge.
102571
102633
 
102572
- 1. Call \`askUserQuestion\` to ask the user for the Google Workspace user email the service account will impersonate via Domain-wide Delegation:
102634
+ 1. Call \`askUserQuestion\` to collect target emails:
102573
102635
  - \`type\`: \`"freeText"\`
102574
- - \`question\`: "Please enter the email address of the Google Workspace user whose Gmail mailbox you want to access"
102575
- - \`placeholder\`: \`"user@example.com"\`
102576
- 2. Save the email via \`updateConnectionParameters\`:
102577
- - \`parameterSlug\`: \`"delegated-user-email"\`
102578
- - \`options\`: \`[{ value: <entered email>, label: <same value> }]\` (a single option is auto-selected)
102579
- 3. Call \`${requestToolName8}\` to get the user's profile:
102636
+ - \`question\`: "Enter the Google Workspace user email(s) whose Gmail mailbox you want to access (comma-separated for multiple)"
102637
+ - \`placeholder\`: \`"alice@example.com, bob@example.com"\`
102638
+
102639
+ 2. Extract individual emails from the response. For each \`<email>\`, verify Domain-wide Delegation access by calling \`${requestWithDelegationToolName2}\`:
102580
102640
  - \`method\`: \`"GET"\`
102581
102641
  - \`path\`: \`"/me/profile"\`
102582
- 4. If an error is returned, ask the user to verify:
102583
- - Domain-wide delegation is enabled for the service account
102584
- - Gmail API scope is authorized in Google Workspace admin console
102585
- - The entered email address is correct
102586
- 5. Call \`${requestToolName8}\` to get the label list:
102587
- - \`method\`: \`"GET"\`
102588
- - \`path\`: \`"/me/labels"\`
102642
+ - \`subject\`: \`<email>\`
102643
+ - \`scopes\`: \`${READONLY_SCOPES2}\`
102644
+
102645
+ 3. For any failed email, take \`serviceAccountEmail\` from the error response and call \`askUserQuestion\`. Include this guidance in \`question\`: "Could not access Gmail for {failed emails}. Verify Domain-wide Delegation for service account \`<serviceAccountEmail>\` in the Workspace admin console ([setup guide](https://support.google.com/a/answer/162106))".
102646
+ - \`options\`: \`[{ label: "Authorized DwD \u2014 retry", value: "retry" }, { label: "Re-enter the email addresses", value: "restart" }]\`
102647
+ - On "retry" \u2192 re-run step 2 with the previously entered email list
102648
+ - On "Re-enter" \u2192 re-run step 1
102649
+
102650
+ 4. Once every email succeeds, call \`finalizeSetup\`. Under \`#### \u30B9\u30B3\u30FC\u30D7\` in \`projectKnowledge\`, list each email on its own line:
102651
+ - \`- subject: alice@example.com\`
102652
+ - \`- subject: bob@example.com\`
102589
102653
 
102590
102654
  #### Constraints
102591
- - **Do NOT read message bodies during setup**. Only the profile and label list requests specified above are allowed
102592
- - Write only 1 sentence between tool calls, then immediately call the next tool. Skip unnecessary explanations and proceed efficiently`
102655
+ - Do NOT read message bodies during setup. Only the \`/me/profile\` verification is permitted
102656
+ - Write at most 1 sentence between tool calls`
102593
102657
  },
102594
102658
  dataOverviewInstructions: {
102595
- en: `1. Call gmail-service-account_request with GET /me/labels to list all labels
102596
- 2. Call gmail-service-account_request with GET /me/messages?maxResults=5 to get recent message IDs
102597
- 3. Call gmail-service-account_request with GET /me/messages/{id}?format=metadata for each message to see subjects and senders`,
102598
- ja: `1. gmail-service-account_request \u3067 GET /me/labels \u3092\u547C\u3073\u51FA\u3057\u3001\u5168\u30E9\u30D9\u30EB\u4E00\u89A7\u3092\u53D6\u5F97
102599
- 2. gmail-service-account_request \u3067 GET /me/messages?maxResults=5 \u3092\u547C\u3073\u51FA\u3057\u3001\u6700\u65B0\u30E1\u30C3\u30BB\u30FC\u30B8ID\u3092\u53D6\u5F97
102600
- 3. \u5404\u30E1\u30C3\u30BB\u30FC\u30B8\u306B\u3064\u3044\u3066 gmail-service-account_request \u3067 GET /me/messages/{id}?format=metadata \u3092\u547C\u3073\u51FA\u3057\u3001\u4EF6\u540D\u3068\u9001\u4FE1\u8005\u3092\u78BA\u8A8D`
102659
+ en: `Pick ONE email from \`#### \u30B9\u30B3\u30FC\u30D7\` (a \`- subject: <email>\` line) and use it as \`subject\` for every call below. Pass \`scopes: ${READONLY_SCOPES2}\` every time.
102660
+
102661
+ 1. \`method=GET\`, \`path=/me/labels\` to list labels.
102662
+ 2. \`method=GET\`, \`path=/me/messages?maxResults=5\` to fetch recent message IDs.
102663
+ 3. For each message id, \`method=GET\`, \`path=/me/messages/{id}?format=metadata\`.`,
102664
+ ja: `\`#### \u30B9\u30B3\u30FC\u30D7\` \u306E \`- subject: <email>\` \u884C\u304B\u3089 1 \u3064\u9078\u3073\u3001\u4EE5\u4E0B\u306E\u30B9\u30C6\u30C3\u30D7\u3067 \`subject\` \u5F15\u6570\u3068\u3057\u3066\u4F7F\u3063\u3066\u304F\u3060\u3055\u3044\u3002\`scopes\` \u306F\u6BCE\u56DE \`${READONLY_SCOPES2}\` \u3092\u6E21\u3057\u307E\u3059\u3002
102665
+
102666
+ 1. \`method=GET\`\u3001\`path=/me/labels\` \u3067\u30E9\u30D9\u30EB\u4E00\u89A7\u3092\u53D6\u5F97
102667
+ 2. \`method=GET\`\u3001\`path=/me/messages?maxResults=5\` \u3067\u6700\u8FD1\u306E\u30E1\u30C3\u30BB\u30FC\u30B8 ID \u3092\u53D6\u5F97
102668
+ 3. \u5404\u30E1\u30C3\u30BB\u30FC\u30B8 ID \u306B\u3064\u3044\u3066 \`method=GET\`\u3001\`path=/me/messages/{id}?format=metadata\``
102601
102669
  }
102602
102670
  });
102603
102671
 
102604
102672
  // ../connectors/src/connectors/gmail/index.ts
102605
- var tools50 = { request: requestTool35 };
102673
+ var tools50 = { request_with_delegation: requestWithDelegationTool2 };
102606
102674
  var gmailConnector = new ConnectorPlugin({
102607
102675
  slug: "gmail",
102608
102676
  authType: AUTH_TYPES.SERVICE_ACCOUNT,
102609
102677
  name: "Gmail",
102610
- description: "Connect to Gmail for email data access using a service account with domain-wide delegation. Read-only access to messages, threads, and labels.",
102678
+ description: "Connect to Gmail for email data access using a service account with domain-wide delegation. Currently read-only (messages, threads, labels).",
102611
102679
  iconUrl: "https://images.ctfassets.net/9ncizv60xc5y/4V3rfaSc1ksFIt2eHBNIwJ/7f3be41a154a6d96dcf229ed0e5858c9/Gmail_icon__2020_.svg.png",
102612
102680
  parameters: parameters50,
102613
102681
  releaseFlag: { dev1: true, dev2: true, prod: true },
@@ -102615,12 +102683,22 @@ var gmailConnector = new ConnectorPlugin({
102615
102683
  systemPrompt: {
102616
102684
  en: `### Tools
102617
102685
 
102618
- - \`gmail-service-account_request\`: The only way to call the Gmail API (read-only). Use it to list messages, get message details, list labels, list threads, and get user profile. Authentication is handled automatically using a service account with domain-wide delegation.
102686
+ - \`gmail-service-account_request_with_delegation\`: Call the Gmail API on behalf of the specified Workspace user via Domain-wide Delegation. Pass \`subject\` as the target user email; the token will be issued as that user. The set of users this connection works with is recorded in the project knowledge under "#### \u30B9\u30B3\u30FC\u30D7" as \`- subject: <email>\` lines \u2014 read those and pick a subject before calling. Always pass \`scopes\`.
102687
+
102688
+ ### OAuth Scopes (pass as \`scopes\` argument)
102689
+
102690
+ This connector is currently read-only. Pass:
102691
+
102692
+ - \`https://www.googleapis.com/auth/gmail.readonly\` \u2014 read-only access (profile, labels, messages, threads)
102693
+
102694
+ The Workspace admin must have authorized this scope for the service account in the Domain-wide Delegation settings, otherwise token issuance will fail with \`unauthorized_client\`.
102695
+
102696
+ Per-endpoint scope reference: https://developers.google.com/gmail/api/auth/scopes
102619
102697
 
102620
102698
  ### Gmail API Reference
102621
102699
 
102622
102700
  #### Available Endpoints
102623
- - GET \`/me/profile\` \u2014 Get the delegated user's profile (email address, total messages/threads)
102701
+ - GET \`/me/profile\` \u2014 Get the impersonated user's profile (email address, total messages/threads)
102624
102702
  - GET \`/me/labels\` \u2014 List all labels in the mailbox
102625
102703
  - GET \`/me/labels/{id}\` \u2014 Get details for a specific label
102626
102704
  - GET \`/me/messages\` \u2014 List messages (returns IDs only; use format param on individual messages)
@@ -102645,7 +102723,7 @@ var gmailConnector = new ConnectorPlugin({
102645
102723
  - \`raw\` \u2014 Full RFC 2822 formatted message in base64url
102646
102724
 
102647
102725
  #### Tips
102648
- - Always use \`/me\` as the userId \u2014 it refers to the delegated user
102726
+ - Always use \`/me\` as the userId in the path \u2014 it refers to the user you passed as \`subject\`
102649
102727
  - List endpoints return only IDs; fetch individual resources for details
102650
102728
  - Use \`format=metadata\` to efficiently get subject/sender without full body
102651
102729
  - Message body content is base64url encoded in \`payload.body.data\` or nested \`payload.parts[].body.data\`
@@ -102656,6 +102734,12 @@ var gmailConnector = new ConnectorPlugin({
102656
102734
 
102657
102735
  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.
102658
102736
 
102737
+ SDK methods (client created via \`connection(connectionId)\`):
102738
+
102739
+ - \`client.requestWithDelegation(path, { subject, scopes, init? })\` \u2014 call the Gmail API as the impersonated Workspace user via Domain-wide Delegation. Pass the minimum scopes required by the endpoint.
102740
+
102741
+ The method returns a standard \`Response\`. Read the body with \`.json()\`. Same path conventions as the tool.
102742
+
102659
102743
  #### Example
102660
102744
 
102661
102745
  \`\`\`ts
@@ -102663,37 +102747,51 @@ import { connection } from "@squadbase/vite-server/connectors/gmail";
102663
102747
 
102664
102748
  const gmail = connection("<connectionId>");
102665
102749
 
102666
- // Get user profile
102667
- const profile = await gmail.getProfile();
102750
+ // Pick the impersonated user from project knowledge ("#### \u30B9\u30B3\u30FC\u30D7").
102751
+ const subject = "alice@example.com";
102752
+ const READ = ["https://www.googleapis.com/auth/gmail.readonly"];
102753
+
102754
+ const profileRes = await gmail.requestWithDelegation("/me/profile", {
102755
+ subject,
102756
+ scopes: READ,
102757
+ });
102758
+ const profile = await profileRes.json();
102668
102759
  console.log(profile.emailAddress, profile.messagesTotal);
102669
102760
 
102670
- // List recent messages
102671
- const messages = await gmail.listMessages({ maxResults: 10 });
102672
- for (const msg of messages.messages) {
102673
- const detail = await gmail.getMessage(msg.id, "metadata");
102674
- const subject = detail.payload.headers.find(h => h.name === "Subject")?.value;
102675
- console.log(subject, detail.snippet);
102761
+ const messagesRes = await gmail.requestWithDelegation(
102762
+ "/me/messages?maxResults=10",
102763
+ { subject, scopes: READ },
102764
+ );
102765
+ const messages = await messagesRes.json();
102766
+
102767
+ for (const msg of messages.messages ?? []) {
102768
+ const detailRes = await gmail.requestWithDelegation(
102769
+ \`/me/messages/\${msg.id}?format=metadata\`,
102770
+ { subject, scopes: READ },
102771
+ );
102772
+ const detail = await detailRes.json();
102773
+ const subjectHeader = detail.payload.headers.find(h => h.name === "Subject")?.value;
102774
+ console.log(subjectHeader, detail.snippet);
102676
102775
  }
102776
+ \`\`\``,
102777
+ ja: `### \u30C4\u30FC\u30EB
102677
102778
 
102678
- // Search messages
102679
- const results = await gmail.listMessages({ q: "from:boss@company.com is:unread" });
102779
+ - \`gmail-service-account_request_with_delegation\`: \u6307\u5B9A\u3055\u308C\u305F Workspace \u30E6\u30FC\u30B6\u30FC\u306B\u4EE3\u308F\u3063\u3066 Domain-wide Delegation \u7D4C\u7531\u3067 Gmail API \u3092\u547C\u3073\u51FA\u3057\u307E\u3059\u3002\u4EE3\u7406\u5BFE\u8C61\u306E\u30E1\u30FC\u30EB\u30A2\u30C9\u30EC\u30B9\u3092 \`subject\` \u3068\u3057\u3066\u6E21\u3057\u3066\u304F\u3060\u3055\u3044\u3002\u30C8\u30FC\u30AF\u30F3\u306F\u305D\u306E\u30E6\u30FC\u30B6\u30FC\u3068\u3057\u3066\u767A\u884C\u3055\u308C\u307E\u3059\u3002\u3053\u306E\u30B3\u30CD\u30AF\u30B7\u30E7\u30F3\u304C\u5BFE\u8C61\u3068\u3059\u308B\u30E6\u30FC\u30B6\u30FC\u306F Project Knowledge \u306E "#### \u30B9\u30B3\u30FC\u30D7" \u306B \`- subject: <email>\` \u5F62\u5F0F\u3067\u8A18\u9332\u3055\u308C\u3066\u3044\u308B\u305F\u3081\u3001\u547C\u3073\u51FA\u3057\u524D\u306B\u305D\u3053\u3092\u8AAD\u3093\u3067 subject \u3092\u6C7A\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\u3002\`scopes\` \u3082\u6BCE\u56DE\u6E21\u3057\u3066\u304F\u3060\u3055\u3044\u3002
102680
102780
 
102681
- // List labels
102682
- const labels = await gmail.listLabels();
102683
- labels.labels.forEach(l => console.log(l.name, l.messagesTotal));
102781
+ ### OAuth \u30B9\u30B3\u30FC\u30D7 (\`scopes\` \u5F15\u6570\u3067\u6E21\u3059)
102684
102782
 
102685
- // Get a thread
102686
- const thread = await gmail.getThread("<threadId>");
102687
- thread.messages.forEach(m => console.log(m.snippet));
102688
- \`\`\``,
102689
- ja: `### \u30C4\u30FC\u30EB
102783
+ \u3053\u306E\u30B3\u30CD\u30AF\u30BF\u30FC\u306F\u73FE\u72B6\u8AAD\u307F\u53D6\u308A\u5C02\u7528\u3067\u3059\u3002\u6B21\u3092\u6E21\u3057\u3066\u304F\u3060\u3055\u3044:
102784
+
102785
+ - \`https://www.googleapis.com/auth/gmail.readonly\` \u2014 \u8AAD\u307F\u53D6\u308A\uFF08\u30D7\u30ED\u30D5\u30A3\u30FC\u30EB\u3001\u30E9\u30D9\u30EB\u3001\u30E1\u30C3\u30BB\u30FC\u30B8\u3001\u30B9\u30EC\u30C3\u30C9\uFF09
102690
102786
 
102691
- - \`gmail-service-account_request\`: Gmail API\u3092\u547C\u3073\u51FA\u3059\u552F\u4E00\u306E\u624B\u6BB5\u3067\u3059\uFF08\u8AAD\u307F\u53D6\u308A\u5C02\u7528\uFF09\u3002\u30E1\u30C3\u30BB\u30FC\u30B8\u4E00\u89A7\u306E\u53D6\u5F97\u3001\u30E1\u30C3\u30BB\u30FC\u30B8\u8A73\u7D30\u306E\u53D6\u5F97\u3001\u30E9\u30D9\u30EB\u4E00\u89A7\u3001\u30B9\u30EC\u30C3\u30C9\u4E00\u89A7\u3001\u30E6\u30FC\u30B6\u30FC\u30D7\u30ED\u30D5\u30A3\u30FC\u30EB\u306E\u53D6\u5F97\u306B\u4F7F\u7528\u3057\u307E\u3059\u3002\u30B5\u30FC\u30D3\u30B9\u30A2\u30AB\u30A6\u30F3\u30C8\u306E\u30C9\u30E1\u30A4\u30F3\u5168\u4F53\u306E\u59D4\u4EFB\u3092\u4F7F\u7528\u3057\u3066\u8A8D\u8A3C\u306F\u81EA\u52D5\u7684\u306B\u51E6\u7406\u3055\u308C\u307E\u3059\u3002
102787
+ \u8981\u6C42\u3059\u308B scope \u306F Workspace \u7BA1\u7406\u8005\u304C Domain-wide Delegation \u8A2D\u5B9A\u3067\u5F53\u8A72 Service Account \u306B\u5BFE\u3057\u3066\u627F\u8A8D\u3057\u3066\u3044\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059\u3002\u627F\u8A8D\u3055\u308C\u3066\u3044\u306A\u3044\u5834\u5408\u30C8\u30FC\u30AF\u30F3\u767A\u884C\u304C \`unauthorized_client\` \u3067\u5931\u6557\u3057\u307E\u3059\u3002
102788
+
102789
+ \u30A8\u30F3\u30C9\u30DD\u30A4\u30F3\u30C8\u5225\u306E\u6B63\u78BA\u306A scope \u30EA\u30D5\u30A1\u30EC\u30F3\u30B9: https://developers.google.com/gmail/api/auth/scopes
102692
102790
 
102693
102791
  ### Gmail API \u30EA\u30D5\u30A1\u30EC\u30F3\u30B9
102694
102792
 
102695
102793
  #### \u5229\u7528\u53EF\u80FD\u306A\u30A8\u30F3\u30C9\u30DD\u30A4\u30F3\u30C8
102696
- - GET \`/me/profile\` \u2014 \u59D4\u4EFB\u30E6\u30FC\u30B6\u30FC\u306E\u30D7\u30ED\u30D5\u30A3\u30FC\u30EB\u3092\u53D6\u5F97\uFF08\u30E1\u30FC\u30EB\u30A2\u30C9\u30EC\u30B9\u3001\u30E1\u30C3\u30BB\u30FC\u30B8/\u30B9\u30EC\u30C3\u30C9\u7DCF\u6570\uFF09
102794
+ - GET \`/me/profile\` \u2014 \u4EE3\u7406\u5BFE\u8C61\u30E6\u30FC\u30B6\u30FC\u306E\u30D7\u30ED\u30D5\u30A3\u30FC\u30EB\u3092\u53D6\u5F97\uFF08\u30E1\u30FC\u30EB\u30A2\u30C9\u30EC\u30B9\u3001\u30E1\u30C3\u30BB\u30FC\u30B8/\u30B9\u30EC\u30C3\u30C9\u7DCF\u6570\uFF09
102697
102795
  - GET \`/me/labels\` \u2014 \u30E1\u30FC\u30EB\u30DC\u30C3\u30AF\u30B9\u306E\u5168\u30E9\u30D9\u30EB\u3092\u4E00\u89A7
102698
102796
  - GET \`/me/labels/{id}\` \u2014 \u7279\u5B9A\u30E9\u30D9\u30EB\u306E\u8A73\u7D30\u3092\u53D6\u5F97
102699
102797
  - GET \`/me/messages\` \u2014 \u30E1\u30C3\u30BB\u30FC\u30B8\u4E00\u89A7\uFF08ID\u306E\u307F\u8FD4\u5374\u3002\u500B\u5225\u30E1\u30C3\u30BB\u30FC\u30B8\u3067format\u30D1\u30E9\u30E1\u30FC\u30BF\u3092\u4F7F\u7528\uFF09
@@ -102718,7 +102816,7 @@ thread.messages.forEach(m => console.log(m.snippet));
102718
102816
  - \`raw\` \u2014 base64url\u30A8\u30F3\u30B3\u30FC\u30C9\u3055\u308C\u305F\u5B8C\u5168\u306ARFC 2822\u30D5\u30A9\u30FC\u30DE\u30C3\u30C8\u30E1\u30C3\u30BB\u30FC\u30B8
102719
102817
 
102720
102818
  #### \u30D2\u30F3\u30C8
102721
- - userId\u306B\u306F\u5E38\u306B \`/me\` \u3092\u4F7F\u7528 \u2014 \u59D4\u4EFB\u30E6\u30FC\u30B6\u30FC\u3092\u6307\u3057\u307E\u3059
102819
+ - \u30D1\u30B9\u306E userId \u306B\u306F\u5E38\u306B \`/me\` \u3092\u4F7F\u7528 \u2014 \`subject\` \u306B\u6E21\u3057\u305F\u30E6\u30FC\u30B6\u30FC\u3092\u6307\u3057\u307E\u3059
102722
102820
  - \u4E00\u89A7\u30A8\u30F3\u30C9\u30DD\u30A4\u30F3\u30C8\u306FID\u306E\u307F\u8FD4\u5374\u3057\u307E\u3059\u3002\u8A73\u7D30\u306F\u500B\u5225\u30EA\u30BD\u30FC\u30B9\u3092\u53D6\u5F97\u3057\u3066\u304F\u3060\u3055\u3044
102723
102821
  - \u4EF6\u540D/\u9001\u4FE1\u8005\u3092\u52B9\u7387\u7684\u306B\u53D6\u5F97\u3059\u308B\u306B\u306F \`format=metadata\` \u3092\u4F7F\u7528\u3057\u307E\u3059
102724
102822
  - \u30E1\u30C3\u30BB\u30FC\u30B8\u672C\u6587\u306F \`payload.body.data\` \u307E\u305F\u306F\u30CD\u30B9\u30C8\u3055\u308C\u305F \`payload.parts[].body.data\` \u306Bbase64url\u30A8\u30F3\u30B3\u30FC\u30C9\u3067\u683C\u7D0D\u3055\u308C\u3066\u3044\u307E\u3059
@@ -102729,6 +102827,12 @@ thread.messages.forEach(m => console.log(m.snippet));
102729
102827
 
102730
102828
  \u3053\u306E\u30B3\u30CD\u30AF\u30BF\u306E\u30D3\u30B8\u30CD\u30B9\u30ED\u30B8\u30C3\u30AF\u30BF\u30A4\u30D7\u306F "typescript" \u3067\u3059\u3002\u4EE5\u4E0B\u306B\u793A\u3059\u30B3\u30CD\u30AF\u30BFSDK\u3092\u4F7F\u7528\u3057\u3066\u30CF\u30F3\u30C9\u30E9\u30B3\u30FC\u30C9\u3092\u8A18\u8FF0\u3057\u3066\u304F\u3060\u3055\u3044\u3002\u74B0\u5883\u5909\u6570\u304B\u3089\u76F4\u63A5\u8A8D\u8A3C\u60C5\u5831\u306B\u30A2\u30AF\u30BB\u30B9\u3057\u306A\u3044\u3067\u304F\u3060\u3055\u3044\u3002
102731
102829
 
102830
+ SDK\u30E1\u30BD\u30C3\u30C9 (\`connection(connectionId)\` \u3067\u4F5C\u6210\u3057\u305F\u30AF\u30E9\u30A4\u30A2\u30F3\u30C8):
102831
+
102832
+ - \`client.requestWithDelegation(path, { subject, scopes, init? })\` \u2014 DwD \u3067 Workspace \u30E6\u30FC\u30B6\u30FC\u306B\u306A\u308A\u3059\u307E\u3057\u3066 Gmail API \u3092\u547C\u3076\u3002\u30A8\u30F3\u30C9\u30DD\u30A4\u30F3\u30C8\u306B\u5FC5\u8981\u306A\u6700\u5C0F scope \u3092\u6E21\u3059\u3002
102833
+
102834
+ \u30E1\u30BD\u30C3\u30C9\u306F\u6A19\u6E96\u306E \`Response\` \u3092\u8FD4\u3057\u307E\u3059\u3002\`response.json()\` \u3067\u30DC\u30C7\u30A3\u3092\u53D6\u5F97\u3057\u3066\u304F\u3060\u3055\u3044\u3002\u30D1\u30B9\u306E\u66F8\u304D\u65B9\u306F\u30C4\u30FC\u30EB\u3068\u540C\u3058\u3002
102835
+
102732
102836
  #### Example
102733
102837
 
102734
102838
  \`\`\`ts
@@ -102736,86 +102840,35 @@ import { connection } from "@squadbase/vite-server/connectors/gmail";
102736
102840
 
102737
102841
  const gmail = connection("<connectionId>");
102738
102842
 
102739
- // Get user profile
102740
- const profile = await gmail.getProfile();
102741
- console.log(profile.emailAddress, profile.messagesTotal);
102843
+ // \u4EE3\u7406\u5BFE\u8C61\u30E6\u30FC\u30B6\u30FC\u306F Project Knowledge ("#### \u30B9\u30B3\u30FC\u30D7") \u304B\u3089\u9078\u3076
102844
+ const subject = "alice@example.com";
102845
+ const READ = ["https://www.googleapis.com/auth/gmail.readonly"];
102742
102846
 
102743
- // List recent messages
102744
- const messages = await gmail.listMessages({ maxResults: 10 });
102745
- for (const msg of messages.messages) {
102746
- const detail = await gmail.getMessage(msg.id, "metadata");
102747
- const subject = detail.payload.headers.find(h => h.name === "Subject")?.value;
102748
- console.log(subject, detail.snippet);
102749
- }
102750
-
102751
- // Search messages
102752
- const results = await gmail.listMessages({ q: "from:boss@company.com is:unread" });
102847
+ const profileRes = await gmail.requestWithDelegation("/me/profile", {
102848
+ subject,
102849
+ scopes: READ,
102850
+ });
102851
+ const profile = await profileRes.json();
102852
+ console.log(profile.emailAddress, profile.messagesTotal);
102753
102853
 
102754
- // List labels
102755
- const labels = await gmail.listLabels();
102756
- labels.labels.forEach(l => console.log(l.name, l.messagesTotal));
102854
+ const messagesRes = await gmail.requestWithDelegation(
102855
+ "/me/messages?maxResults=10",
102856
+ { subject, scopes: READ },
102857
+ );
102858
+ const messages = await messagesRes.json();
102757
102859
 
102758
- // Get a thread
102759
- const thread = await gmail.getThread("<threadId>");
102760
- thread.messages.forEach(m => console.log(m.snippet));
102860
+ for (const msg of messages.messages ?? []) {
102861
+ const detailRes = await gmail.requestWithDelegation(
102862
+ \`/me/messages/\${msg.id}?format=metadata\`,
102863
+ { subject, scopes: READ },
102864
+ );
102865
+ const detail = await detailRes.json();
102866
+ const subjectHeader = detail.payload.headers.find(h => h.name === "Subject")?.value;
102867
+ console.log(subjectHeader, detail.snippet);
102868
+ }
102761
102869
  \`\`\``
102762
102870
  },
102763
- tools: tools50,
102764
- async checkConnection(params, _config) {
102765
- const { GoogleAuth } = await import("google-auth-library");
102766
- const credentials = JSON.parse(
102767
- Buffer.from(
102768
- params[parameters50.serviceAccountKeyJsonBase64.slug],
102769
- "base64"
102770
- ).toString("utf-8")
102771
- );
102772
- const delegatedUserEmail = params[delegatedUserEmailParameter.slug];
102773
- if (!delegatedUserEmail) {
102774
- if (!credentials.client_email || !credentials.private_key) {
102775
- return {
102776
- success: false,
102777
- error: "Service account JSON must contain client_email and private_key"
102778
- };
102779
- }
102780
- return { success: true };
102781
- }
102782
- const auth = new GoogleAuth({
102783
- credentials,
102784
- scopes: ["https://www.googleapis.com/auth/gmail.readonly"],
102785
- clientOptions: {
102786
- subject: delegatedUserEmail
102787
- }
102788
- });
102789
- try {
102790
- const token = await auth.getAccessToken();
102791
- if (!token) {
102792
- return {
102793
- success: false,
102794
- error: "Failed to obtain access token"
102795
- };
102796
- }
102797
- const res = await fetch(
102798
- "https://gmail.googleapis.com/gmail/v1/users/me/profile",
102799
- {
102800
- method: "GET",
102801
- headers: { Authorization: `Bearer ${token}` }
102802
- }
102803
- );
102804
- if (!res.ok) {
102805
- const errorText = await res.text().catch(() => res.statusText);
102806
- return {
102807
- success: false,
102808
- error: `Gmail API failed: HTTP ${res.status} ${errorText}`
102809
- };
102810
- }
102811
- return { success: true };
102812
- } catch (error2) {
102813
- return {
102814
- success: false,
102815
- error: error2 instanceof Error ? error2.message : String(error2)
102816
- };
102817
- }
102818
- }
102871
+ tools: tools50
102819
102872
  });
102820
102873
 
102821
102874
  // ../connectors/src/connectors/gmail-oauth/tools/request.ts
@@ -102877,7 +102930,7 @@ var outputSchema62 = z64.discriminatedUnion("success", [
102877
102930
  error: z64.string()
102878
102931
  })
102879
102932
  ]);
102880
- var requestTool36 = new ConnectorTool({
102933
+ var requestTool35 = new ConnectorTool({
102881
102934
  name: "request",
102882
102935
  description: `Send authenticated GET requests to the Gmail API v1.
102883
102936
  Authentication is handled automatically via OAuth proxy.
@@ -102935,7 +102988,7 @@ All paths are relative to https://gmail.googleapis.com/gmail/v1/users. Use '/me'
102935
102988
  });
102936
102989
 
102937
102990
  // ../connectors/src/connectors/gmail-oauth/setup.ts
102938
- var requestToolName9 = `gmail-oauth_${requestTool36.name}`;
102991
+ var requestToolName9 = `gmail-oauth_${requestTool35.name}`;
102939
102992
  var gmailOnboarding2 = new ConnectorOnboarding({
102940
102993
  connectionSetupInstructions: {
102941
102994
  ja: `\u4EE5\u4E0B\u306E\u624B\u9806\u3067Gmail\u30B3\u30CD\u30AF\u30B7\u30E7\u30F3\u306E\u30BB\u30C3\u30C8\u30A2\u30C3\u30D7\u3092\u884C\u3063\u3066\u304F\u3060\u3055\u3044\u3002
@@ -102979,7 +103032,7 @@ var gmailOnboarding2 = new ConnectorOnboarding({
102979
103032
  var parameters51 = {};
102980
103033
 
102981
103034
  // ../connectors/src/connectors/gmail-oauth/index.ts
102982
- var tools51 = { request: requestTool36 };
103035
+ var tools51 = { request: requestTool35 };
102983
103036
  var gmailOauthConnector = new ConnectorPlugin({
102984
103037
  slug: "gmail",
102985
103038
  authType: AUTH_TYPES.OAUTH,
@@ -103414,7 +103467,7 @@ var outputSchema64 = z66.discriminatedUnion("success", [
103414
103467
  error: z66.string()
103415
103468
  })
103416
103469
  ]);
103417
- var requestTool37 = new ConnectorTool({
103470
+ var requestTool36 = new ConnectorTool({
103418
103471
  name: "request",
103419
103472
  description: `Send authenticated requests to the LinkedIn Marketing API (REST).
103420
103473
  Authentication is handled automatically via OAuth proxy.
@@ -103490,7 +103543,7 @@ Required headers (LinkedIn-Version, X-Restli-Protocol-Version) are set automatic
103490
103543
 
103491
103544
  // ../connectors/src/connectors/linkedin-ads/index.ts
103492
103545
  var tools52 = {
103493
- request: requestTool37,
103546
+ request: requestTool36,
103494
103547
  listAdAccounts: listAdAccountsTool3
103495
103548
  };
103496
103549
  var linkedinAdsConnector = new ConnectorPlugin({
@@ -103799,7 +103852,7 @@ var outputSchema65 = z67.discriminatedUnion("success", [
103799
103852
  error: z67.string()
103800
103853
  })
103801
103854
  ]);
103802
- var requestTool38 = new ConnectorTool({
103855
+ var requestTool37 = new ConnectorTool({
103803
103856
  name: "request",
103804
103857
  description: `Send authenticated requests to the Zendesk Support API.
103805
103858
  Authentication is handled automatically using email/token Basic auth.
@@ -103855,7 +103908,7 @@ Zendesk uses cursor-based pagination with page[size] and page[after] parameters.
103855
103908
  });
103856
103909
 
103857
103910
  // ../connectors/src/connectors/zendesk/index.ts
103858
- var tools53 = { request: requestTool38 };
103911
+ var tools53 = { request: requestTool37 };
103859
103912
  var zendeskConnector = new ConnectorPlugin({
103860
103913
  slug: "zendesk",
103861
103914
  authType: AUTH_TYPES.API_KEY,
@@ -104099,7 +104152,7 @@ var outputSchema66 = z68.discriminatedUnion("success", [
104099
104152
  error: z68.string()
104100
104153
  })
104101
104154
  ]);
104102
- var requestTool39 = new ConnectorTool({
104155
+ var requestTool38 = new ConnectorTool({
104103
104156
  name: "request",
104104
104157
  description: `Send authenticated requests to the Zendesk Support API.
104105
104158
  Authentication is handled automatically via OAuth proxy.
@@ -104160,7 +104213,7 @@ Zendesk uses cursor-based pagination with page[size] and page[after] parameters.
104160
104213
  });
104161
104214
 
104162
104215
  // ../connectors/src/connectors/zendesk-oauth/setup.ts
104163
- var requestToolName10 = `zendesk-oauth_${requestTool39.name}`;
104216
+ var requestToolName10 = `zendesk-oauth_${requestTool38.name}`;
104164
104217
  var zendeskOauthOnboarding = new ConnectorOnboarding({
104165
104218
  connectionSetupInstructions: {
104166
104219
  en: `Follow these steps to set up the Zendesk connection.
@@ -104200,7 +104253,7 @@ var zendeskOauthOnboarding = new ConnectorOnboarding({
104200
104253
  var parameters54 = {};
104201
104254
 
104202
104255
  // ../connectors/src/connectors/zendesk-oauth/index.ts
104203
- var tools54 = { request: requestTool39 };
104256
+ var tools54 = { request: requestTool38 };
104204
104257
  var zendeskOauthConnector = new ConnectorPlugin({
104205
104258
  slug: "zendesk",
104206
104259
  authType: AUTH_TYPES.OAUTH,
@@ -104416,7 +104469,7 @@ var outputSchema67 = z69.discriminatedUnion("success", [
104416
104469
  error: z69.string()
104417
104470
  })
104418
104471
  ]);
104419
- var requestTool40 = new ConnectorTool({
104472
+ var requestTool39 = new ConnectorTool({
104420
104473
  name: "request",
104421
104474
  description: `Send authenticated requests to the Intercom API.
104422
104475
  Authentication is handled automatically using the Access Token (Bearer token).
@@ -104472,7 +104525,7 @@ The Intercom-Version header is set to 2.11 automatically.`,
104472
104525
  });
104473
104526
 
104474
104527
  // ../connectors/src/connectors/intercom/index.ts
104475
- var tools55 = { request: requestTool40 };
104528
+ var tools55 = { request: requestTool39 };
104476
104529
  var intercomConnector = new ConnectorPlugin({
104477
104530
  slug: "intercom",
104478
104531
  authType: AUTH_TYPES.API_KEY,
@@ -104737,7 +104790,7 @@ var outputSchema68 = z70.discriminatedUnion("success", [
104737
104790
  error: z70.string()
104738
104791
  })
104739
104792
  ]);
104740
- var requestTool41 = new ConnectorTool({
104793
+ var requestTool40 = new ConnectorTool({
104741
104794
  name: "request",
104742
104795
  description: `Send authenticated requests to the Intercom API.
104743
104796
  Authentication is handled automatically via OAuth proxy.
@@ -104800,7 +104853,7 @@ Search endpoints (contacts/search, conversations/search) use POST with a query o
104800
104853
  });
104801
104854
 
104802
104855
  // ../connectors/src/connectors/intercom-oauth/setup.ts
104803
- var requestToolName11 = `intercom-oauth_${requestTool41.name}`;
104856
+ var requestToolName11 = `intercom-oauth_${requestTool40.name}`;
104804
104857
  var intercomOauthOnboarding = new ConnectorOnboarding({
104805
104858
  connectionSetupInstructions: {
104806
104859
  en: `Follow these steps to set up the Intercom connection.
@@ -104840,7 +104893,7 @@ var intercomOauthOnboarding = new ConnectorOnboarding({
104840
104893
  var parameters56 = {};
104841
104894
 
104842
104895
  // ../connectors/src/connectors/intercom-oauth/index.ts
104843
- var tools56 = { request: requestTool41 };
104896
+ var tools56 = { request: requestTool40 };
104844
104897
  var intercomOauthConnector = new ConnectorPlugin({
104845
104898
  slug: "intercom",
104846
104899
  authType: AUTH_TYPES.OAUTH,
@@ -105092,7 +105145,7 @@ var outputSchema69 = z71.discriminatedUnion("success", [
105092
105145
  error: z71.string()
105093
105146
  })
105094
105147
  ]);
105095
- var requestTool42 = new ConnectorTool({
105148
+ var requestTool41 = new ConnectorTool({
105096
105149
  name: "request",
105097
105150
  description: `Send authenticated requests to the Mixpanel REST API.
105098
105151
  Authentication is handled automatically using Basic auth (Service Account username + secret).
@@ -105186,7 +105239,7 @@ Rate limit: 60 queries/hour, 5 concurrent queries for Query API.`,
105186
105239
  });
105187
105240
 
105188
105241
  // ../connectors/src/connectors/mixpanel/index.ts
105189
- var tools57 = { request: requestTool42 };
105242
+ var tools57 = { request: requestTool41 };
105190
105243
  var mixpanelConnector = new ConnectorPlugin({
105191
105244
  slug: "mixpanel",
105192
105245
  authType: AUTH_TYPES.API_KEY,
@@ -105380,7 +105433,7 @@ var outputSchema70 = z72.discriminatedUnion("success", [
105380
105433
  error: z72.string()
105381
105434
  })
105382
105435
  ]);
105383
- var requestTool43 = new ConnectorTool({
105436
+ var requestTool42 = new ConnectorTool({
105384
105437
  name: "request",
105385
105438
  description: `Send authenticated requests to the Grafana HTTP API.
105386
105439
  Authentication is handled automatically using the configured API Key or Service Account Token via Bearer token.
@@ -105436,7 +105489,7 @@ The path must start with '/' and is appended to the configured Grafana instance
105436
105489
  });
105437
105490
 
105438
105491
  // ../connectors/src/connectors/grafana/index.ts
105439
- var tools58 = { request: requestTool43 };
105492
+ var tools58 = { request: requestTool42 };
105440
105493
  var grafanaConnector = new ConnectorPlugin({
105441
105494
  slug: "grafana",
105442
105495
  authType: AUTH_TYPES.API_KEY,
@@ -105624,7 +105677,7 @@ var outputSchema71 = z73.discriminatedUnion("success", [
105624
105677
  error: z73.string()
105625
105678
  })
105626
105679
  ]);
105627
- var requestTool44 = new ConnectorTool({
105680
+ var requestTool43 = new ConnectorTool({
105628
105681
  name: "request",
105629
105682
  description: `Send authenticated requests to the Backlog REST API (v2).
105630
105683
  Authentication is handled automatically by appending the apiKey query parameter to every request.
@@ -105681,7 +105734,7 @@ Do NOT include the apiKey parameter yourself; it is injected automatically.`,
105681
105734
  });
105682
105735
 
105683
105736
  // ../connectors/src/connectors/backlog/index.ts
105684
- var tools59 = { request: requestTool44 };
105737
+ var tools59 = { request: requestTool43 };
105685
105738
  var backlogConnector = new ConnectorPlugin({
105686
105739
  slug: "backlog",
105687
105740
  authType: AUTH_TYPES.API_KEY,
@@ -105891,7 +105944,7 @@ var outputSchema72 = z74.discriminatedUnion("success", [
105891
105944
  error: z74.string()
105892
105945
  })
105893
105946
  ]);
105894
- var requestTool45 = new ConnectorTool({
105947
+ var requestTool44 = new ConnectorTool({
105895
105948
  name: "request",
105896
105949
  description: `Send authenticated requests to the Gamma REST API.
105897
105950
  Authentication is handled automatically using the API Key (X-API-KEY header).
@@ -106119,7 +106172,7 @@ Gamma does NOT support image uploads. To visualize data, embed raw numbers direc
106119
106172
  });
106120
106173
 
106121
106174
  // ../connectors/src/connectors/gamma/index.ts
106122
- var tools60 = { request: requestTool45, generate: generateTool };
106175
+ var tools60 = { request: requestTool44, generate: generateTool };
106123
106176
  var gammaConnector = new ConnectorPlugin({
106124
106177
  slug: "gamma",
106125
106178
  authType: AUTH_TYPES.API_KEY,
@@ -106342,7 +106395,7 @@ var outputSchema74 = z76.discriminatedUnion("success", [
106342
106395
  error: z76.string()
106343
106396
  })
106344
106397
  ]);
106345
- var requestTool46 = new ConnectorTool({
106398
+ var requestTool45 = new ConnectorTool({
106346
106399
  name: "request",
106347
106400
  description: `Send authenticated requests to the Sentry API.
106348
106401
  Supports GET, POST, PUT, and DELETE methods.
@@ -106399,7 +106452,7 @@ Authentication is handled automatically via Bearer token.
106399
106452
  });
106400
106453
 
106401
106454
  // ../connectors/src/connectors/sentry/index.ts
106402
- var tools61 = { request: requestTool46 };
106455
+ var tools61 = { request: requestTool45 };
106403
106456
  var sentryConnector = new ConnectorPlugin({
106404
106457
  slug: "sentry",
106405
106458
  authType: AUTH_TYPES.API_KEY,
@@ -106688,7 +106741,7 @@ function normalizeInstanceUrl(raw) {
106688
106741
  }
106689
106742
  return trimmed;
106690
106743
  }
106691
- var requestTool47 = new ConnectorTool({
106744
+ var requestTool46 = new ConnectorTool({
106692
106745
  name: "request",
106693
106746
  description: `Send authenticated requests to the Salesforce REST API.
106694
106747
  Authentication is handled automatically using the OAuth 2.0 Client Credentials Flow (External Client App or Connected App Consumer Key + Secret). An access token is obtained on each request, so the tool user only provides the API path.
@@ -106785,7 +106838,7 @@ Prefer SOQL via the /query endpoint for filtered, joined, or aggregated reads ra
106785
106838
  });
106786
106839
 
106787
106840
  // ../connectors/src/connectors/salesforce/index.ts
106788
- var tools62 = { request: requestTool47 };
106841
+ var tools62 = { request: requestTool46 };
106789
106842
  var salesforceConnector = new ConnectorPlugin({
106790
106843
  slug: "salesforce",
106791
106844
  authType: AUTH_TYPES.API_KEY,
@@ -106793,7 +106846,7 @@ var salesforceConnector = new ConnectorPlugin({
106793
106846
  description: "Connect to Salesforce CRM for accounts, contacts, opportunities, leads, cases, and custom objects via SOQL and the REST API.",
106794
106847
  iconUrl: "https://images.ctfassets.net/9ncizv60xc5y/6vZlbrUKhxXIiuvWJlb8YB/bbc5e08b88de46c8ed338a74c7d0abb3/salesforce-icon.png",
106795
106848
  parameters: parameters62,
106796
- releaseFlag: { dev1: true, dev2: false, prod: false },
106849
+ releaseFlag: { dev1: true, dev2: true, prod: true },
106797
106850
  onboarding: salesforceOnboarding,
106798
106851
  systemPrompt: {
106799
106852
  en: `### Tools
@@ -107072,7 +107125,7 @@ var outputSchema76 = z78.discriminatedUnion("success", [
107072
107125
  error: z78.string()
107073
107126
  })
107074
107127
  ]);
107075
- var requestTool48 = new ConnectorTool({
107128
+ var requestTool47 = new ConnectorTool({
107076
107129
  name: "request",
107077
107130
  description: `Send authenticated requests to the InfluxDB HTTP API.
107078
107131
  Authentication is handled automatically using the API token (\`Authorization: Token {token}\`). The instance URL is resolved from the connection.
@@ -107150,7 +107203,7 @@ For read-only data exploration prefer SQL (InfluxDB 3) or InfluxQL queries \u201
107150
107203
  });
107151
107204
 
107152
107205
  // ../connectors/src/connectors/influxdb/index.ts
107153
- var tools63 = { request: requestTool48 };
107206
+ var tools63 = { request: requestTool47 };
107154
107207
  var influxdbConnector = new ConnectorPlugin({
107155
107208
  slug: "influxdb",
107156
107209
  authType: AUTH_TYPES.API_KEY,