@tangle-network/agent-integrations 0.53.22 → 0.53.23

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.
@@ -74,6 +74,7 @@ __export(adapters_exports, {
74
74
  auth0Connector: () => auth0Connector,
75
75
  autoboundConnector: () => autoboundConnector,
76
76
  autocallsConnector: () => autocallsConnector,
77
+ avalaraConnector: () => avalaraConnector,
77
78
  avianConnector: () => avianConnector,
78
79
  avomaConnector: () => avomaConnector,
79
80
  azureAdConnector: () => azureAdConnector,
@@ -146,6 +147,7 @@ __export(adapters_exports, {
146
147
  clicdataConnector: () => clicdataConnector,
147
148
  clickfunnelsConnector: () => clickfunnelsConnector,
148
149
  clickupConnector: () => clickupConnector,
150
+ clientCredentialsRestConnector: () => clientCredentialsRestConnector,
149
151
  clioConnector: () => clioConnector,
150
152
  clockifyConnector: () => clockifyConnector,
151
153
  clockodoConnector: () => clockodoConnector,
@@ -419,6 +421,7 @@ __export(adapters_exports, {
419
421
  mollieConnector: () => mollieConnector,
420
422
  mondayConnector: () => mondayConnector,
421
423
  mongodbConnector: () => mongodbConnector,
424
+ mycaseConnector: () => mycaseConnector,
422
425
  n8nConnector: () => n8nConnector,
423
426
  netlifyConnector: () => netlifyConnector,
424
427
  netsuiteConnector: () => netsuiteConnector,
@@ -436,6 +439,7 @@ __export(adapters_exports, {
436
439
  omnihrConnector: () => omnihrConnector,
437
440
  oneDrive: () => oneDrive,
438
441
  oneSpanSignConnector: () => oneSpanSignConnector,
442
+ oneloginConnector: () => oneloginConnector,
439
443
  openPhoneConnector: () => openPhoneConnector,
440
444
  openRouterConnector: () => openRouterConnector,
441
445
  openaiConnector: () => openaiConnector,
@@ -463,6 +467,7 @@ __export(adapters_exports, {
463
467
  phonyConnector: () => phonyConnector,
464
468
  pinchPaymentsConnector: () => pinchPaymentsConnector,
465
469
  pineconeConnector: () => pineconeConnector,
470
+ pingIdentityConnector: () => pingIdentityConnector,
466
471
  pipedreamConnector: () => pipedreamConnector,
467
472
  pipedriveConnector: () => pipedriveConnector,
468
473
  placidConnector: () => placidConnector,
@@ -490,6 +495,7 @@ __export(adapters_exports, {
490
495
  rapidtextAiConnector: () => rapidtextAiConnector,
491
496
  reachinboxConnector: () => reachinboxConnector,
492
497
  recallAiConnector: () => recallAiConnector,
498
+ recurlyConnector: () => recurlyConnector,
493
499
  redditConnector: () => redditConnector,
494
500
  reoonVerifierConnector: () => reoonVerifierConnector,
495
501
  replyIoConnector: () => replyIoConnector,
@@ -510,6 +516,7 @@ __export(adapters_exports, {
510
516
  sanityConnector: () => sanityConnector,
511
517
  sardisConnector: () => sardisConnector,
512
518
  savvycalConnector: () => savvycalConnector,
519
+ scimConnector: () => scimConnector,
513
520
  scrapegraphaiConnector: () => scrapegraphaiConnector,
514
521
  scrapelessConnector: () => scrapelessConnector,
515
522
  seamlessAiConnector: () => seamlessAiConnector,
@@ -557,6 +564,7 @@ __export(adapters_exports, {
557
564
  talkableConnector: () => talkableConnector,
558
565
  tallyConnector: () => tallyConnector,
559
566
  tangleIdentity: () => tangleIdentity,
567
+ taxjarConnector: () => taxjarConnector,
560
568
  teableConnector: () => teableConnector,
561
569
  telegramConnector: () => telegramConnector,
562
570
  telnyxConnector: () => telnyxConnector,
@@ -770,11 +778,11 @@ function declarativeRestConnector(spec) {
770
778
  const op = readOperation(spec, inv.capabilityName, "read");
771
779
  const response = await executeRestRequest(spec, op.request, inv, requiredArgsOf(op.parameters));
772
780
  if (response.outcome === "rate-limited") {
773
- const retryAfterMs3 = response.retryAfterMs ?? DEFAULT_RETRY_AFTER_MS;
781
+ const retryAfterMs4 = response.retryAfterMs ?? DEFAULT_RETRY_AFTER_MS;
774
782
  throw new ProviderRateLimited(
775
- `${spec.displayName} ${inv.capabilityName} rate limit (429); retry after ${retryAfterMs3}ms`,
783
+ `${spec.displayName} ${inv.capabilityName} rate limit (429); retry after ${retryAfterMs4}ms`,
776
784
  inv.source.id,
777
- { status: 429, body: response.data, retryAfterMs: retryAfterMs3 }
785
+ { status: 429, body: response.data, retryAfterMs: retryAfterMs4 }
778
786
  );
779
787
  }
780
788
  if (response.outcome === "conflict") {
@@ -919,7 +927,10 @@ async function executeRestRequest(spec, request4, inv, requiredArgs) {
919
927
  ...renderHeaders(spec.defaultHeaders ?? {}, scope, true),
920
928
  ...renderHeaders(renderableHeaders, scope)
921
929
  };
922
- const structuredCredentials = placement.kind === "structured-headers" || placement.kind === "structured-json-body" ? readStructuredCredentials(inv.source.credentials, placement.fields) : void 0;
930
+ const structuredCredentials = placement.kind === "structured-headers" || placement.kind === "structured-json-body" ? readStructuredCredentials(inv.source.credentials, placement.fields) : placement.kind === "basic-structured" ? readStructuredCredentials(inv.source.credentials, {
931
+ [placement.usernameField]: placement.usernameField,
932
+ [placement.passwordField]: placement.passwordField
933
+ }) : void 0;
923
934
  if (placement.kind === "structured-headers") {
924
935
  for (const [credentialName, headerName] of Object.entries(placement.fields)) {
925
936
  headers[headerName] = structuredCredentials[credentialName];
@@ -955,6 +966,10 @@ async function executeRestRequest(spec, request4, inv, requiredArgs) {
955
966
  region: awsRegion,
956
967
  bundle: aws
957
968
  });
969
+ } else if (placement.kind === "basic-structured") {
970
+ const username = structuredCredentials[placement.usernameField];
971
+ const password = structuredCredentials[placement.passwordField];
972
+ headers.authorization = `Basic ${Buffer.from(`${username}:${password}`).toString("base64")}`;
958
973
  } else if (placement.kind !== "structured-headers" && placement.kind !== "structured-json-body") {
959
974
  applyCredentials(headers, url, placement, inv.source.credentials);
960
975
  }
@@ -968,7 +983,11 @@ async function executeRestRequest(spec, request4, inv, requiredArgs) {
968
983
  throw new CredentialsExpired(`${spec.displayName} rejected credentials (${res.status})`, inv.source.id);
969
984
  }
970
985
  if (res.status === 409 || res.status === 412) {
971
- const text2 = redactCredentialText(await safeErrorText(res), inv.source.credentials);
986
+ const text2 = redactCredentialText(
987
+ await safeErrorText(res),
988
+ inv.source.credentials,
989
+ [getHeaderCI(headers, "authorization")]
990
+ );
972
991
  return {
973
992
  data: parseBodyText(text2),
974
993
  outcome: "conflict",
@@ -978,7 +997,11 @@ async function executeRestRequest(spec, request4, inv, requiredArgs) {
978
997
  };
979
998
  }
980
999
  if (res.status === 429) {
981
- const text2 = redactCredentialText(await safeErrorText(res), inv.source.credentials);
1000
+ const text2 = redactCredentialText(
1001
+ await safeErrorText(res),
1002
+ inv.source.credentials,
1003
+ [getHeaderCI(headers, "authorization")]
1004
+ );
982
1005
  return {
983
1006
  data: parseBodyText(text2),
984
1007
  outcome: "rate-limited",
@@ -991,7 +1014,11 @@ async function executeRestRequest(spec, request4, inv, requiredArgs) {
991
1014
  return { data: { exists: res.status === 204 } };
992
1015
  }
993
1016
  if (!res.ok) {
994
- const text2 = redactCredentialText(await safeErrorText(res), inv.source.credentials);
1017
+ const text2 = redactCredentialText(
1018
+ await safeErrorText(res),
1019
+ inv.source.credentials,
1020
+ [getHeaderCI(headers, "authorization")]
1021
+ );
995
1022
  throw new Error(`${spec.kind} ${request4.method} ${url.pathname} HTTP ${res.status}: ${text2.slice(0, 300)}`);
996
1023
  }
997
1024
  const text = await res.text();
@@ -1080,7 +1107,9 @@ function applyCredentials(headers, url, placement, credentials) {
1080
1107
  if (placement.kind === "basic-api-key") {
1081
1108
  headers.authorization = `Basic ${Buffer.from(`${token}:`).toString("base64")}`;
1082
1109
  }
1083
- if (placement.kind === "header") headers[placement.header] = `${placement.prefix ?? ""}${token}`;
1110
+ if (placement.kind === "header") {
1111
+ headers[placement.header] = `${placement.prefix ?? ""}${token}${placement.suffix ?? ""}`;
1112
+ }
1084
1113
  if (placement.kind === "query") url.searchParams.set(placement.parameter, token);
1085
1114
  }
1086
1115
  function readStructuredCredentials(credentials, fields) {
@@ -1121,9 +1150,9 @@ function credentialToken(credentials) {
1121
1150
  }
1122
1151
  throw new Error(`declarative REST connectors require oauth2 or api-key credentials, got ${credentials.kind}`);
1123
1152
  }
1124
- function redactCredentialText(text, credentials) {
1153
+ function redactCredentialText(text, credentials, additionalSecrets = []) {
1125
1154
  const candidates = credentials.kind === "oauth2" ? [credentials.accessToken, credentials.refreshToken] : credentials.kind === "api-key" ? [credentials.apiKey, ...jsonStringValues(credentials.apiKey)] : credentials.kind === "custom" ? Object.values(credentials.values) : [];
1126
- const secrets = candidates.filter(
1155
+ const secrets = [...candidates, ...additionalSecrets].filter(
1127
1156
  (secret) => typeof secret === "string" && secret.length > 0
1128
1157
  );
1129
1158
  return secrets.reduce(
@@ -1537,6 +1566,803 @@ function membershipCapability(name, method, description) {
1537
1566
  };
1538
1567
  }
1539
1568
 
1569
+ // src/connectors/adapters/client-credentials-rest.ts
1570
+ import { createHash as createHash2 } from "crypto";
1571
+ function clientCredentialsRestConnector(spec) {
1572
+ const regionMetadataKey = spec.regionMetadataKey ?? "region";
1573
+ const delegated = declarativeRestConnector({
1574
+ ...spec,
1575
+ baseUrl: { metadataKey: "__clientCredentialsApiBaseUrl" },
1576
+ allowedBaseUrls: Object.values(spec.regions).map((region) => region.apiBaseUrl),
1577
+ credentialPlacement: spec.apiCredentialPlacement ?? { kind: "bearer" }
1578
+ });
1579
+ const tokens = /* @__PURE__ */ new Map();
1580
+ const pending = /* @__PURE__ */ new Map();
1581
+ async function authenticatedSource(source) {
1582
+ const bundle = readCredentialBundle(source.credentials);
1583
+ const regionName = readRegionName(bundle, source.metadata, regionMetadataKey, spec.defaultRegion);
1584
+ const region = spec.regions[regionName];
1585
+ if (!region) {
1586
+ throw new Error(`${spec.kind}: unsupported region ${regionName}; expected one of ${Object.keys(spec.regions).join(", ")}`);
1587
+ }
1588
+ const resolvedRegion = {
1589
+ ...region,
1590
+ tokenUrl: renderConnectionMetadata(region.tokenUrl, source.metadata)
1591
+ };
1592
+ const scope = bundle.scope ?? spec.defaultScope;
1593
+ const fingerprint = credentialFingerprint(bundle, resolvedRegion, scope);
1594
+ const cached = tokens.get(source.id);
1595
+ if (cached?.fingerprint === fingerprint && cached.expiresAt > Date.now() + 6e4) {
1596
+ return withAccessToken(source, resolvedRegion.apiBaseUrl, cached.accessToken);
1597
+ }
1598
+ if (cached) tokens.delete(source.id);
1599
+ const inFlight = pending.get(source.id);
1600
+ if (inFlight?.fingerprint === fingerprint) {
1601
+ const token = await inFlight.promise;
1602
+ return withAccessToken(source, resolvedRegion.apiBaseUrl, token.accessToken);
1603
+ }
1604
+ const promise = exchangeClientCredentials(
1605
+ spec.displayName,
1606
+ source.id,
1607
+ bundle,
1608
+ resolvedRegion,
1609
+ fingerprint,
1610
+ scope,
1611
+ spec.tokenCredentialPlacement ?? "basic"
1612
+ );
1613
+ pending.set(source.id, { fingerprint, promise });
1614
+ try {
1615
+ const token = await promise;
1616
+ if (pending.get(source.id)?.promise === promise) cacheToken(tokens, source.id, token);
1617
+ return withAccessToken(source, resolvedRegion.apiBaseUrl, token.accessToken);
1618
+ } finally {
1619
+ if (pending.get(source.id)?.promise === promise) pending.delete(source.id);
1620
+ }
1621
+ }
1622
+ return {
1623
+ manifest: delegated.manifest,
1624
+ executeRead: delegated.executeRead ? async (invocation) => delegated.executeRead({
1625
+ ...invocation,
1626
+ source: await authenticatedSource(invocation.source)
1627
+ }) : void 0,
1628
+ executeMutation: delegated.executeMutation ? async (invocation) => delegated.executeMutation({
1629
+ ...invocation,
1630
+ source: await authenticatedSource(invocation.source)
1631
+ }) : void 0,
1632
+ async test(source) {
1633
+ try {
1634
+ return delegated.test(await authenticatedSource(source));
1635
+ } catch (error) {
1636
+ return { ok: false, reason: error instanceof Error ? error.message : "unknown error" };
1637
+ }
1638
+ }
1639
+ };
1640
+ }
1641
+ function cacheToken(tokens, sourceId, token) {
1642
+ tokens.set(sourceId, token);
1643
+ const timeout = setTimeout(() => {
1644
+ if (tokens.get(sourceId) === token) tokens.delete(sourceId);
1645
+ }, Math.max(0, token.expiresAt - Date.now()));
1646
+ timeout.unref();
1647
+ }
1648
+ function readCredentialBundle(credentials) {
1649
+ let values;
1650
+ if (credentials.kind === "custom") {
1651
+ values = credentials.values;
1652
+ } else if (credentials.kind === "api-key") {
1653
+ try {
1654
+ const parsed = JSON.parse(credentials.apiKey);
1655
+ if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) throw new Error("not an object");
1656
+ values = parsed;
1657
+ } catch {
1658
+ throw new Error("client credentials require a JSON object in the API-key field");
1659
+ }
1660
+ } else {
1661
+ throw new Error(`client credentials require custom or API-key credentials, got ${credentials.kind}`);
1662
+ }
1663
+ const clientId = requiredString(values.clientId, "clientId");
1664
+ const clientSecret = requiredString(values.clientSecret, "clientSecret");
1665
+ return {
1666
+ clientId,
1667
+ clientSecret,
1668
+ region: optionalString(values.region, "region"),
1669
+ scope: optionalString(values.scope, "scope")
1670
+ };
1671
+ }
1672
+ function requiredString(value, field) {
1673
+ if (typeof value !== "string" || !value.trim()) throw new Error(`client credentials are missing ${field}`);
1674
+ return value.trim();
1675
+ }
1676
+ function optionalString(value, field) {
1677
+ if (value === void 0 || value === null || value === "") return void 0;
1678
+ if (typeof value !== "string") throw new Error(`client credentials ${field} must be a string`);
1679
+ return value.trim();
1680
+ }
1681
+ function readRegionName(bundle, metadata, metadataKey, fallback) {
1682
+ const metadataRegion = metadata[metadataKey];
1683
+ if (metadataRegion !== void 0 && typeof metadataRegion !== "string") {
1684
+ throw new Error(`connection metadata.${metadataKey} must be a string`);
1685
+ }
1686
+ return (bundle.region ?? metadataRegion ?? fallback).toLowerCase().trim();
1687
+ }
1688
+ function credentialFingerprint(bundle, region, scope) {
1689
+ return createHash2("sha256").update(bundle.clientId).update("\0").update(bundle.clientSecret).update("\0").update(region.tokenUrl).update("\0").update(scope ?? "").digest("hex");
1690
+ }
1691
+ function renderConnectionMetadata(template, metadata) {
1692
+ const rendered = template.replace(/\{connection\.([a-zA-Z0-9_.-]+)\}/g, (_match, key) => {
1693
+ const value = key.split(".").reduce((current, part) => {
1694
+ if (current && typeof current === "object" && part in current) {
1695
+ return current[part];
1696
+ }
1697
+ return void 0;
1698
+ }, metadata);
1699
+ if (typeof value !== "string" || !value.trim()) throw new Error(`missing metadata.${key}`);
1700
+ return encodeURIComponent(value.trim());
1701
+ });
1702
+ const url = new URL(rendered);
1703
+ if (url.protocol !== "https:" || url.username || url.password) {
1704
+ throw new Error("client-credentials token URL must be HTTPS without embedded credentials");
1705
+ }
1706
+ return url.href;
1707
+ }
1708
+ async function exchangeClientCredentials(displayName, sourceId, bundle, region, fingerprint, scope, credentialPlacement = "basic") {
1709
+ const body = new URLSearchParams({ grant_type: "client_credentials" });
1710
+ if (scope) body.set("scope", scope);
1711
+ if (credentialPlacement === "form-body") {
1712
+ body.set("client_id", bundle.clientId);
1713
+ body.set("client_secret", bundle.clientSecret);
1714
+ }
1715
+ const headers = {
1716
+ accept: "application/json",
1717
+ "content-type": "application/x-www-form-urlencoded"
1718
+ };
1719
+ if (credentialPlacement === "basic") {
1720
+ headers.authorization = `Basic ${Buffer.from(`${bundle.clientId}:${bundle.clientSecret}`).toString("base64")}`;
1721
+ }
1722
+ const response = await fetch(region.tokenUrl, {
1723
+ method: "POST",
1724
+ headers,
1725
+ body: body.toString(),
1726
+ signal: AbortSignal.timeout(2e4)
1727
+ });
1728
+ if (response.status === 429) {
1729
+ throw new ProviderRateLimited(`${displayName} token endpoint rate limit (429)`, sourceId, {
1730
+ status: 429,
1731
+ retryAfterMs: retryAfterMs(response.headers.get("retry-after"))
1732
+ });
1733
+ }
1734
+ if (response.status === 400 || response.status === 401 || response.status === 403) {
1735
+ throw new CredentialsExpired(`${displayName} rejected client credentials (${response.status})`, sourceId, {
1736
+ status: response.status
1737
+ });
1738
+ }
1739
+ if (!response.ok) throw new Error(`${displayName} token exchange failed (${response.status})`);
1740
+ let payload;
1741
+ try {
1742
+ payload = await response.json();
1743
+ } catch {
1744
+ throw new Error(`${displayName} token exchange returned malformed JSON`);
1745
+ }
1746
+ if (!payload || typeof payload !== "object" || Array.isArray(payload)) {
1747
+ throw new Error(`${displayName} token exchange returned an invalid response`);
1748
+ }
1749
+ const values = payload;
1750
+ const accessToken3 = requiredString(values.access_token, "access_token");
1751
+ const expiresIn = Number(values.expires_in ?? 3600);
1752
+ if (!Number.isFinite(expiresIn) || expiresIn <= 0) {
1753
+ throw new Error(`${displayName} token exchange returned an invalid expires_in`);
1754
+ }
1755
+ return {
1756
+ fingerprint,
1757
+ accessToken: accessToken3,
1758
+ expiresAt: Date.now() + Math.round(expiresIn * 1e3)
1759
+ };
1760
+ }
1761
+ function withAccessToken(source, apiBaseUrl, accessToken3) {
1762
+ return {
1763
+ ...source,
1764
+ metadata: { ...source.metadata, __clientCredentialsApiBaseUrl: apiBaseUrl },
1765
+ credentials: { kind: "oauth2", accessToken: accessToken3 }
1766
+ };
1767
+ }
1768
+ function retryAfterMs(raw) {
1769
+ if (!raw) return 6e4;
1770
+ const seconds = Number(raw);
1771
+ if (Number.isFinite(seconds) && seconds >= 0) return Math.max(1e3, Math.round(seconds * 1e3));
1772
+ const at = Date.parse(raw);
1773
+ return Number.isFinite(at) ? Math.max(1e3, at - Date.now()) : 6e4;
1774
+ }
1775
+
1776
+ // src/connectors/adapters/onelogin.ts
1777
+ var userId2 = { type: "string", description: "OneLogin user id." };
1778
+ var groupId2 = { type: "string", description: "OneLogin group id." };
1779
+ var oneloginRestConnector = clientCredentialsRestConnector({
1780
+ kind: "onelogin",
1781
+ displayName: "OneLogin",
1782
+ description: "Provision OneLogin users, groups, and user group assignments with customer-owned API credentials.",
1783
+ auth: {
1784
+ kind: "api-key",
1785
+ hint: 'JSON credential bundle: {"clientId":"...","clientSecret":"...","region":"us|eu"}.'
1786
+ },
1787
+ category: "other",
1788
+ defaultConsistencyModel: "authoritative",
1789
+ regions: {
1790
+ us: {
1791
+ apiBaseUrl: "https://api.us.onelogin.com",
1792
+ tokenUrl: "https://api.us.onelogin.com/auth/oauth2/v2/token"
1793
+ },
1794
+ eu: {
1795
+ apiBaseUrl: "https://api.eu.onelogin.com",
1796
+ tokenUrl: "https://api.eu.onelogin.com/auth/oauth2/v2/token"
1797
+ }
1798
+ },
1799
+ defaultRegion: "us",
1800
+ tokenCredentialPlacement: "form-body",
1801
+ apiCredentialPlacement: { kind: "header", header: "Authorization", prefix: "bearer:" },
1802
+ defaultHeaders: { Accept: "application/json" },
1803
+ test: { method: "GET", path: "/api/2/users", query: { limit: 1 } },
1804
+ capabilities: [
1805
+ {
1806
+ name: "users.list",
1807
+ class: "read",
1808
+ description: "List or filter OneLogin users.",
1809
+ parameters: {
1810
+ type: "object",
1811
+ properties: {
1812
+ limit: { type: "integer", minimum: 1, maximum: 1e3 },
1813
+ page: { type: "integer", minimum: 1 },
1814
+ email: { type: "string" },
1815
+ username: { type: "string" },
1816
+ status: { type: "integer" },
1817
+ group_id: { type: "integer" },
1818
+ role_id: { type: "integer" }
1819
+ }
1820
+ },
1821
+ request: {
1822
+ method: "GET",
1823
+ path: "/api/2/users",
1824
+ query: {
1825
+ limit: "{limit}",
1826
+ page: "{page}",
1827
+ email: "{email}",
1828
+ username: "{username}",
1829
+ status: "{status}",
1830
+ group_id: "{group_id}",
1831
+ role_id: "{role_id}"
1832
+ }
1833
+ }
1834
+ },
1835
+ {
1836
+ name: "users.get",
1837
+ class: "read",
1838
+ description: "Read one OneLogin user.",
1839
+ parameters: { type: "object", properties: { userId: userId2 }, required: ["userId"] },
1840
+ request: { method: "GET", path: "/api/2/users/{userId}" }
1841
+ },
1842
+ {
1843
+ name: "users.create",
1844
+ class: "mutation",
1845
+ description: "Create a OneLogin user from a provider-native user object.",
1846
+ parameters: { type: "object", properties: { user: { type: "object" } }, required: ["user"] },
1847
+ request: { method: "POST", path: "/api/2/users", body: "{user}" },
1848
+ cas: "native-idempotency",
1849
+ externalEffect: true
1850
+ },
1851
+ {
1852
+ name: "users.update",
1853
+ class: "mutation",
1854
+ description: "Update mutable fields on a OneLogin user.",
1855
+ parameters: {
1856
+ type: "object",
1857
+ properties: { userId: userId2, user: { type: "object" } },
1858
+ required: ["userId", "user"]
1859
+ },
1860
+ request: { method: "PUT", path: "/api/2/users/{userId}", body: "{user}" },
1861
+ cas: "optimistic-read-verify",
1862
+ externalEffect: true
1863
+ },
1864
+ {
1865
+ name: "users.deactivate",
1866
+ class: "mutation",
1867
+ description: "Set a OneLogin user to suspended status without deleting the record.",
1868
+ parameters: { type: "object", properties: { userId: userId2 }, required: ["userId"] },
1869
+ request: { method: "PUT", path: "/api/2/users/{userId}", body: { status: 2 } },
1870
+ cas: "optimistic-read-verify",
1871
+ externalEffect: true
1872
+ },
1873
+ {
1874
+ name: "groups.list",
1875
+ class: "read",
1876
+ description: "List OneLogin groups.",
1877
+ parameters: {
1878
+ type: "object",
1879
+ properties: {
1880
+ limit: { type: "integer", minimum: 1, maximum: 1e3 },
1881
+ page: { type: "integer", minimum: 1 },
1882
+ name: { type: "string" }
1883
+ }
1884
+ },
1885
+ request: { method: "GET", path: "/api/1/groups", query: { limit: "{limit}", page: "{page}", name: "{name}" } }
1886
+ },
1887
+ {
1888
+ name: "groups.get",
1889
+ class: "read",
1890
+ description: "Read one OneLogin group.",
1891
+ parameters: { type: "object", properties: { groupId: groupId2 }, required: ["groupId"] },
1892
+ request: { method: "GET", path: "/api/1/groups/{groupId}" }
1893
+ },
1894
+ {
1895
+ name: "groups.users.add",
1896
+ class: "mutation",
1897
+ description: "Assign a OneLogin user to a group. OneLogin permits one group per user.",
1898
+ parameters: {
1899
+ type: "object",
1900
+ properties: { groupId: groupId2, userId: userId2 },
1901
+ required: ["groupId", "userId"]
1902
+ },
1903
+ request: { method: "PUT", path: "/api/2/users/{userId}", body: { group_id: "{groupId}" } },
1904
+ cas: "optimistic-read-verify",
1905
+ externalEffect: true
1906
+ },
1907
+ {
1908
+ name: "groups.users.remove",
1909
+ class: "mutation",
1910
+ description: "Remove a OneLogin user from the expected current group.",
1911
+ parameters: {
1912
+ type: "object",
1913
+ properties: { groupId: groupId2, userId: userId2 },
1914
+ required: ["groupId", "userId"]
1915
+ },
1916
+ request: { method: "PUT", path: "/api/2/users/{userId}", body: { group_id: null } },
1917
+ cas: "optimistic-read-verify",
1918
+ externalEffect: true
1919
+ }
1920
+ ]
1921
+ });
1922
+ var oneloginConnector = {
1923
+ ...oneloginRestConnector,
1924
+ async executeMutation(invocation) {
1925
+ if (invocation.capabilityName !== "groups.users.remove") {
1926
+ return oneloginRestConnector.executeMutation(invocation);
1927
+ }
1928
+ const current = await oneloginRestConnector.executeRead({
1929
+ ...invocation,
1930
+ capabilityName: "users.get",
1931
+ args: { userId: invocation.args.userId }
1932
+ });
1933
+ const currentGroup = readGroupId(current.data);
1934
+ const expectedGroup = String(invocation.args.groupId);
1935
+ if (currentGroup !== expectedGroup) {
1936
+ return {
1937
+ status: "conflict",
1938
+ alternatives: [],
1939
+ currentState: current.data,
1940
+ message: `OneLogin user is assigned to group ${currentGroup ?? "none"}, not ${expectedGroup}`
1941
+ };
1942
+ }
1943
+ return oneloginRestConnector.executeMutation(invocation);
1944
+ }
1945
+ };
1946
+ function readGroupId(data4) {
1947
+ if (!data4 || typeof data4 !== "object" || Array.isArray(data4)) return void 0;
1948
+ const value = data4.group_id;
1949
+ return typeof value === "string" || typeof value === "number" ? String(value) : void 0;
1950
+ }
1951
+
1952
+ // src/connectors/adapters/ping-identity.ts
1953
+ var userId3 = { type: "string", description: "PingOne user id." };
1954
+ var groupId3 = { type: "string", description: "PingOne group id." };
1955
+ var regions = {
1956
+ us: { apiBaseUrl: "https://api.pingone.com", tokenUrl: "https://auth.pingone.com/{connection.environmentId}/as/token" },
1957
+ ca: { apiBaseUrl: "https://api.pingone.ca", tokenUrl: "https://auth.pingone.ca/{connection.environmentId}/as/token" },
1958
+ eu: { apiBaseUrl: "https://api.pingone.eu", tokenUrl: "https://auth.pingone.eu/{connection.environmentId}/as/token" },
1959
+ au: { apiBaseUrl: "https://api.pingone.com.au", tokenUrl: "https://auth.pingone.com.au/{connection.environmentId}/as/token" },
1960
+ asia: { apiBaseUrl: "https://api.pingone.asia", tokenUrl: "https://auth.pingone.asia/{connection.environmentId}/as/token" }
1961
+ };
1962
+ var pingIdentityConnector = clientCredentialsRestConnector({
1963
+ kind: "ping-identity",
1964
+ displayName: "Ping Identity",
1965
+ description: "Provision PingOne users, groups, and group memberships with customer-owned worker credentials.",
1966
+ auth: {
1967
+ kind: "api-key",
1968
+ hint: 'JSON credential bundle: {"clientId":"...","clientSecret":"...","region":"us|ca|eu|au|asia"}. Set environmentId in connection metadata.'
1969
+ },
1970
+ category: "other",
1971
+ defaultConsistencyModel: "authoritative",
1972
+ regions,
1973
+ defaultRegion: "us",
1974
+ defaultHeaders: { Accept: "application/json" },
1975
+ test: {
1976
+ method: "GET",
1977
+ path: "/v1/environments/{connection.environmentId}/users",
1978
+ query: { limit: 1 }
1979
+ },
1980
+ capabilities: [
1981
+ {
1982
+ name: "users.list",
1983
+ class: "read",
1984
+ description: "List or filter users in the connected PingOne environment.",
1985
+ parameters: {
1986
+ type: "object",
1987
+ properties: {
1988
+ limit: { type: "integer", minimum: 1, maximum: 200 },
1989
+ filter: { type: "string" },
1990
+ order: { type: "string" }
1991
+ }
1992
+ },
1993
+ request: {
1994
+ method: "GET",
1995
+ path: "/v1/environments/{connection.environmentId}/users",
1996
+ query: { limit: "{limit}", filter: "{filter}", order: "{order}" }
1997
+ }
1998
+ },
1999
+ {
2000
+ name: "users.get",
2001
+ class: "read",
2002
+ description: "Read one PingOne user.",
2003
+ parameters: { type: "object", properties: { userId: userId3 }, required: ["userId"] },
2004
+ request: { method: "GET", path: "/v1/environments/{connection.environmentId}/users/{userId}" }
2005
+ },
2006
+ {
2007
+ name: "users.create",
2008
+ class: "mutation",
2009
+ description: "Create a PingOne user from a provider-native user object.",
2010
+ parameters: {
2011
+ type: "object",
2012
+ properties: { user: { type: "object" } },
2013
+ required: ["user"]
2014
+ },
2015
+ request: { method: "POST", path: "/v1/environments/{connection.environmentId}/users", body: "{user}" },
2016
+ cas: "native-idempotency",
2017
+ externalEffect: true
2018
+ },
2019
+ {
2020
+ name: "users.update",
2021
+ class: "mutation",
2022
+ description: "Patch mutable fields on a PingOne user.",
2023
+ parameters: {
2024
+ type: "object",
2025
+ properties: { userId: userId3, user: { type: "object" } },
2026
+ required: ["userId", "user"]
2027
+ },
2028
+ request: { method: "PATCH", path: "/v1/environments/{connection.environmentId}/users/{userId}", body: "{user}" },
2029
+ cas: "optimistic-read-verify",
2030
+ externalEffect: true
2031
+ },
2032
+ {
2033
+ name: "users.deactivate",
2034
+ class: "mutation",
2035
+ description: "Disable a PingOne user without deleting the record.",
2036
+ parameters: { type: "object", properties: { userId: userId3 }, required: ["userId"] },
2037
+ request: {
2038
+ method: "PATCH",
2039
+ path: "/v1/environments/{connection.environmentId}/users/{userId}",
2040
+ body: { enabled: false }
2041
+ },
2042
+ cas: "optimistic-read-verify",
2043
+ externalEffect: true
2044
+ },
2045
+ {
2046
+ name: "groups.list",
2047
+ class: "read",
2048
+ description: "List or filter groups in the PingOne environment.",
2049
+ parameters: {
2050
+ type: "object",
2051
+ properties: {
2052
+ limit: { type: "integer", minimum: 1, maximum: 200 },
2053
+ filter: { type: "string" }
2054
+ }
2055
+ },
2056
+ request: {
2057
+ method: "GET",
2058
+ path: "/v1/environments/{connection.environmentId}/groups",
2059
+ query: { limit: "{limit}", filter: "{filter}" }
2060
+ }
2061
+ },
2062
+ {
2063
+ name: "groups.get",
2064
+ class: "read",
2065
+ description: "Read one PingOne group.",
2066
+ parameters: { type: "object", properties: { groupId: groupId3 }, required: ["groupId"] },
2067
+ request: { method: "GET", path: "/v1/environments/{connection.environmentId}/groups/{groupId}" }
2068
+ },
2069
+ {
2070
+ name: "groups.create",
2071
+ class: "mutation",
2072
+ description: "Create a PingOne group from a provider-native group object.",
2073
+ parameters: { type: "object", properties: { group: { type: "object" } }, required: ["group"] },
2074
+ request: { method: "POST", path: "/v1/environments/{connection.environmentId}/groups", body: "{group}" },
2075
+ cas: "native-idempotency",
2076
+ externalEffect: true
2077
+ },
2078
+ {
2079
+ name: "groups.update",
2080
+ class: "mutation",
2081
+ description: "Patch mutable fields on a PingOne group.",
2082
+ parameters: {
2083
+ type: "object",
2084
+ properties: { groupId: groupId3, group: { type: "object" } },
2085
+ required: ["groupId", "group"]
2086
+ },
2087
+ request: { method: "PUT", path: "/v1/environments/{connection.environmentId}/groups/{groupId}", body: "{group}" },
2088
+ cas: "optimistic-read-verify",
2089
+ externalEffect: true
2090
+ },
2091
+ {
2092
+ name: "groups.users.add",
2093
+ class: "mutation",
2094
+ description: "Add a PingOne user to a group.",
2095
+ parameters: {
2096
+ type: "object",
2097
+ properties: { groupId: groupId3, userId: userId3 },
2098
+ required: ["groupId", "userId"]
2099
+ },
2100
+ request: {
2101
+ method: "POST",
2102
+ path: "/v1/environments/{connection.environmentId}/users/{userId}/memberOfGroups",
2103
+ body: { id: "{groupId}" }
2104
+ },
2105
+ cas: "native-idempotency",
2106
+ externalEffect: true
2107
+ },
2108
+ {
2109
+ name: "groups.users.remove",
2110
+ class: "mutation",
2111
+ description: "Remove a PingOne user from a group.",
2112
+ parameters: {
2113
+ type: "object",
2114
+ properties: { groupId: groupId3, userId: userId3 },
2115
+ required: ["groupId", "userId"]
2116
+ },
2117
+ request: {
2118
+ method: "DELETE",
2119
+ path: "/v1/environments/{connection.environmentId}/users/{userId}/memberOfGroups/{groupId}"
2120
+ },
2121
+ cas: "native-idempotency",
2122
+ externalEffect: true
2123
+ }
2124
+ ]
2125
+ });
2126
+
2127
+ // src/connectors/adapters/scim.ts
2128
+ var userId4 = { type: "string", description: "SCIM user resource id." };
2129
+ var groupId4 = { type: "string", description: "SCIM group resource id." };
2130
+ var patchSchema = "urn:ietf:params:scim:api:messages:2.0:PatchOp";
2131
+ var scimRestConnector = declarativeRestConnector({
2132
+ kind: "scim",
2133
+ displayName: "SCIM",
2134
+ description: "Provision users, groups, and group memberships against any public SCIM 2.0 service provider.",
2135
+ auth: {
2136
+ kind: "api-key",
2137
+ hint: "SCIM bearer token. Set baseUrl to the provider SCIM 2.0 root, for example https://tenant.example.com/scim/v2."
2138
+ },
2139
+ category: "other",
2140
+ defaultConsistencyModel: "authoritative",
2141
+ baseUrl: { metadataKey: "baseUrl" },
2142
+ requirePublicHttpsBaseUrl: true,
2143
+ credentialPlacement: { kind: "bearer" },
2144
+ defaultHeaders: {
2145
+ Accept: "application/scim+json, application/json",
2146
+ "Content-Type": "application/scim+json"
2147
+ },
2148
+ test: { method: "GET", path: "/ServiceProviderConfig" },
2149
+ capabilities: [
2150
+ {
2151
+ name: "users.list",
2152
+ class: "read",
2153
+ description: "List or filter SCIM users with standard pagination and attribute selection.",
2154
+ parameters: {
2155
+ type: "object",
2156
+ properties: {
2157
+ filter: { type: "string" },
2158
+ startIndex: { type: "integer", minimum: 1 },
2159
+ count: { type: "integer", minimum: 1, maximum: 1e3 },
2160
+ attributes: { type: "string" },
2161
+ excludedAttributes: { type: "string" },
2162
+ sortBy: { type: "string" },
2163
+ sortOrder: { type: "string", enum: ["ascending", "descending"] }
2164
+ }
2165
+ },
2166
+ request: {
2167
+ method: "GET",
2168
+ path: "/Users",
2169
+ query: {
2170
+ filter: "{filter}",
2171
+ startIndex: "{startIndex}",
2172
+ count: "{count}",
2173
+ attributes: "{attributes}",
2174
+ excludedAttributes: "{excludedAttributes}",
2175
+ sortBy: "{sortBy}",
2176
+ sortOrder: "{sortOrder}"
2177
+ }
2178
+ }
2179
+ },
2180
+ {
2181
+ name: "users.get",
2182
+ class: "read",
2183
+ description: "Read one SCIM user.",
2184
+ parameters: { type: "object", properties: { userId: userId4 }, required: ["userId"] },
2185
+ request: { method: "GET", path: "/Users/{userId}" }
2186
+ },
2187
+ {
2188
+ name: "users.create",
2189
+ class: "mutation",
2190
+ description: "Create a SCIM user from a complete provider-compatible resource.",
2191
+ parameters: { type: "object", properties: { user: { type: "object" } }, required: ["user"] },
2192
+ request: { method: "POST", path: "/Users", body: "{user}" },
2193
+ cas: "native-idempotency",
2194
+ externalEffect: true
2195
+ },
2196
+ {
2197
+ name: "users.replace",
2198
+ class: "mutation",
2199
+ description: "Replace a SCIM user resource.",
2200
+ parameters: {
2201
+ type: "object",
2202
+ properties: { userId: userId4, user: { type: "object" } },
2203
+ required: ["userId", "user"]
2204
+ },
2205
+ request: { method: "PUT", path: "/Users/{userId}", body: "{user}" },
2206
+ cas: "etag-if-match",
2207
+ externalEffect: true
2208
+ },
2209
+ {
2210
+ name: "users.update",
2211
+ class: "mutation",
2212
+ description: "Apply SCIM PatchOp operations to a user.",
2213
+ parameters: {
2214
+ type: "object",
2215
+ properties: { userId: userId4, operations: { type: "array", items: { type: "object" } } },
2216
+ required: ["userId", "operations"]
2217
+ },
2218
+ request: {
2219
+ method: "PATCH",
2220
+ path: "/Users/{userId}",
2221
+ body: { schemas: [patchSchema], Operations: "{operations}" }
2222
+ },
2223
+ cas: "etag-if-match",
2224
+ externalEffect: true
2225
+ },
2226
+ {
2227
+ name: "users.deactivate",
2228
+ class: "mutation",
2229
+ description: "Deactivate a SCIM user by setting active=false.",
2230
+ parameters: { type: "object", properties: { userId: userId4 }, required: ["userId"] },
2231
+ request: {
2232
+ method: "PATCH",
2233
+ path: "/Users/{userId}",
2234
+ body: { schemas: [patchSchema], Operations: [{ op: "replace", path: "active", value: false }] }
2235
+ },
2236
+ cas: "etag-if-match",
2237
+ externalEffect: true
2238
+ },
2239
+ {
2240
+ name: "groups.list",
2241
+ class: "read",
2242
+ description: "List or filter SCIM groups.",
2243
+ parameters: {
2244
+ type: "object",
2245
+ properties: {
2246
+ filter: { type: "string" },
2247
+ startIndex: { type: "integer", minimum: 1 },
2248
+ count: { type: "integer", minimum: 1, maximum: 1e3 },
2249
+ attributes: { type: "string" },
2250
+ excludedAttributes: { type: "string" }
2251
+ }
2252
+ },
2253
+ request: {
2254
+ method: "GET",
2255
+ path: "/Groups",
2256
+ query: {
2257
+ filter: "{filter}",
2258
+ startIndex: "{startIndex}",
2259
+ count: "{count}",
2260
+ attributes: "{attributes}",
2261
+ excludedAttributes: "{excludedAttributes}"
2262
+ }
2263
+ }
2264
+ },
2265
+ {
2266
+ name: "groups.get",
2267
+ class: "read",
2268
+ description: "Read one SCIM group.",
2269
+ parameters: { type: "object", properties: { groupId: groupId4 }, required: ["groupId"] },
2270
+ request: { method: "GET", path: "/Groups/{groupId}" }
2271
+ },
2272
+ {
2273
+ name: "groups.create",
2274
+ class: "mutation",
2275
+ description: "Create a SCIM group from a complete provider-compatible resource.",
2276
+ parameters: { type: "object", properties: { group: { type: "object" } }, required: ["group"] },
2277
+ request: { method: "POST", path: "/Groups", body: "{group}" },
2278
+ cas: "native-idempotency",
2279
+ externalEffect: true
2280
+ },
2281
+ {
2282
+ name: "groups.update",
2283
+ class: "mutation",
2284
+ description: "Apply SCIM PatchOp operations to a group.",
2285
+ parameters: {
2286
+ type: "object",
2287
+ properties: { groupId: groupId4, operations: { type: "array", items: { type: "object" } } },
2288
+ required: ["groupId", "operations"]
2289
+ },
2290
+ request: {
2291
+ method: "PATCH",
2292
+ path: "/Groups/{groupId}",
2293
+ body: { schemas: [patchSchema], Operations: "{operations}" }
2294
+ },
2295
+ cas: "etag-if-match",
2296
+ externalEffect: true
2297
+ },
2298
+ {
2299
+ name: "groups.users.add",
2300
+ class: "mutation",
2301
+ description: "Add a user reference to a SCIM group.",
2302
+ parameters: {
2303
+ type: "object",
2304
+ properties: { groupId: groupId4, userId: userId4 },
2305
+ required: ["groupId", "userId"]
2306
+ },
2307
+ request: {
2308
+ method: "PATCH",
2309
+ path: "/Groups/{groupId}",
2310
+ body: {
2311
+ schemas: [patchSchema],
2312
+ Operations: [{ op: "add", path: "members", value: [{ value: "{userId}" }] }]
2313
+ }
2314
+ },
2315
+ cas: "etag-if-match",
2316
+ externalEffect: true
2317
+ },
2318
+ {
2319
+ name: "groups.users.remove",
2320
+ class: "mutation",
2321
+ description: "Remove a user reference from a SCIM group.",
2322
+ parameters: {
2323
+ type: "object",
2324
+ properties: {
2325
+ groupId: groupId4,
2326
+ userId: userId4
2327
+ },
2328
+ required: ["groupId", "userId"]
2329
+ },
2330
+ request: {
2331
+ method: "PATCH",
2332
+ path: "/Groups/{groupId}",
2333
+ body: { schemas: [patchSchema], Operations: ["{operation}"] }
2334
+ },
2335
+ cas: "etag-if-match",
2336
+ externalEffect: true
2337
+ }
2338
+ ]
2339
+ });
2340
+ var scimConnector = {
2341
+ ...scimRestConnector,
2342
+ async executeMutation(invocation) {
2343
+ if (invocation.capabilityName !== "groups.users.remove") {
2344
+ return scimRestConnector.executeMutation(invocation);
2345
+ }
2346
+ const userIdValue = invocation.args.userId;
2347
+ if (typeof userIdValue !== "string" || !userIdValue.trim()) {
2348
+ throw new Error("missing required argument: userId");
2349
+ }
2350
+ return scimRestConnector.executeMutation({
2351
+ ...invocation,
2352
+ args: {
2353
+ ...invocation.args,
2354
+ operation: {
2355
+ op: "remove",
2356
+ path: `members[value eq "${escapeScimFilterValue(userIdValue)}"]`
2357
+ }
2358
+ }
2359
+ });
2360
+ }
2361
+ };
2362
+ function escapeScimFilterValue(value) {
2363
+ return value.replace(/\\/g, "\\\\").replace(/"/g, '\\"');
2364
+ }
2365
+
1540
2366
  // src/connectors/adapters/actualbudget.ts
1541
2367
  var actualbudgetConnector = declarativeRestConnector({
1542
2368
  kind: "actualbudget",
@@ -6899,7 +7725,7 @@ var modelslabConnector = {
6899
7725
  if (inv.capabilityName !== "text.to.image") {
6900
7726
  throw new Error(`modelslab: unknown mutation capability ${inv.capabilityName}`);
6901
7727
  }
6902
- const prompt = requiredString(inv.args, "prompt");
7728
+ const prompt = requiredString2(inv.args, "prompt");
6903
7729
  const data4 = await request(inv.source, `${baseUrl}/text2img`, {
6904
7730
  ...pick(inv.args, [
6905
7731
  "negative_prompt",
@@ -6925,7 +7751,7 @@ var modelslabConnector = {
6925
7751
  if (inv.capabilityName !== "images.status") {
6926
7752
  throw new Error(`modelslab: unknown read capability ${inv.capabilityName}`);
6927
7753
  }
6928
- const requestId = encodeURIComponent(requiredString(inv.args, "requestId"));
7754
+ const requestId = encodeURIComponent(requiredString2(inv.args, "requestId"));
6929
7755
  const data4 = await request(inv.source, `${baseUrl}/fetch/${requestId}`, {});
6930
7756
  return { data: data4, fetchedAt: Date.now() };
6931
7757
  },
@@ -6954,7 +7780,7 @@ async function request(source, url, body) {
6954
7780
  throw new ProviderRateLimited("ModelsLab rate limit (429)", source.id, {
6955
7781
  status: 429,
6956
7782
  body: responseBody,
6957
- retryAfterMs: retryAfterMs(response.headers.get("retry-after"))
7783
+ retryAfterMs: retryAfterMs2(response.headers.get("retry-after"))
6958
7784
  });
6959
7785
  }
6960
7786
  if (!response.ok) throw new Error(`modelslab POST ${new URL(url).pathname} HTTP ${response.status}`);
@@ -6967,7 +7793,7 @@ function credential(source) {
6967
7793
  }
6968
7794
  return source.credentials.apiKey;
6969
7795
  }
6970
- function requiredString(args, key) {
7796
+ function requiredString2(args, key) {
6971
7797
  const value = args[key];
6972
7798
  if (typeof value !== "string" || !value) throw new Error(`modelslab: ${key} is required`);
6973
7799
  return value;
@@ -6987,7 +7813,7 @@ async function readBody(response) {
6987
7813
  function isErrorResponse(value) {
6988
7814
  return Boolean(value && typeof value === "object" && value.status === "error");
6989
7815
  }
6990
- function retryAfterMs(value) {
7816
+ function retryAfterMs2(value) {
6991
7817
  if (!value) return 6e4;
6992
7818
  const seconds = Number(value);
6993
7819
  return Number.isFinite(seconds) && seconds >= 0 ? Math.max(1e3, seconds * 1e3) : 6e4;
@@ -7701,12 +8527,12 @@ function collectionRead(name, description, path, entity) {
7701
8527
  }
7702
8528
  };
7703
8529
  }
7704
- function entityRead(name, description, path, id) {
8530
+ function entityRead(name, description, path, id2) {
7705
8531
  return {
7706
8532
  name,
7707
8533
  class: "read",
7708
8534
  description,
7709
- parameters: idParameters(id),
8535
+ parameters: idParameters(id2),
7710
8536
  request: { method: "GET", path }
7711
8537
  };
7712
8538
  }
@@ -7721,15 +8547,15 @@ function entityCreate(name, description, path) {
7721
8547
  externalEffect: true
7722
8548
  };
7723
8549
  }
7724
- function entityUpdate(name, description, path, id) {
8550
+ function entityUpdate(name, description, path, id2) {
7725
8551
  return {
7726
8552
  name,
7727
8553
  class: "mutation",
7728
8554
  description,
7729
8555
  parameters: {
7730
8556
  type: "object",
7731
- properties: { [id]: { type: "integer" } },
7732
- required: [id],
8557
+ properties: { [id2]: { type: "integer" } },
8558
+ required: [id2],
7733
8559
  additionalProperties: true
7734
8560
  },
7735
8561
  request: { method: "PUT", path, body: "args" },
@@ -7737,22 +8563,22 @@ function entityUpdate(name, description, path, id) {
7737
8563
  externalEffect: true
7738
8564
  };
7739
8565
  }
7740
- function entityDelete(name, description, path, id) {
8566
+ function entityDelete(name, description, path, id2) {
7741
8567
  return {
7742
8568
  name,
7743
8569
  class: "mutation",
7744
8570
  description,
7745
- parameters: idParameters(id),
8571
+ parameters: idParameters(id2),
7746
8572
  request: { method: "DELETE", path },
7747
8573
  cas: "native-idempotency",
7748
8574
  externalEffect: true
7749
8575
  };
7750
8576
  }
7751
- function idParameters(id) {
8577
+ function idParameters(id2) {
7752
8578
  return {
7753
8579
  type: "object",
7754
- properties: { [id]: { type: "integer" } },
7755
- required: [id]
8580
+ properties: { [id2]: { type: "integer" } },
8581
+ required: [id2]
7756
8582
  };
7757
8583
  }
7758
8584
  function arbitraryBodyParameters() {
@@ -9635,6 +10461,192 @@ var avomaConnector = declarativeRestConnector({
9635
10461
  ]
9636
10462
  });
9637
10463
 
10464
+ // src/connectors/adapters/avalara.ts
10465
+ var companyCode = { type: "string", description: "Avalara company code." };
10466
+ var transactionCode = { type: "string", description: "Merchant transaction code." };
10467
+ var model = {
10468
+ type: "object",
10469
+ description: "Provider-native AvaTax v2 request model."
10470
+ };
10471
+ var avalaraConnector = declarativeRestConnector({
10472
+ kind: "avalara",
10473
+ displayName: "Avalara AvaTax",
10474
+ description: "Calculate tax and manage AvaTax transaction documents, adjustments, commits, voids, and refunds.",
10475
+ auth: {
10476
+ kind: "api-key",
10477
+ hint: 'JSON credential bundle: {"accountId":"...","licenseKey":"..."}. Use apiBaseUrl metadata for the sandbox host when needed.'
10478
+ },
10479
+ category: "commerce",
10480
+ defaultConsistencyModel: "authoritative",
10481
+ baseUrl: { metadataKey: "apiBaseUrl", fallback: "https://rest.avatax.com" },
10482
+ allowedBaseUrls: ["https://rest.avatax.com", "https://sandbox-rest.avatax.com"],
10483
+ credentialPlacement: {
10484
+ kind: "basic-structured",
10485
+ usernameField: "accountId",
10486
+ passwordField: "licenseKey"
10487
+ },
10488
+ test: { method: "GET", path: "/api/v2/utilities/ping" },
10489
+ capabilities: [
10490
+ {
10491
+ name: "rates.by-address",
10492
+ class: "read",
10493
+ description: "Estimate the total tax rate for one postal address.",
10494
+ parameters: {
10495
+ type: "object",
10496
+ properties: {
10497
+ line1: { type: "string" },
10498
+ city: { type: "string" },
10499
+ region: { type: "string" },
10500
+ postalCode: { type: "string" },
10501
+ country: { type: "string" }
10502
+ },
10503
+ required: ["postalCode", "country"]
10504
+ },
10505
+ request: {
10506
+ method: "GET",
10507
+ path: "/api/v2/taxrates/byaddress",
10508
+ query: {
10509
+ line1: "{line1}",
10510
+ city: "{city}",
10511
+ region: "{region}",
10512
+ postalCode: "{postalCode}",
10513
+ country: "{country}"
10514
+ }
10515
+ }
10516
+ },
10517
+ {
10518
+ name: "definitions.tax-codes.list",
10519
+ class: "read",
10520
+ description: "List Avalara system tax codes for product classification.",
10521
+ parameters: {
10522
+ type: "object",
10523
+ properties: {
10524
+ top: { type: "integer", minimum: 1, maximum: 1e3 },
10525
+ skip: { type: "integer", minimum: 0 },
10526
+ filter: { type: "string" },
10527
+ orderBy: { type: "string" }
10528
+ }
10529
+ },
10530
+ request: {
10531
+ method: "GET",
10532
+ path: "/api/v2/definitions/taxcodes",
10533
+ query: { "$top": "{top}", "$skip": "{skip}", "$filter": "{filter}", "$orderby": "{orderBy}" }
10534
+ }
10535
+ },
10536
+ {
10537
+ name: "transactions.create",
10538
+ class: "mutation",
10539
+ description: "Create an AvaTax transaction document and calculate its tax.",
10540
+ parameters: {
10541
+ type: "object",
10542
+ properties: { model },
10543
+ required: ["model"]
10544
+ },
10545
+ request: { method: "POST", path: "/api/v2/transactions/create", body: "{model}" },
10546
+ cas: "native-idempotency",
10547
+ externalEffect: true
10548
+ },
10549
+ {
10550
+ name: "transactions.create-or-adjust",
10551
+ class: "mutation",
10552
+ description: "Create a transaction or adjust the existing transaction with the same company/code/type.",
10553
+ parameters: {
10554
+ type: "object",
10555
+ properties: { model },
10556
+ required: ["model"]
10557
+ },
10558
+ request: { method: "POST", path: "/api/v2/transactions/createoradjust", body: "{model}" },
10559
+ cas: "native-idempotency",
10560
+ externalEffect: true
10561
+ },
10562
+ transactionRead("transactions.get", "", "Read one AvaTax transaction and its summary."),
10563
+ {
10564
+ name: "transactions.audit",
10565
+ class: "read",
10566
+ description: "Read the audit trail for one AvaTax transaction.",
10567
+ parameters: {
10568
+ type: "object",
10569
+ properties: { companyCode, transactionCode },
10570
+ required: ["companyCode", "transactionCode"]
10571
+ },
10572
+ request: {
10573
+ method: "GET",
10574
+ path: "/api/v2/companies/{companyCode}/transactions/{transactionCode}/audit"
10575
+ }
10576
+ },
10577
+ transactionAction("transactions.commit", "/commit", "Commit a transaction for reporting and filing."),
10578
+ transactionAction("transactions.void", "/void", "Void a transaction with an explicit AvaTax void reason."),
10579
+ transactionAction("transactions.refund", "/refund", "Create a full or partial refund transaction."),
10580
+ transactionAction("transactions.lock", "/lock", "Lock a transaction against further edits."),
10581
+ {
10582
+ name: "companies.list",
10583
+ class: "read",
10584
+ description: "List AvaTax companies accessible to the account.",
10585
+ parameters: {
10586
+ type: "object",
10587
+ properties: {
10588
+ top: { type: "integer", minimum: 1, maximum: 1e3 },
10589
+ skip: { type: "integer", minimum: 0 },
10590
+ filter: { type: "string" }
10591
+ }
10592
+ },
10593
+ request: {
10594
+ method: "GET",
10595
+ path: "/api/v2/companies",
10596
+ query: { "$top": "{top}", "$skip": "{skip}", "$filter": "{filter}" }
10597
+ }
10598
+ }
10599
+ ]
10600
+ });
10601
+ function transactionRead(name, suffix, description) {
10602
+ return {
10603
+ name,
10604
+ class: "read",
10605
+ description,
10606
+ parameters: {
10607
+ type: "object",
10608
+ properties: {
10609
+ companyCode,
10610
+ transactionCode,
10611
+ documentType: { type: "string" },
10612
+ include: { type: "string", description: "Related response objects to include." }
10613
+ },
10614
+ required: ["companyCode", "transactionCode"]
10615
+ },
10616
+ request: {
10617
+ method: "GET",
10618
+ path: `/api/v2/companies/{companyCode}/transactions/{transactionCode}${suffix}`,
10619
+ query: { documentType: "{documentType}", "$include": "{include}" }
10620
+ }
10621
+ };
10622
+ }
10623
+ function transactionAction(name, suffix, description) {
10624
+ return {
10625
+ name,
10626
+ class: "mutation",
10627
+ description,
10628
+ parameters: {
10629
+ type: "object",
10630
+ properties: {
10631
+ companyCode,
10632
+ transactionCode,
10633
+ documentType: { type: "string" },
10634
+ include: { type: "string", description: "Related response objects to include." },
10635
+ model
10636
+ },
10637
+ required: ["companyCode", "transactionCode", "model"]
10638
+ },
10639
+ request: {
10640
+ method: "POST",
10641
+ path: `/api/v2/companies/{companyCode}/transactions/{transactionCode}${suffix}`,
10642
+ query: { documentType: "{documentType}", "$include": "{include}" },
10643
+ body: "{model}"
10644
+ },
10645
+ cas: "native-idempotency",
10646
+ externalEffect: true
10647
+ };
10648
+ }
10649
+
9638
10650
  // src/connectors/adapters/azure-ad.ts
9639
10651
  var azureAdConnector = declarativeRestConnector({
9640
10652
  kind: "azure-ad",
@@ -15310,6 +16322,494 @@ var chargebeeConnector = declarativeRestConnector({
15310
16322
  ]
15311
16323
  });
15312
16324
 
16325
+ // src/connectors/adapters/recurly.ts
16326
+ var id = (description) => ({ type: "string", description });
16327
+ var pageQuery = {
16328
+ limit: { type: "integer", minimum: 1, maximum: 200 },
16329
+ cursor: { type: "string" },
16330
+ sort: { type: "string", enum: ["asc", "desc"] },
16331
+ begin_time: { type: "string", description: "ISO 8601 lower timestamp bound." },
16332
+ end_time: { type: "string", description: "ISO 8601 upper timestamp bound." }
16333
+ };
16334
+ var recurlyConnector = declarativeRestConnector({
16335
+ kind: "recurly",
16336
+ displayName: "Recurly",
16337
+ description: "Manage Recurly billing accounts, plans, subscriptions, invoices, and subscription lifecycle state.",
16338
+ auth: {
16339
+ kind: "api-key",
16340
+ hint: "Recurly private API key from Developer Settings. Sent as the HTTP Basic username with an empty password."
16341
+ },
16342
+ category: "crm",
16343
+ defaultConsistencyModel: "authoritative",
16344
+ baseUrl: "https://v3.recurly.com",
16345
+ credentialPlacement: { kind: "basic-api-key" },
16346
+ defaultHeaders: {
16347
+ accept: "application/vnd.recurly.v2021-02-25",
16348
+ "content-type": "application/json"
16349
+ },
16350
+ test: { method: "GET", path: "/sites", query: { limit: 1 } },
16351
+ capabilities: [
16352
+ {
16353
+ name: "sites.list",
16354
+ class: "read",
16355
+ description: "List sites accessible to the supplied Recurly private API key.",
16356
+ parameters: { type: "object", properties: { limit: pageQuery.limit } },
16357
+ request: { method: "GET", path: "/sites", query: { limit: "{limit}" } }
16358
+ },
16359
+ {
16360
+ name: "accounts.list",
16361
+ class: "read",
16362
+ description: "List billing accounts with optional lifecycle and time filters.",
16363
+ parameters: {
16364
+ type: "object",
16365
+ properties: {
16366
+ ...pageQuery,
16367
+ state: { type: "string", enum: ["active", "closed", "any"] },
16368
+ email: { type: "string" }
16369
+ }
16370
+ },
16371
+ request: {
16372
+ method: "GET",
16373
+ path: "/accounts",
16374
+ query: {
16375
+ limit: "{limit}",
16376
+ cursor: "{cursor}",
16377
+ sort: "{sort}",
16378
+ begin_time: "{begin_time}",
16379
+ end_time: "{end_time}",
16380
+ state: "{state}",
16381
+ email: "{email}"
16382
+ }
16383
+ }
16384
+ },
16385
+ {
16386
+ name: "accounts.get",
16387
+ class: "read",
16388
+ description: "Read one billing account by UUID or code-prefixed identifier.",
16389
+ parameters: {
16390
+ type: "object",
16391
+ properties: { accountId: id("Account UUID or `code-<account code>`.") },
16392
+ required: ["accountId"]
16393
+ },
16394
+ request: { method: "GET", path: "/accounts/{accountId}" }
16395
+ },
16396
+ {
16397
+ name: "accounts.create",
16398
+ class: "mutation",
16399
+ description: "Create a billing account.",
16400
+ parameters: {
16401
+ type: "object",
16402
+ properties: {
16403
+ code: { type: "string" },
16404
+ email: { type: "string" },
16405
+ first_name: { type: "string" },
16406
+ last_name: { type: "string" },
16407
+ company: { type: "string" },
16408
+ preferred_locale: { type: "string" },
16409
+ preferred_time_zone: { type: "string" },
16410
+ address: { type: "object" },
16411
+ custom_fields: { type: "array", items: { type: "object" } }
16412
+ },
16413
+ required: ["code", "email"]
16414
+ },
16415
+ request: { method: "POST", path: "/accounts", body: "args" },
16416
+ cas: "native-idempotency",
16417
+ externalEffect: true
16418
+ },
16419
+ {
16420
+ name: "accounts.update",
16421
+ class: "mutation",
16422
+ description: "Update profile, address, locale, or custom fields on a billing account.",
16423
+ parameters: {
16424
+ type: "object",
16425
+ properties: {
16426
+ accountId: id("Account UUID or `code-<account code>`."),
16427
+ email: { type: "string" },
16428
+ first_name: { type: "string" },
16429
+ last_name: { type: "string" },
16430
+ company: { type: "string" },
16431
+ preferred_locale: { type: "string" },
16432
+ preferred_time_zone: { type: "string" },
16433
+ address: { type: "object" },
16434
+ custom_fields: { type: "array", items: { type: "object" } }
16435
+ },
16436
+ required: ["accountId"]
16437
+ },
16438
+ request: { method: "PUT", path: "/accounts/{accountId}", body: "args" },
16439
+ cas: "optimistic-read-verify",
16440
+ externalEffect: true
16441
+ },
16442
+ {
16443
+ name: "plans.list",
16444
+ class: "read",
16445
+ description: "List subscription plans.",
16446
+ parameters: {
16447
+ type: "object",
16448
+ properties: { ...pageQuery, state: { type: "string", enum: ["active", "inactive"] } }
16449
+ },
16450
+ request: {
16451
+ method: "GET",
16452
+ path: "/plans",
16453
+ query: {
16454
+ limit: "{limit}",
16455
+ cursor: "{cursor}",
16456
+ sort: "{sort}",
16457
+ begin_time: "{begin_time}",
16458
+ end_time: "{end_time}",
16459
+ state: "{state}"
16460
+ }
16461
+ }
16462
+ },
16463
+ {
16464
+ name: "subscriptions.list",
16465
+ class: "read",
16466
+ description: "List subscriptions across the site.",
16467
+ parameters: {
16468
+ type: "object",
16469
+ properties: {
16470
+ ...pageQuery,
16471
+ state: { type: "string", enum: ["active", "canceled", "expired", "failed", "future", "paused"] }
16472
+ }
16473
+ },
16474
+ request: {
16475
+ method: "GET",
16476
+ path: "/subscriptions",
16477
+ query: {
16478
+ limit: "{limit}",
16479
+ cursor: "{cursor}",
16480
+ sort: "{sort}",
16481
+ begin_time: "{begin_time}",
16482
+ end_time: "{end_time}",
16483
+ state: "{state}"
16484
+ }
16485
+ }
16486
+ },
16487
+ {
16488
+ name: "accounts.subscriptions.list",
16489
+ class: "read",
16490
+ description: "List subscriptions belonging to one billing account.",
16491
+ parameters: {
16492
+ type: "object",
16493
+ properties: {
16494
+ ...pageQuery,
16495
+ accountId: id("Account UUID or `code-<account code>`."),
16496
+ state: { type: "string", enum: ["active", "canceled", "expired", "failed", "future", "paused"] }
16497
+ },
16498
+ required: ["accountId"]
16499
+ },
16500
+ request: {
16501
+ method: "GET",
16502
+ path: "/accounts/{accountId}/subscriptions",
16503
+ query: {
16504
+ limit: "{limit}",
16505
+ cursor: "{cursor}",
16506
+ sort: "{sort}",
16507
+ begin_time: "{begin_time}",
16508
+ end_time: "{end_time}",
16509
+ state: "{state}"
16510
+ }
16511
+ }
16512
+ },
16513
+ {
16514
+ name: "subscriptions.get",
16515
+ class: "read",
16516
+ description: "Read one subscription by UUID.",
16517
+ parameters: {
16518
+ type: "object",
16519
+ properties: { subscriptionId: id("Subscription UUID.") },
16520
+ required: ["subscriptionId"]
16521
+ },
16522
+ request: { method: "GET", path: "/subscriptions/{subscriptionId}" }
16523
+ },
16524
+ {
16525
+ name: "subscriptions.create",
16526
+ class: "mutation",
16527
+ description: "Start a subscription for an existing or inline billing account.",
16528
+ parameters: {
16529
+ type: "object",
16530
+ properties: {
16531
+ plan_code: { type: "string" },
16532
+ currency: { type: "string", minLength: 3, maxLength: 3 },
16533
+ account: { type: "object", description: "Existing account reference or inline account object." },
16534
+ quantity: { type: "integer", minimum: 1 },
16535
+ starts_at: { type: "string" },
16536
+ trial_ends_at: { type: "string" },
16537
+ collection_method: { type: "string", enum: ["automatic", "manual"] },
16538
+ net_terms: { type: "integer", minimum: 0 },
16539
+ custom_fields: { type: "array", items: { type: "object" } }
16540
+ },
16541
+ required: ["plan_code", "currency", "account"]
16542
+ },
16543
+ request: { method: "POST", path: "/subscriptions", body: "args" },
16544
+ cas: "native-idempotency",
16545
+ externalEffect: true
16546
+ },
16547
+ {
16548
+ name: "subscriptions.cancel",
16549
+ class: "mutation",
16550
+ description: "Schedule a subscription to cancel at its renewal date.",
16551
+ parameters: {
16552
+ type: "object",
16553
+ properties: { subscriptionId: id("Subscription UUID.") },
16554
+ required: ["subscriptionId"]
16555
+ },
16556
+ request: { method: "POST", path: "/subscriptions/{subscriptionId}/cancel", body: {} },
16557
+ cas: "native-idempotency",
16558
+ externalEffect: true
16559
+ },
16560
+ {
16561
+ name: "subscriptions.reactivate",
16562
+ class: "mutation",
16563
+ description: "Reactivate a subscription that is pending cancellation.",
16564
+ parameters: {
16565
+ type: "object",
16566
+ properties: { subscriptionId: id("Subscription UUID.") },
16567
+ required: ["subscriptionId"]
16568
+ },
16569
+ request: { method: "POST", path: "/subscriptions/{subscriptionId}/reactivate", body: {} },
16570
+ cas: "native-idempotency",
16571
+ externalEffect: true
16572
+ },
16573
+ {
16574
+ name: "subscriptions.terminate",
16575
+ class: "mutation",
16576
+ description: "Immediately terminate a subscription, with an explicit refund policy.",
16577
+ parameters: {
16578
+ type: "object",
16579
+ properties: {
16580
+ subscriptionId: id("Subscription UUID."),
16581
+ refund: { type: "string", enum: ["none", "partial", "full"] }
16582
+ },
16583
+ required: ["subscriptionId", "refund"]
16584
+ },
16585
+ request: {
16586
+ method: "POST",
16587
+ path: "/subscriptions/{subscriptionId}/terminate",
16588
+ query: { refund: "{refund}" },
16589
+ body: {}
16590
+ },
16591
+ cas: "native-idempotency",
16592
+ externalEffect: true
16593
+ },
16594
+ {
16595
+ name: "invoices.list",
16596
+ class: "read",
16597
+ description: "List invoices with account, state, type, and time filters.",
16598
+ parameters: {
16599
+ type: "object",
16600
+ properties: {
16601
+ ...pageQuery,
16602
+ accountId: id("Optional account UUID or `code-<account code>`."),
16603
+ state: { type: "string", enum: ["pending", "processing", "past_due", "paid", "failed", "voided"] },
16604
+ type: { type: "string", enum: ["charge", "credit", "non-legacy"] }
16605
+ }
16606
+ },
16607
+ request: {
16608
+ method: "GET",
16609
+ path: "/invoices",
16610
+ query: {
16611
+ limit: "{limit}",
16612
+ cursor: "{cursor}",
16613
+ sort: "{sort}",
16614
+ begin_time: "{begin_time}",
16615
+ end_time: "{end_time}",
16616
+ account_id: "{accountId}",
16617
+ state: "{state}",
16618
+ type: "{type}"
16619
+ }
16620
+ }
16621
+ },
16622
+ {
16623
+ name: "invoices.get",
16624
+ class: "read",
16625
+ description: "Read one invoice by UUID or number-prefixed identifier.",
16626
+ parameters: {
16627
+ type: "object",
16628
+ properties: { invoiceId: id("Invoice UUID or `number-<invoice number>`.") },
16629
+ required: ["invoiceId"]
16630
+ },
16631
+ request: { method: "GET", path: "/invoices/{invoiceId}" }
16632
+ },
16633
+ {
16634
+ name: "accounts.invoices.list",
16635
+ class: "read",
16636
+ description: "List invoices belonging to one billing account.",
16637
+ parameters: {
16638
+ type: "object",
16639
+ properties: {
16640
+ ...pageQuery,
16641
+ accountId: id("Account UUID or `code-<account code>`."),
16642
+ state: { type: "string", enum: ["pending", "processing", "past_due", "paid", "failed", "voided"] },
16643
+ type: { type: "string", enum: ["charge", "credit", "non-legacy"] }
16644
+ },
16645
+ required: ["accountId"]
16646
+ },
16647
+ request: {
16648
+ method: "GET",
16649
+ path: "/accounts/{accountId}/invoices",
16650
+ query: {
16651
+ limit: "{limit}",
16652
+ cursor: "{cursor}",
16653
+ sort: "{sort}",
16654
+ begin_time: "{begin_time}",
16655
+ end_time: "{end_time}",
16656
+ state: "{state}",
16657
+ type: "{type}"
16658
+ }
16659
+ }
16660
+ }
16661
+ ]
16662
+ });
16663
+
16664
+ // src/connectors/adapters/taxjar.ts
16665
+ var transactionId = { type: "string", description: "Merchant transaction id." };
16666
+ var provider = {
16667
+ type: "string",
16668
+ enum: ["api", "stripe", "square"],
16669
+ description: "Transaction source. Defaults to api."
16670
+ };
16671
+ var taxjarConnector = declarativeRestConnector({
16672
+ kind: "taxjar",
16673
+ displayName: "TaxJar",
16674
+ description: "Calculate sales tax and synchronize order/refund transactions with TaxJar for reporting and filing.",
16675
+ auth: {
16676
+ kind: "api-key",
16677
+ hint: "TaxJar SmartCalcs API token from Account \u2192 TaxJar API."
16678
+ },
16679
+ category: "commerce",
16680
+ defaultConsistencyModel: "authoritative",
16681
+ baseUrl: "https://api.taxjar.com/v2",
16682
+ credentialPlacement: {
16683
+ kind: "header",
16684
+ header: "Authorization",
16685
+ prefix: 'Token token="',
16686
+ suffix: '"'
16687
+ },
16688
+ test: { method: "GET", path: "/categories" },
16689
+ capabilities: [
16690
+ {
16691
+ name: "taxes.calculate",
16692
+ class: "read",
16693
+ description: "Calculate sales tax for a cart or order without creating a TaxJar transaction.",
16694
+ parameters: {
16695
+ type: "object",
16696
+ properties: {
16697
+ from_country: { type: "string" },
16698
+ from_zip: { type: "string" },
16699
+ from_state: { type: "string" },
16700
+ from_city: { type: "string" },
16701
+ from_street: { type: "string" },
16702
+ to_country: { type: "string" },
16703
+ to_zip: { type: "string" },
16704
+ to_state: { type: "string" },
16705
+ to_city: { type: "string" },
16706
+ to_street: { type: "string" },
16707
+ amount: { type: "number" },
16708
+ shipping: { type: "number" },
16709
+ customer_id: { type: "string" },
16710
+ exemption_type: { type: "string" },
16711
+ nexus_addresses: { type: "array", items: { type: "object" } },
16712
+ line_items: { type: "array", items: { type: "object" } }
16713
+ },
16714
+ required: ["from_country", "from_zip", "to_country", "to_zip", "amount", "shipping"]
16715
+ },
16716
+ request: { method: "POST", path: "/taxes", body: "args" }
16717
+ },
16718
+ {
16719
+ name: "rates.get",
16720
+ class: "read",
16721
+ description: "Read the combined sales-tax rate for a US or Canadian postal code.",
16722
+ parameters: {
16723
+ type: "object",
16724
+ properties: {
16725
+ zip: { type: "string" },
16726
+ country: { type: "string" },
16727
+ state: { type: "string" },
16728
+ city: { type: "string" },
16729
+ street: { type: "string" }
16730
+ },
16731
+ required: ["zip"]
16732
+ },
16733
+ request: {
16734
+ method: "GET",
16735
+ path: "/rates/{zip}",
16736
+ query: { country: "{country}", state: "{state}", city: "{city}", street: "{street}" }
16737
+ }
16738
+ },
16739
+ {
16740
+ name: "categories.list",
16741
+ class: "read",
16742
+ description: "List TaxJar product tax categories and their tax codes.",
16743
+ parameters: { type: "object", properties: {} },
16744
+ request: { method: "GET", path: "/categories" }
16745
+ },
16746
+ {
16747
+ name: "nexus-regions.list",
16748
+ class: "read",
16749
+ description: "List nexus regions configured for the TaxJar account.",
16750
+ parameters: { type: "object", properties: {} },
16751
+ request: { method: "GET", path: "/nexus/regions" }
16752
+ },
16753
+ transactionRead2("orders.get", "/transactions/orders/{transactionId}", "Read a synced order transaction."),
16754
+ transactionWrite("orders.create", "POST", "/transactions/orders", "Create an order transaction for reporting and filing."),
16755
+ transactionWrite("orders.update", "PUT", "/transactions/orders/{transactionId}", "Update an order transaction."),
16756
+ transactionDelete("orders.delete", "/transactions/orders/{transactionId}", "Delete an order transaction."),
16757
+ transactionRead2("refunds.get", "/transactions/refunds/{transactionId}", "Read a synced refund transaction."),
16758
+ transactionWrite("refunds.create", "POST", "/transactions/refunds", "Create a refund transaction for reporting and filing."),
16759
+ transactionWrite("refunds.update", "PUT", "/transactions/refunds/{transactionId}", "Update a refund transaction."),
16760
+ transactionDelete("refunds.delete", "/transactions/refunds/{transactionId}", "Delete a refund transaction.")
16761
+ ]
16762
+ });
16763
+ function transactionRead2(name, path, description) {
16764
+ return {
16765
+ name,
16766
+ class: "read",
16767
+ description,
16768
+ parameters: {
16769
+ type: "object",
16770
+ properties: { transactionId, provider },
16771
+ required: ["transactionId"]
16772
+ },
16773
+ request: { method: "GET", path, query: { provider: "{provider}" } }
16774
+ };
16775
+ }
16776
+ function transactionWrite(name, method, path, description) {
16777
+ return {
16778
+ name,
16779
+ class: "mutation",
16780
+ description,
16781
+ parameters: {
16782
+ type: "object",
16783
+ properties: {
16784
+ transactionId,
16785
+ data: {
16786
+ type: "object",
16787
+ description: "Provider-native TaxJar order/refund payload, including transaction_id and transaction_date."
16788
+ }
16789
+ },
16790
+ required: method === "POST" ? ["data"] : ["transactionId", "data"]
16791
+ },
16792
+ request: { method, path, body: "{data}" },
16793
+ cas: "native-idempotency",
16794
+ externalEffect: true
16795
+ };
16796
+ }
16797
+ function transactionDelete(name, path, description) {
16798
+ return {
16799
+ name,
16800
+ class: "mutation",
16801
+ description,
16802
+ parameters: {
16803
+ type: "object",
16804
+ properties: { transactionId, provider },
16805
+ required: ["transactionId"]
16806
+ },
16807
+ request: { method: "DELETE", path, query: { provider: "{provider}" } },
16808
+ cas: "native-idempotency",
16809
+ externalEffect: true
16810
+ };
16811
+ }
16812
+
15313
16813
  // src/connectors/adapters/cashfree-payments.ts
15314
16814
  var cashfreePaymentsConnector = declarativeRestConnector({
15315
16815
  kind: "cashfree-payments",
@@ -19726,7 +21226,7 @@ var frontConnector = declarativeRestConnector({
19726
21226
  });
19727
21227
 
19728
21228
  // src/connectors/oauth.ts
19729
- import { createHash as createHash2, randomBytes } from "crypto";
21229
+ import { createHash as createHash3, randomBytes } from "crypto";
19730
21230
  var PENDING_TTL_MS = 10 * 60 * 1e3;
19731
21231
  var InMemoryOAuthFlowStore = class {
19732
21232
  pendingFlows = /* @__PURE__ */ new Map();
@@ -19754,7 +21254,7 @@ function startOAuthFlow(input) {
19754
21254
  const now = input.now ?? Date.now();
19755
21255
  store.sweep?.(now);
19756
21256
  const codeVerifier = base64Url(randomBytes(48));
19757
- const codeChallenge = base64Url(createHash2("sha256").update(codeVerifier).digest());
21257
+ const codeChallenge = base64Url(createHash3("sha256").update(codeVerifier).digest());
19758
21258
  const state = base64Url(randomBytes(24));
19759
21259
  store.put(state, {
19760
21260
  codeVerifier,
@@ -19939,20 +21439,20 @@ async function googleApiError(res, context, dataSourceId) {
19939
21439
  const body = await readErrorBody(res);
19940
21440
  return classifyGoogleError(res.status, body, context, dataSourceId);
19941
21441
  }
19942
- function googleTestFailureReason(status, body, provider) {
21442
+ function googleTestFailureReason(status, body, provider2) {
19943
21443
  const reason = googleErrorReason(body);
19944
21444
  const cls = classifyGoogleReason(reason);
19945
21445
  const detail = reason ? `, ${reason}` : "";
19946
21446
  if (cls === "quota" || status === 429) {
19947
- return `${provider} rate limit (${status}${detail}) \u2014 retry later`;
21447
+ return `${provider2} rate limit (${status}${detail}) \u2014 retry later`;
19948
21448
  }
19949
21449
  if (cls === "auth" || status === 401) {
19950
- return `${provider} rejected token (${status}${detail}) \u2014 reconnect required`;
21450
+ return `${provider2} rejected token (${status}${detail}) \u2014 reconnect required`;
19951
21451
  }
19952
21452
  if (cls === "config" || status === 403) {
19953
- return `${provider} permission/config error (${status}${detail}) \u2014 check the API is enabled and scopes are granted`;
21453
+ return `${provider2} permission/config error (${status}${detail}) \u2014 check the API is enabled and scopes are granted`;
19954
21454
  }
19955
- return `${provider} returned ${status}`;
21455
+ return `${provider2} returned ${status}`;
19956
21456
  }
19957
21457
  async function readErrorBody(res) {
19958
21458
  const text = await res.text().catch(() => "");
@@ -20163,7 +21663,7 @@ async function listMessages(inv, accessToken3, timeoutMs) {
20163
21663
  const params = new URLSearchParams({
20164
21664
  maxResults: String(args.maxResults ?? 25)
20165
21665
  });
20166
- for (const id of args.labelIds ?? ["INBOX"]) params.append("labelIds", id);
21666
+ for (const id2 of args.labelIds ?? ["INBOX"]) params.append("labelIds", id2);
20167
21667
  if (args.query) params.set("q", args.query);
20168
21668
  if (args.pageToken) params.set("pageToken", args.pageToken);
20169
21669
  const listRes = await fetch(`${API}/messages?${params.toString()}`, {
@@ -20176,8 +21676,8 @@ async function listMessages(inv, accessToken3, timeoutMs) {
20176
21676
  const listJson = await listRes.json();
20177
21677
  const ids = listJson.messages ?? [];
20178
21678
  const metas = await Promise.all(
20179
- ids.map(async ({ id }) => {
20180
- const res = await fetch(`${API}/messages/${encodeURIComponent(id)}?format=metadata&metadataHeaders=From&metadataHeaders=To&metadataHeaders=Subject&metadataHeaders=Date`, {
21679
+ ids.map(async ({ id: id2 }) => {
21680
+ const res = await fetch(`${API}/messages/${encodeURIComponent(id2)}?format=metadata&metadataHeaders=From&metadataHeaders=To&metadataHeaders=Subject&metadataHeaders=Date`, {
20181
21681
  headers: { authorization: `Bearer ${accessToken3}` },
20182
21682
  signal: AbortSignal.timeout(timeoutMs)
20183
21683
  });
@@ -20206,13 +21706,13 @@ function toMessageSummary(meta) {
20206
21706
  };
20207
21707
  }
20208
21708
  async function readMessage(inv, accessToken3, timeoutMs) {
20209
- const { id } = inv.args;
20210
- const res = await fetch(`${API}/messages/${encodeURIComponent(id)}?format=full`, {
21709
+ const { id: id2 } = inv.args;
21710
+ const res = await fetch(`${API}/messages/${encodeURIComponent(id2)}?format=full`, {
20211
21711
  headers: { authorization: `Bearer ${accessToken3}` },
20212
21712
  signal: AbortSignal.timeout(timeoutMs)
20213
21713
  });
20214
21714
  if (res.status === 404) {
20215
- throw new Error(`gmail read_message: message ${id} not found`);
21715
+ throw new Error(`gmail read_message: message ${id2} not found`);
20216
21716
  }
20217
21717
  if (!res.ok) {
20218
21718
  throw await googleApiError(res, "gmail read_message", inv.source.id);
@@ -23444,7 +24944,7 @@ async function ensureFreshAccessToken5(creds, clientId, clientSecret) {
23444
24944
  }
23445
24945
 
23446
24946
  // src/connectors/adapters/google-sheets.ts
23447
- import { createHash as createHash3 } from "crypto";
24947
+ import { createHash as createHash4 } from "crypto";
23448
24948
  var SCOPES5 = ["https://www.googleapis.com/auth/spreadsheets"];
23449
24949
  var AUTH_URL6 = "https://accounts.google.com/o/oauth2/v2/auth";
23450
24950
  var TOKEN_URL6 = "https://oauth2.googleapis.com/token";
@@ -23717,7 +25217,7 @@ async function fetchAllRows(accessToken3, meta) {
23717
25217
  function rowFingerprint(values) {
23718
25218
  const keys = Object.keys(values).sort();
23719
25219
  const blob = keys.map((k) => `${k}=${values[k]}`).join("");
23720
- return createHash3("sha256").update(blob).digest("hex").slice(0, 16);
25220
+ return createHash4("sha256").update(blob).digest("hex").slice(0, 16);
23721
25221
  }
23722
25222
  function matchesPredicate(row, predicate) {
23723
25223
  for (const [k, v] of Object.entries(predicate)) {
@@ -25628,8 +27128,8 @@ async function createDeal(inv, accessToken3, timeoutMs) {
25628
27128
  const payload = { properties: dealProperties };
25629
27129
  const contactIds = args.associations?.contactIds ?? [];
25630
27130
  if (contactIds.length > 0) {
25631
- payload.associations = contactIds.map((id) => ({
25632
- to: { id },
27131
+ payload.associations = contactIds.map((id2) => ({
27132
+ to: { id: id2 },
25633
27133
  // 3 = deal→contact association type id (standard HubSpot mapping)
25634
27134
  types: [{ associationCategory: "HUBSPOT_DEFINED", associationTypeId: 3 }]
25635
27135
  }));
@@ -31844,9 +33344,9 @@ function microsoftGraph(opts) {
31844
33344
  return { data: { groups }, fetchedAt: Date.now() };
31845
33345
  }
31846
33346
  if (inv.capabilityName === "list_group_members") {
31847
- const { groupId: groupId2, top } = inv.args;
33347
+ const { groupId: groupId5, top } = inv.args;
31848
33348
  const t = Math.min(Math.max(1, top ?? 50), 100);
31849
- const url = `${GRAPH}/groups/${encodeURIComponent(groupId2)}/members?$select=id,displayName,mail,userPrincipalName&$top=${t}`;
33349
+ const url = `${GRAPH}/groups/${encodeURIComponent(groupId5)}/members?$select=id,displayName,mail,userPrincipalName&$top=${t}`;
31850
33350
  const json = await graphGet(url, accessToken3, inv.source.id);
31851
33351
  const members = (json.value ?? []).map((m) => ({
31852
33352
  // odata.type is '#microsoft.graph.user' | '#microsoft.graph.group'
@@ -34034,6 +35534,200 @@ var mondayConnector = declarativeRestConnector({
34034
35534
  ]
34035
35535
  });
34036
35536
 
35537
+ // src/connectors/adapters/mycase.ts
35538
+ var pageProperties = {
35539
+ page: { type: "integer", minimum: 1 },
35540
+ page_size: { type: "integer", minimum: 1, maximum: 100 },
35541
+ updated_after: { type: "string", description: "ISO 8601 lower timestamp bound for incremental synchronization." }
35542
+ };
35543
+ var resourceId = { type: "string", description: "MyCase resource id." };
35544
+ var dataObject = {
35545
+ type: "object",
35546
+ description: "Provider-native MyCase JSON payload for this resource."
35547
+ };
35548
+ function list(name, path, description, extra = {}) {
35549
+ const query2 = Object.fromEntries(
35550
+ Object.keys({ ...pageProperties, ...extra }).map((key) => [key, `{${key}}`])
35551
+ );
35552
+ return {
35553
+ name,
35554
+ class: "read",
35555
+ description,
35556
+ parameters: { type: "object", properties: { ...pageProperties, ...extra } },
35557
+ request: { method: "GET", path, query: query2 }
35558
+ };
35559
+ }
35560
+ function create(name, path, description) {
35561
+ return {
35562
+ name,
35563
+ class: "mutation",
35564
+ description,
35565
+ parameters: {
35566
+ type: "object",
35567
+ properties: { data: dataObject },
35568
+ required: ["data"]
35569
+ },
35570
+ request: { method: "POST", path, body: "{data}" },
35571
+ cas: "native-idempotency",
35572
+ externalEffect: true
35573
+ };
35574
+ }
35575
+ function update(name, path, description) {
35576
+ return {
35577
+ name,
35578
+ class: "mutation",
35579
+ description,
35580
+ parameters: {
35581
+ type: "object",
35582
+ properties: { id: resourceId, data: dataObject },
35583
+ required: ["id", "data"]
35584
+ },
35585
+ request: { method: "PUT", path: `${path}/{id}`, body: "{data}" },
35586
+ cas: "optimistic-read-verify",
35587
+ externalEffect: true
35588
+ };
35589
+ }
35590
+ var mycaseConnector = declarativeRestConnector({
35591
+ kind: "mycase",
35592
+ displayName: "MyCase",
35593
+ description: "Manage legal cases, clients, companies, leads, matters, activities, time, expenses, and notes in MyCase.",
35594
+ auth: {
35595
+ kind: "oauth2",
35596
+ authorizationUrl: "https://auth.mycase.com/login_sessions/new",
35597
+ tokenUrl: "https://auth.mycase.com/tokens",
35598
+ scopes: [],
35599
+ sendScopeParam: false,
35600
+ clientIdEnv: "MYCASE_OAUTH_CLIENT_ID",
35601
+ clientSecretEnv: "MYCASE_OAUTH_CLIENT_SECRET"
35602
+ },
35603
+ category: "crm",
35604
+ defaultConsistencyModel: "authoritative",
35605
+ baseUrl: "https://external-integrations.mycase.com/v1",
35606
+ credentialPlacement: { kind: "bearer" },
35607
+ test: { method: "GET", path: "/staff", query: { page_size: 1 } },
35608
+ capabilities: [
35609
+ list("cases.list", "/cases", "List or incrementally synchronize legal cases.", {
35610
+ name: { type: "string" },
35611
+ case_number: { type: "string" },
35612
+ case_stage_id: { type: "string" },
35613
+ practice_area_id: { type: "string" },
35614
+ status: { type: "string" }
35615
+ }),
35616
+ create("cases.create", "/cases", "Create a legal case."),
35617
+ update("cases.update", "/cases", "Update a legal case."),
35618
+ list("clients.list", "/clients", "List or incrementally synchronize clients.", {
35619
+ first_name: { type: "string" },
35620
+ last_name: { type: "string" },
35621
+ email: { type: "string" }
35622
+ }),
35623
+ create("clients.create", "/clients", "Create a person/client record."),
35624
+ update("clients.update", "/clients", "Update a person/client record."),
35625
+ list("companies.list", "/companies", "List or incrementally synchronize companies.", {
35626
+ name: { type: "string" },
35627
+ email: { type: "string" }
35628
+ }),
35629
+ create("companies.create", "/companies", "Create a company record."),
35630
+ update("companies.update", "/companies", "Update a company record."),
35631
+ list("leads.list", "/leads", "List or incrementally synchronize leads.", {
35632
+ first_name: { type: "string" },
35633
+ last_name: { type: "string" },
35634
+ email: { type: "string" },
35635
+ status: { type: "string" }
35636
+ }),
35637
+ create("leads.create", "/leads", "Create a lead."),
35638
+ list("staff.list", "/staff", "List firm staff who can own or participate in work.", {
35639
+ first_name: { type: "string" },
35640
+ last_name: { type: "string" },
35641
+ email: { type: "string" }
35642
+ }),
35643
+ list("case-stages.list", "/case_stages", "List case stages."),
35644
+ create("case-stages.create", "/case_stages", "Create a case stage."),
35645
+ list("practice-areas.list", "/practice_areas", "List practice areas."),
35646
+ create("practice-areas.create", "/practice_areas", "Create a practice area."),
35647
+ list("referral-sources.list", "/referral_sources", "List referral sources."),
35648
+ create("referral-sources.create", "/referral_sources", "Create a referral source."),
35649
+ list("people-groups.list", "/people_groups", "List people groups."),
35650
+ list("locations.list", "/locations", "List office and event locations.", {
35651
+ name: { type: "string" }
35652
+ }),
35653
+ create("locations.create", "/locations", "Create a location."),
35654
+ list("events.list", "/events", "List or incrementally synchronize calendar events.", {
35655
+ start_date: { type: "string" },
35656
+ end_date: { type: "string" },
35657
+ case_id: { type: "string" }
35658
+ }),
35659
+ create("events.create", "/events", "Create a calendar event."),
35660
+ list("tasks.list", "/tasks", "List or incrementally synchronize tasks.", {
35661
+ due_date_start: { type: "string" },
35662
+ due_date_end: { type: "string" },
35663
+ case_id: { type: "string" },
35664
+ assignee_id: { type: "string" },
35665
+ completed: { type: "boolean" }
35666
+ }),
35667
+ create("tasks.create", "/tasks", "Create a task."),
35668
+ list("calls.list", "/calls", "List logged calls.", {
35669
+ caller_id: { type: "string" },
35670
+ caller_type: { type: "string", enum: ["client", "lead"] },
35671
+ staff_id: { type: "string" }
35672
+ }),
35673
+ create("calls.create", "/calls", "Log a call."),
35674
+ list("time-entries.list", "/time_entries", "List time entries.", {
35675
+ case_id: { type: "string" },
35676
+ staff_id: { type: "string" },
35677
+ start_date: { type: "string" },
35678
+ end_date: { type: "string" }
35679
+ }),
35680
+ create("time-entries.create", "/time_entries", "Create a time entry."),
35681
+ list("expenses.list", "/expenses", "List case expenses.", {
35682
+ case_id: { type: "string" },
35683
+ staff_id: { type: "string" },
35684
+ start_date: { type: "string" },
35685
+ end_date: { type: "string" }
35686
+ }),
35687
+ create("expenses.create", "/expenses", "Create a case expense."),
35688
+ {
35689
+ name: "case-notes.create",
35690
+ class: "mutation",
35691
+ description: "Add a note to a case.",
35692
+ parameters: {
35693
+ type: "object",
35694
+ properties: { caseId: resourceId, data: dataObject },
35695
+ required: ["caseId", "data"]
35696
+ },
35697
+ request: { method: "POST", path: "/cases/{caseId}/notes", body: "{data}" },
35698
+ cas: "native-idempotency",
35699
+ externalEffect: true
35700
+ },
35701
+ {
35702
+ name: "client-notes.create",
35703
+ class: "mutation",
35704
+ description: "Add a note to a client.",
35705
+ parameters: {
35706
+ type: "object",
35707
+ properties: { clientId: resourceId, data: dataObject },
35708
+ required: ["clientId", "data"]
35709
+ },
35710
+ request: { method: "POST", path: "/clients/{clientId}/notes", body: "{data}" },
35711
+ cas: "native-idempotency",
35712
+ externalEffect: true
35713
+ },
35714
+ {
35715
+ name: "company-notes.create",
35716
+ class: "mutation",
35717
+ description: "Add a note to a company.",
35718
+ parameters: {
35719
+ type: "object",
35720
+ properties: { companyId: resourceId, data: dataObject },
35721
+ required: ["companyId", "data"]
35722
+ },
35723
+ request: { method: "POST", path: "/companies/{companyId}/notes", body: "{data}" },
35724
+ cas: "native-idempotency",
35725
+ externalEffect: true
35726
+ },
35727
+ create("custom-fields.create", "/custom_fields", "Create a custom field definition.")
35728
+ ]
35729
+ });
35730
+
34037
35731
  // src/connectors/adapters/notion.ts
34038
35732
  var TOKEN_URL12 = "https://api.notion.com/v1/oauth/token";
34039
35733
  var NOTION_VERSION = "2022-06-28";
@@ -36656,8 +38350,8 @@ function toMessageSummary2(m) {
36656
38350
  };
36657
38351
  }
36658
38352
  async function readMessage2(inv, accessToken3, timeoutMs) {
36659
- const { id } = inv.args;
36660
- const url = `${API7}/me/messages/${encodeURIComponent(id)}?$expand=attachments($select=id,name,contentType,size,isInline)`;
38353
+ const { id: id2 } = inv.args;
38354
+ const url = `${API7}/me/messages/${encodeURIComponent(id2)}?$expand=attachments($select=id,name,contentType,size,isInline)`;
36661
38355
  const res = await fetch(url, {
36662
38356
  headers: { authorization: `Bearer ${accessToken3}` },
36663
38357
  signal: AbortSignal.timeout(timeoutMs)
@@ -36666,7 +38360,7 @@ async function readMessage2(inv, accessToken3, timeoutMs) {
36666
38360
  throw new CredentialsExpired(`Outlook Mail rejected token (${res.status})`, inv.source.id);
36667
38361
  }
36668
38362
  if (res.status === 404) {
36669
- throw new Error(`outlook-mail read_message: message ${id} not found`);
38363
+ throw new Error(`outlook-mail read_message: message ${id2} not found`);
36670
38364
  }
36671
38365
  if (!res.ok) {
36672
38366
  const text = await res.text().catch(() => "");
@@ -39228,9 +40922,9 @@ function parseRss(text) {
39228
40922
  const pubDate = firstTagText(item, "pubDate");
39229
40923
  const author = firstTagText(item, "author") ?? firstTagText(item, "dc:creator");
39230
40924
  const categories = collectElements(item, "category").map((cat) => decodeXml(stripTags(cat)) ?? "").filter(Boolean);
39231
- const id = decodeXml(guid) ?? decodeXml(link) ?? hash(item);
40925
+ const id2 = decodeXml(guid) ?? decodeXml(link) ?? hash(item);
39232
40926
  return {
39233
- id,
40927
+ id: id2,
39234
40928
  title: decodeXml(title),
39235
40929
  link: decodeXml(link),
39236
40930
  summary: decodeXml(description),
@@ -39250,7 +40944,7 @@ function parseAtom(text, feedUrl) {
39250
40944
  const feedUpdated = normalizeDate(decodeXml(firstTagText(feedInner, "updated")));
39251
40945
  const items = collectElements(feedOuter, "entry");
39252
40946
  const entries = items.map((item) => {
39253
- const id = decodeXml(firstTagText(item, "id"));
40947
+ const id2 = decodeXml(firstTagText(item, "id"));
39254
40948
  const title = decodeXml(firstTagText(item, "title"));
39255
40949
  const summary = decodeXml(firstTagText(item, "summary"));
39256
40950
  const contentNode = firstTagText(item, "content");
@@ -39260,7 +40954,7 @@ function parseAtom(text, feedUrl) {
39260
40954
  const link = pickAtomLink(item);
39261
40955
  const categories = collectAtomCategories(item);
39262
40956
  return {
39263
- id: id ?? link ?? hash(item),
40957
+ id: id2 ?? link ?? hash(item),
39264
40958
  title,
39265
40959
  link,
39266
40960
  summary,
@@ -40964,11 +42658,11 @@ function sharepoint(opts) {
40964
42658
  };
40965
42659
  }
40966
42660
  if (inv.capabilityName === "lists.create") {
40967
- const { siteId, displayName, columns, list } = inv.args;
42661
+ const { siteId, displayName, columns, list: list2 } = inv.args;
40968
42662
  const url = `${GRAPH3}/sites/${encodeURIComponent(siteId)}/lists`;
40969
42663
  const body = { displayName };
40970
42664
  if (Array.isArray(columns)) body.columns = columns;
40971
- if (list && typeof list === "object") body.list = list;
42665
+ if (list2 && typeof list2 === "object") body.list = list2;
40972
42666
  const res = await fetch(url, {
40973
42667
  method: "POST",
40974
42668
  headers: {
@@ -49400,7 +51094,7 @@ async function request2(source, path, options) {
49400
51094
  throw new ProviderRateLimited("Zoho Bookings rate limit (429)", source.id, {
49401
51095
  status: 429,
49402
51096
  body: responseBody,
49403
- retryAfterMs: retryAfterMs2(response.headers.get("retry-after"))
51097
+ retryAfterMs: retryAfterMs3(response.headers.get("retry-after"))
49404
51098
  });
49405
51099
  }
49406
51100
  if (!response.ok) throw new Error(`zoho-bookings ${options.method} ${path} HTTP ${response.status}`);
@@ -49445,7 +51139,7 @@ function exactlyOne(args, keys, label) {
49445
51139
  const present = keys.filter((key) => args[key] !== void 0 && args[key] !== null && args[key] !== "");
49446
51140
  if (present.length !== 1) throw new Error(`zoho-bookings: exactly one ${label} is required`);
49447
51141
  }
49448
- function retryAfterMs2(value) {
51142
+ function retryAfterMs3(value) {
49449
51143
  if (!value) return 6e4;
49450
51144
  const seconds = Number(value);
49451
51145
  return Number.isFinite(seconds) && seconds >= 0 ? Math.max(1e3, seconds * 1e3) : 6e4;
@@ -50584,11 +52278,11 @@ async function request3(source, path, options) {
50584
52278
  });
50585
52279
  }
50586
52280
  if (response.status === 429) {
50587
- const retryAfterMs3 = parseRetryAfter(response.headers.get("retry-after"));
52281
+ const retryAfterMs4 = parseRetryAfter(response.headers.get("retry-after"));
50588
52282
  throw new ProviderRateLimited("Zoho Campaigns rate limit (429)", source.id, {
50589
52283
  status: 429,
50590
52284
  body: responseBody,
50591
- retryAfterMs: retryAfterMs3
52285
+ retryAfterMs: retryAfterMs4
50592
52286
  });
50593
52287
  }
50594
52288
  if (!response.ok) {
@@ -57355,6 +59049,10 @@ var CONNECTOR_ADAPTER_FACTORIES = [
57355
59049
  clientId: "IRONCLAD_OAUTH_CLIENT_ID",
57356
59050
  clientSecret: "IRONCLAD_OAUTH_CLIENT_SECRET"
57357
59051
  }),
59052
+ defineFactoryAdapter(() => mycaseConnector, {
59053
+ clientId: "MYCASE_OAUTH_CLIENT_ID",
59054
+ clientSecret: "MYCASE_OAUTH_CLIENT_SECRET"
59055
+ }),
57358
59056
  defineFactoryAdapter(() => signNowConnector, {}),
57359
59057
  defineFactoryAdapter(() => oneSpanSignConnector, {}),
57360
59058
  defineFactoryAdapter(() => affinityConnector, {}),
@@ -57399,6 +59097,9 @@ var CONNECTOR_ADAPTER_FACTORIES = [
57399
59097
  clientSecret: "AUTH0_OAUTH_CLIENT_SECRET"
57400
59098
  }),
57401
59099
  defineFactoryAdapter(() => oktaConnector, {}),
59100
+ defineFactoryAdapter(() => pingIdentityConnector, {}),
59101
+ defineFactoryAdapter(() => oneloginConnector, {}),
59102
+ defineFactoryAdapter(() => scimConnector, {}),
57402
59103
  defineFactoryAdapter(() => twentyConnector, {}),
57403
59104
  defineFactoryAdapter(() => folkConnector, {}),
57404
59105
  defineFactoryAdapter(() => freshsalesConnector, {}),
@@ -57436,6 +59137,9 @@ var CONNECTOR_ADAPTER_FACTORIES = [
57436
59137
  // credential bundles, so no shared deployment secret gates registration.
57437
59138
  defineFactoryAdapter(() => stripePackConnector, {}),
57438
59139
  defineFactoryAdapter(() => chargebeeConnector, {}),
59140
+ defineFactoryAdapter(() => recurlyConnector, {}),
59141
+ defineFactoryAdapter(() => avalaraConnector, {}),
59142
+ defineFactoryAdapter(() => taxjarConnector, {}),
57439
59143
  defineFactoryAdapter(() => paddleConnector, {}),
57440
59144
  defineFactoryAdapter(() => plaidConnector, {}),
57441
59145
  defineFactoryAdapter(() => rampConnector, {}),
@@ -57807,11 +59511,11 @@ var phonyConnector = {
57807
59511
  };
57808
59512
  }
57809
59513
  if (inv.capabilityName === "get_call") {
57810
- const { id } = inv.args;
59514
+ const { id: id2 } = inv.args;
57811
59515
  const json = await getJson(
57812
59516
  inv,
57813
59517
  token,
57814
- `${API13}/v1/outbound/${encodeURIComponent(id)}`,
59518
+ `${API13}/v1/outbound/${encodeURIComponent(id2)}`,
57815
59519
  "get_call"
57816
59520
  );
57817
59521
  return { data: { call: json.call ?? null }, fetchedAt: Date.now() };
@@ -137110,6 +138814,10 @@ var demandbaseConnector = declarativeRestConnector({
137110
138814
  export {
137111
138815
  declarativeRestConnector,
137112
138816
  oktaConnector,
138817
+ clientCredentialsRestConnector,
138818
+ oneloginConnector,
138819
+ pingIdentityConnector,
138820
+ scimConnector,
137113
138821
  actualbudgetConnector,
137114
138822
  aianswerConnector,
137115
138823
  airparserConnector,
@@ -137161,6 +138869,7 @@ export {
137161
138869
  attioConnector,
137162
138870
  auth0Connector,
137163
138871
  avomaConnector,
138872
+ avalaraConnector,
137164
138873
  azureAdConnector,
137165
138874
  basecampConnector,
137166
138875
  backblazeConnector,
@@ -137181,6 +138890,8 @@ export {
137181
138890
  contentfulConnector,
137182
138891
  copperConnector,
137183
138892
  chargebeeConnector,
138893
+ recurlyConnector,
138894
+ taxjarConnector,
137184
138895
  cashfreePaymentsConnector,
137185
138896
  circleConnector,
137186
138897
  checkoutConnector,
@@ -137255,6 +138966,7 @@ export {
137255
138966
  meetgeekAiConnector,
137256
138967
  mollieConnector,
137257
138968
  mondayConnector,
138969
+ mycaseConnector,
137258
138970
  notionConnector,
137259
138971
  notion,
137260
138972
  n8nConnector,
@@ -137722,4 +139434,4 @@ export {
137722
139434
  demandbaseConnector,
137723
139435
  adapters_exports
137724
139436
  };
137725
- //# sourceMappingURL=chunk-GODEAAAZ.js.map
139437
+ //# sourceMappingURL=chunk-X3WHOEX7.js.map