@tangle-network/agent-integrations 0.71.0 → 0.73.0

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.
@@ -8056,7 +8056,7 @@ const message = {
8056
8056
  minLength: 1,
8057
8057
  maxLength: 18e3
8058
8058
  };
8059
- const base$11 = declarativeRestConnector({
8059
+ const base$12 = declarativeRestConnector({
8060
8060
  kind: "contiguity",
8061
8061
  displayName: "Contiguity",
8062
8062
  category: "crm",
@@ -8316,14 +8316,14 @@ const base$11 = declarativeRestConnector({
8316
8316
  ]
8317
8317
  });
8318
8318
  const contiguityConnector = {
8319
- ...base$11,
8319
+ ...base$12,
8320
8320
  async executeMutation(inv) {
8321
- if (inv.capabilityName !== "email.send") return base$11.executeMutation(inv);
8321
+ if (inv.capabilityName !== "email.send") return base$12.executeMutation(inv);
8322
8322
  const { body, contentType, ...args } = inv.args;
8323
8323
  if (typeof body !== "string" || !body.length || contentType !== void 0 && contentType !== "text/plain" && contentType !== "text/html") throw new Error("Contiguity email requires a body and supported contentType");
8324
8324
  delete args.text;
8325
8325
  delete args.html;
8326
- return base$11.executeMutation({
8326
+ return base$12.executeMutation({
8327
8327
  ...inv,
8328
8328
  args: {
8329
8329
  ...args,
@@ -8835,7 +8835,7 @@ function transcriptResponse(value) {
8835
8835
  language: "multi"
8836
8836
  };
8837
8837
  }
8838
- const base$10 = declarativeRestConnector({
8838
+ const base$11 = declarativeRestConnector({
8839
8839
  kind: "deepgram",
8840
8840
  displayName: "Deepgram",
8841
8841
  description: "Transcribe audio to text, synthesize text to speech, and analyze audio content with AI-powered speech recognition.",
@@ -9079,10 +9079,10 @@ const base$10 = declarativeRestConnector({
9079
9079
  ]
9080
9080
  });
9081
9081
  const deepgramConnector = {
9082
- ...base$10,
9082
+ ...base$11,
9083
9083
  manifest: {
9084
- ...base$10.manifest,
9085
- capabilities: [...base$10.manifest.capabilities, {
9084
+ ...base$11.manifest,
9085
+ capabilities: [...base$11.manifest.capabilities, {
9086
9086
  name: "transcription.bytes",
9087
9087
  class: "mutation",
9088
9088
  cas: "none",
@@ -9109,7 +9109,7 @@ const deepgramConnector = {
9109
9109
  }]
9110
9110
  },
9111
9111
  async executeMutation(inv) {
9112
- if (inv.capabilityName !== "transcription.bytes") return base$10.executeMutation(inv);
9112
+ if (inv.capabilityName !== "transcription.bytes") return base$11.executeMutation(inv);
9113
9113
  const { bytes, contentType } = privateAudio(inv.args);
9114
9114
  if (inv.source.credentials.kind !== "api-key" || !inv.source.credentials.apiKey || /[\u0000-\u0020\u007f]/.test(inv.source.credentials.apiKey)) throw new IntegrationRuntimeError({
9115
9115
  code: "provider_auth_failed",
@@ -10211,7 +10211,7 @@ const echowinConnector = declarativeRestConnector({
10211
10211
  */
10212
10212
  const ELEVENLABS_BASE_URL = "https://api.elevenlabs.io";
10213
10213
  const MAX_SAMPLE_BYTES = 11e6;
10214
- const base$9 = declarativeRestConnector({
10214
+ const base$10 = declarativeRestConnector({
10215
10215
  kind: "elevenlabs",
10216
10216
  displayName: "ElevenLabs",
10217
10217
  description: "Your own ElevenLabs account: text to speech, voices, instant voice clones of your own voice, speech to text, and conversational voice agents.",
@@ -10328,11 +10328,11 @@ const base$9 = declarativeRestConnector({
10328
10328
  ]
10329
10329
  });
10330
10330
  const elevenlabsConnector = {
10331
- ...base$9,
10331
+ ...base$10,
10332
10332
  manifest: {
10333
- ...base$9.manifest,
10333
+ ...base$10.manifest,
10334
10334
  capabilities: [
10335
- ...base$9.manifest.capabilities,
10335
+ ...base$10.manifest.capabilities,
10336
10336
  {
10337
10337
  name: "voices.clone_instant",
10338
10338
  class: "mutation",
@@ -10443,7 +10443,7 @@ const elevenlabsConnector = {
10443
10443
  ]
10444
10444
  },
10445
10445
  async executeRead(inv) {
10446
- if (inv.capabilityName !== "speech_to_text") return base$9.executeRead(inv);
10446
+ if (inv.capabilityName !== "speech_to_text") return base$10.executeRead(inv);
10447
10447
  const audioUrl = httpsUrl(inv.args.audioUrl, "audioUrl");
10448
10448
  const form = new FormData();
10449
10449
  form.append("model_id", "scribe_v1");
@@ -10511,7 +10511,7 @@ const elevenlabsConnector = {
10511
10511
  idempotentReplay: false
10512
10512
  };
10513
10513
  }
10514
- return base$9.executeMutation(inv);
10514
+ return base$10.executeMutation(inv);
10515
10515
  }
10516
10516
  };
10517
10517
  function invalid(message) {
@@ -51353,7 +51353,7 @@ function mutation$2(name, description, properties, required, path, body) {
51353
51353
  }
51354
51354
  };
51355
51355
  }
51356
- const base$8 = declarativeRestConnector({
51356
+ const base$9 = declarativeRestConnector({
51357
51357
  kind: "meta-ads",
51358
51358
  displayName: "Meta Ads",
51359
51359
  description: "Manage Facebook and Instagram paid traffic campaigns, bounded budgets, ad sets, link creatives, delivery status and insights.",
@@ -51657,9 +51657,9 @@ function prepare$2(inv) {
51657
51657
  };
51658
51658
  }
51659
51659
  const metaAdsConnector = {
51660
- ...base$8,
51660
+ ...base$9,
51661
51661
  async executeRead(inv) {
51662
- const result = await base$8.executeRead(prepare$2(inv));
51662
+ const result = await base$9.executeRead(prepare$2(inv));
51663
51663
  if (isPlainRecord(result.data) && isPlainRecord(result.data.paging)) {
51664
51664
  const { next: _next, previous: _previous, ...paging } = result.data.paging;
51665
51665
  return {
@@ -51673,7 +51673,7 @@ const metaAdsConnector = {
51673
51673
  return result;
51674
51674
  },
51675
51675
  async executeMutation(inv) {
51676
- const result = await base$8.executeMutation(prepare$2(inv));
51676
+ const result = await base$9.executeMutation(prepare$2(inv));
51677
51677
  if (result.status !== "committed") return result;
51678
51678
  const data = result.data;
51679
51679
  if (!(isPlainRecord(data) && !("error" in data) && (inv.capabilityName.includes(".create") ? typeof data.id === "string" && data.id.trim().length > 0 : data.success === true))) throw new Error("meta-ads: missing native mutation receipt; reconcile provider state before retrying");
@@ -51736,7 +51736,7 @@ function write$5(name, description, path, properties, required, body, method = "
51736
51736
  }
51737
51737
  };
51738
51738
  }
51739
- const base$7 = declarativeRestConnector({
51739
+ const base$8 = declarativeRestConnector({
51740
51740
  kind: "x-ads",
51741
51741
  displayName: "X Ads",
51742
51742
  description: "Manage X paid campaigns with total budgets, scheduled line items, targeting, promoted posts, and spend reports.",
@@ -52014,7 +52014,7 @@ const base$7 = declarativeRestConnector({
52014
52014
  ]
52015
52015
  });
52016
52016
  const xAdsConnector = {
52017
- ...base$7,
52017
+ ...base$8,
52018
52018
  async executeMutation(inv) {
52019
52019
  for (const key of [
52020
52020
  "totalBudgetMicros",
@@ -52023,7 +52023,7 @@ const xAdsConnector = {
52023
52023
  ]) if (inv.args[key] !== void 0 && (typeof inv.args[key] !== "string" || !/^[1-9][0-9]*$/.test(inv.args[key]))) throw new Error(`x-ads: ${key} must be positive integer microcurrency`);
52024
52024
  if (typeof inv.args.dailyBudgetMicros === "string" && typeof inv.args.totalBudgetMicros === "string" && BigInt(inv.args.dailyBudgetMicros) > BigInt(inv.args.totalBudgetMicros)) throw new Error("x-ads: daily budget exceeds total budget");
52025
52025
  if (inv.capabilityName === "lineItems.createTraffic" && !(typeof inv.args.startTime === "string" && typeof inv.args.endTime === "string" && Date.parse(inv.args.endTime) > Date.parse(inv.args.startTime))) throw new Error("x-ads: endTime must be after startTime");
52026
- const result = await base$7.executeMutation(inv);
52026
+ const result = await base$8.executeMutation(inv);
52027
52027
  if (result.status === "committed") {
52028
52028
  const envelope = result.data;
52029
52029
  const records = isPlainRecord(envelope) ? Array.isArray(envelope.data) ? envelope.data : [envelope.data] : [];
@@ -52098,7 +52098,7 @@ function mutation$1(name, description, properties, required, path, body) {
52098
52098
  }
52099
52099
  };
52100
52100
  }
52101
- const base$6 = declarativeRestConnector({
52101
+ const base$7 = declarativeRestConnector({
52102
52102
  kind: "tiktok-ads",
52103
52103
  displayName: "TikTok Ads",
52104
52104
  description: "Operate TikTok Marketing API traffic campaigns, lifetime budgets, targeted ad groups, video ads and paid performance reports.",
@@ -52537,18 +52537,18 @@ async function uploadVideo(inv) {
52537
52537
  };
52538
52538
  }
52539
52539
  const tiktokAdsConnector = {
52540
- ...base$6,
52540
+ ...base$7,
52541
52541
  async executeRead(inv) {
52542
52542
  if (inv.capabilityName === "advertisers.list") return discover(inv);
52543
52543
  credentials(inv.source.credentials);
52544
- const result = await base$6.executeRead(prepare$1(inv));
52544
+ const result = await base$7.executeRead(prepare$1(inv));
52545
52545
  assertEnvelope$1(result.data);
52546
52546
  return result;
52547
52547
  },
52548
52548
  async executeMutation(inv) {
52549
52549
  if (inv.capabilityName === "videos.uploadFromUrl") return uploadVideo(inv);
52550
52550
  credentials(inv.source.credentials);
52551
- const result = await base$6.executeMutation(prepare$1(inv));
52551
+ const result = await base$7.executeMutation(prepare$1(inv));
52552
52552
  if (result.status === "committed") assertMutationReceipt$1(result.data, inv.capabilityName);
52553
52553
  return result;
52554
52554
  },
@@ -52709,7 +52709,7 @@ function write$4(name, description, path, properties, required, body, create = f
52709
52709
  }
52710
52710
  };
52711
52711
  }
52712
- const base$5 = declarativeRestConnector({
52712
+ const base$6 = declarativeRestConnector({
52713
52713
  kind: "linkedin-ads",
52714
52714
  displayName: "LinkedIn Ads",
52715
52715
  description: "Discover advertiser accounts, prepare lifetime-budget sponsored campaigns, target professional audiences, sponsor existing posts, and measure results.",
@@ -53045,7 +53045,7 @@ const base$5 = declarativeRestConnector({
53045
53045
  ]
53046
53046
  });
53047
53047
  const linkedinAdsConnector = {
53048
- ...base$5,
53048
+ ...base$6,
53049
53049
  async executeMutation(inv) {
53050
53050
  for (const key of ["totalBudget", "bidAmount"]) if (inv.args[key] !== void 0 && (typeof inv.args[key] !== "string" || !new RegExp(money$3.pattern).test(inv.args[key]))) throw new Error(`linkedin-ads: ${key} must be positive decimal currency`);
53051
53051
  if (inv.capabilityName === "campaignGroups.create" || inv.capabilityName === "campaigns.createSponsored") {
@@ -53058,7 +53058,7 @@ const linkedinAdsConnector = {
53058
53058
  targetingCriteria: nativeTargeting(inv.args.targetingCriteria)
53059
53059
  }
53060
53060
  };
53061
- const result = await base$5.executeMutation(inv);
53061
+ const result = await base$6.executeMutation(inv);
53062
53062
  if (result.status === "committed") {
53063
53063
  if ([
53064
53064
  "campaignGroups.create",
@@ -53143,7 +53143,7 @@ function write$3(name, description, path, properties, required, data, method = "
53143
53143
  }
53144
53144
  };
53145
53145
  }
53146
- const base$4 = declarativeRestConnector({
53146
+ const base$5 = declarativeRestConnector({
53147
53147
  kind: "reddit-ads",
53148
53148
  displayName: "Reddit Ads",
53149
53149
  description: "Prepare lifetime-budget Reddit traffic campaigns, target communities and geographies, create ad creatives, launch or pause, and measure spend and conversions.",
@@ -53498,13 +53498,13 @@ const base$4 = declarativeRestConnector({
53498
53498
  ]
53499
53499
  });
53500
53500
  const redditAdsConnector = {
53501
- ...base$4,
53501
+ ...base$5,
53502
53502
  async executeMutation(inv) {
53503
53503
  if (inv.args.totalBudgetMicros !== void 0 && !(typeof inv.args.totalBudgetMicros === "number" && Number.isSafeInteger(inv.args.totalBudgetMicros) && Number(inv.args.totalBudgetMicros) > 0)) throw new Error("reddit-ads: totalBudgetMicros must be positive safe integer microcurrency");
53504
53504
  if (inv.capabilityName === "campaigns.createTraffic" || inv.capabilityName === "adGroups.createTraffic") {
53505
53505
  if (!(typeof inv.args.startTime === "string" && typeof inv.args.endTime === "string" && Date.parse(inv.args.endTime) > Date.parse(inv.args.startTime))) throw new Error("reddit-ads: endTime must be after startTime");
53506
53506
  }
53507
- const result = await base$4.executeMutation(inv);
53507
+ const result = await base$5.executeMutation(inv);
53508
53508
  if (result.status === "committed") {
53509
53509
  const envelope = result.data;
53510
53510
  if (!isPlainRecord(envelope) || envelope.error || envelope.errors || !isPlainRecord(envelope.data) || typeof envelope.data.id !== "string" || !envelope.data.id) throw new Error("reddit-ads: missing native mutation receipt or provider error; reconcile state before retrying");
@@ -53572,7 +53572,7 @@ function mutation(name, description, properties, required, path, body) {
53572
53572
  }
53573
53573
  };
53574
53574
  }
53575
- const base$3 = declarativeRestConnector({
53575
+ const base$4 = declarativeRestConnector({
53576
53576
  kind: "snapchat-ads",
53577
53577
  displayName: "Snapchat Ads",
53578
53578
  description: "Create bounded Snapchat campaigns, targeted ad squads, uploaded media and website creatives; control delivery and read spend and conversions.",
@@ -53943,21 +53943,21 @@ async function upload(inv) {
53943
53943
  };
53944
53944
  }
53945
53945
  const snapchatAdsConnector = {
53946
- ...base$3,
53946
+ ...base$4,
53947
53947
  async executeRead(inv) {
53948
- const result = await base$3.executeRead(prepare(inv));
53948
+ const result = await base$4.executeRead(prepare(inv));
53949
53949
  assertEnvelope(result.data);
53950
53950
  return result;
53951
53951
  },
53952
53952
  async executeMutation(inv) {
53953
53953
  if (inv.capabilityName === "media.upload") return upload(inv);
53954
- const result = await base$3.executeMutation(prepare(inv));
53954
+ const result = await base$4.executeMutation(prepare(inv));
53955
53955
  if (result.status === "committed") assertMutationReceipt(result.data, inv.capabilityName);
53956
53956
  return result;
53957
53957
  },
53958
53958
  async test(source) {
53959
53959
  try {
53960
- assertEnvelope((await base$3.executeRead({
53960
+ assertEnvelope((await base$4.executeRead({
53961
53961
  source,
53962
53962
  capabilityName: "accounts.list",
53963
53963
  args: {},
@@ -61601,6 +61601,20 @@ function hubspot(opts) {
61601
61601
  required: ["email"]
61602
61602
  }
61603
61603
  },
61604
+ {
61605
+ name: "find_contact_owner",
61606
+ class: "read",
61607
+ description: "Find who owns a person in HubSpot, by email: the contact owner, else the owner of an associated company, else of the most recently updated associated deal. Returns the owner id, the level and record it came from, every level checked, and the owner's name and email when the connection can read owners. Never infers an owner from activity.",
61608
+ requiredScopes: [SCOPE_CONTACTS_READ],
61609
+ parameters: {
61610
+ type: "object",
61611
+ properties: { email: {
61612
+ type: "string",
61613
+ description: "Email of the person (case-insensitive)."
61614
+ } },
61615
+ required: ["email"]
61616
+ }
61617
+ },
61604
61618
  {
61605
61619
  name: "list_new_contacts",
61606
61620
  class: "read",
@@ -61804,6 +61818,7 @@ function hubspot(opts) {
61804
61818
  async executeRead(inv) {
61805
61819
  if (inv.capabilityName === "list_new_contacts") return listNewContacts(inv, await ensureFreshAccessToken$7(inv.source.credentials, clientId, clientSecret));
61806
61820
  if (inv.capabilityName === "list_new_deals") return listNewDeals(inv, await ensureFreshAccessToken$7(inv.source.credentials, clientId, clientSecret));
61821
+ if (inv.capabilityName === "find_contact_owner") return findContactOwner(inv, await ensureFreshAccessToken$7(inv.source.credentials, clientId, clientSecret));
61807
61822
  if (inv.capabilityName !== "find_contact") throw new Error(`hubspot: unknown read capability ${inv.capabilityName}`);
61808
61823
  const { email } = inv.args;
61809
61824
  const accessToken = await ensureFreshAccessToken$7(inv.source.credentials, clientId, clientSecret);
@@ -61824,7 +61839,8 @@ function hubspot(opts) {
61824
61839
  "firstname",
61825
61840
  "lastname",
61826
61841
  "phone",
61827
- "company"
61842
+ "company",
61843
+ "hubspot_owner_id"
61828
61844
  ],
61829
61845
  limit: 1
61830
61846
  }),
@@ -62242,6 +62258,147 @@ async function listNewContacts(inv, accessToken) {
62242
62258
  fetchedAt: Date.now()
62243
62259
  };
62244
62260
  }
62261
+ async function hubspotJson(inv, accessToken, path, init = {}) {
62262
+ const res = await fetch(`${API$9}${path}`, {
62263
+ ...init,
62264
+ headers: {
62265
+ authorization: `Bearer ${accessToken}`,
62266
+ "content-type": "application/json"
62267
+ },
62268
+ signal: AbortSignal.timeout(1e4)
62269
+ });
62270
+ if (res.status === 401) throw new CredentialsExpired(`HubSpot rejected token (401)`, inv.source.id);
62271
+ if (res.status === 403 || res.status === 404) return {
62272
+ status: res.status,
62273
+ body: null
62274
+ };
62275
+ if (!res.ok) {
62276
+ const text = await res.text().catch(() => "");
62277
+ throw new Error(`hubspot find_contact_owner ${res.status}: ${text.slice(0, 200)}`);
62278
+ }
62279
+ return {
62280
+ status: res.status,
62281
+ body: await res.json()
62282
+ };
62283
+ }
62284
+ function ownerIdOf(body) {
62285
+ const id = (body?.properties)?.hubspot_owner_id;
62286
+ return typeof id === "string" && id.trim() ? id.trim() : null;
62287
+ }
62288
+ /** The ids of a contact's associated records of one type, or null when the token cannot read them. */
62289
+ async function associatedIds(inv, accessToken, contactId, object) {
62290
+ const { status, body } = await hubspotJson(inv, accessToken, `/crm/v4/objects/contacts/${encodeURIComponent(contactId)}/associations/${object}?limit=20`);
62291
+ if (status === 403) return null;
62292
+ return (body?.results ?? []).map((row) => String(row.toObjectId ?? "")).filter(Boolean);
62293
+ }
62294
+ async function findContactOwner(inv, accessToken) {
62295
+ const { email } = inv.args;
62296
+ const checked = [];
62297
+ const done = (owner, contactId) => ownerDetails(inv, accessToken, owner).then((details) => ({
62298
+ data: {
62299
+ found: contactId !== null,
62300
+ contactId,
62301
+ owner: details,
62302
+ checked
62303
+ },
62304
+ fetchedAt: Date.now()
62305
+ }));
62306
+ const search = await hubspotJson(inv, accessToken, "/crm/v3/objects/contacts/search", {
62307
+ method: "POST",
62308
+ body: JSON.stringify({
62309
+ filterGroups: [{ filters: [{
62310
+ propertyName: "email",
62311
+ operator: "EQ",
62312
+ value: email.toLowerCase()
62313
+ }] }],
62314
+ properties: ["email", "hubspot_owner_id"],
62315
+ limit: 1
62316
+ })
62317
+ });
62318
+ const contact = search.body?.results?.[0];
62319
+ if (!contact) {
62320
+ checked.push({
62321
+ level: "contact",
62322
+ recordId: null,
62323
+ result: search.status === 403 ? "not_readable" : "not_found"
62324
+ });
62325
+ return done(null, null);
62326
+ }
62327
+ const contactOwner = ownerIdOf(contact);
62328
+ checked.push({
62329
+ level: "contact",
62330
+ recordId: contact.id,
62331
+ result: contactOwner ? "owner" : "none"
62332
+ });
62333
+ if (contactOwner) return done({
62334
+ level: "contact",
62335
+ recordId: contact.id,
62336
+ ownerId: contactOwner
62337
+ }, contact.id);
62338
+ for (const object of ["companies", "deals"]) {
62339
+ const level = object === "companies" ? "company" : "deal";
62340
+ const ids = await associatedIds(inv, accessToken, contact.id, object);
62341
+ if (ids === null) {
62342
+ checked.push({
62343
+ level,
62344
+ recordId: null,
62345
+ result: "not_readable"
62346
+ });
62347
+ continue;
62348
+ }
62349
+ if (ids.length === 0) {
62350
+ checked.push({
62351
+ level,
62352
+ recordId: null,
62353
+ result: "not_found"
62354
+ });
62355
+ continue;
62356
+ }
62357
+ const read = await hubspotJson(inv, accessToken, `/crm/v3/objects/${object}/batch/read`, {
62358
+ method: "POST",
62359
+ body: JSON.stringify({
62360
+ properties: ["hubspot_owner_id", "hs_lastmodifieddate"],
62361
+ inputs: ids.map((id) => ({ id }))
62362
+ })
62363
+ });
62364
+ if (read.status === 403) {
62365
+ checked.push({
62366
+ level,
62367
+ recordId: null,
62368
+ result: "not_readable"
62369
+ });
62370
+ continue;
62371
+ }
62372
+ const owned = (read.body?.results ?? []).map((row) => ({
62373
+ id: row.id,
62374
+ ownerId: ownerIdOf(row),
62375
+ updated: Date.parse(String(row.properties?.hs_lastmodifieddate ?? "")) || 0
62376
+ })).filter((row) => row.ownerId).sort((a, b) => b.updated - a.updated)[0];
62377
+ checked.push({
62378
+ level,
62379
+ recordId: owned?.id ?? ids[0] ?? null,
62380
+ result: owned ? "owner" : "none"
62381
+ });
62382
+ if (owned?.ownerId) return done({
62383
+ level,
62384
+ recordId: owned.id,
62385
+ ownerId: owned.ownerId
62386
+ }, contact.id);
62387
+ }
62388
+ return done(null, contact.id);
62389
+ }
62390
+ /** The owner's name and email when the connection may read owners; the id alone otherwise. */
62391
+ async function ownerDetails(inv, accessToken, owner) {
62392
+ if (!owner) return null;
62393
+ const { body } = await hubspotJson(inv, accessToken, `/crm/v3/owners/${encodeURIComponent(owner.ownerId)}`);
62394
+ const details = body;
62395
+ const name = [details?.firstName, details?.lastName].filter((part) => typeof part === "string" && part.trim() !== "").join(" ");
62396
+ return {
62397
+ ...owner,
62398
+ email: typeof details?.email === "string" ? details.email : null,
62399
+ name: name || null
62400
+ };
62401
+ }
62245
62402
  //#endregion
62246
62403
  //#region src/connectors/adapters/public-http-target.ts
62247
62404
  /** Reject literal local/private HTTP targets before a universal connector calls fetch. */
@@ -110325,6 +110482,9 @@ const slackEventsConnector = {
110325
110482
  //#endregion
110326
110483
  //#region src/connectors/adapters/github.ts
110327
110484
  const GIT_SHA = "(?:[0-9a-fA-F]{40}|[0-9a-fA-F]{64})";
110485
+ /** The most files one pulls.propose call may write or delete. */
110486
+ const PROPOSE_MAX_FILES = 50;
110487
+ const PLAIN_BRANCH = "^(?!/)(?!.*//)(?!.*\\.\\.)(?!.*@\\{)(?!.*\\.lock$)[A-Za-z0-9._/-]+(?<![/.])$";
110328
110488
  const repoParams = {
110329
110489
  type: "object",
110330
110490
  properties: {
@@ -110333,7 +110493,7 @@ const repoParams = {
110333
110493
  },
110334
110494
  required: ["owner", "repo"]
110335
110495
  };
110336
- const githubConnector = declarativeRestConnector({
110496
+ const githubSpec = {
110337
110497
  kind: "github",
110338
110498
  displayName: "GitHub",
110339
110499
  description: "Search repositories/issues and create or update GitHub issues through a user-scoped token.",
@@ -111099,7 +111259,7 @@ const githubConnector = declarativeRestConnector({
111099
111259
  {
111100
111260
  name: "git.createTree",
111101
111261
  class: "mutation",
111102
- description: "Step 2 of a draft pull request. Write a tree: `base_tree` plus the changed entries. Each entry is `{ path, mode: \"100644\", type: \"blob\", content }` (use `sha: null` to delete a file). Creates an unreferenced object; nothing is visible until a branch points at a commit using it.",
111262
+ description: "Prefer pulls.propose, which proposes a whole change under one owner approval; each of these low-level steps needs its own. Step 2 of a draft pull request. Write a tree: `base_tree` plus the changed entries. Each entry is `{ path, mode: \"100644\", type: \"blob\", content }` (use `sha: null` to delete a file). Creates an unreferenced object; nothing is visible until a branch points at a commit using it.",
111103
111263
  parameters: {
111104
111264
  type: "object",
111105
111265
  properties: {
@@ -111165,7 +111325,7 @@ const githubConnector = declarativeRestConnector({
111165
111325
  {
111166
111326
  name: "git.createCommit",
111167
111327
  class: "mutation",
111168
- description: "Step 3 of a draft pull request. Write a commit object for a tree with explicit parents (normally the base branch head). Creates an unreferenced object; it moves no branch. Its `sha` is what git.createRef needs.",
111328
+ description: "Prefer pulls.propose for a pull request (one owner approval for the whole change). Step 3 of a draft pull request. Write a commit object for a tree with explicit parents (normally the base branch head). Creates an unreferenced object; it moves no branch. Its `sha` is what git.createRef needs.",
111169
111329
  parameters: {
111170
111330
  type: "object",
111171
111331
  properties: {
@@ -111208,7 +111368,7 @@ const githubConnector = declarativeRestConnector({
111208
111368
  {
111209
111369
  name: "git.createRef",
111210
111370
  class: "mutation",
111211
- description: "Step 4 of a draft pull request. Create a NEW branch at a commit: `ref` must be `refs/heads/<new-branch>` and `sha` the commit from git.createCommit. Never moves an existing branch; GitHub returns 422 when the ref already exists. Then pulls.create with `head: \"<new-branch>\"` (no `refs/heads/`) and `draft: true`.",
111371
+ description: "Prefer pulls.propose for a pull request (one owner approval for the whole change). Step 4 of a draft pull request. Create a NEW branch at a commit: `ref` must be `refs/heads/<new-branch>` and `sha` the commit from git.createCommit. Never moves an existing branch; GitHub returns 422 when the ref already exists. Then pulls.create with `head: \"<new-branch>\"` (no `refs/heads/`) and `draft: true`.",
111212
111372
  parameters: {
111213
111373
  type: "object",
111214
111374
  properties: {
@@ -111305,7 +111465,7 @@ const githubConnector = declarativeRestConnector({
111305
111465
  {
111306
111466
  name: "pulls.create",
111307
111467
  class: "mutation",
111308
- description: "Open a pull request from `head` into `base` on the target repository. Step 5 of a draft pull request: `head` is the branch git.createRef created and `draft: true`.",
111468
+ description: "Open a pull request from `head` into `base` on the target repository. To propose file changes, prefer pulls.propose, which writes the files and opens the draft under one owner approval. Step 5 of a draft pull request: `head` is the branch git.createRef created and `draft: true`.",
111309
111469
  parameters: {
111310
111470
  type: "object",
111311
111471
  properties: {
@@ -111345,6 +111505,84 @@ const githubConnector = declarativeRestConnector({
111345
111505
  cas: "native-idempotency",
111346
111506
  externalEffect: true
111347
111507
  },
111508
+ {
111509
+ name: "pulls.propose",
111510
+ class: "mutation",
111511
+ description: "Propose a change as a draft pull request in ONE call, under one owner approval: write `files` on a NEW branch cut from the head of `base`, commit them, and open a draft pull request from `branch` into `base`. Prefer it over git.createTree, git.createCommit, git.createRef and pulls.create, which each need their own approval. It never moves an existing branch and never merges. Returns the pull request, the commit and each changed file with its line counts.",
111512
+ parameters: {
111513
+ type: "object",
111514
+ additionalProperties: false,
111515
+ properties: {
111516
+ owner: { type: "string" },
111517
+ repo: { type: "string" },
111518
+ base: {
111519
+ type: "string",
111520
+ description: "Branch the pull request merges into, usually the default branch (`main`). A plain branch name."
111521
+ },
111522
+ branch: {
111523
+ type: "string",
111524
+ description: "The NEW branch to create, e.g. `gtm-agent/hero-copy`. It must not exist yet and must differ from `base`."
111525
+ },
111526
+ title: {
111527
+ type: "string",
111528
+ minLength: 1,
111529
+ maxLength: 256
111530
+ },
111531
+ body: {
111532
+ type: "string",
111533
+ description: "Pull request description (markdown)."
111534
+ },
111535
+ commit_message: {
111536
+ type: "string",
111537
+ description: "Commit message; defaults to the title."
111538
+ },
111539
+ files: {
111540
+ type: "array",
111541
+ minItems: 1,
111542
+ maxItems: PROPOSE_MAX_FILES,
111543
+ description: "Every file the change writes or deletes. `{ path, content }` writes the whole new file; `{ path, delete: true }` removes it.",
111544
+ items: {
111545
+ type: "object",
111546
+ additionalProperties: false,
111547
+ properties: {
111548
+ path: {
111549
+ type: "string",
111550
+ description: "Repository-relative path, e.g. `src/routes/_index.tsx`."
111551
+ },
111552
+ content: {
111553
+ type: "string",
111554
+ description: "The complete new file content (UTF-8 text)."
111555
+ },
111556
+ mode: {
111557
+ type: "string",
111558
+ enum: ["100644", "100755"],
111559
+ description: "File mode; `100755` for an executable. Defaults to `100644`."
111560
+ },
111561
+ delete: {
111562
+ type: "boolean",
111563
+ description: "True deletes the file; false or absent writes `content`."
111564
+ }
111565
+ },
111566
+ required: ["path"]
111567
+ }
111568
+ }
111569
+ },
111570
+ required: [
111571
+ "owner",
111572
+ "repo",
111573
+ "base",
111574
+ "branch",
111575
+ "title",
111576
+ "files"
111577
+ ]
111578
+ },
111579
+ request: {
111580
+ method: "POST",
111581
+ path: "/repos/{owner}/{repo}/pulls"
111582
+ },
111583
+ cas: "optimistic-read-verify",
111584
+ externalEffect: true
111585
+ },
111348
111586
  {
111349
111587
  name: "pulls.merge",
111350
111588
  class: "mutation",
@@ -111453,7 +111691,283 @@ const githubConnector = declarativeRestConnector({
111453
111691
  externalEffect: true
111454
111692
  }
111455
111693
  ]
111456
- });
111694
+ };
111695
+ const base$3 = declarativeRestConnector(githubSpec);
111696
+ const baseMutation$1 = base$3.executeMutation;
111697
+ const githubConnector = {
111698
+ ...base$3,
111699
+ async executeMutation(inv) {
111700
+ if (inv.capabilityName === "pulls.propose") return proposePullRequest(inv);
111701
+ return baseMutation$1(inv);
111702
+ }
111703
+ };
111704
+ const PROPOSE_MAX_FILE_BYTES = 1e6;
111705
+ const PROPOSE_MAX_TOTAL_BYTES = 4e6;
111706
+ /** Branches a repository serves by default; a proposal never creates one. */
111707
+ const DEFAULT_BRANCH_NAMES = /* @__PURE__ */ new Set([
111708
+ "main",
111709
+ "master",
111710
+ "trunk",
111711
+ "default",
111712
+ "head",
111713
+ "develop"
111714
+ ]);
111715
+ const PROPOSE_ARGUMENTS = /* @__PURE__ */ new Set([
111716
+ "owner",
111717
+ "repo",
111718
+ "base",
111719
+ "branch",
111720
+ "title",
111721
+ "body",
111722
+ "commit_message",
111723
+ "files"
111724
+ ]);
111725
+ const PROPOSE_FILE_FIELDS = /* @__PURE__ */ new Set([
111726
+ "path",
111727
+ "content",
111728
+ "mode",
111729
+ "delete"
111730
+ ]);
111731
+ function refuse(field, message) {
111732
+ throw new InvalidCapabilityArgument(`github pulls.propose: invalid argument "${field}": ${message}`, field);
111733
+ }
111734
+ function requiredText(args, field, max = 256) {
111735
+ const value = args[field];
111736
+ if (typeof value !== "string" || !value.trim()) refuse(field, "is required");
111737
+ if (value.length > max) refuse(field, `is longer than ${max} characters`);
111738
+ return value.trim();
111739
+ }
111740
+ function branchName(args, field) {
111741
+ const value = requiredText(args, field, 200);
111742
+ if (new RegExp(`^${GIT_SHA}$`).test(value)) refuse(field, "is a commit sha, not a branch name");
111743
+ if (value.startsWith("refs/")) refuse(field, "pass the bare branch name, not a `refs/` path");
111744
+ if (!new RegExp(PLAIN_BRANCH).test(value) || value.split("/").some((part) => part.startsWith(".") || part.endsWith(".lock"))) refuse(field, "is not a plain git branch name");
111745
+ return value;
111746
+ }
111747
+ function repoPath(value, index) {
111748
+ const field = `files[${index}].path`;
111749
+ if (typeof value !== "string" || !value.trim()) refuse(field, "is required");
111750
+ const path = value.trim();
111751
+ if (path.startsWith("/") || /[\\\0]/.test(path) || path.split("/").some((part) => !part || part === "." || part === "..")) refuse(field, `${JSON.stringify(path.slice(0, 80))} is not a repository-relative path`);
111752
+ if (path === ".git" || path.startsWith(".git/")) refuse(field, "cannot write inside .git");
111753
+ return path;
111754
+ }
111755
+ /** Validate every argument before the first request, so a refusal writes nothing. */
111756
+ function proposeArgs(raw) {
111757
+ for (const key of Object.keys(raw)) if (!PROPOSE_ARGUMENTS.has(key)) refuse(key, "is not an argument of pulls.propose");
111758
+ const base = branchName(raw, "base");
111759
+ const branch = branchName(raw, "branch");
111760
+ if (branch === base) refuse("branch", "must be a new branch, not the base");
111761
+ if (DEFAULT_BRANCH_NAMES.has(branch.toLowerCase())) refuse("branch", `${branch} is a default branch name; name a new branch`);
111762
+ const title = requiredText(raw, "title");
111763
+ const body = raw.body === void 0 ? void 0 : typeof raw.body === "string" ? raw.body : refuse("body", "must be a string");
111764
+ const commitMessage = raw.commit_message === void 0 ? title : requiredText(raw, "commit_message", 4e3);
111765
+ if (!Array.isArray(raw.files) || raw.files.length === 0) refuse("files", "name at least one file");
111766
+ if (raw.files.length > PROPOSE_MAX_FILES) refuse("files", `a proposal changes at most ${PROPOSE_MAX_FILES} files`);
111767
+ const seen = /* @__PURE__ */ new Set();
111768
+ let total = 0;
111769
+ const files = raw.files.map((entry, index) => {
111770
+ if (!entry || typeof entry !== "object" || Array.isArray(entry)) refuse(`files[${index}]`, "must be an object");
111771
+ const file = entry;
111772
+ for (const key of Object.keys(file)) if (!PROPOSE_FILE_FIELDS.has(key)) refuse(`files[${index}].${key}`, "is not a file field");
111773
+ const path = repoPath(file.path, index);
111774
+ if (seen.has(path)) refuse(`files[${index}].path`, `${path} is listed twice`);
111775
+ seen.add(path);
111776
+ const mode = file.mode === void 0 ? "100644" : file.mode;
111777
+ if (mode !== "100644" && mode !== "100755") refuse(`files[${index}].mode`, "must be 100644 or 100755");
111778
+ if (file.delete !== void 0 && typeof file.delete !== "boolean") refuse(`files[${index}].delete`, "must be true or false");
111779
+ if (file.delete === true) {
111780
+ if (file.content !== void 0) refuse(`files[${index}]`, "a deleted file carries no content");
111781
+ return {
111782
+ path,
111783
+ mode,
111784
+ delete: true
111785
+ };
111786
+ }
111787
+ if (typeof file.content !== "string") refuse(`files[${index}].content`, "is required unless delete is true");
111788
+ const bytes = new TextEncoder().encode(file.content).length;
111789
+ if (bytes > PROPOSE_MAX_FILE_BYTES) refuse(`files[${index}].content`, `is larger than ${PROPOSE_MAX_FILE_BYTES} bytes`);
111790
+ total += bytes;
111791
+ return {
111792
+ path,
111793
+ content: file.content,
111794
+ mode,
111795
+ delete: false
111796
+ };
111797
+ });
111798
+ if (total > PROPOSE_MAX_TOTAL_BYTES) refuse("files", `the change is larger than ${PROPOSE_MAX_TOTAL_BYTES} bytes`);
111799
+ return {
111800
+ owner: requiredText(raw, "owner", 100),
111801
+ repo: requiredText(raw, "repo", 100),
111802
+ base,
111803
+ branch,
111804
+ title,
111805
+ ...body !== void 0 ? { body } : {},
111806
+ commitMessage,
111807
+ files
111808
+ };
111809
+ }
111810
+ function field(value, ...path) {
111811
+ let current = value;
111812
+ for (const key of path) {
111813
+ if (!current || typeof current !== "object") return void 0;
111814
+ current = current[key];
111815
+ }
111816
+ return current;
111817
+ }
111818
+ function shaOf(value, what, ...path) {
111819
+ const sha = field(value, ...path);
111820
+ if (typeof sha !== "string" || !new RegExp(`^${GIT_SHA}$`).test(sha)) throw new Error(`github pulls.propose: GitHub returned no ${what}`);
111821
+ return sha;
111822
+ }
111823
+ /**
111824
+ * Write the files on a new branch and open a draft pull request, as one call:
111825
+ * read the base head, write a tree, commit it on that head, create the branch,
111826
+ * open the draft, and read its file list. The branch is new (GitHub refuses
111827
+ * an existing ref), so the call never moves an existing branch.
111828
+ */
111829
+ async function proposePullRequest(inv) {
111830
+ const args = proposeArgs(inv.args);
111831
+ const at = (request, values) => executeRestRequest(githubSpec, request, {
111832
+ ...inv,
111833
+ args: {
111834
+ owner: args.owner,
111835
+ repo: args.repo,
111836
+ ...values
111837
+ }
111838
+ });
111839
+ const head = await at({
111840
+ method: "GET",
111841
+ path: "/repos/{owner}/{repo}/branches/{branch}"
111842
+ }, { branch: args.base });
111843
+ if (head.outcome) return mutationResultFromTransport(githubSpec.displayName, head);
111844
+ const parent = shaOf(head.data, "base head commit", "commit", "sha");
111845
+ const tree = await at({
111846
+ method: "POST",
111847
+ path: "/repos/{owner}/{repo}/git/trees",
111848
+ body: {
111849
+ base_tree: "{base_tree}",
111850
+ tree: "{tree}"
111851
+ }
111852
+ }, {
111853
+ base_tree: shaOf(head.data, "base tree", "commit", "commit", "tree", "sha"),
111854
+ tree: args.files.map((file) => file.delete ? {
111855
+ path: file.path,
111856
+ mode: file.mode,
111857
+ type: "blob",
111858
+ sha: null
111859
+ } : {
111860
+ path: file.path,
111861
+ mode: file.mode,
111862
+ type: "blob",
111863
+ content: file.content
111864
+ })
111865
+ });
111866
+ if (tree.outcome) return mutationResultFromTransport(githubSpec.displayName, tree);
111867
+ const commit = await at({
111868
+ method: "POST",
111869
+ path: "/repos/{owner}/{repo}/git/commits",
111870
+ body: {
111871
+ message: "{message}",
111872
+ tree: "{tree}",
111873
+ parents: "{parents}"
111874
+ }
111875
+ }, {
111876
+ message: args.commitMessage,
111877
+ tree: shaOf(tree.data, "tree", "sha"),
111878
+ parents: [parent]
111879
+ });
111880
+ if (commit.outcome) return mutationResultFromTransport(githubSpec.displayName, commit);
111881
+ const commitSha = shaOf(commit.data, "commit", "sha");
111882
+ let ref;
111883
+ try {
111884
+ ref = await at({
111885
+ method: "POST",
111886
+ path: "/repos/{owner}/{repo}/git/refs",
111887
+ body: {
111888
+ ref: "{ref}",
111889
+ sha: "{sha}"
111890
+ }
111891
+ }, {
111892
+ ref: `refs/heads/${args.branch}`,
111893
+ sha: commitSha
111894
+ });
111895
+ } catch (error) {
111896
+ if (error instanceof Error && / HTTP 422: /.test(error.message) && /already exists/i.test(error.message)) refuse("branch", `${args.branch} already exists in ${args.owner}/${args.repo}; name a new branch`);
111897
+ throw error;
111898
+ }
111899
+ if (ref.outcome) return mutationResultFromTransport(githubSpec.displayName, ref);
111900
+ const created = `branch ${args.branch} at commit ${commitSha} exists in ${args.owner}/${args.repo}`;
111901
+ let pull;
111902
+ try {
111903
+ pull = await at({
111904
+ method: "POST",
111905
+ path: "/repos/{owner}/{repo}/pulls",
111906
+ body: {
111907
+ title: "{title}",
111908
+ head: "{head}",
111909
+ base: "{base}",
111910
+ body: "{body}",
111911
+ draft: true
111912
+ }
111913
+ }, {
111914
+ title: args.title,
111915
+ head: args.branch,
111916
+ base: args.base,
111917
+ ...args.body !== void 0 ? { body: args.body } : {}
111918
+ });
111919
+ } catch (error) {
111920
+ throw new Error(`github pulls.propose: ${created}, but opening the pull request failed; call pulls.create with head ${args.branch}. ${error instanceof Error ? error.message : String(error)}`);
111921
+ }
111922
+ if (pull.outcome) throw new Error(`github pulls.propose: ${created}, but GitHub ${pull.outcome === "rate-limited" ? "throttled" : "refused"} opening the pull request; call pulls.create with head ${args.branch}. ${(pull.message ?? "").slice(0, 300)}`.trim());
111923
+ const number = field(pull.data, "number");
111924
+ if (typeof number !== "number") throw new Error(`github pulls.propose: ${created}, but GitHub returned no pull request number`);
111925
+ let files = args.files.map((file) => ({
111926
+ path: file.path,
111927
+ status: file.delete ? "removed" : "modified",
111928
+ additions: 0,
111929
+ deletions: 0
111930
+ }));
111931
+ try {
111932
+ const listed = await at({
111933
+ method: "GET",
111934
+ path: "/repos/{owner}/{repo}/pulls/{pull_number}/files",
111935
+ query: { per_page: "100" }
111936
+ }, { pull_number: number });
111937
+ if (!listed.outcome && Array.isArray(listed.data)) files = listed.data.flatMap((entry) => {
111938
+ const path = field(entry, "filename");
111939
+ return typeof path === "string" ? [{
111940
+ path,
111941
+ status: String(field(entry, "status") ?? "modified"),
111942
+ additions: Number(field(entry, "additions") ?? 0),
111943
+ deletions: Number(field(entry, "deletions") ?? 0)
111944
+ }] : [];
111945
+ });
111946
+ } catch {}
111947
+ return {
111948
+ status: "committed",
111949
+ data: {
111950
+ pullRequest: {
111951
+ number,
111952
+ url: String(field(pull.data, "html_url") ?? `https://github.com/${args.owner}/${args.repo}/pull/${number}`),
111953
+ title: String(field(pull.data, "title") ?? args.title),
111954
+ state: String(field(pull.data, "state") ?? "open"),
111955
+ draft: field(pull.data, "draft") !== false
111956
+ },
111957
+ repository: `${args.owner}/${args.repo}`,
111958
+ base: args.base,
111959
+ branch: args.branch,
111960
+ commit: {
111961
+ sha: commitSha,
111962
+ url: `https://github.com/${args.owner}/${args.repo}/commit/${commitSha}`
111963
+ },
111964
+ files
111965
+ },
111966
+ etagAfter: pull.etag,
111967
+ committedAt: Date.now(),
111968
+ idempotentReplay: false
111969
+ };
111970
+ }
111457
111971
  //#endregion
111458
111972
  //#region src/connectors/adapters/gitlab.ts
111459
111973
  const gitlabConnector = declarativeRestConnector({
@@ -195545,4 +196059,4 @@ var adapters_exports = /* @__PURE__ */ __exportAll({
195545
196059
  //#endregion
195546
196060
  export { vboutConnector as $, googleGeminiConnector as $a, hubspot as $c, codyConnector as $d, captainDataConnector as $i, docuseal as $l, mauticConnector as $n, zohoInvoiceConnector as $o, fragmentConnector as $r, rabbitMqConnector as $s, predictLeadsConnector as $t, tenzoConnector as $u, contactoutConnector as A, amazonSesConnector as Aa, microsoftDynamicsCrmConnector as Ac, adobeCreativeCloudConnector as Ad, cryptolensConnector as Ai, gongConnector as Al, knockConnector as An, firebaseConnector as Ao, kapsoConnector as Ar, squareConnector as As, serpstatConnector as At, azureAdConnector as Au, workableConnector as B, afforaiConnector as Ba, leadConnectorConnector as Bc, excelFilesConnector as Bd, clearoutConnector as Bi, folkConnector as Bl, griptapeConnector as Bn, matrixConnector as Bo, housecallProConnector as Br, sftpConnector as Bs, robollyConnector as Bt, amazonLambdaConnector as Bu, warmlyConnector as C, similarwebConnector as Ca, mastodonConnector as Cc, cloudconvertConnector as Cd, oneloginConnector as Cf, dittofeedConnector as Ci, tiktokAdsConnector as Cl, odooConnector as Cn, supabaseConnector as Co, leapAiConnector as Cr, twentyConnector as Cs, smartsheetConnector as Ct, boxConnector as Cu, wizaConnector as D, ampecoConnector as Da, microsoftTeams as Dc, bigcommerceConnector as Dd, createPhonyConnector as Df, denserAiConnector as Di, googleAnalyticsConnector as Dl, medullarConnector as Dn, metabaseConnector as Do, klentyConnector as Dr, ticktickConnector as Ds, signrequestConnector as Dt, azureServiceBusConnector as Du, commonRoomConnector as E, appfollowConnector as Ea, microsoftOnenoteConnector as Ec, canvaConnector as Ed, declarativeRestConnector as Ef, devinConnector as Ei, googleAdsConnector as El, mindStudioConnector as En, mysqlConnector as Eo, knackConnector as Er, tlDvConnector as Es, shortIoConnector as Et, basecampConnector as Eu, amplemarketConnector as F, amazonSecretsManagerConnector as Fa, makeConnector as Fc, gammaConnector as Fd, crispConnector as Fi, googleErrorReason as Fl, ibmCognoseConnector as Fn, baserowConnector as Fo, jinaAiConnector as Fr, shippoConnector as Fs, scrapelessConnector as Ft, attioConnector as Fu, whatsappConnector as G, smooveConnector as Ga, jotformConnector as Gc, duckdbConnector as Gd, chatDataConnector as Gi, firefliesAiConnector as Gl, googleVertexaiConnector as Gn, marketoConnector as Go, guideliteConnector as Gr, recallAiConnector as Gs, reachinboxConnector as Gt, aircallConnector as Gu, woodpeckerConnector as H, airOpsConnector as Ha, kafkaConnector as Hc, echowinConnector as Hd, clockifyConnector as Hi, filloutFormsConnector as Hl, gptzeroDetectAiConnector as Hn, smartleadConnector as Ho, hashiCorpVaultConnector as Hr, rssConnector as Hs, retableConnector as Ht, amazonEventBridgeConnector as Hu, zeplinConnector as I, amazonBedrockConnector as Ia, createLinkedinConnector as Ic, flowParserConnector as Id, comfyicuConnector as Ii, googleTestFailureReason as Il, hystructConnector as In, airtableConnector as Io, imageRouterConnector as Ir, sharepoint as Is, scrapegraphaiConnector as It, asanaConnector as Iu, wafeqConnector as J, qdrantConnector as Ja, invoiceninjaConnector as Jc, deepgramConnector as Jd, chatlingConnector as Ji, etsyConnector as Jl, mixpanelConnector as Jn, klaviyoConnector as Jo, googleSearchConnector as Jr, createRedshiftConnector as Js, quadernoConnector as Jt, zoominfoConnector as Ju, webscrapingAiConnector as K, greenhouseConnector as Ka, jiraCloudConnector as Kc, digitalPilotConnector as Kd, chartlyConnector as Ki, fireberryConnector as Kl, exaConnector as Kn, mailchimpConnector as Ko, greipConnector as Kr, createPostgresConnector as Ks, rapidtextAiConnector as Kt, adobeSignConnector as Ku, youcanbookmeConnector as L, aipriseConnector as La, linkedinConnector as Lc, fellowConnector as Ld, cometapiConnector as Li, frontConnector as Ll, humeAiConnector as Ln, TELEGRAM_FILE_DOWNLOAD_ROOT as Lo, instantlyAiConnector as Lr, savvycalConnector as Ls, sardisConnector as Lt, amazonSqsConnector as Lu, saleshandyConnector as M, altTextAiConnector as Ma, microsoftCalendar as Mc, giftbitConnector as Md, copyAiConnector as Mi, classifyGoogleError as Ml, instasentConnector as Mn, digitalOceanConnector as Mo, joggAiConnector as Mr, sageIntacctConnector as Ms, sendinblueConnector as Mt, avomaConnector as Mu, lagrowthmachineConnector as N, alaiConnector as Na, microsoft365PlannerConnector as Nc, generatebannersConnector as Nd, dashworksConnector as Ni, classifyGoogleReason as Nl, insightoAiConnector as Nn, discourseConnector as No, justInvoiceConnector as Nr, slack as Ns, skyprepConnector as Nt, acuitySchedulingConnector as Nu, snovIoConnector as O, apitemplateIoConnector as Oa, microsoftGraph as Oc, bexioConnector as Od, phonyConnector as Of, deepseekConnector as Oi, googleCalendar as Ol, mailchainConnector as On, hightouchConnector as Oo, kissflowConnector as Or, tallyConnector as Os, serviceNowConnector as Ot, azureEventGridConnector as Ou, heyreachConnector as P, airtopConnector as Pa, microsoft365PeopleConnector as Pc, genderApiConnector as Pd, convertkitConnector as Pi, googleApiError as Pl, imapConnector as Pn, datadogConnector as Po, jiraDataCenterConnector as Pr, signNowConnector as Ps, seekTableConnector as Pt, auth0Connector as Pu, vidlab7Connector as Q, geminiConnector as Qa, httpConnector as Qc, contextualAiConnector as Qd, certopusConnector as Qi, docusignConnector as Ql, memConnector as Qn, zohoMailConnector as Qo, gameballConnector as Qr, createRabbitMqConnector as Qs, productboardConnector as Qt, vercelConnector as Qu, wufooConnector as R, acumbamailConnector as Ra, linearConnector as Rc, featheryConnector as Rd, cohereConnector as Ri, freshsalesConnector as Rl, hedyConnector as Rn, telegramConnector as Ro, huggingFaceConnector as Rr, saleorConnector as Rs, saasticConnector as Rt, amazonSnsConnector as Ru, autoboundConnector as S, semrushConnector as Sa, meetgeekAiConnector as Sc, constantContactConnector as Sd, pingIdentityConnector as Sf, documergeConnector as Si, linkedinAdsConnector as Sl, omniCoConnector as Sn, builtwithConnector as So, kommoConnector as Sr, typeformConnector as Ss, smartsuiteConnector as St, baremetricsConnector as Su, leadfeederConnector as T, apitableConnector as Ta, microsoftPowerBiConnector as Tc, clicdataConnector as Td, oktaConnector as Tf, descriptConnector as Ti, metaAdsConnector as Tl, nocodbConnector as Tn, createMySqlConnector as To, koFiConnector as Tr, todoistConnector as Ts, simplirouteConnector as Tt, backblazeConnector as Tu, wonderchatConnector as U, kustomerConnector as Ua, publicKafkaSocketFactory as Uc, dripConnector as Ud, clockodoConnector as Ui, figmaConnector as Ul, gotifyConnector as Un, salesloftConnector as Uo, heygenConnector as Ur, ringcentralConnector as Us, replyIoConnector as Ut, amplitudeConnector as Uu, woocommerceConnector as V, agentxConnector as Va, createKafkaConnector as Vc, elevenlabsConnector as Vd, cloutlyConnector as Vi, flowluConnector as Vl, gristConnector as Vn, chatwootConnector as Vo, heymarketSmsConnector as Vr, salesforceConnector as Vs, retellAiConnector as Vt, amazonCloudWatchConnector as Vu, whatsscaleConnector as W, activecampaignConnector as Wa, justcallConnector as Wc, docsbotConnector as Wd, chatnodeConnector as Wi, figjamConnector as Wl, glideConnector as Wn, outreachConnector as Wo, hastewireConnector as Wr, rampConnector as Ws, reoonVerifierConnector as Wt, affinityConnector as Wu, vtexConnector as X, weaviateConnector as Xa, instagramBusinessConnector as Xc, couchbaseConnector as Xd, cannyConnector as Xi, dropboxConnector as Xl, mindeeConnector as Xn, brazeConnector as Xo, ghostcmsConnector as Xr, createRedisConnector as Xs, pushoverConnector as Xt, wootricConnector as Xu, vtigerConnector as Y, pineconeConnector as Ya, insightlyConnector as Yc, dappierConnector as Yd, chargekeepConnector as Yi, ebayConnector as Yl, mixmaxConnector as Yn, customerIoConnector as Yo, gistlyConnector as Yr, redshiftConnector as Ys, qawafelConnector as Yt, workdayConnector as Yu, vlmRunConnector as Z, huggingfaceConnector as Za, intercomConnector as Zc, contiguityConnector as Zd, chainalysisApiConnector as Zi, dialpadConnector as Zl, millionverifierConnector as Zn, apolloConnector as Zo, freshserviceConnector as Zr, redisConnector as Zs, proxycurlConnector as Zt, videoaskConnector as Zu, zenrowsConnector as _, avianConnector as _a, createMongoDbConnector as _c, giteaConnector as _d, anyhookWebsocketConnector as _f, elasticEmailConnector as _i, createAmazonAdsConnector as _l, opnformConnector as _n, zerobounceConnector as _o, linkaConnector as _r, twilioSmsConnector as _s, stripeConnector as _t, calCom as _u, linqWhatsappConnector as a, bolnaConnector as aa, paddleConnector as ac, reddit as ad, chaindeskConnector as af, flipandoConnector as ai, googleTasksConnector as al, placidConnector as an, zendeskSellConnector as ao, lucidyaConnector as ar, cloudbedsConnector as as, twilioConnector as at, recurlyConnector as au, leadmagicConnector as b, clayConnector as ba, miroConnector as bc, discordConnector as bd, actualbudgetConnector as bf, dumplingAiConnector as bi, snapchatAdsConnector as bl, openRouterConnector as bn, hunterConnector as bo, lettaConnector as br, twitter as bs, socialkitConnector as bt, billComConnector as bu, getresponseConnector as c, bitlyConnector as ca, oneSpanSignConnector as cc, paychexConnector as cd, cartloomConnector as cf, enrichlayerConnector as ci, googleSearchConsoleConnector as cl, peekshotConnector as cn, facebookPagesConnector as co, lushaConnector as cr, zendeskConnector as cs, totalcmsConnector as ct, contentfulConnector as cu, nooksConnector as d, beamerConnector as da, ninjapipeConnector as dc, niftyConnector as dd, bikaConnector as df, esignaturesConnector as di, googleForms as dl, paywhirlConnector as dn, slackEventsConnector as do, logrocketConnector as dr, wrikeConnector as ds, timeOpsConnector as dt, cloudinaryConnector as du, braveSearchConnector as ea, quickbooksConnector as ec, teableConnector as ed, clickfunnelsConnector as ef, frameConnector as ei, helpscoutConnector as el, posthogConnector as en, anthropicConnector as eo, messagebirdConnector as er, zohoCampaignsConnector as es, uscreenConnector as et, chessComConnector as eu, signwellConnector as f, azureOpenaiConnector as fa, netsuiteConnector as fc, netlifyConnector as fd, beehiivConnector as ff, emailitConnector as fi, googleDrive as fl, pinchPaymentsConnector as fn, stripeWebhookReceiverConnector as fo, lokaliseConnector as fr, wordpressConnector as fs, textcortexAiConnector as ft, cloudflareConnector as fu, oceanIoConnector as g, asknewsConnector as ga, mycaseConnector as gc, gustoConnector as gd, apifyConnector as gf, edenAiConnector as gi, googleCloudStorageConnector as gl, orimonConnector as gn, resolveConnectorAdapterFactoryOptions as go, localaiConnector as gr, voucheryIoConnector as gs, systemeIoConnector as gt, calendlyConnector as gu, seamlessAiConnector as h, azureCommunicationServicesConnector as ha, notionConnector as hc, instaChartsConnector as hd, askHandleConnector as hf, easyPeasyAiConnector as hi, googlePubSubConnector as hl, oracleDatabaseConnector as hn, CONNECTOR_ADAPTER_FACTORIES as ho, lobstermailConnector as hr, whatsappBusiness as hs, tableauConnector as ht, capsuleCrmConnector as hu, resendConnector as i, bookedinConnector as ia, plaidConnector as ic, ripplingConnector as id, chatAidConnector as if, formbricksConnector as ii, googlechatConnector as il, plausibleConnector as in, sendgridConnector as io, matomoConnector as ir, pricelabsConnector as is, upgradechatConnector as it, taxjarConnector as iu, bettercontactConnector as j, alttextifyConnector as ja, microsoftDynamics365BusinessCentralConnector as jc, modelslabConnector as jd, datafuelConnector as ji, gmail as jl, kallabotAiConnector as jn, clicksendConnector as jo, kizeoFormsConnector as jr, shopifyConnector as js, senjaConnector as jt, avalaraConnector as ju, findymailConnector as k, amazonTextractConnector as ka, microsoftExcel365Connector as kc, adpConnector as kd, customgptConnector as ki, gorgiasConnector as kl, loopsConnector as kn, googleBigqueryConnector as ko, kimaiConnector as kr, stripePackConnector as ks, tregConnector as kt, azureBlobStorageConnector as ku, factorsAiConnector as l, blandAiConnector as la, oneDrive as lc, pagerdutyConnector as ld, cambAiConnector as lf, fathomAnalyticsConnector as li, googleMyBusinessConnector as ll, pdfmonkeyConnector as ln, gitlabConnector as lo, loftyConnector as lr, zapierConnector as ls, togglTrackConnector as lt, confluenceConnector as lu, usergemsConnector as m, autocallsConnector as ma, notion as mc, leverConnector as md, bannerbearConnector as mf, dustConnector as mi, googleContactsConnector as ml, paperformConnector as mn, webhookConnector as mo, llmrailsConnector as mr, xeroConnector as ms, talkableConnector as mt, closeConnector as mu, sendblueConnector as n, brilliantDirectoriesConnector as na, pipedriveConnector as nc, sendpulseConnector as nd, claudeConnector as nf, fountainConnector as ni, hellosign as nl, pollybotAiConnector as nn, sentryConnector as no, mailgunConnector as nr, zohoCrmConnector as ns, validatedmailsConnector as nt, circleConnector as nu, linqConnector as o, blueskyConnector as oa, pandadoc as oc, redditConnector as od, chainAwareConnector as of, flowiseConnector as oi, googleSlidesConnector as ol, personalAiConnector as on, zagomailConnector as oo, luxuryPresenceConnector as or, zohoBookingsConnector as os, twinLabsConnector as ot, chargebeeConnector as ou, polytomicConnector as p, barcodeLookupConnector as pa, n8nConnector as pc, lightfunnelsConnector as pd, base44Connector as pf, emailoctopusConnector as pi, googleDocs as pl, pastefyConnector as pn, gtmAgentConnector as po, magicalApiConnector as pr, webflowConnector as ps, telnyxConnector as pt, clickupConnector as pu, whatConvertsConnector as q, bamboohrConnector as qa, ironcladConnector as qc, detectingAiConnector as qd, chatbaseConnector as qi, fathomConnector as ql, missiveConnector as qn, lemlistConnector as qo, greenptConnector as qr, postgresConnector as qs, raiaAiConnector as qt, zuoraConnector as qu, clerkConnector as r, browseAiConnector as ra, pipedreamConnector as rc, sanityConnector as rd, chatsistantConnector as rf, foreplayCoConnector as ri, granolaConnector as rl, pocketbaseConnector as rn, postmarkConnector as ro, manychatConnector as rr, zohoDeskConnector as rs, vapiConnector as rt, cashfreePaymentsConnector as ru, inkboxConnector as s, bonjoroConnector as sa, outlookMail as sc, pushbulletConnector as sd, csvFilesConnector as sf, facebookLeadsConnector as si, googleSheets as sl, perplexityAiConnector as sn, quickzuConnector as so, mailerLiteConnector as sr, zoomConnector as ss, typefullyConnector as st, copperConnector as su, adapters_exports as t, campaignMonitorConnector as ta, parquetFilesConnector as tc, snowflakeConnector as td, clearoutphoneConnector as tf, mailercheckConnector as ti, harvestConnector as tl, postizConnector as tn, openaiConnector as to, mailerooConnector as tr, zohoBooksConnector as ts, umamiConnector as tt, checkoutConnector as tu, modjoConnector as u, bettermodeConnector as ua, openPhoneConnector as uc, opsgenieConnector as ud, buttondownConnector as uf, firecrawlConnector as ui, googleMeetConnector as ul, parseurConnector as un, githubConnector as uo, logsnagConnector as ur, youtubeDataConnector as us, timelinesAiConnector as ut, codaConnector as uu, phantombusterConnector as v, assemblyaiConnector as va, mongodbConnector as vc, freeAgentConnector as vd, airparserConnector as vf, documentproConnector as vi, createMicrosoftAdsConnector as vl, openmicAiConnector as vn, theirstackConnector as vo, letsCalendarConnector as vr, tiktok as vs, swarmnodeConnector as vt, calComConnector as vu, serperConnector as w, aminosConnector as wa, microsoftTodoConnector as wc, clioConnector as wd, clientCredentialsRestConnector as wf, datocmsConnector as wi, xAdsConnector as wl, ntfyConnector as wn, segmentConnector as wo, kudosityConnector as wr, trelloConnector as ws, simplybookmeConnector as wt, biginByZohoConnector as wu, crustdataConnector as x, cognismConnector as xa, mollieConnector as xc, demandbaseConnector as xd, scimConnector as xf, doctlyConnector as xi, redditAdsConnector as xl, omnihrConnector as xn, fullenrichConnector as xo, leexiConnector as xr, twitterConnector as xs, smsmodeConnector as xt, brexConnector as xu, brightdataConnector as y, ashbyConnector as ya, mondayConnector as yc, formstackConnector as yd, aianswerConnector as yf, dubConnector as yi, pinterestAdsConnector as yl, opportifyConnector as yn, neverbounceConnector as yo, linkupConnector as yr, tiktokConnector as ys, supadataConnector as yt, billplzConnector as yu, writesonicBulkConnector as z, aidbaseConnector as za, lemonSqueezyConnector as zc, everhourConnector as zd, cognitoFormsConnector as zi, freshdeskConnector as zl, heartbeatConnector as zn, mattermostConnector as zo, influencersClubConnector as zr, createSftpConnector as zs, runwareConnector as zt, amazonS3Connector as zu };
195547
196061
 
195548
- //# sourceMappingURL=adapters-CURjrtYm.js.map
196062
+ //# sourceMappingURL=adapters-D8TvHRA1.js.map