archal 0.9.18 → 0.9.19

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.
@@ -591,8 +591,9 @@ var GENERATED_TWIN_CATALOG = [
591
591
  icon: "AP",
592
592
  name: "Apify",
593
593
  description: "Actors, runs, datasets, key-value stores, and request queues.",
594
- toolCount: 45,
595
- transport: "rest"
594
+ toolCount: 43,
595
+ transport: "rest",
596
+ opsCoverage: null
596
597
  },
597
598
  {
598
599
  id: "discord",
@@ -600,7 +601,17 @@ var GENERATED_TWIN_CATALOG = [
600
601
  name: "Discord",
601
602
  description: "Guilds, channels, messages, webhooks, threads, commands, and interaction responses.",
602
603
  toolCount: 67,
603
- transport: "both"
604
+ transport: "both",
605
+ opsCoverage: 14
606
+ },
607
+ {
608
+ id: "firecrawl",
609
+ icon: "FC",
610
+ name: "Firecrawl",
611
+ description: "Scraping, crawling, mapping, search, and extraction.",
612
+ toolCount: 6,
613
+ transport: "rest",
614
+ opsCoverage: 77
604
615
  },
605
616
  {
606
617
  id: "github",
@@ -608,7 +619,8 @@ var GENERATED_TWIN_CATALOG = [
608
619
  name: "GitHub",
609
620
  description: "Repos, issues, pull requests, branches, and commits.",
610
621
  toolCount: 26,
611
- transport: "both"
622
+ transport: "both",
623
+ opsCoverage: 96
612
624
  },
613
625
  {
614
626
  id: "google-workspace",
@@ -616,7 +628,17 @@ var GENERATED_TWIN_CATALOG = [
616
628
  name: "Google Workspace",
617
629
  description: "Gmail, Calendar, Drive, Sheets, and Contacts.",
618
630
  toolCount: 249,
619
- transport: "both"
631
+ transport: "both",
632
+ opsCoverage: 64
633
+ },
634
+ {
635
+ id: "hubspot",
636
+ icon: "HS",
637
+ name: "HubSpot",
638
+ description: "CRM contacts, companies, deals, tickets, and engagements.",
639
+ toolCount: 45,
640
+ transport: "rest",
641
+ opsCoverage: 10
620
642
  },
621
643
  {
622
644
  id: "jira",
@@ -624,7 +646,8 @@ var GENERATED_TWIN_CATALOG = [
624
646
  name: "Jira",
625
647
  description: "Issues, projects, boards, sprints, and versions.",
626
648
  toolCount: 49,
627
- transport: "both"
649
+ transport: "both",
650
+ opsCoverage: 80
628
651
  },
629
652
  {
630
653
  id: "linear",
@@ -632,7 +655,8 @@ var GENERATED_TWIN_CATALOG = [
632
655
  name: "Linear",
633
656
  description: "Issues, projects, teams, cycles, and workflows.",
634
657
  toolCount: 42,
635
- transport: "both"
658
+ transport: "both",
659
+ opsCoverage: 98
636
660
  },
637
661
  {
638
662
  id: "ramp",
@@ -640,7 +664,17 @@ var GENERATED_TWIN_CATALOG = [
640
664
  name: "Ramp",
641
665
  description: "Cards, funds, expenses, reimbursements, bills, and travel.",
642
666
  toolCount: 46,
643
- transport: "mcp"
667
+ transport: "mcp",
668
+ opsCoverage: null
669
+ },
670
+ {
671
+ id: "sendgrid",
672
+ icon: "SG",
673
+ name: "SendGrid",
674
+ description: "Mail send, contacts, lists, templates, and stats.",
675
+ toolCount: 28,
676
+ transport: "rest",
677
+ opsCoverage: 100
644
678
  },
645
679
  {
646
680
  id: "slack",
@@ -648,7 +682,8 @@ var GENERATED_TWIN_CATALOG = [
648
682
  name: "Slack",
649
683
  description: "Channels, messages, threads, users, and reactions.",
650
684
  toolCount: 8,
651
- transport: "both"
685
+ transport: "both",
686
+ opsCoverage: 100
652
687
  },
653
688
  {
654
689
  id: "stripe",
@@ -656,7 +691,8 @@ var GENERATED_TWIN_CATALOG = [
656
691
  name: "Stripe",
657
692
  description: "Customers, payments, subscriptions, invoices, and refunds.",
658
693
  toolCount: 28,
659
- transport: "both"
694
+ transport: "both",
695
+ opsCoverage: null
660
696
  },
661
697
  {
662
698
  id: "supabase",
@@ -664,7 +700,8 @@ var GENERATED_TWIN_CATALOG = [
664
700
  name: "Supabase",
665
701
  description: "SQL, migrations, logs, branches, and project metadata.",
666
702
  toolCount: 29,
667
- transport: "both"
703
+ transport: "both",
704
+ opsCoverage: 100
668
705
  },
669
706
  {
670
707
  id: "tavily",
@@ -672,7 +709,35 @@ var GENERATED_TWIN_CATALOG = [
672
709
  name: "Tavily",
673
710
  description: "Search, extract, crawl, map, research, usage, and API key operations.",
674
711
  toolCount: 11,
675
- transport: "rest"
712
+ transport: "rest",
713
+ opsCoverage: 100
714
+ },
715
+ {
716
+ id: "telegram",
717
+ icon: "TG",
718
+ name: "Telegram",
719
+ description: "Bot messages, chats, updates, and webhooks.",
720
+ toolCount: 32,
721
+ transport: "both",
722
+ opsCoverage: null
723
+ },
724
+ {
725
+ id: "twilio",
726
+ icon: "TW",
727
+ name: "Twilio",
728
+ description: "Messages, calls, phone numbers, and verifications.",
729
+ toolCount: 35,
730
+ transport: "rest",
731
+ opsCoverage: 92
732
+ },
733
+ {
734
+ id: "unipile",
735
+ icon: "UP",
736
+ name: "Unipile",
737
+ description: "LinkedIn and email messaging, accounts, and chats.",
738
+ toolCount: 24,
739
+ transport: "rest",
740
+ opsCoverage: 100
676
741
  }
677
742
  ];
678
743
  var GENERATED_STARTABLE_TWIN_IDS = [
@@ -975,11 +1040,10 @@ function trimEnv(name) {
975
1040
  }
976
1041
  function parsePositiveInteger(rawValue, fallback, minimum = 1) {
977
1042
  if (!rawValue) return fallback;
978
- const parsed = Number.parseInt(rawValue, 10);
979
- if (Number.isNaN(parsed) || parsed < minimum) {
980
- return fallback;
981
- }
982
- return parsed;
1043
+ const normalized = rawValue.trim();
1044
+ if (!/^[1-9]\d*$/.test(normalized)) return fallback;
1045
+ const parsed = Number(normalized);
1046
+ return Number.isSafeInteger(parsed) && parsed >= minimum ? parsed : fallback;
983
1047
  }
984
1048
  function normalizeApiBaseUrl(value) {
985
1049
  if (!value) return null;
@@ -1312,12 +1376,14 @@ var __toESM2 = (mod, isNodeMode, target) => (target = mod != null ? __create2(__
1312
1376
  mod
1313
1377
  ));
1314
1378
 
1315
- // ../seedgen/dist/chunk-E7QP3UBL.js
1379
+ // ../seedgen/dist/chunk-OUL4HJ5I.js
1316
1380
  var import_stream = require("stream");
1317
1381
  var import_crypto = __toESM(require("crypto"), 1);
1318
1382
  var import_async_hooks = require("async_hooks");
1319
1383
  var import_os = require("os");
1320
1384
  var import_path = require("path");
1385
+ var import_os2 = require("os");
1386
+ var import_path2 = require("path");
1321
1387
  var require_code = __commonJS({
1322
1388
  "../../node_modules/.pnpm/ajv@8.18.0/node_modules/ajv/dist/compile/codegen/code.js"(exports2) {
1323
1389
  "use strict";
@@ -4228,7 +4294,7 @@ var require_compile = __commonJS({
4228
4294
  const schOrFunc = root.refs[ref2];
4229
4295
  if (schOrFunc)
4230
4296
  return schOrFunc;
4231
- let _sch = resolve5.call(this, root, ref2);
4297
+ let _sch = resolve6.call(this, root, ref2);
4232
4298
  if (_sch === void 0) {
4233
4299
  const schema = (_a2 = root.localRefs) === null || _a2 === void 0 ? void 0 : _a2[ref2];
4234
4300
  const { schemaId } = this.opts;
@@ -4255,7 +4321,7 @@ var require_compile = __commonJS({
4255
4321
  function sameSchemaEnv(s1, s2) {
4256
4322
  return s1.schema === s2.schema && s1.root === s2.root && s1.baseId === s2.baseId;
4257
4323
  }
4258
- function resolve5(root, ref2) {
4324
+ function resolve6(root, ref2) {
4259
4325
  let sch;
4260
4326
  while (typeof (sch = this.refs[ref2]) == "string")
4261
4327
  ref2 = sch;
@@ -4822,55 +4888,55 @@ var require_fast_uri = __commonJS({
4822
4888
  }
4823
4889
  return uri;
4824
4890
  }
4825
- function resolve5(baseURI, relativeURI, options) {
4891
+ function resolve6(baseURI, relativeURI, options) {
4826
4892
  const schemelessOptions = options ? Object.assign({ scheme: "null" }, options) : { scheme: "null" };
4827
4893
  const resolved = resolveComponent(parse32(baseURI, schemelessOptions), parse32(relativeURI, schemelessOptions), schemelessOptions, true);
4828
4894
  schemelessOptions.skipEscape = true;
4829
4895
  return serialize(resolved, schemelessOptions);
4830
4896
  }
4831
- function resolveComponent(base, relative2, options, skipNormalization) {
4897
+ function resolveComponent(base, relative3, options, skipNormalization) {
4832
4898
  const target = {};
4833
4899
  if (!skipNormalization) {
4834
4900
  base = parse32(serialize(base, options), options);
4835
- relative2 = parse32(serialize(relative2, options), options);
4901
+ relative3 = parse32(serialize(relative3, options), options);
4836
4902
  }
4837
4903
  options = options || {};
4838
- if (!options.tolerant && relative2.scheme) {
4839
- target.scheme = relative2.scheme;
4840
- target.userinfo = relative2.userinfo;
4841
- target.host = relative2.host;
4842
- target.port = relative2.port;
4843
- target.path = removeDotSegments(relative2.path || "");
4844
- target.query = relative2.query;
4904
+ if (!options.tolerant && relative3.scheme) {
4905
+ target.scheme = relative3.scheme;
4906
+ target.userinfo = relative3.userinfo;
4907
+ target.host = relative3.host;
4908
+ target.port = relative3.port;
4909
+ target.path = removeDotSegments(relative3.path || "");
4910
+ target.query = relative3.query;
4845
4911
  } else {
4846
- if (relative2.userinfo !== void 0 || relative2.host !== void 0 || relative2.port !== void 0) {
4847
- target.userinfo = relative2.userinfo;
4848
- target.host = relative2.host;
4849
- target.port = relative2.port;
4850
- target.path = removeDotSegments(relative2.path || "");
4851
- target.query = relative2.query;
4912
+ if (relative3.userinfo !== void 0 || relative3.host !== void 0 || relative3.port !== void 0) {
4913
+ target.userinfo = relative3.userinfo;
4914
+ target.host = relative3.host;
4915
+ target.port = relative3.port;
4916
+ target.path = removeDotSegments(relative3.path || "");
4917
+ target.query = relative3.query;
4852
4918
  } else {
4853
- if (!relative2.path) {
4919
+ if (!relative3.path) {
4854
4920
  target.path = base.path;
4855
- if (relative2.query !== void 0) {
4856
- target.query = relative2.query;
4921
+ if (relative3.query !== void 0) {
4922
+ target.query = relative3.query;
4857
4923
  } else {
4858
4924
  target.query = base.query;
4859
4925
  }
4860
4926
  } else {
4861
- if (relative2.path[0] === "/") {
4862
- target.path = removeDotSegments(relative2.path);
4927
+ if (relative3.path[0] === "/") {
4928
+ target.path = removeDotSegments(relative3.path);
4863
4929
  } else {
4864
4930
  if ((base.userinfo !== void 0 || base.host !== void 0 || base.port !== void 0) && !base.path) {
4865
- target.path = "/" + relative2.path;
4931
+ target.path = "/" + relative3.path;
4866
4932
  } else if (!base.path) {
4867
- target.path = relative2.path;
4933
+ target.path = relative3.path;
4868
4934
  } else {
4869
- target.path = base.path.slice(0, base.path.lastIndexOf("/") + 1) + relative2.path;
4935
+ target.path = base.path.slice(0, base.path.lastIndexOf("/") + 1) + relative3.path;
4870
4936
  }
4871
4937
  target.path = removeDotSegments(target.path);
4872
4938
  }
4873
- target.query = relative2.query;
4939
+ target.query = relative3.query;
4874
4940
  }
4875
4941
  target.userinfo = base.userinfo;
4876
4942
  target.host = base.host;
@@ -4878,7 +4944,7 @@ var require_fast_uri = __commonJS({
4878
4944
  }
4879
4945
  target.scheme = base.scheme;
4880
4946
  }
4881
- target.fragment = relative2.fragment;
4947
+ target.fragment = relative3.fragment;
4882
4948
  return target;
4883
4949
  }
4884
4950
  function equal(uriA, uriB, options) {
@@ -5049,7 +5115,7 @@ var require_fast_uri = __commonJS({
5049
5115
  var fastUri = {
5050
5116
  SCHEMES,
5051
5117
  normalize,
5052
- resolve: resolve5,
5118
+ resolve: resolve6,
5053
5119
  resolveComponent,
5054
5120
  equal,
5055
5121
  serialize,
@@ -27125,6 +27191,62 @@ var toolSearchInputSchema = external_exports3.object({
27125
27191
  /** Max results. Defaults to 10; capped at 100. */
27126
27192
  limit: external_exports3.number().int().positive().max(TOOL_SEARCH_MAX_LIMIT).optional()
27127
27193
  });
27194
+ var RecordingManifestEntrySchema = external_exports3.object({
27195
+ filename: external_exports3.string(),
27196
+ sha256: external_exports3.string().regex(/^[0-9a-f]{64}$/, "sha256 must be 64 lowercase hex chars"),
27197
+ size: external_exports3.number().optional(),
27198
+ sizeBytes: external_exports3.number().optional(),
27199
+ uploadedAt: external_exports3.string().optional(),
27200
+ // Optional symbolic tags that map fixture-oracle / replay lookups onto this
27201
+ // recording. Lets twins keep tag→file resolution inside the manifest itself
27202
+ // rather than depending on a separate provenance.json (which is excluded
27203
+ // from the in-tree fixture allowlist for graduated twins). Codex P2 on
27204
+ // tavily #3603 — fixture-oracle previously required provenance.json to
27205
+ // resolve `rest-profile:tavily:tavily_search_basic` → filename.
27206
+ tags: external_exports3.array(external_exports3.string()).optional()
27207
+ }).loose();
27208
+ var RecordingManifestSchema = external_exports3.object({
27209
+ service: external_exports3.string().min(1),
27210
+ version: external_exports3.number().int(),
27211
+ container: external_exports3.string().min(1),
27212
+ baseUrl: external_exports3.string().optional(),
27213
+ entries: external_exports3.array(RecordingManifestEntrySchema)
27214
+ }).loose();
27215
+ var DEFAULT_BASE_URL = process.env["ARCHAL_FIXTURE_BASE_URL"] ?? "https://archalforge8f96908966.blob.core.windows.net/archal-fixture-artifacts?sv=2023-11-03&spr=https&se=2031-05-10T00%3A00%3A00Z&sr=c&sp=rl&sig=r3%2FC3EwzilSHls8z3Pn5ZR%2BkinwQw1C6%2BDKObIZSIu0%3D";
27216
+ var DEFAULT_CACHE_ROOT = process.env["ARCHAL_FIXTURE_CACHE_ROOT"] ?? (0, import_path2.resolve)((0, import_os2.homedir)(), ".archal", "forge", "recordings-cache");
27217
+ function warnIfSasExpiresSoon(baseUrl) {
27218
+ if (process.env["ARCHAL_FIXTURE_SAS_WARN"] === "0") return;
27219
+ const queryIdx = baseUrl.indexOf("?");
27220
+ if (queryIdx < 0) return;
27221
+ const query = baseUrl.slice(queryIdx + 1);
27222
+ const seParam = query.split("&").find((p) => p.startsWith("se="));
27223
+ if (!seParam) return;
27224
+ const seValue = decodeURIComponent(seParam.slice(3));
27225
+ const expiresAt = Date.parse(seValue);
27226
+ if (Number.isNaN(expiresAt)) return;
27227
+ const now = Date.now();
27228
+ const daysRemaining = Math.floor((expiresAt - now) / (1e3 * 60 * 60 * 24));
27229
+ if (daysRemaining < 365) {
27230
+ console.warn(
27231
+ `[recording-fetcher] SAS token in ARCHAL_FIXTURE_BASE_URL expires in ${daysRemaining}d (${seValue}). Rotate via scripts/rotate-fixture-sas.mjs before expiry.`
27232
+ );
27233
+ }
27234
+ }
27235
+ warnIfSasExpiresSoon(DEFAULT_BASE_URL);
27236
+ var DEFAULT_CACHE_ROOT2 = process.env["ARCHAL_LEGACY_ASSET_CACHE_ROOT"] ?? (0, import_path.resolve)((0, import_os.homedir)(), ".archal", "forge", "legacy-assets-cache");
27237
+ var LegacyAssetEntrySchema = external_exports3.object({
27238
+ relativePath: external_exports3.string().min(1),
27239
+ sha256: external_exports3.string().regex(/^[0-9a-f]{64}$/, "sha256 must be 64 lowercase hex chars"),
27240
+ sizeBytes: external_exports3.number().optional(),
27241
+ uploadedAt: external_exports3.string().optional()
27242
+ }).loose();
27243
+ var LegacyAssetManifestSchema = external_exports3.object({
27244
+ service: external_exports3.string().min(1),
27245
+ version: external_exports3.number().int(),
27246
+ container: external_exports3.string().min(1),
27247
+ layout: external_exports3.string().optional(),
27248
+ entries: external_exports3.array(LegacyAssetEntrySchema)
27249
+ }).loose();
27128
27250
  var manifest_default = [
27129
27251
  {
27130
27252
  name: "apify",
@@ -27173,6 +27295,12 @@ var manifest_default = [
27173
27295
  package: "@archal/twin-firecrawl",
27174
27296
  path: "twins/firecrawl",
27175
27297
  stage: "internal",
27298
+ display: {
27299
+ icon: "FC",
27300
+ name: "Firecrawl",
27301
+ description: "Scraping, crawling, mapping, search, and extraction.",
27302
+ toolCount: 6
27303
+ },
27176
27304
  transport: "rest",
27177
27305
  hostedRuntime: { enabled: true, requiresDist: true, requiresEmptySeed: true },
27178
27306
  cli: { bundleAssets: false, bundleToolSnapshot: false },
@@ -27240,6 +27368,12 @@ var manifest_default = [
27240
27368
  package: "@archal/twin-hubspot",
27241
27369
  path: "twins/hubspot",
27242
27370
  stage: "internal",
27371
+ display: {
27372
+ icon: "HS",
27373
+ name: "HubSpot",
27374
+ description: "CRM contacts, companies, deals, tickets, and engagements.",
27375
+ toolCount: 45
27376
+ },
27243
27377
  transport: "rest",
27244
27378
  hostedRuntime: { enabled: true, requiresDist: true, requiresEmptySeed: true },
27245
27379
  cli: { bundleAssets: false, bundleToolSnapshot: false },
@@ -27316,6 +27450,12 @@ var manifest_default = [
27316
27450
  package: "@archal/twin-sendgrid",
27317
27451
  path: "twins/sendgrid",
27318
27452
  stage: "internal",
27453
+ display: {
27454
+ icon: "SG",
27455
+ name: "SendGrid",
27456
+ description: "Mail send, contacts, lists, templates, and stats.",
27457
+ toolCount: 28
27458
+ },
27319
27459
  transport: "rest",
27320
27460
  hostedRuntime: { enabled: true, requiresDist: true, requiresEmptySeed: true },
27321
27461
  cli: { bundleAssets: false, bundleToolSnapshot: false },
@@ -27412,6 +27552,12 @@ var manifest_default = [
27412
27552
  package: "@archal/twin-telegram",
27413
27553
  path: "twins/telegram",
27414
27554
  stage: "internal",
27555
+ display: {
27556
+ icon: "TG",
27557
+ name: "Telegram",
27558
+ description: "Bot messages, chats, updates, and webhooks.",
27559
+ toolCount: 32
27560
+ },
27415
27561
  transport: "both",
27416
27562
  hostedRuntime: { enabled: true, requiresDist: true, requiresEmptySeed: true },
27417
27563
  cli: { bundleAssets: false, bundleToolSnapshot: false },
@@ -27424,6 +27570,12 @@ var manifest_default = [
27424
27570
  package: "@archal/twin-twilio",
27425
27571
  path: "twins/twilio",
27426
27572
  stage: "internal",
27573
+ display: {
27574
+ icon: "TW",
27575
+ name: "Twilio",
27576
+ description: "Messages, calls, phone numbers, and verifications.",
27577
+ toolCount: 35
27578
+ },
27427
27579
  transport: "rest",
27428
27580
  hostedRuntime: { enabled: true, requiresDist: true, requiresEmptySeed: true },
27429
27581
  cli: { bundleAssets: false, bundleToolSnapshot: false },
@@ -27436,6 +27588,12 @@ var manifest_default = [
27436
27588
  package: "@archal/twin-unipile",
27437
27589
  path: "twins/unipile",
27438
27590
  stage: "internal",
27591
+ display: {
27592
+ icon: "UP",
27593
+ name: "Unipile",
27594
+ description: "LinkedIn and email messaging, accounts, and chats.",
27595
+ toolCount: 24
27596
+ },
27439
27597
  transport: "rest",
27440
27598
  hostedRuntime: { enabled: true, requiresDist: true, requiresEmptySeed: true },
27441
27599
  cli: { bundleAssets: false, bundleToolSnapshot: false },
@@ -27580,48 +27738,6 @@ var SCENARIO_RISK_RULES = [
27580
27738
  var SCENARIO_RISK_TAXONOMY = SCENARIO_RISK_RULES.map(
27581
27739
  ({ id, label, description }) => ({ id, label, description })
27582
27740
  );
27583
- var RecordingManifestEntrySchema = external_exports3.object({
27584
- filename: external_exports3.string(),
27585
- sha256: external_exports3.string().regex(/^[0-9a-f]{64}$/, "sha256 must be 64 lowercase hex chars"),
27586
- size: external_exports3.number().optional(),
27587
- sizeBytes: external_exports3.number().optional(),
27588
- uploadedAt: external_exports3.string().optional(),
27589
- // Optional symbolic tags that map fixture-oracle / replay lookups onto this
27590
- // recording. Lets twins keep tag→file resolution inside the manifest itself
27591
- // rather than depending on a separate provenance.json (which is excluded
27592
- // from the in-tree fixture allowlist for graduated twins). Codex P2 on
27593
- // tavily #3603 — fixture-oracle previously required provenance.json to
27594
- // resolve `rest-profile:tavily:tavily_search_basic` → filename.
27595
- tags: external_exports3.array(external_exports3.string()).optional()
27596
- }).loose();
27597
- var RecordingManifestSchema = external_exports3.object({
27598
- service: external_exports3.string().min(1),
27599
- version: external_exports3.number().int(),
27600
- container: external_exports3.string().min(1),
27601
- baseUrl: external_exports3.string().optional(),
27602
- entries: external_exports3.array(RecordingManifestEntrySchema)
27603
- }).loose();
27604
- var DEFAULT_BASE_URL = process.env["ARCHAL_FIXTURE_BASE_URL"] ?? "https://archalforge8f96908966.blob.core.windows.net/archal-fixture-artifacts?sv=2023-11-03&spr=https&se=2031-05-10T00%3A00%3A00Z&sr=c&sp=rl&sig=r3%2FC3EwzilSHls8z3Pn5ZR%2BkinwQw1C6%2BDKObIZSIu0%3D";
27605
- var DEFAULT_CACHE_ROOT = process.env["ARCHAL_FIXTURE_CACHE_ROOT"] ?? (0, import_path.resolve)((0, import_os.homedir)(), ".archal", "forge", "recordings-cache");
27606
- function warnIfSasExpiresSoon(baseUrl) {
27607
- if (process.env["ARCHAL_FIXTURE_SAS_WARN"] === "0") return;
27608
- const queryIdx = baseUrl.indexOf("?");
27609
- if (queryIdx < 0) return;
27610
- const query = baseUrl.slice(queryIdx + 1);
27611
- const seParam = query.split("&").find((p) => p.startsWith("se="));
27612
- if (!seParam) return;
27613
- const seValue = decodeURIComponent(seParam.slice(3));
27614
- const expiresAt = Date.parse(seValue);
27615
- if (Number.isNaN(expiresAt)) return;
27616
- const now = Date.now();
27617
- const daysRemaining = Math.floor((expiresAt - now) / (1e3 * 60 * 60 * 24));
27618
- if (daysRemaining < 365) {
27619
- console.warn(
27620
- `[recording-fetcher] SAS token in ARCHAL_FIXTURE_BASE_URL expires in ${daysRemaining}d (${seValue}). Rotate via scripts/rotate-fixture-sas.mjs before expiry.`
27621
- );
27622
- }
27623
- }
27624
- warnIfSasExpiresSoon(DEFAULT_BASE_URL);
27625
27741
 
27626
27742
  // ../../node_modules/.pnpm/acorn@8.16.0/node_modules/acorn/dist/acorn.mjs
27627
27743
  var astralIdentifierCodes = [509, 0, 227, 0, 150, 4, 294, 9, 1368, 2, 2, 1, 6, 3, 41, 2, 5, 0, 166, 1, 574, 3, 9, 9, 7, 9, 32, 4, 318, 1, 78, 5, 71, 10, 50, 3, 123, 2, 54, 14, 32, 10, 3, 1, 11, 3, 46, 10, 8, 0, 46, 9, 7, 2, 37, 13, 2, 9, 6, 1, 45, 0, 13, 2, 49, 13, 9, 3, 2, 11, 83, 11, 7, 0, 3, 0, 158, 11, 6, 9, 7, 3, 56, 1, 2, 6, 3, 1, 3, 2, 10, 0, 11, 1, 3, 6, 4, 4, 68, 8, 2, 0, 3, 0, 2, 3, 2, 4, 2, 0, 15, 1, 83, 17, 10, 9, 5, 0, 82, 19, 13, 9, 214, 6, 3, 8, 28, 1, 83, 16, 16, 9, 82, 12, 9, 9, 7, 19, 58, 14, 5, 9, 243, 14, 166, 9, 71, 5, 2, 1, 3, 3, 2, 0, 2, 1, 13, 9, 120, 6, 3, 6, 4, 0, 29, 9, 41, 6, 2, 3, 9, 0, 10, 10, 47, 15, 199, 7, 137, 9, 54, 7, 2, 7, 17, 9, 57, 21, 2, 13, 123, 5, 4, 0, 2, 1, 2, 6, 2, 0, 9, 9, 49, 4, 2, 1, 2, 4, 9, 9, 55, 9, 266, 3, 10, 1, 2, 0, 49, 6, 4, 4, 14, 10, 5350, 0, 7, 14, 11465, 27, 2343, 9, 87, 9, 39, 4, 60, 6, 26, 9, 535, 9, 470, 0, 2, 54, 8, 3, 82, 0, 12, 1, 19628, 1, 4178, 9, 519, 45, 3, 22, 543, 4, 4, 5, 9, 7, 3, 6, 31, 3, 149, 2, 1418, 49, 513, 54, 5, 49, 9, 0, 15, 0, 23, 4, 2, 14, 1361, 6, 2, 16, 3, 6, 2, 1, 2, 4, 101, 0, 161, 6, 10, 9, 357, 0, 62, 13, 499, 13, 245, 1, 2, 9, 233, 0, 3, 0, 8, 1, 6, 0, 475, 6, 110, 6, 6, 9, 4759, 9, 787719, 239];
@@ -34311,10 +34427,10 @@ var LINEAR_ENTITY_DEFS = {
34311
34427
  }
34312
34428
  };
34313
34429
 
34314
- // ../seedgen/dist/chunk-XI7HKUUF.js
34430
+ // ../seedgen/dist/chunk-CIYCQV32.js
34315
34431
  var import_fs = require("fs");
34316
34432
  var import_url = require("url");
34317
- var import_path2 = __toESM(require("path"), 1);
34433
+ var import_path3 = __toESM(require("path"), 1);
34318
34434
  var ENV_TOKEN_FALLBACK_TTL_SECONDS2 = 24 * 60 * 60;
34319
34435
  var GENERATED_TWIN_CATALOG2 = [
34320
34436
  {
@@ -34322,8 +34438,9 @@ var GENERATED_TWIN_CATALOG2 = [
34322
34438
  icon: "AP",
34323
34439
  name: "Apify",
34324
34440
  description: "Actors, runs, datasets, key-value stores, and request queues.",
34325
- toolCount: 45,
34326
- transport: "rest"
34441
+ toolCount: 43,
34442
+ transport: "rest",
34443
+ opsCoverage: null
34327
34444
  },
34328
34445
  {
34329
34446
  id: "discord",
@@ -34331,7 +34448,17 @@ var GENERATED_TWIN_CATALOG2 = [
34331
34448
  name: "Discord",
34332
34449
  description: "Guilds, channels, messages, webhooks, threads, commands, and interaction responses.",
34333
34450
  toolCount: 67,
34334
- transport: "both"
34451
+ transport: "both",
34452
+ opsCoverage: 14
34453
+ },
34454
+ {
34455
+ id: "firecrawl",
34456
+ icon: "FC",
34457
+ name: "Firecrawl",
34458
+ description: "Scraping, crawling, mapping, search, and extraction.",
34459
+ toolCount: 6,
34460
+ transport: "rest",
34461
+ opsCoverage: 77
34335
34462
  },
34336
34463
  {
34337
34464
  id: "github",
@@ -34339,7 +34466,8 @@ var GENERATED_TWIN_CATALOG2 = [
34339
34466
  name: "GitHub",
34340
34467
  description: "Repos, issues, pull requests, branches, and commits.",
34341
34468
  toolCount: 26,
34342
- transport: "both"
34469
+ transport: "both",
34470
+ opsCoverage: 96
34343
34471
  },
34344
34472
  {
34345
34473
  id: "google-workspace",
@@ -34347,7 +34475,17 @@ var GENERATED_TWIN_CATALOG2 = [
34347
34475
  name: "Google Workspace",
34348
34476
  description: "Gmail, Calendar, Drive, Sheets, and Contacts.",
34349
34477
  toolCount: 249,
34350
- transport: "both"
34478
+ transport: "both",
34479
+ opsCoverage: 64
34480
+ },
34481
+ {
34482
+ id: "hubspot",
34483
+ icon: "HS",
34484
+ name: "HubSpot",
34485
+ description: "CRM contacts, companies, deals, tickets, and engagements.",
34486
+ toolCount: 45,
34487
+ transport: "rest",
34488
+ opsCoverage: 10
34351
34489
  },
34352
34490
  {
34353
34491
  id: "jira",
@@ -34355,7 +34493,8 @@ var GENERATED_TWIN_CATALOG2 = [
34355
34493
  name: "Jira",
34356
34494
  description: "Issues, projects, boards, sprints, and versions.",
34357
34495
  toolCount: 49,
34358
- transport: "both"
34496
+ transport: "both",
34497
+ opsCoverage: 80
34359
34498
  },
34360
34499
  {
34361
34500
  id: "linear",
@@ -34363,7 +34502,8 @@ var GENERATED_TWIN_CATALOG2 = [
34363
34502
  name: "Linear",
34364
34503
  description: "Issues, projects, teams, cycles, and workflows.",
34365
34504
  toolCount: 42,
34366
- transport: "both"
34505
+ transport: "both",
34506
+ opsCoverage: 98
34367
34507
  },
34368
34508
  {
34369
34509
  id: "ramp",
@@ -34371,7 +34511,17 @@ var GENERATED_TWIN_CATALOG2 = [
34371
34511
  name: "Ramp",
34372
34512
  description: "Cards, funds, expenses, reimbursements, bills, and travel.",
34373
34513
  toolCount: 46,
34374
- transport: "mcp"
34514
+ transport: "mcp",
34515
+ opsCoverage: null
34516
+ },
34517
+ {
34518
+ id: "sendgrid",
34519
+ icon: "SG",
34520
+ name: "SendGrid",
34521
+ description: "Mail send, contacts, lists, templates, and stats.",
34522
+ toolCount: 28,
34523
+ transport: "rest",
34524
+ opsCoverage: 100
34375
34525
  },
34376
34526
  {
34377
34527
  id: "slack",
@@ -34379,7 +34529,8 @@ var GENERATED_TWIN_CATALOG2 = [
34379
34529
  name: "Slack",
34380
34530
  description: "Channels, messages, threads, users, and reactions.",
34381
34531
  toolCount: 8,
34382
- transport: "both"
34532
+ transport: "both",
34533
+ opsCoverage: 100
34383
34534
  },
34384
34535
  {
34385
34536
  id: "stripe",
@@ -34387,7 +34538,8 @@ var GENERATED_TWIN_CATALOG2 = [
34387
34538
  name: "Stripe",
34388
34539
  description: "Customers, payments, subscriptions, invoices, and refunds.",
34389
34540
  toolCount: 28,
34390
- transport: "both"
34541
+ transport: "both",
34542
+ opsCoverage: null
34391
34543
  },
34392
34544
  {
34393
34545
  id: "supabase",
@@ -34395,7 +34547,8 @@ var GENERATED_TWIN_CATALOG2 = [
34395
34547
  name: "Supabase",
34396
34548
  description: "SQL, migrations, logs, branches, and project metadata.",
34397
34549
  toolCount: 29,
34398
- transport: "both"
34550
+ transport: "both",
34551
+ opsCoverage: 100
34399
34552
  },
34400
34553
  {
34401
34554
  id: "tavily",
@@ -34403,7 +34556,35 @@ var GENERATED_TWIN_CATALOG2 = [
34403
34556
  name: "Tavily",
34404
34557
  description: "Search, extract, crawl, map, research, usage, and API key operations.",
34405
34558
  toolCount: 11,
34406
- transport: "rest"
34559
+ transport: "rest",
34560
+ opsCoverage: 100
34561
+ },
34562
+ {
34563
+ id: "telegram",
34564
+ icon: "TG",
34565
+ name: "Telegram",
34566
+ description: "Bot messages, chats, updates, and webhooks.",
34567
+ toolCount: 32,
34568
+ transport: "both",
34569
+ opsCoverage: null
34570
+ },
34571
+ {
34572
+ id: "twilio",
34573
+ icon: "TW",
34574
+ name: "Twilio",
34575
+ description: "Messages, calls, phone numbers, and verifications.",
34576
+ toolCount: 35,
34577
+ transport: "rest",
34578
+ opsCoverage: 92
34579
+ },
34580
+ {
34581
+ id: "unipile",
34582
+ icon: "UP",
34583
+ name: "Unipile",
34584
+ description: "LinkedIn and email messaging, accounts, and chats.",
34585
+ toolCount: 24,
34586
+ transport: "rest",
34587
+ opsCoverage: 100
34407
34588
  }
34408
34589
  ];
34409
34590
  var GENERATED_STARTABLE_TWIN_IDS2 = [
@@ -34548,13 +34729,13 @@ var LLM_PRICING_FAMILY_RATES2 = [
34548
34729
  { match: /^deepseek-v4-flash/i, rate: LLM_PRICING_USD_PER_M_TOKENS2["deepseek-v4-flash"] }
34549
34730
  ];
34550
34731
  function resolveWorkerScriptPath() {
34551
- const thisDir = import_path2.default.dirname((0, import_url.fileURLToPath)(__archal_import_meta_url));
34732
+ const thisDir = import_path3.default.dirname((0, import_url.fileURLToPath)(__archal_import_meta_url));
34552
34733
  const candidates = [
34553
34734
  // Source or unbundled output: executor.js and subprocess-worker.js live together.
34554
- import_path2.default.join(thisDir, "subprocess-worker.js"),
34735
+ import_path3.default.join(thisDir, "subprocess-worker.js"),
34555
34736
  // tsup bundles executor into a root chunk while keeping the worker entry
34556
34737
  // at dist/codegen/subprocess-worker.js.
34557
- import_path2.default.join(thisDir, "codegen", "subprocess-worker.js")
34738
+ import_path3.default.join(thisDir, "codegen", "subprocess-worker.js")
34558
34739
  ];
34559
34740
  return candidates.find((candidate) => (0, import_fs.existsSync)(candidate));
34560
34741
  }
@@ -34656,7 +34837,7 @@ var NO_COLOR = "NO_COLOR" in process.env || process.env["TERM"] === "dumb";
34656
34837
  var import_async_hooks2 = require("async_hooks");
34657
34838
  var runSessionContext = new import_async_hooks2.AsyncLocalStorage();
34658
34839
 
34659
- // ../seedgen/dist/chunk-P6IA2T7T.js
34840
+ // ../seedgen/dist/chunk-JD4OJDYX.js
34660
34841
  var MANAGED_SEED_BACKEND_INITIAL_COOLDOWN_MS = 30 * 1e3;
34661
34842
  var MANAGED_SEED_BACKEND_MAX_COOLDOWN_MS = 5 * 60 * 1e3;
34662
34843
 
@@ -35043,13 +35224,13 @@ ALTER TABLE users ENABLE ROW LEVEL SECURITY;
35043
35224
  CREATE POLICY "users_select" ON users FOR SELECT USING (true);
35044
35225
  CREATE POLICY "users_update_own" ON users FOR UPDATE USING (id = current_setting('app.user_id', true)::int);`;
35045
35226
 
35046
- // ../seedgen/dist/chunk-HL4OTBZD.js
35047
- var import_path3 = require("path");
35048
- var import_os2 = require("os");
35049
- var CACHE_DIR = (0, import_path3.join)((0, import_os2.homedir)(), ".archal", "seed-cache");
35227
+ // ../seedgen/dist/chunk-KEUOYX5N.js
35228
+ var import_path4 = require("path");
35229
+ var import_os3 = require("os");
35230
+ var CACHE_DIR = (0, import_path4.join)((0, import_os3.homedir)(), ".archal", "seed-cache");
35050
35231
  var MAX_AGE_MS = 7 * 24 * 60 * 60 * 1e3;
35051
35232
 
35052
- // ../seedgen/dist/chunk-A25DCP64.js
35233
+ // ../seedgen/dist/chunk-KAB6MOBH.js
35053
35234
  var import_crypto2 = require("crypto");
35054
35235
  function buildSeedPromptHashInput() {
35055
35236
  return [