@tangle-network/agent-integrations 0.53.47 → 0.53.49

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.
Files changed (54) hide show
  1. package/dist/catalog.d.ts +2 -2
  2. package/dist/catalog.js +9 -9
  3. package/dist/{chunk-DHF5EXLO.js → chunk-5UCHLQ3D.js} +9 -3
  4. package/dist/{chunk-DHF5EXLO.js.map → chunk-5UCHLQ3D.js.map} +1 -1
  5. package/dist/{chunk-C7SE5X44.js → chunk-GUZA3U6T.js} +383 -68
  6. package/dist/chunk-GUZA3U6T.js.map +1 -0
  7. package/dist/{chunk-AGXTCR34.js → chunk-H5UCSRF4.js} +2682 -259
  8. package/dist/{chunk-AGXTCR34.js.map → chunk-H5UCSRF4.js.map} +1 -1
  9. package/dist/{chunk-TP4MD4PD.js → chunk-KBYYTHXQ.js} +2 -2
  10. package/dist/{chunk-AG4ORH2A.js → chunk-TKEVCGAI.js} +6 -6
  11. package/dist/chunk-TKEVCGAI.js.map +1 -0
  12. package/dist/{chunk-JR2RWYQO.js → chunk-UI3U62H6.js} +2 -2
  13. package/dist/{chunk-WE7SQ7PB.js → chunk-W72KPXXX.js} +23 -3
  14. package/dist/chunk-W72KPXXX.js.map +1 -0
  15. package/dist/{chunk-U36WHHML.js → chunk-ZSXRS7D7.js} +251 -10
  16. package/dist/chunk-ZSXRS7D7.js.map +1 -0
  17. package/dist/{chunk-EKSAOR2I.js → chunk-ZZA4HOBE.js} +2 -2
  18. package/dist/connect/index.d.ts +2 -2
  19. package/dist/connect/index.js +2 -2
  20. package/dist/connectors/adapters/index.d.ts +58 -19
  21. package/dist/connectors/adapters/index.js +18 -2
  22. package/dist/connectors/index.d.ts +45 -12
  23. package/dist/connectors/index.js +21 -3
  24. package/dist/{consumer-UnsjK9iM.d.ts → consumer-DrLnbqYt.d.ts} +1 -1
  25. package/dist/consumer.d.ts +3 -3
  26. package/dist/consumer.js +2 -2
  27. package/dist/{core-types-Cx53j2Xp.d.ts → core-types-D26cY5tD.d.ts} +7 -1
  28. package/dist/coverage-catalog.d.ts +2 -2
  29. package/dist/coverage-catalog.js +1 -1
  30. package/dist/{importers-YLXwPCz_.d.ts → importers-CQKts3pm.d.ts} +1 -1
  31. package/dist/index.d.ts +13 -12
  32. package/dist/index.js +27 -9
  33. package/dist/mcp.d.ts +3 -3
  34. package/dist/mcp.js +9 -9
  35. package/dist/middleware/index.d.ts +2 -2
  36. package/dist/middleware/index.js +2 -2
  37. package/dist/registry.d.ts +2 -2
  38. package/dist/registry.js +9 -9
  39. package/dist/runtime.d.ts +2 -2
  40. package/dist/runtime.js +9 -9
  41. package/dist/specs.d.ts +11 -3
  42. package/dist/specs.js +5 -5
  43. package/dist/{tangle-id--7mgjNkq.d.ts → tangle-id-BCOVbWrP.d.ts} +1 -1
  44. package/dist/{types-qFsboS2G.d.ts → types-DpKn0frG.d.ts} +29 -10
  45. package/docs/integration-execution-audit.md +17 -11
  46. package/docs/integration-execution-matrix.json +837 -304
  47. package/package.json +1 -1
  48. package/dist/chunk-AG4ORH2A.js.map +0 -1
  49. package/dist/chunk-C7SE5X44.js.map +0 -1
  50. package/dist/chunk-U36WHHML.js.map +0 -1
  51. package/dist/chunk-WE7SQ7PB.js.map +0 -1
  52. /package/dist/{chunk-TP4MD4PD.js.map → chunk-KBYYTHXQ.js.map} +0 -0
  53. /package/dist/{chunk-JR2RWYQO.js.map → chunk-UI3U62H6.js.map} +0 -0
  54. /package/dist/{chunk-EKSAOR2I.js.map → chunk-ZZA4HOBE.js.map} +0 -0
@@ -1,13 +1,13 @@
1
1
  import {
2
2
  buildIntegrationCoverageConnectors,
3
3
  listIntegrationCoverageSpecs
4
- } from "./chunk-AG4ORH2A.js";
4
+ } from "./chunk-TKEVCGAI.js";
5
5
  import {
6
6
  bundledApiKeyHint,
7
7
  bundledAuthMode,
8
8
  bundledOAuth2Auth,
9
9
  getBundledAdapterManifest
10
- } from "./chunk-DHF5EXLO.js";
10
+ } from "./chunk-5UCHLQ3D.js";
11
11
 
12
12
  // src/specs/types.ts
13
13
  function specAuthToConnectorAuth(auth) {
@@ -245,6 +245,7 @@ var INTEGRATION_KIND_ALIASES = {
245
245
  twilio: "twilio-sms",
246
246
  "twilio-voice": "twilio-sms",
247
247
  "telegram-bot": "telegram",
248
+ "x-twitter": "twitter",
248
249
  scrapegrapghai: "scrapegraphai"
249
250
  };
250
251
  function canonicalIntegrationKind(kind) {
@@ -253,6 +254,228 @@ function canonicalIntegrationKind(kind) {
253
254
 
254
255
  // src/specs/overrides.ts
255
256
  var INTEGRATION_OVERRIDES = {
257
+ tiktok: {
258
+ consoleUrl: "https://developers.tiktok.com/apps/",
259
+ consoleSteps: [
260
+ {
261
+ id: "app",
262
+ title: "Create or select the TikTok app",
263
+ detail: "Use one company-owned TikTok for Developers app for Tangle Integration Hub. Do not create a duplicate app."
264
+ },
265
+ {
266
+ id: "products",
267
+ title: "Enable Login Kit and Content Posting",
268
+ detail: "Enable Login Kit, Content Posting API, and the user.info.basic, video.list, and video.publish scopes."
269
+ },
270
+ {
271
+ id: "redirect",
272
+ title: "Register the callback",
273
+ detail: "Add {redirectUri} as an exact HTTPS web redirect URI.",
274
+ copyValue: "{redirectUri}"
275
+ },
276
+ {
277
+ id: "urls",
278
+ title: "Verify publishing URLs",
279
+ detail: "Verify every HTTPS domain or URL prefix TikTok may pull videos and photos from."
280
+ },
281
+ {
282
+ id: "test",
283
+ title: "Test a private post",
284
+ detail: "Connect a test creator, read creator information, publish private test media, and poll the publish id until completion."
285
+ }
286
+ ],
287
+ knownQuirks: [
288
+ {
289
+ id: "private-until-audit",
290
+ severity: "critical",
291
+ message: "TikTok restricts unaudited Content Posting clients to private posts. Public visibility requires TikTok app review."
292
+ },
293
+ {
294
+ id: "verified-pull-url",
295
+ severity: "critical",
296
+ message: "Direct posts can pull media only from an HTTPS domain or URL prefix verified for this TikTok app."
297
+ },
298
+ {
299
+ id: "creator-preflight",
300
+ severity: "warning",
301
+ message: "TikTok requires current creator options before each direct post. The adapter performs this preflight and rejects unavailable privacy or duration choices."
302
+ },
303
+ {
304
+ id: "token-lifetime",
305
+ severity: "info",
306
+ message: "Access tokens last about 24 hours. Refresh tokens last about 365 days and may rotate on refresh."
307
+ }
308
+ ],
309
+ postSetup: [
310
+ {
311
+ id: "tiktok.private-publish",
312
+ title: "Prove one private direct post",
313
+ detail: "Publish media from a verified URL and poll the returned publish id until TikTok reports PUBLISH_COMPLETE."
314
+ },
315
+ {
316
+ id: "tiktok.refresh",
317
+ title: "Prove token refresh",
318
+ detail: "Refresh the short-lived access token and preserve TikTok\u2019s newly returned refresh token."
319
+ }
320
+ ],
321
+ healthcheck: {
322
+ id: "tiktok.user.info",
323
+ level: "connection",
324
+ description: "Read the connected TikTok account with user.info.basic."
325
+ }
326
+ },
327
+ amplitude: {
328
+ consoleUrl: "https://analytics.amplitude.com/",
329
+ credentialFields: [
330
+ {
331
+ label: "Amplitude project credential JSON",
332
+ description: "JSON containing the API key and secret key for one Amplitude project.",
333
+ example: '{"apiKey":"...","secretKey":"..."}',
334
+ secret: true
335
+ }
336
+ ],
337
+ consoleSteps: [
338
+ {
339
+ id: "project",
340
+ title: "Select one Amplitude project",
341
+ detail: "Open Project Settings > General for the project that Tangle may access."
342
+ },
343
+ {
344
+ id: "credentials",
345
+ title: "Copy the project credentials",
346
+ detail: "Copy the API key and secret key into one JSON credential bundle."
347
+ },
348
+ {
349
+ id: "region",
350
+ title: "Set the data region",
351
+ detail: "Use the default US host. Set apiBaseUrl to the documented EU host only for an EU project."
352
+ },
353
+ {
354
+ id: "test",
355
+ title: "Test the project connection",
356
+ detail: "The connection check lists visible project events without changing analytics data."
357
+ }
358
+ ],
359
+ knownQuirks: [
360
+ {
361
+ id: "project-bound",
362
+ severity: "warning",
363
+ message: "The API key and secret key belong to one project. Use a separate connection for each project."
364
+ },
365
+ {
366
+ id: "region-bound",
367
+ severity: "critical",
368
+ message: "US and EU projects use different hosts. Tangle accepts only the two official Amplitude API hosts."
369
+ },
370
+ {
371
+ id: "annotation-authority",
372
+ severity: "warning",
373
+ message: "Annotation changes require suitable Amplitude authority and remain approval-gated."
374
+ }
375
+ ],
376
+ healthcheck: {
377
+ id: "amplitude.connection",
378
+ level: "connection",
379
+ description: "Authenticate with the project credential pair and list visible events."
380
+ }
381
+ },
382
+ cloudflare: {
383
+ consoleUrl: "https://dash.cloudflare.com/profile/api-tokens/",
384
+ credentialFields: [
385
+ {
386
+ label: "Dedicated Cloudflare API token",
387
+ description: "Create a new resource-scoped token for Tangle Integration Hub. Do not reuse an infrastructure token.",
388
+ secret: true
389
+ }
390
+ ],
391
+ consoleSteps: [
392
+ {
393
+ id: "token",
394
+ title: "Create a dedicated API token",
395
+ detail: "Create a custom token named Tangle Integration Hub. Do not use the legacy Global API Key."
396
+ },
397
+ {
398
+ id: "permissions",
399
+ title: "Grant narrow permissions",
400
+ detail: "Grant Account Settings Read, Zone Read, Zone Settings Read, and DNS Read or DNS Edit only."
401
+ },
402
+ {
403
+ id: "resources",
404
+ title: "Limit the token to selected zones",
405
+ detail: "Include only the accounts and zones that this connection must manage."
406
+ },
407
+ {
408
+ id: "store",
409
+ title: "Store the one-time token",
410
+ detail: "Copy the token once. Tangle Hub seals it before persistence."
411
+ },
412
+ {
413
+ id: "test",
414
+ title: "Verify token status",
415
+ detail: "The connection check calls the token verification endpoint and requires active status."
416
+ }
417
+ ],
418
+ knownQuirks: [
419
+ {
420
+ id: "no-global-key",
421
+ severity: "critical",
422
+ message: "Global API keys grant full user authority and are unsupported. Use a scoped API token."
423
+ },
424
+ {
425
+ id: "no-token-reuse",
426
+ severity: "critical",
427
+ message: "Never reuse a token used by Tangle deployment, Workers, Terraform, DNS automation, or other infrastructure."
428
+ },
429
+ {
430
+ id: "dns-impact",
431
+ severity: "critical",
432
+ message: "DNS updates can interrupt production traffic. Every DNS mutation remains approval-gated."
433
+ }
434
+ ],
435
+ healthcheck: {
436
+ id: "cloudflare.token",
437
+ level: "connection",
438
+ description: "Verify that the dedicated API token is valid and active."
439
+ }
440
+ },
441
+ nango: {
442
+ consoleUrl: "https://nango.dev/docs/getting-started/intro-to-nango",
443
+ credentialFields: [],
444
+ consoleSteps: [
445
+ {
446
+ id: "gateway",
447
+ title: "Choose a Nango gateway deployment",
448
+ detail: "Use Nango only when a product intentionally deploys Nango Cloud or a self-hosted Nango environment."
449
+ },
450
+ {
451
+ id: "runtime",
452
+ title: "Configure the gateway runtime",
453
+ detail: "Store the Nango host and environment secret in the product-owned gateway service, not as provider OAuth credentials."
454
+ },
455
+ {
456
+ id: "providers",
457
+ title: "Configure real provider integrations",
458
+ detail: "Register each external provider in Nango and test its connection lifecycle separately."
459
+ }
460
+ ],
461
+ knownQuirks: [
462
+ {
463
+ id: "gateway-not-provider",
464
+ severity: "critical",
465
+ message: "Nango is an integration gateway, not an end-user OAuth provider. This catalog entry has no generic Connect flow."
466
+ },
467
+ {
468
+ id: "no-runtime",
469
+ severity: "critical",
470
+ message: "This package does not ship a Nango gateway backend. The entry remains non-executable until a product deploys one."
471
+ }
472
+ ],
473
+ healthcheck: {
474
+ id: "nango.static",
475
+ level: "static",
476
+ description: "No Nango gateway runtime is configured by this package."
477
+ }
478
+ },
256
479
  mongodb: {
257
480
  credentialFields: [
258
481
  {
@@ -920,6 +1143,10 @@ function resolveConnectorAuthSpec(kind) {
920
1143
  redirectUriTemplate: auth.redirectUriTemplate,
921
1144
  clientIdEnv: auth.clientIdEnv,
922
1145
  clientSecretEnv: auth.clientSecretEnv,
1146
+ scopeSeparator: auth.scopeSeparator,
1147
+ authorizationClientIdParam: auth.authorizationClientIdParam,
1148
+ tokenClientIdParam: auth.tokenClientIdParam,
1149
+ tokenClientSecretParam: auth.tokenClientSecretParam,
923
1150
  tokenClientAuthMethod: auth.tokenClientAuthMethod,
924
1151
  extraAuthParams: auth.extraAuthParams
925
1152
  };
@@ -1050,17 +1277,22 @@ function authFor(spec, family, permissions, kind) {
1050
1277
  }))
1051
1278
  );
1052
1279
  const real = manifest ? bundledOAuth2Auth(manifest) : void 0;
1280
+ const tokenClientAuthMethod = real?.tokenClientAuthMethod ?? "client_secret_post";
1053
1281
  return {
1054
1282
  mode: "oauth2",
1055
1283
  authorizationUrl: real?.authorizationUrl ?? f.authorizationUrl,
1056
1284
  tokenUrl: real?.tokenUrl ?? f.tokenUrl,
1057
1285
  clientIdEnv: real?.clientIdEnv ?? f.credentialFields.find((field) => !field.secret)?.env,
1058
- clientSecretEnv: real?.clientSecretEnv ?? f.credentialFields.find((field) => field.secret)?.env,
1059
- tokenClientAuthMethod: real?.tokenClientAuthMethod ?? "client_secret_post",
1286
+ clientSecretEnv: tokenClientAuthMethod === "none" ? void 0 : real?.clientSecretEnv ?? f.credentialFields.find((field) => field.secret)?.env,
1287
+ scopeSeparator: real?.scopeSeparator ?? " ",
1288
+ authorizationClientIdParam: real?.authorizationClientIdParam ?? "client_id",
1289
+ tokenClientIdParam: real?.tokenClientIdParam ?? "client_id",
1290
+ tokenClientSecretParam: real?.tokenClientSecretParam ?? "client_secret",
1291
+ tokenClientAuthMethod,
1060
1292
  scopes: real ? scopesFromManifest(real.scopes, permissions) : scopes,
1061
1293
  extraAuthParams: real?.extraAuthParams ?? extraAuthParamsFor(family),
1062
1294
  redirectUriTemplate: (f.redirectUriTemplate ?? "https://{host}/api/integrations/oauth/{kind}/callback").replace("{kind}", spec.id),
1063
- pkce: family === "google" || family === "microsoft-graph" ? "supported" : "unsupported"
1295
+ pkce: real?.pkce ?? (family === "google" || family === "microsoft-graph" ? "supported" : "required")
1064
1296
  };
1065
1297
  }
1066
1298
  function actionsFromManifest(manifest, fallbackDataClass) {
@@ -1084,7 +1316,7 @@ function scopesFromManifest(providerScopes, permissions) {
1084
1316
  const writePermission = permissions.find((permission) => permission.risk === "write");
1085
1317
  const readPermission = permissions.find((permission) => permission.risk === "read") ?? permissions[0];
1086
1318
  return providerScopes.map((providerScope) => {
1087
- const mutating = /(?:^|[.\/_:-])(?:write|manage|create|modify|edit|update|delete|full|readwrite)(?:$|[.\/_:-])/i.test(
1319
+ const mutating = /(?:^|[.\/_:-])(?:write|manage|create|modify|edit|update|delete|publish|full|readwrite)(?:$|[.\/_:-])/i.test(
1088
1320
  providerScope
1089
1321
  );
1090
1322
  const base = (mutating ? writePermission : readPermission) ?? readPermission;
@@ -1101,10 +1333,18 @@ function scopesFromManifest(providerScopes, permissions) {
1101
1333
  function credentialFieldsFor(auth) {
1102
1334
  if (auth.mode === "api_key" || auth.mode === "hmac") return [auth.credential];
1103
1335
  if (auth.mode === "oauth2") {
1104
- return [
1105
- { label: "Client ID", env: auth.clientIdEnv, description: "OAuth client ID.", secret: false },
1106
- { label: "Client Secret", env: auth.clientSecretEnv, description: "OAuth client secret.", secret: true }
1336
+ const fields = [
1337
+ { label: "Client ID", env: auth.clientIdEnv, description: "OAuth client ID.", secret: false }
1107
1338
  ];
1339
+ if (auth.tokenClientAuthMethod !== "none") {
1340
+ fields.push({
1341
+ label: "Client Secret",
1342
+ env: auth.clientSecretEnv,
1343
+ description: "OAuth client secret.",
1344
+ secret: true
1345
+ });
1346
+ }
1347
+ return fields;
1108
1348
  }
1109
1349
  return [];
1110
1350
  }
@@ -1204,6 +1444,7 @@ function apiKeyFieldFor(kind) {
1204
1444
  }
1205
1445
  function apiKeyPlacementFor(kind) {
1206
1446
  if (kind === "sftp" || kind === "kafka") return void 0;
1447
+ if (kind === "amplitude") return "basic";
1207
1448
  if (kind === "clickup" || kind === "gitlab") return "header";
1208
1449
  return "bearer";
1209
1450
  }
@@ -1343,4 +1584,4 @@ export {
1343
1584
  validateCredentialFormat,
1344
1585
  validateCredentialSet
1345
1586
  };
1346
- //# sourceMappingURL=chunk-U36WHHML.js.map
1587
+ //# sourceMappingURL=chunk-ZSXRS7D7.js.map