@chainpatrol/sdk 1.10.0 → 1.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import { __spreadValues, __export, __spreadProps, __async, __objRest, __pow } from './chunk-4U7ZT42S.mjs';
1
+ import { __spreadValues, __export, __async, __spreadProps, __objRest, __pow } from './chunk-4U7ZT42S.mjs';
2
2
  import { getDomain, getSubdomain, parse as parse$1 } from 'tldts';
3
3
  import { z } from 'zod';
4
4
 
@@ -1216,17 +1216,17 @@ var PolyDateFormatter = class {
1216
1216
  constructor(dt, intl, opts) {
1217
1217
  this.opts = opts;
1218
1218
  this.originalZone = void 0;
1219
- let z61 = void 0;
1219
+ let z64 = void 0;
1220
1220
  if (this.opts.timeZone) {
1221
1221
  this.dt = dt;
1222
1222
  } else if (dt.zone.type === "fixed") {
1223
1223
  const gmtOffset = -1 * (dt.offset / 60);
1224
1224
  const offsetZ = gmtOffset >= 0 ? `Etc/GMT+${gmtOffset}` : `Etc/GMT${gmtOffset}`;
1225
1225
  if (dt.offset !== 0 && IANAZone.create(offsetZ).valid) {
1226
- z61 = offsetZ;
1226
+ z64 = offsetZ;
1227
1227
  this.dt = dt;
1228
1228
  } else {
1229
- z61 = "UTC";
1229
+ z64 = "UTC";
1230
1230
  this.dt = dt.offset === 0 ? dt : dt.setZone("UTC").plus({ minutes: dt.offset });
1231
1231
  this.originalZone = dt.zone;
1232
1232
  }
@@ -1234,14 +1234,14 @@ var PolyDateFormatter = class {
1234
1234
  this.dt = dt;
1235
1235
  } else if (dt.zone.type === "iana") {
1236
1236
  this.dt = dt;
1237
- z61 = dt.zone.name;
1237
+ z64 = dt.zone.name;
1238
1238
  } else {
1239
- z61 = "UTC";
1239
+ z64 = "UTC";
1240
1240
  this.dt = dt.setZone("UTC").plus({ minutes: dt.offset });
1241
1241
  this.originalZone = dt.zone;
1242
1242
  }
1243
1243
  const intlOpts = __spreadValues({}, this.opts);
1244
- intlOpts.timeZone = intlOpts.timeZone || z61;
1244
+ intlOpts.timeZone = intlOpts.timeZone || z64;
1245
1245
  this.dtf = getCachedDTF(intl, intlOpts);
1246
1246
  }
1247
1247
  format() {
@@ -6975,6 +6975,22 @@ z.object({
6975
6975
  z.object({
6976
6976
  noteId: z.number().int().positive()
6977
6977
  });
6978
+ var ASSET_TAGS = {
6979
+ ENFORCEMENT_EXHAUSTED: {
6980
+ label: "Enforcement Exhausted",
6981
+ description: "All available enforcement options have been pursued with the relevant providers. The asset remains active due to provider inaction.",
6982
+ colorScheme: "orange"
6983
+ }
6984
+ };
6985
+ var ASSET_TAG_KEYS = Object.keys(ASSET_TAGS);
6986
+ var assetTagKeySchema = z.enum(ASSET_TAG_KEYS);
6987
+ z.object({
6988
+ assetId: z.number().int().positive()
6989
+ });
6990
+ z.object({
6991
+ assetId: z.number().int().positive(),
6992
+ tag: assetTagKeySchema
6993
+ });
6978
6994
  z.object({
6979
6995
  slug: z.string(),
6980
6996
  assetId: z.number(),
@@ -7134,7 +7150,9 @@ var AssetType = {
7134
7150
  FIVE_HUNDRED_PX: "FIVE_HUNDRED_PX",
7135
7151
  LUMA: "LUMA",
7136
7152
  SMARTMONEYMATCH: "SMARTMONEYMATCH",
7137
- APK_GOLD: "APK_GOLD"
7153
+ APK_GOLD: "APK_GOLD",
7154
+ GLASSDOOR: "GLASSDOOR",
7155
+ PUMP_FUN: "PUMP_FUN"
7138
7156
  };
7139
7157
  var LivenessStatus = {
7140
7158
  UNKNOWN: "UNKNOWN",
@@ -7295,8 +7313,23 @@ z.object({
7295
7313
  watchStatus: z.nativeEnum(WatchStatus).optional().describe("The watch status of the asset.")
7296
7314
  }).describe("Check asset response body");
7297
7315
  var assetListInputSchema = z.object({
7298
- /** The type of asset to retrieve. */
7299
- type: z.nativeEnum(AssetType).describe("Asset type"),
7316
+ /**
7317
+ * The type of asset to retrieve. Omitting the key means every asset type,
7318
+ * which lets a bulk consumer sweep the whole blocklist with one cursor
7319
+ * instead of looping all 94 members of `AssetType`.
7320
+ *
7321
+ * An explicit `null` is rejected with a 400 rather than treated as "all
7322
+ * types". Only omission opts into the full sweep, so a client that sends
7323
+ * `type: null` from an uninitialised variable gets a clear error instead of
7324
+ * silently pulling every blocked asset.
7325
+ *
7326
+ * Not `.nullable()`: besides accepting that null, it renders in the
7327
+ * generated MCP tool manifest as a nested `anyOf` containing `{"not": {}}`,
7328
+ * which buries the enum hint telling a model which values are legal.
7329
+ */
7330
+ type: z.nativeEnum(AssetType).optional().describe(
7331
+ "Asset type to retrieve. Omit the field entirely to retrieve assets of every type in a single paginated sweep; an explicit null is rejected."
7332
+ ),
7300
7333
  /** Optional status filter for the assets; defaults to `BLOCKED`. */
7301
7334
  status: z.nativeEnum(AssetStatus).optional().default(AssetStatus.BLOCKED).describe("Status of the assets to retrieve"),
7302
7335
  /**
@@ -7324,7 +7357,8 @@ var assetListInputSchema = z.object({
7324
7357
  }).describe(
7325
7358
  `List asset request body
7326
7359
 
7327
- Defaults to getting all the updates in the last 1 day.
7360
+ With no \`startDate\`, this returns every matching asset regardless of age \u2014 there
7361
+ is no implicit one-day window. Pass \`startDate\` to get a delta instead.
7328
7362
 
7329
7363
  You can also choose a \`startDate\` and \`endDate\` for the range of asset updates, most
7330
7364
  timestamp formats should work, we use [Luxon](https://moment.github.io/luxon/#/parsing)
@@ -7433,6 +7467,8 @@ var ThreatDetectionSourceKey = /* @__PURE__ */ ((ThreatDetectionSourceKey2) => {
7433
7467
  ThreatDetectionSourceKey2["TELEGRAM_CHANNELS_SEARCH_VETRIC"] = "telegram_channels_search_vetric";
7434
7468
  ThreatDetectionSourceKey2["TELEGRAM_USER_SEARCH_VETRIC"] = "telegram_user_search_vetric";
7435
7469
  ThreatDetectionSourceKey2["FACEBOOK_PAGE_SEARCH_VETRIC"] = "facebook_page_search_vetric";
7470
+ ThreatDetectionSourceKey2["FACEBOOK_USER_SEARCH_VETRIC"] = "facebook_user_search_vetric";
7471
+ ThreatDetectionSourceKey2["FACEBOOK_POST_SEARCH_VETRIC"] = "facebook_post_search_vetric";
7436
7472
  ThreatDetectionSourceKey2["INSTAGRAM_ACCOUNT_SEARCH_VETRIC"] = "instagram_account_search_vetric";
7437
7473
  ThreatDetectionSourceKey2["TWITTER_SEARCH_VETRIC"] = "twitter_search_vetric";
7438
7474
  ThreatDetectionSourceKey2["LINKEDIN_PEOPLE_SEARCH_VETRIC"] = "linkedin_people_search_vetric";
@@ -7472,14 +7508,17 @@ var ThreatDetectionSourceKey = /* @__PURE__ */ ((ThreatDetectionSourceKey2) => {
7472
7508
  ThreatDetectionSourceKey2["GROK_USER_SEARCH"] = "grok_user_search";
7473
7509
  ThreatDetectionSourceKey2["GOOGLE_LENS_IMAGE_SEARCH"] = "google_lens_image_search";
7474
7510
  ThreatDetectionSourceKey2["YANDEX_SEARCH"] = "yandex_search";
7511
+ ThreatDetectionSourceKey2["YANDEX_IMAGE_SEARCH"] = "yandex_image_search";
7475
7512
  ThreatDetectionSourceKey2["LINKEDIN_EMPLOYEE_DETECTION"] = "linkedin_employee_detection";
7476
7513
  ThreatDetectionSourceKey2["LINKEDIN_POST_SEARCH"] = "linkedin_post_search";
7477
7514
  ThreatDetectionSourceKey2["LINKEDIN_COMPANY_SEARCH"] = "linkedin_company_search";
7478
7515
  ThreatDetectionSourceKey2["BING_ADS_SEARCH"] = "bing_ads_search";
7479
7516
  ThreatDetectionSourceKey2["TIK_TOK_ADS_SEARCH"] = "tik_tok_ads_search";
7517
+ ThreatDetectionSourceKey2["ADLIBRARY_ADS_SEARCH"] = "adlibrary_ads_search";
7480
7518
  ThreatDetectionSourceKey2["DNSDB"] = "dnsdb";
7481
7519
  ThreatDetectionSourceKey2["DAILY_MOTION_SEARCH"] = "daily_motion_search";
7482
7520
  ThreatDetectionSourceKey2["WATCHLIST"] = "watchlist";
7521
+ ThreatDetectionSourceKey2["GITHUB_SEARCH"] = "github_search";
7483
7522
  return ThreatDetectionSourceKey2;
7484
7523
  })(ThreatDetectionSourceKey || {});
7485
7524
  var ThreatDetectionScope = /* @__PURE__ */ ((ThreatDetectionScope2) => {
@@ -7505,6 +7544,7 @@ var AssetScanEnrichmentType = /* @__PURE__ */ ((AssetScanEnrichmentType2) => {
7505
7544
  AssetScanEnrichmentType2["DNS"] = "dns";
7506
7545
  AssetScanEnrichmentType2["TLS"] = "tls";
7507
7546
  AssetScanEnrichmentType2["TCP"] = "tcp";
7547
+ AssetScanEnrichmentType2["HOSTNAME_FIRST_SEEN"] = "hostname_first_seen";
7508
7548
  AssetScanEnrichmentType2["TWITTER_POST"] = "post";
7509
7549
  AssetScanEnrichmentType2["TWITTER_PROFILE"] = "profile";
7510
7550
  AssetScanEnrichmentType2["TWITTER_FOLLOWERS"] = "twitter_followers";
@@ -7530,12 +7570,17 @@ var AssetScanEnrichmentType = /* @__PURE__ */ ((AssetScanEnrichmentType2) => {
7530
7570
  AssetScanEnrichmentType2["VIMEO_PROFILE"] = "vimeo_profile";
7531
7571
  AssetScanEnrichmentType2["STACKBLITZ_PAGE"] = "stackblitz_page";
7532
7572
  AssetScanEnrichmentType2["LEETCODE_PAGE"] = "leetcode_page";
7573
+ AssetScanEnrichmentType2["TUMBLR_BLOG"] = "tumblr_blog";
7574
+ AssetScanEnrichmentType2["TUMBLR_POST"] = "tumblr_post";
7575
+ AssetScanEnrichmentType2["TUMBLR_COMMUNITY"] = "tumblr_community";
7533
7576
  AssetScanEnrichmentType2["NPM_PACKAGE"] = "npm_package";
7534
7577
  AssetScanEnrichmentType2["PYPI_PACKAGE"] = "pypi_package";
7535
7578
  AssetScanEnrichmentType2["RUST_PACKAGE"] = "rust_package";
7536
7579
  AssetScanEnrichmentType2["LINKEDIN_PROFILE"] = "linkedin_profile";
7580
+ AssetScanEnrichmentType2["PUMP_FUN_TOKEN"] = "pump_fun_token";
7537
7581
  AssetScanEnrichmentType2["META_AD"] = "meta_ad";
7538
7582
  AssetScanEnrichmentType2["GOOGLE_AD"] = "google_ad";
7583
+ AssetScanEnrichmentType2["ADLIBRARY_AD"] = "adlibrary_ad";
7539
7584
  AssetScanEnrichmentType2["CONTRACT_DEPLOYER"] = "contract_deployer";
7540
7585
  return AssetScanEnrichmentType2;
7541
7586
  })(AssetScanEnrichmentType || {});
@@ -7547,6 +7592,8 @@ var AssetScanEnrichmentSource = /* @__PURE__ */ ((AssetScanEnrichmentSource2) =>
7547
7592
  AssetScanEnrichmentSource2["NETWORK"] = "node_js_network";
7548
7593
  AssetScanEnrichmentSource2["EXTENSION"] = "extension";
7549
7594
  AssetScanEnrichmentSource2["PLAYWRIGHT"] = "playwright";
7595
+ AssetScanEnrichmentSource2["CHAINPATROL_BROWSER"] = "chainpatrol_browser";
7596
+ AssetScanEnrichmentSource2["STEEL_BROWSER"] = "steel_browser";
7550
7597
  AssetScanEnrichmentSource2["X_API"] = "x_api";
7551
7598
  AssetScanEnrichmentSource2["SOCIALDATA_API"] = "socialdata_api";
7552
7599
  AssetScanEnrichmentSource2["NEYNAR_API"] = "neynar_api";
@@ -7565,12 +7612,16 @@ var AssetScanEnrichmentSource = /* @__PURE__ */ ((AssetScanEnrichmentSource2) =>
7565
7612
  AssetScanEnrichmentSource2["VIMEO_API"] = "vimeo_api";
7566
7613
  AssetScanEnrichmentSource2["STACKBLITZ_API"] = "stackblitz_api";
7567
7614
  AssetScanEnrichmentSource2["LEETCODE_API"] = "leetcode_api";
7615
+ AssetScanEnrichmentSource2["TUMBLR_API"] = "tumblr_api";
7568
7616
  AssetScanEnrichmentSource2["NPM_REGISTRY_API"] = "npm_registry_api";
7569
7617
  AssetScanEnrichmentSource2["PYPI_REGISTRY_API"] = "pypi_registry_api";
7570
7618
  AssetScanEnrichmentSource2["CRATES_IO_API"] = "crates_io_api";
7571
7619
  AssetScanEnrichmentSource2["APIFY_LINKEDIN_API"] = "apify_linkedin_api";
7620
+ AssetScanEnrichmentSource2["PUMP_FUN_API"] = "pump_fun_api";
7572
7621
  AssetScanEnrichmentSource2["META_ADS_LIBRARY"] = "meta_ads_library";
7622
+ AssetScanEnrichmentSource2["STEEL_META_ADS_LIBRARY"] = "steel_meta_ads_library";
7573
7623
  AssetScanEnrichmentSource2["GOOGLE_ADS_TRANSPARENCY_CENTER"] = "google_ads_transparency_center";
7624
+ AssetScanEnrichmentSource2["ADLIBRARY"] = "adlibrary";
7574
7625
  AssetScanEnrichmentSource2["ETHERSCAN_API"] = "etherscan_api";
7575
7626
  return AssetScanEnrichmentSource2;
7576
7627
  })(AssetScanEnrichmentSource || {});
@@ -7585,6 +7636,7 @@ var ASSET_SCAN_ENRICHMENT_TYPE_LABELS = {
7585
7636
  ["dns" /* DNS */]: "DNS Lookup",
7586
7637
  ["tls" /* TLS */]: "TLS Connection Info",
7587
7638
  ["tcp" /* TCP */]: "TCP Connection Info",
7639
+ ["hostname_first_seen" /* HOSTNAME_FIRST_SEEN */]: "Hostname First Seen",
7588
7640
  // Farcaster
7589
7641
  ["cast" /* FARCASTER_CAST */]: "Farcaster Cast",
7590
7642
  ["farcaster_profile" /* FARCASTER_PROFILE */]: "Farcaster Profile",
@@ -7623,6 +7675,10 @@ var ASSET_SCAN_ENRICHMENT_TYPE_LABELS = {
7623
7675
  ["stackblitz_page" /* STACKBLITZ_PAGE */]: "Stackblitz Page",
7624
7676
  // Leetcode
7625
7677
  ["leetcode_page" /* LEETCODE_PAGE */]: "Leetcode Page",
7678
+ // Tumblr
7679
+ ["tumblr_blog" /* TUMBLR_BLOG */]: "Tumblr Blog",
7680
+ ["tumblr_post" /* TUMBLR_POST */]: "Tumblr Post",
7681
+ ["tumblr_community" /* TUMBLR_COMMUNITY */]: "Tumblr Community",
7626
7682
  // NPM
7627
7683
  ["npm_package" /* NPM_PACKAGE */]: "NPM Package",
7628
7684
  // PyPI
@@ -7631,10 +7687,14 @@ var ASSET_SCAN_ENRICHMENT_TYPE_LABELS = {
7631
7687
  ["rust_package" /* RUST_PACKAGE */]: "Rust Package",
7632
7688
  // LinkedIn
7633
7689
  ["linkedin_profile" /* LINKEDIN_PROFILE */]: "LinkedIn Profile",
7690
+ // Pump.fun
7691
+ ["pump_fun_token" /* PUMP_FUN_TOKEN */]: "Pump.fun Token",
7634
7692
  // Meta Ads
7635
7693
  ["meta_ad" /* META_AD */]: "Meta Ad",
7636
7694
  // Google Ads
7637
7695
  ["google_ad" /* GOOGLE_AD */]: "Google Ad",
7696
+ // Cross-platform ad intelligence
7697
+ ["adlibrary_ad" /* ADLIBRARY_AD */]: "AdLibrary Ad",
7638
7698
  // Crypto / Onchain
7639
7699
  ["contract_deployer" /* CONTRACT_DEPLOYER */]: "Contract Deployer"
7640
7700
  };
@@ -7647,6 +7707,8 @@ var ASSET_SCAN_ENRICHMENT_SOURCE_LABELS = {
7647
7707
  ["node_js_network" /* NETWORK */]: "Network",
7648
7708
  ["extension" /* EXTENSION */]: "Browser Extension",
7649
7709
  ["playwright" /* PLAYWRIGHT */]: "Playwright",
7710
+ ["chainpatrol_browser" /* CHAINPATROL_BROWSER */]: "ChainPatrol Browser",
7711
+ ["steel_browser" /* STEEL_BROWSER */]: "Steel Browser",
7650
7712
  // Twitter
7651
7713
  ["x_api" /* X_API */]: "X API",
7652
7714
  ["socialdata_api" /* SOCIALDATA_API */]: "SocialData API",
@@ -7681,6 +7743,8 @@ var ASSET_SCAN_ENRICHMENT_SOURCE_LABELS = {
7681
7743
  ["stackblitz_api" /* STACKBLITZ_API */]: "Stackblitz API",
7682
7744
  // Leetcode
7683
7745
  ["leetcode_api" /* LEETCODE_API */]: "Leetcode API",
7746
+ // Tumblr
7747
+ ["tumblr_api" /* TUMBLR_API */]: "Tumblr API",
7684
7748
  // NPM
7685
7749
  ["npm_registry_api" /* NPM_REGISTRY_API */]: "NPM Registry API",
7686
7750
  // PyPI
@@ -7689,10 +7753,15 @@ var ASSET_SCAN_ENRICHMENT_SOURCE_LABELS = {
7689
7753
  ["crates_io_api" /* CRATES_IO_API */]: "Crates.io API",
7690
7754
  // LinkedIn
7691
7755
  ["apify_linkedin_api" /* APIFY_LINKEDIN_API */]: "Apify LinkedIn API",
7756
+ // Pump.fun
7757
+ ["pump_fun_api" /* PUMP_FUN_API */]: "Pump.fun API",
7692
7758
  // Meta Ads
7693
7759
  ["meta_ads_library" /* META_ADS_LIBRARY */]: "Meta Ads Library",
7760
+ ["steel_meta_ads_library" /* STEEL_META_ADS_LIBRARY */]: "Steel Meta Ads Library",
7694
7761
  // Google Ads
7695
7762
  ["google_ads_transparency_center" /* GOOGLE_ADS_TRANSPARENCY_CENTER */]: "Google Ads Transparency Center",
7763
+ // Cross-platform ad intelligence
7764
+ ["adlibrary" /* ADLIBRARY */]: "AdLibrary",
7696
7765
  // Crypto / Onchain
7697
7766
  ["etherscan_api" /* ETHERSCAN_API */]: "Etherscan"
7698
7767
  };
@@ -7700,7 +7769,8 @@ var ASSET_SCAN_ENRICHMENT_SOURCE_TO_TYPES = {
7700
7769
  // URL-related sources
7701
7770
  ["urlscan" /* URLSCAN */]: [
7702
7771
  "browser_capture" /* BROWSER_CAPTURE */,
7703
- "geolocation_and_ip" /* GEOLOCATION_AND_IP */
7772
+ "geolocation_and_ip" /* GEOLOCATION_AND_IP */,
7773
+ "hostname_first_seen" /* HOSTNAME_FIRST_SEEN */
7704
7774
  ],
7705
7775
  ["whois" /* WHOIS */]: ["ownership_and_registration" /* OWNERSHIP_AND_REGISTRATION */],
7706
7776
  ["rdap" /* RDAP */]: ["ownership_and_registration" /* OWNERSHIP_AND_REGISTRATION */],
@@ -7725,6 +7795,12 @@ var ASSET_SCAN_ENRICHMENT_SOURCE_TO_TYPES = {
7725
7795
  "bilibili_profile" /* BILIBILI_PROFILE */,
7726
7796
  "telegram_profile" /* TELEGRAM_PROFILE */
7727
7797
  ],
7798
+ // Only the generic page capture: the in-house browser does not (yet) run the
7799
+ // platform-specific scrapes PLAYWRIGHT does above.
7800
+ ["chainpatrol_browser" /* CHAINPATROL_BROWSER */]: [
7801
+ "browser_capture" /* BROWSER_CAPTURE */
7802
+ ],
7803
+ ["steel_browser" /* STEEL_BROWSER */]: ["browser_capture" /* BROWSER_CAPTURE */],
7728
7804
  // Twitter-related sources
7729
7805
  ["x_api" /* X_API */]: [
7730
7806
  "post" /* TWITTER_POST */,
@@ -7784,6 +7860,12 @@ var ASSET_SCAN_ENRICHMENT_SOURCE_TO_TYPES = {
7784
7860
  ["stackblitz_api" /* STACKBLITZ_API */]: ["stackblitz_page" /* STACKBLITZ_PAGE */],
7785
7861
  // Leetcode-related sources
7786
7862
  ["leetcode_api" /* LEETCODE_API */]: ["leetcode_page" /* LEETCODE_PAGE */],
7863
+ // Tumblr-related sources
7864
+ ["tumblr_api" /* TUMBLR_API */]: [
7865
+ "tumblr_blog" /* TUMBLR_BLOG */,
7866
+ "tumblr_post" /* TUMBLR_POST */,
7867
+ "tumblr_community" /* TUMBLR_COMMUNITY */
7868
+ ],
7787
7869
  // NPM-related sources
7788
7870
  ["npm_registry_api" /* NPM_REGISTRY_API */]: ["npm_package" /* NPM_PACKAGE */],
7789
7871
  // PyPI-related sources
@@ -7794,12 +7876,17 @@ var ASSET_SCAN_ENRICHMENT_SOURCE_TO_TYPES = {
7794
7876
  ["apify_linkedin_api" /* APIFY_LINKEDIN_API */]: [
7795
7877
  "linkedin_profile" /* LINKEDIN_PROFILE */
7796
7878
  ],
7879
+ // Pump.fun
7880
+ ["pump_fun_api" /* PUMP_FUN_API */]: ["pump_fun_token" /* PUMP_FUN_TOKEN */],
7797
7881
  // Meta Ads-related sources
7798
7882
  ["meta_ads_library" /* META_ADS_LIBRARY */]: ["meta_ad" /* META_AD */],
7883
+ ["steel_meta_ads_library" /* STEEL_META_ADS_LIBRARY */]: ["meta_ad" /* META_AD */],
7799
7884
  // Google Ads-related sources
7800
7885
  ["google_ads_transparency_center" /* GOOGLE_ADS_TRANSPARENCY_CENTER */]: [
7801
7886
  "google_ad" /* GOOGLE_AD */
7802
7887
  ],
7888
+ // Cross-platform ad intelligence sources
7889
+ ["adlibrary" /* ADLIBRARY */]: ["adlibrary_ad" /* ADLIBRARY_AD */],
7803
7890
  // Crypto / Onchain sources
7804
7891
  ["etherscan_api" /* ETHERSCAN_API */]: ["contract_deployer" /* CONTRACT_DEPLOYER */]
7805
7892
  };
@@ -8000,6 +8087,7 @@ function isDefinedAndNotNull(value) {
8000
8087
  // ../../internal/utils/src/promise.ts
8001
8088
  var promise_exports = {};
8002
8089
  __export(promise_exports, {
8090
+ allSettledWithConcurrency: () => allSettledWithConcurrency,
8003
8091
  isPromiseSettledResultFulfilled: () => isPromiseSettledResultFulfilled,
8004
8092
  isPromiseSettledResultRejected: () => isPromiseSettledResultRejected
8005
8093
  });
@@ -8009,6 +8097,27 @@ function isPromiseSettledResultFulfilled(result) {
8009
8097
  function isPromiseSettledResultRejected(result) {
8010
8098
  return result.status === "rejected";
8011
8099
  }
8100
+ function allSettledWithConcurrency(items, limit, fn5) {
8101
+ return __async(this, null, function* () {
8102
+ const results = new Array(items.length);
8103
+ let next = 0;
8104
+ const worker = () => __async(null, null, function* () {
8105
+ for (; ; ) {
8106
+ const index = next;
8107
+ next += 1;
8108
+ if (index >= items.length) return;
8109
+ try {
8110
+ results[index] = { status: "fulfilled", value: yield fn5(items[index], index) };
8111
+ } catch (reason) {
8112
+ results[index] = { status: "rejected", reason };
8113
+ }
8114
+ }
8115
+ });
8116
+ const workers = Math.max(1, Math.min(Math.floor(limit) || 1, items.length));
8117
+ yield Promise.all(Array.from({ length: workers }, worker));
8118
+ return results;
8119
+ });
8120
+ }
8012
8121
 
8013
8122
  // ../../internal/utils/src/url.ts
8014
8123
  var url_exports = {};
@@ -10763,6 +10872,7 @@ function buildSafePreviewUrl({
10763
10872
  var parse_exports = {};
10764
10873
  __export(parse_exports, {
10765
10874
  parseTerms: () => parseTerms,
10875
+ repairTermsString: () => repairTermsString,
10766
10876
  stringifyTerms: () => stringifyTerms
10767
10877
  });
10768
10878
  function parseTerms(terms, {
@@ -10789,6 +10899,31 @@ function parseTerms(terms, {
10789
10899
  function stringifyTerms(parsedTerms) {
10790
10900
  return parsedTerms.map((term) => term.type === "exact" ? `*${term.value}*` : term.value).join(", ");
10791
10901
  }
10902
+ function repairTermsString(terms) {
10903
+ if (!terms) return terms;
10904
+ const entries = terms.split(",").map((entry) => entry.trim()).filter((entry) => entry.length > 0);
10905
+ if (entries.length === 0) return terms;
10906
+ const first = entries[0];
10907
+ const last = entries[entries.length - 1];
10908
+ const isWholeListWrap = entries.length > 1 && first.startsWith("*") && !first.endsWith("*") && last.endsWith("*") && !last.startsWith("*");
10909
+ const hasOneSidedAsterisk = entries.some(
10910
+ (entry) => entry.startsWith("*") !== entry.endsWith("*")
10911
+ );
10912
+ if (!isWholeListWrap && !hasOneSidedAsterisk) return terms;
10913
+ const seen = /* @__PURE__ */ new Set();
10914
+ const repaired = [];
10915
+ for (const entry of entries) {
10916
+ const inner = entry.replace(/^\*+|\*+$/g, "").trim();
10917
+ if (inner.length === 0) continue;
10918
+ const isExact = isWholeListWrap || entry.startsWith("*") && entry.endsWith("*") && entry.length > 2;
10919
+ const formatted = isExact ? `*${inner}*` : inner;
10920
+ const key = formatted.toLowerCase();
10921
+ if (seen.has(key)) continue;
10922
+ seen.add(key);
10923
+ repaired.push(formatted);
10924
+ }
10925
+ return repaired.join(", ");
10926
+ }
10792
10927
 
10793
10928
  // ../../internal/utils/src/brand-pattern.ts
10794
10929
  var brand_pattern_exports = {};
@@ -11434,6 +11569,44 @@ z.object({
11434
11569
  })
11435
11570
  )
11436
11571
  });
11572
+ var DATE_ONLY_PATTERN = /^\d{4}-\d{2}-\d{2}$/;
11573
+ var utcDateSchema = (endOfDay) => z.preprocess((value) => {
11574
+ if (typeof value !== "string") {
11575
+ return value;
11576
+ }
11577
+ const parsed = DateTime.fromISO(value, { zone: "utc" });
11578
+ if (!parsed.isValid) {
11579
+ return new Date(Number.NaN);
11580
+ }
11581
+ return endOfDay && DATE_ONLY_PATTERN.test(value) ? parsed.endOf("day").toJSDate() : parsed.toJSDate();
11582
+ }, z.coerce.date());
11583
+
11584
+ // ../../internal/validation/src/public/metrics/false-positive-rate.ts
11585
+ z.object({
11586
+ slug: z.string().min(1).describe("Organization slug"),
11587
+ startDate: utcDateSchema(false).optional().describe(
11588
+ "Only include assets blocked on or after this date. A date-only value (YYYY-MM-DD) starts at midnight UTC"
11589
+ ),
11590
+ endDate: utcDateSchema(true).optional().describe(
11591
+ "Only include assets blocked on or before this date. A date-only value (YYYY-MM-DD) covers the whole day in UTC; pass a full timestamp for a precise cut-off"
11592
+ ),
11593
+ brandIds: z.array(z.number().int().positive()).optional().describe("Only include assets belonging to these brands"),
11594
+ countryCodes: z.array(z.string().length(2)).optional().describe("Only include assets scanned from these ISO 3166-1 alpha-2 countries")
11595
+ });
11596
+ z.object({
11597
+ byAssetType: z.array(
11598
+ z.object({
11599
+ assetType: z.nativeEnum(AssetType).describe("Asset type that was blocked"),
11600
+ blocked: z.number().describe("Assets of this type blocked within the date range"),
11601
+ falsePositives: z.number().describe("Of those, how many are no longer blocked today"),
11602
+ falsePositiveRate: z.number().nullable().describe(
11603
+ "falsePositives / blocked, 0-1. Null only when nothing was blocked, which cannot happen for a returned row"
11604
+ )
11605
+ })
11606
+ ).describe(
11607
+ "False positive rate, one entry per asset type blocked in the range, descending by number blocked. Asset types with no false positives are included with a rate of 0; asset types with no blocks at all in the range are omitted, since they have no rate to report. The denominator counts block events, not distinct assets, so an asset blocked twice in the range counts twice. Whether a block still stands is read as of now while the range bounds the block itself, so a recent range reads low. An asset's blocked status is global, so a block another organization's report caused to be reversed is counted here too"
11608
+ )
11609
+ });
11437
11610
  z.object({
11438
11611
  slug: z.string().min(1),
11439
11612
  startDate: z.date(),
@@ -11448,8 +11621,8 @@ z.object({
11448
11621
  endDate: z.date()
11449
11622
  })
11450
11623
  });
11451
- var DATE_ONLY_PATTERN = /^\d{4}-\d{2}-\d{2}$/;
11452
- var utcDateSchema = (endOfDay) => z.preprocess((value) => {
11624
+ var DATE_ONLY_PATTERN2 = /^\d{4}-\d{2}-\d{2}$/;
11625
+ var utcDateSchema2 = (endOfDay) => z.preprocess((value) => {
11453
11626
  if (typeof value !== "string") {
11454
11627
  return value;
11455
11628
  }
@@ -11457,7 +11630,7 @@ var utcDateSchema = (endOfDay) => z.preprocess((value) => {
11457
11630
  if (!parsed.isValid) {
11458
11631
  return new Date(Number.NaN);
11459
11632
  }
11460
- return endOfDay && DATE_ONLY_PATTERN.test(value) ? parsed.endOf("day").toJSDate() : parsed.toJSDate();
11633
+ return endOfDay && DATE_ONLY_PATTERN2.test(value) ? parsed.endOf("day").toJSDate() : parsed.toJSDate();
11461
11634
  }, z.coerce.date());
11462
11635
  var funnelCountsSchema = z.object({
11463
11636
  blocked: z.number().int().nonnegative().describe(
@@ -11466,10 +11639,10 @@ var funnelCountsSchema = z.object({
11466
11639
  });
11467
11640
  z.object({
11468
11641
  slug: z.string().min(1).describe("Organization slug"),
11469
- startDate: utcDateSchema(false).describe(
11642
+ startDate: utcDateSchema2(false).describe(
11470
11643
  "Only include assets whose earliest report was created on or after this date. A date-only value (YYYY-MM-DD) starts at midnight UTC"
11471
11644
  ),
11472
- endDate: utcDateSchema(true).describe(
11645
+ endDate: utcDateSchema2(true).describe(
11473
11646
  "Only include assets whose earliest report was created on or before this date. A date-only value (YYYY-MM-DD) covers the whole day in UTC; pass a full timestamp for a precise cut-off"
11474
11647
  ),
11475
11648
  brandIds: z.array(z.number().int().positive()).optional().describe("Only include assets belonging to these brands")
@@ -11523,25 +11696,12 @@ z.object({
11523
11696
  })
11524
11697
  )
11525
11698
  });
11526
- var DATE_ONLY_PATTERN2 = /^\d{4}-\d{2}-\d{2}$/;
11527
- var utcDateSchema2 = (endOfDay) => z.preprocess((value) => {
11528
- if (typeof value !== "string") {
11529
- return value;
11530
- }
11531
- const parsed = DateTime.fromISO(value, { zone: "utc" });
11532
- if (!parsed.isValid) {
11533
- return new Date(Number.NaN);
11534
- }
11535
- return endOfDay && DATE_ONLY_PATTERN2.test(value) ? parsed.endOf("day").toJSDate() : parsed.toJSDate();
11536
- }, z.coerce.date());
11537
-
11538
- // ../../internal/validation/src/public/metrics/takedown-success-rate.ts
11539
11699
  z.object({
11540
11700
  slug: z.string().min(1).describe("Organization slug"),
11541
- startDate: utcDateSchema2(false).optional().describe(
11701
+ startDate: utcDateSchema(false).optional().describe(
11542
11702
  "Only include takedowns first submitted to a provider on or after this date. A date-only value (YYYY-MM-DD) starts at midnight UTC"
11543
11703
  ),
11544
- endDate: utcDateSchema2(true).optional().describe(
11704
+ endDate: utcDateSchema(true).optional().describe(
11545
11705
  "Only include takedowns first submitted to a provider on or before this date. A date-only value (YYYY-MM-DD) covers the whole day in UTC; pass a full timestamp for a precise cut-off"
11546
11706
  ),
11547
11707
  blockLabel: z.string().optional().describe(
@@ -11569,10 +11729,10 @@ z.object({
11569
11729
  });
11570
11730
  z.object({
11571
11731
  slug: z.string().min(1).describe("Organization slug"),
11572
- startDate: utcDateSchema2(false).optional().describe(
11732
+ startDate: utcDateSchema(false).optional().describe(
11573
11733
  "Only include takedowns completed on or after this date. A date-only value (YYYY-MM-DD) starts at midnight UTC"
11574
11734
  ),
11575
- endDate: utcDateSchema2(true).optional().describe(
11735
+ endDate: utcDateSchema(true).optional().describe(
11576
11736
  "Only include takedowns completed on or before this date. A date-only value (YYYY-MM-DD) covers the whole day in UTC; pass a full timestamp for a precise cut-off"
11577
11737
  ),
11578
11738
  blockLabel: z.string().optional().describe(
@@ -11602,10 +11762,10 @@ var TakedownProviderRoleSchema = z.enum([
11602
11762
  ]);
11603
11763
  z.object({
11604
11764
  slug: z.string().min(1).describe("Organization slug"),
11605
- startDate: utcDateSchema2(false).optional().describe(
11765
+ startDate: utcDateSchema(false).optional().describe(
11606
11766
  "Only include takedowns completed on or after this date. A date-only value (YYYY-MM-DD) starts at midnight UTC"
11607
11767
  ),
11608
- endDate: utcDateSchema2(true).optional().describe(
11768
+ endDate: utcDateSchema(true).optional().describe(
11609
11769
  "Only include takedowns completed on or before this date. A date-only value (YYYY-MM-DD) covers the whole day in UTC; pass a full timestamp for a precise cut-off"
11610
11770
  ),
11611
11771
  roles: z.array(TakedownProviderRoleSchema).optional().describe(
@@ -12241,8 +12401,10 @@ var reportCreateInputSchema = z.object({
12241
12401
  ).optional().refine((value) => !value || !isPhoneNumberMissingCountryCode(value), {
12242
12402
  message: PHONE_COUNTRY_CODE_ERROR_MESSAGE
12243
12403
  }),
12244
- /** Optional list of URLs for images to be attached to the report. */
12245
- attachmentUrls: z.array(z.string().url()).optional().describe("URLs of images to attach to the report"),
12404
+ /** Optional list of URLs for files to be attached to the report as evidence. */
12405
+ attachmentUrls: z.array(z.string().url()).optional().describe(
12406
+ "URLs of files to attach to the report as evidence. Any file type, not only images: .eml/.msg messages, PDFs, and documents are all supported. Upload a file to POST /attachment/upload to get a URL, or pass a publicly reachable URL you host yourself."
12407
+ ),
12246
12408
  /** Optional link to the external submission (e.g. Telegram message link) */
12247
12409
  externalSubmissionLink: z.string().url().optional().describe("Link to the external submission (e.g. Telegram message link)"),
12248
12410
  /** Optional user agent string from the reporter's browser */
@@ -12410,6 +12572,38 @@ for parsing the dates.`
12410
12572
  path: ["startDate"]
12411
12573
  }
12412
12574
  );
12575
+ var TakedownProofType = {
12576
+ ProviderEmail: "provider-email"
12577
+ };
12578
+ var takedownProofEmailSchema = z.object({
12579
+ text: z.string().describe(
12580
+ "The provider's reply, verbatim. Plain-text body where the provider sent one, otherwise the raw HTML body \u2014 treat it as untrusted content and escape it before rendering."
12581
+ ),
12582
+ subject: z.string().nullable().describe("Subject line of the provider's reply.")
12583
+ }).nullable().describe(
12584
+ "Present when `type` is `provider-email`, `null` for every other proof type."
12585
+ );
12586
+ var takedownProofSchema = z.object({
12587
+ type: z.nativeEnum(TakedownProofType).describe(
12588
+ "Which kind of evidence this is. Currently only `provider-email`. New types may be added over time \u2014 read `type` before reading any of the type-specific objects below, and treat an unrecognised value as an opaque proof rather than an error."
12589
+ ),
12590
+ source: z.string().nullable().describe(
12591
+ "Who confirmed the takedown, in whatever form that provider identifies itself \u2014 an address such as `abuse@example.com` for `provider-email`."
12592
+ ),
12593
+ confirmedAt: z.date().describe("When the provider confirmed the takedown."),
12594
+ email: takedownProofEmailSchema
12595
+ });
12596
+ var takedownProofsSchema = z.array(takedownProofSchema).describe(
12597
+ `Evidence that this takedown is ours: providers confirming they removed the asset, newest first.
12598
+
12599
+ A takedown filed at several providers can be confirmed by more than one of them, so this is a list. At most 5 are returned per takedown.
12600
+
12601
+ \`type\`, \`source\` and \`confirmedAt\` are present on every entry, so a caller that only needs to show "confirmed by X on date Y" never has to branch on the type. The type-specific object (\`email\`, and others as they are added) carries the underlying evidence.
12602
+
12603
+ Empty unless the takedown is COMPLETED and we hold a confirmation \u2014 which is the common case, because most providers either never reply or reply without confirming they acted. An empty list is not evidence that the asset is still up.
12604
+
12605
+ Requires the \`takedown-proof-api\` feature flag; without it this is always empty.`
12606
+ );
12413
12607
  var takedownItemSchema = z.object({
12414
12608
  id: z.number().describe("Takedown ID"),
12415
12609
  status: z.nativeEnum(TakedownStatus).describe("Takedown status"),
@@ -12459,7 +12653,8 @@ var takedownItemSchema = z.object({
12459
12653
  name: z.string().describe("TLD registrar name (e.g. `Verisign`, `Public Interest Registry`)")
12460
12654
  }).nullable().describe(
12461
12655
  "Top-level-domain registrar assigned to this takedown. `null` when unresolved."
12462
- )
12656
+ ),
12657
+ proofs: takedownProofsSchema
12463
12658
  });
12464
12659
  z.object({
12465
12660
  takedowns: z.array(takedownItemSchema).describe("List of takedowns"),
@@ -12775,12 +12970,17 @@ var ONE_PAGER_BUDGETS = {
12775
12970
  headline: 60,
12776
12971
  badge: 28,
12777
12972
  frontLabel: 44,
12778
- paragraph: 480,
12779
12973
  paragraphsMax: 2,
12780
12974
  heroPhrase: 80,
12781
- heroNarrative: 300,
12782
- divergenceLine: 220,
12783
- xp01Line: 220
12975
+ landscapeCaption: 180,
12976
+ xp01Line: 220,
12977
+ screenshotCaption: 48,
12978
+ divergenceLine: 220
12979
+ };
12980
+ var ONE_PAGER_STORED_MAX = {
12981
+ paragraph: 480,
12982
+ paragraph2Lead: 60,
12983
+ heroNarrative: 300
12784
12984
  };
12785
12985
  var onePagerFactPayloadSchema = z.object({
12786
12986
  /** Raw (not defanged) asset contents the prose may reference. */
@@ -12792,24 +12992,56 @@ var onePagerFactPayloadSchema = z.object({
12792
12992
  platforms: z.array(z.string()),
12793
12993
  groupSize: z.number(),
12794
12994
  takedownCompletedAt: z.string().nullable(),
12795
- activeSince: z.string().nullable()
12995
+ activeSince: z.string().nullable(),
12996
+ // ---- v2 enrichment ----------------------------------------------------
12997
+ // Optional rather than defaulted so rows stored by v1 keep parsing AND the
12998
+ // inferred type stays assignable from a v1-shaped literal.
12999
+ /** How the attacker paid for the surface ("free_subdomain" | ...). */
13000
+ hostingPattern: z.string().nullable().optional(),
13001
+ /** Who surfaced it first ("client_reported" | "proactive"). */
13002
+ sourceKind: z.string().nullable().optional(),
13003
+ /** Prior blocked assets in the same relaunch family. */
13004
+ relaunchCount: z.number().nullable().optional(),
13005
+ /** Earliest sighting, ISO. */
13006
+ firstSeenAt: z.string().nullable().optional(),
13007
+ /**
13008
+ * Pre-computed hours from first sighting to confirmed removal, as a string
13009
+ * so it lands in the same allowlist as `numbers`. The model is forbidden
13010
+ * from doing arithmetic, so every duration it may cite is computed here.
13011
+ */
13012
+ timeToRemovalHrs: z.string().nullable().optional()
12796
13013
  });
12797
13014
  var onePagerStorySchema = z.object({
12798
13015
  archetypeId: z.string(),
12799
13016
  archetypeCategory: z.string(),
12800
13017
  /** 1-5 = placed on the page; null = alternate available for swap. */
12801
13018
  slot: z.number().int().min(1).max(5).nullable(),
13019
+ /** Column layout the story occupies; slot 1 is full-width by convention. */
13020
+ layout: z.enum(["full", "half"]).default("half"),
12802
13021
  frontLabel: z.string().max(ONE_PAGER_BUDGETS.frontLabel),
12803
13022
  headline: z.string().max(ONE_PAGER_BUDGETS.headline),
13023
+ /** Compound "10 of 10 removed · 3 hrs". */
12804
13024
  badge: z.string().max(ONE_PAGER_BUDGETS.badge),
12805
- paragraphs: z.array(z.string().max(ONE_PAGER_BUDGETS.paragraph)).min(1).max(ONE_PAGER_BUDGETS.paragraphsMax),
13025
+ paragraphs: z.array(z.string().max(ONE_PAGER_STORED_MAX.paragraph)).min(1).max(ONE_PAGER_BUDGETS.paragraphsMax),
13026
+ /** Bold lead-in shown ahead of the second paragraph. */
13027
+ paragraph2Lead: z.string().max(ONE_PAGER_STORED_MAX.paragraph2Lead).nullable().default(null),
12806
13028
  /** Defanged, display-ready asset identifiers. */
12807
- assetList: z.array(z.string()).max(10),
13029
+ assetList: z.array(z.string()).max(12),
13030
+ /** Story-bank identity for the referenced assets. */
13031
+ assetIds: z.array(z.number()).default([]),
12808
13032
  screenshotUrls: z.array(z.string()),
12809
13033
  selectedScreenshotUrls: z.array(z.string()).max(2),
13034
+ /** Parallel to selectedScreenshotUrls. */
13035
+ screenshotCaptions: z.array(z.string().max(ONE_PAGER_BUDGETS.screenshotCaption)).max(2).default([]),
13036
+ /** Manual redact toggle, parallel to selectedScreenshotUrls. */
13037
+ screenshotBlur: z.array(z.boolean()).max(2).default([]),
12810
13038
  xp01Line: z.string().max(ONE_PAGER_BUDGETS.xp01Line).nullable(),
12811
13039
  factPayload: onePagerFactPayloadSchema,
12812
- proseSource: z.enum(["llm", "template"])
13040
+ proseSource: z.enum(["llm", "template"]),
13041
+ /** Cross-period continuation framing. */
13042
+ continuation: z.boolean().default(false),
13043
+ /** Shown in the editor when this story overlaps with a prior period. */
13044
+ priorHeadline: z.string().nullable().default(null)
12813
13045
  });
12814
13046
  var onePagerLandscapeRowSchema = z.object({
12815
13047
  platform: z.string(),
@@ -12820,25 +13052,55 @@ var onePagerFormDataObjectSchema = z.object({
12820
13052
  orgName: z.string(),
12821
13053
  orgSlug: z.string(),
12822
13054
  periodLabel: z.string(),
13055
+ partnershipLabel: z.string().max(40).default("AN ONGOING PARTNERSHIP"),
13056
+ coverageWindow: z.object({ start: z.string(), end: z.string(), label: z.string(), short: z.boolean() }).nullable().default(null),
12823
13057
  heroStat: z.object({
12824
13058
  value: z.string(),
12825
13059
  phrase: z.string().max(ONE_PAGER_BUDGETS.heroPhrase)
12826
13060
  }),
12827
- heroNarrative: z.string().max(ONE_PAGER_BUDGETS.heroNarrative),
12828
- metricsRows: z.array(z.object({ label: z.string(), value: z.string() })).length(4),
13061
+ heroNarrative: z.string().max(ONE_PAGER_STORED_MAX.heroNarrative),
13062
+ /**
13063
+ * Up to 4 rows, but the metric library legitimately returns fewer on a thin
13064
+ * month (a zero-valued metric is excluded outright rather than rendered as
13065
+ * a "0" row), so this is a range, not a fixed length. Below 2 the block
13066
+ * reads as broken rather than short.
13067
+ */
13068
+ metricsRows: z.array(
13069
+ z.object({
13070
+ key: z.string().default("legacy"),
13071
+ label: z.string(),
13072
+ value: z.string()
13073
+ })
13074
+ ).min(2).max(4),
12829
13075
  landscape: z.object({
12830
13076
  rows: z.array(onePagerLandscapeRowSchema).max(8),
12831
13077
  otherCount: z.number().nullable(),
12832
13078
  otherPlatformsLabel: z.string().nullable(),
12833
- divergenceLine: z.string().max(ONE_PAGER_BUDGETS.divergenceLine).nullable()
13079
+ /** Kept for legacy row parse; caption is preferred going forward. */
13080
+ divergenceLine: z.string().max(ONE_PAGER_BUDGETS.divergenceLine).nullable(),
13081
+ caption: z.string().max(ONE_PAGER_BUDGETS.landscapeCaption).nullable().default(null)
12834
13082
  }),
12835
13083
  stories: z.array(onePagerStorySchema).min(1).max(6),
12836
- footer: z.object({ contactName: z.string(), contactLine: z.string() })
13084
+ footer: z.object({
13085
+ contactName: z.string(),
13086
+ contactLine: z.string(),
13087
+ contactEmail: z.string().default(""),
13088
+ bookingLink: z.string().default(""),
13089
+ ctaLine: z.string().default("Anything your community has flagged, send it over.")
13090
+ }),
13091
+ /** Engine v2 writes 2; absent/older rows default to 1. */
13092
+ schemaVersion: z.number().default(1)
12837
13093
  });
12838
13094
  onePagerFormDataObjectSchema.refine(
12839
13095
  (data) => data.stories.some((s2) => s2.slot !== null),
12840
13096
  { message: "at least one story must be placed", path: ["stories"] }
12841
13097
  );
13098
+ var INTERNAL_ORG_SLUGS = [
13099
+ "chainpatrol",
13100
+ "chainpatrol-automation",
13101
+ "mountaintop"
13102
+ ];
13103
+ new Set(INTERNAL_ORG_SLUGS);
12842
13104
  z.object({
12843
13105
  x: z.number().min(0).max(1),
12844
13106
  y: z.number().min(0).max(1),
@@ -13604,20 +13866,20 @@ var convertA98ToXyz65_default = convertA98ToXyz65;
13604
13866
 
13605
13867
  // ../../node_modules/culori/src/a98/convertXyz65ToA98.js
13606
13868
  var gamma = (v) => Math.pow(Math.abs(v), 256 / 563) * Math.sign(v);
13607
- var convertXyz65ToA98 = ({ x, y, z: z61, alpha }) => {
13869
+ var convertXyz65ToA98 = ({ x, y, z: z64, alpha }) => {
13608
13870
  if (x === void 0) x = 0;
13609
13871
  if (y === void 0) y = 0;
13610
- if (z61 === void 0) z61 = 0;
13872
+ if (z64 === void 0) z64 = 0;
13611
13873
  let res = {
13612
13874
  mode: "a98",
13613
13875
  r: gamma(
13614
- x * 2.0415879038107465 - y * 0.5650069742788597 - 0.3447313507783297 * z61
13876
+ x * 2.0415879038107465 - y * 0.5650069742788597 - 0.3447313507783297 * z64
13615
13877
  ),
13616
13878
  g: gamma(
13617
- x * -0.9692436362808798 + y * 1.8759675015077206 + 0.0415550574071756 * z61
13879
+ x * -0.9692436362808798 + y * 1.8759675015077206 + 0.0415550574071756 * z64
13618
13880
  ),
13619
13881
  b: gamma(
13620
- x * 0.0134442806320312 - y * 0.1183623922310184 + 1.0151749943912058 * z61
13882
+ x * 0.0134442806320312 - y * 0.1183623922310184 + 1.0151749943912058 * z64
13621
13883
  )
13622
13884
  };
13623
13885
  if (alpha !== void 0) {
@@ -13684,14 +13946,14 @@ var convertLrgbToRgb = ({ r, g, b, alpha }, mode = "rgb") => {
13684
13946
  var convertLrgbToRgb_default = convertLrgbToRgb;
13685
13947
 
13686
13948
  // ../../node_modules/culori/src/xyz65/convertXyz65ToRgb.js
13687
- var convertXyz65ToRgb = ({ x, y, z: z61, alpha }) => {
13949
+ var convertXyz65ToRgb = ({ x, y, z: z64, alpha }) => {
13688
13950
  if (x === void 0) x = 0;
13689
13951
  if (y === void 0) y = 0;
13690
- if (z61 === void 0) z61 = 0;
13952
+ if (z64 === void 0) z64 = 0;
13691
13953
  let res = convertLrgbToRgb_default({
13692
- r: x * 3.2409699419045226 - y * 1.537383177570094 - 0.4986107602930034 * z61,
13693
- g: x * -0.9692436362808796 + y * 1.8759675015077204 + 0.0415550574071756 * z61,
13694
- b: x * 0.0556300796969936 - y * 0.2039769588889765 + 1.0569715142428784 * z61
13954
+ r: x * 3.2409699419045226 - y * 1.537383177570094 - 0.4986107602930034 * z64,
13955
+ g: x * -0.9692436362808796 + y * 1.8759675015077204 + 0.0415550574071756 * z64,
13956
+ b: x * 0.0556300796969936 - y * 0.2039769588889765 + 1.0569715142428784 * z64
13695
13957
  });
13696
13958
  if (alpha !== void 0) {
13697
13959
  res.alpha = alpha;
@@ -13941,13 +14203,13 @@ var convertLab65ToRgb_default = convertLab65ToRgb;
13941
14203
 
13942
14204
  // ../../node_modules/culori/src/lab65/convertXyz65ToLab65.js
13943
14205
  var f = (value) => value > e ? Math.cbrt(value) : (k * value + 16) / 116;
13944
- var convertXyz65ToLab65 = ({ x, y, z: z61, alpha }) => {
14206
+ var convertXyz65ToLab65 = ({ x, y, z: z64, alpha }) => {
13945
14207
  if (x === void 0) x = 0;
13946
14208
  if (y === void 0) y = 0;
13947
- if (z61 === void 0) z61 = 0;
14209
+ if (z64 === void 0) z64 = 0;
13948
14210
  let f0 = f(x / D65.X);
13949
14211
  let f1 = f(y / D65.Y);
13950
- let f22 = f(z61 / D65.Z);
14212
+ let f22 = f(z64 / D65.Z);
13951
14213
  let res = {
13952
14214
  mode: "lab65",
13953
14215
  l: 116 * f1 - 16,
@@ -14604,10 +14866,10 @@ var convertItpToXyz65_default = convertItpToXyz65;
14604
14866
 
14605
14867
  // ../../node_modules/culori/src/itp/convertXyz65ToItp.js
14606
14868
  var toAbs = (c2 = 0) => Math.max(c2 * YW, 0);
14607
- var convertXyz65ToItp = ({ x, y, z: z61, alpha }) => {
14869
+ var convertXyz65ToItp = ({ x, y, z: z64, alpha }) => {
14608
14870
  const absX = toAbs(x);
14609
14871
  const absY = toAbs(y);
14610
- const absZ = toAbs(z61);
14872
+ const absZ = toAbs(z64);
14611
14873
  const l2 = transferPqEncode(
14612
14874
  0.3592832590121217 * absX + 0.6976051147779502 * absY - 0.0358915932320289 * absZ
14613
14875
  );
@@ -14665,15 +14927,15 @@ var jabPqEncode = (v) => {
14665
14927
  return Math.pow((C1 + C2 * vn3) / (1 + C3 * vn3), p);
14666
14928
  };
14667
14929
  var abs = (v = 0) => Math.max(v * 203, 0);
14668
- var convertXyz65ToJab = ({ x, y, z: z61, alpha }) => {
14930
+ var convertXyz65ToJab = ({ x, y, z: z64, alpha }) => {
14669
14931
  x = abs(x);
14670
14932
  y = abs(y);
14671
- z61 = abs(z61);
14672
- let xp = 1.15 * x - 0.15 * z61;
14933
+ z64 = abs(z64);
14934
+ let xp = 1.15 * x - 0.15 * z64;
14673
14935
  let yp = 0.66 * y + 0.34 * x;
14674
- let l2 = jabPqEncode(0.41478972 * xp + 0.579999 * yp + 0.014648 * z61);
14675
- let m = jabPqEncode(-0.20151 * xp + 1.120649 * yp + 0.0531008 * z61);
14676
- let s2 = jabPqEncode(-0.0166008 * xp + 0.2648 * yp + 0.6684799 * z61);
14936
+ let l2 = jabPqEncode(0.41478972 * xp + 0.579999 * yp + 0.014648 * z64);
14937
+ let m = jabPqEncode(-0.20151 * xp + 1.120649 * yp + 0.0531008 * z64);
14938
+ let s2 = jabPqEncode(-0.0166008 * xp + 0.2648 * yp + 0.6684799 * z64);
14677
14939
  let i = (l2 + m) / 2;
14678
14940
  let res = {
14679
14941
  mode: "jab",
@@ -14859,14 +15121,14 @@ var convertLabToXyz50 = ({ l: l2, a, b, alpha }) => {
14859
15121
  var convertLabToXyz50_default = convertLabToXyz50;
14860
15122
 
14861
15123
  // ../../node_modules/culori/src/xyz50/convertXyz50ToRgb.js
14862
- var convertXyz50ToRgb = ({ x, y, z: z61, alpha }) => {
15124
+ var convertXyz50ToRgb = ({ x, y, z: z64, alpha }) => {
14863
15125
  if (x === void 0) x = 0;
14864
15126
  if (y === void 0) y = 0;
14865
- if (z61 === void 0) z61 = 0;
15127
+ if (z64 === void 0) z64 = 0;
14866
15128
  let res = convertLrgbToRgb_default({
14867
- r: x * 3.1341359569958707 - y * 1.6173863321612538 - 0.4906619460083532 * z61,
14868
- g: x * -0.978795502912089 + y * 1.916254567259524 + 0.03344273116131949 * z61,
14869
- b: x * 0.07195537988411677 - y * 0.2289768264158322 + 1.405386058324125 * z61
15129
+ r: x * 3.1341359569958707 - y * 1.6173863321612538 - 0.4906619460083532 * z64,
15130
+ g: x * -0.978795502912089 + y * 1.916254567259524 + 0.03344273116131949 * z64,
15131
+ b: x * 0.07195537988411677 - y * 0.2289768264158322 + 1.405386058324125 * z64
14870
15132
  });
14871
15133
  if (alpha !== void 0) {
14872
15134
  res.alpha = alpha;
@@ -14897,13 +15159,13 @@ var convertRgbToXyz50_default = convertRgbToXyz50;
14897
15159
 
14898
15160
  // ../../node_modules/culori/src/lab/convertXyz50ToLab.js
14899
15161
  var f2 = (value) => value > e3 ? Math.cbrt(value) : (k3 * value + 16) / 116;
14900
- var convertXyz50ToLab = ({ x, y, z: z61, alpha }) => {
15162
+ var convertXyz50ToLab = ({ x, y, z: z64, alpha }) => {
14901
15163
  if (x === void 0) x = 0;
14902
15164
  if (y === void 0) y = 0;
14903
- if (z61 === void 0) z61 = 0;
15165
+ if (z64 === void 0) z64 = 0;
14904
15166
  let f0 = f2(x / D50.X);
14905
15167
  let f1 = f2(y / D50.Y);
14906
- let f22 = f2(z61 / D50.Z);
15168
+ let f22 = f2(z64 / D50.Z);
14907
15169
  let res = {
14908
15170
  mode: "lab",
14909
15171
  l: 116 * f1 - 16,
@@ -15138,18 +15400,18 @@ var convertLchuvToLuv = ({ l: l2, c: c2, h, alpha }) => {
15138
15400
  var convertLchuvToLuv_default = convertLchuvToLuv;
15139
15401
 
15140
15402
  // ../../node_modules/culori/src/luv/convertXyz50ToLuv.js
15141
- var u_fn = (x, y, z61) => 4 * x / (x + 15 * y + 3 * z61);
15142
- var v_fn = (x, y, z61) => 9 * y / (x + 15 * y + 3 * z61);
15403
+ var u_fn = (x, y, z64) => 4 * x / (x + 15 * y + 3 * z64);
15404
+ var v_fn = (x, y, z64) => 9 * y / (x + 15 * y + 3 * z64);
15143
15405
  var un = u_fn(D50.X, D50.Y, D50.Z);
15144
15406
  var vn = v_fn(D50.X, D50.Y, D50.Z);
15145
15407
  var l_fn = (value) => value <= e3 ? k3 * value : 116 * Math.cbrt(value) - 16;
15146
- var convertXyz50ToLuv = ({ x, y, z: z61, alpha }) => {
15408
+ var convertXyz50ToLuv = ({ x, y, z: z64, alpha }) => {
15147
15409
  if (x === void 0) x = 0;
15148
15410
  if (y === void 0) y = 0;
15149
- if (z61 === void 0) z61 = 0;
15411
+ if (z64 === void 0) z64 = 0;
15150
15412
  let l2 = l_fn(y / D50.Y);
15151
- let u = u_fn(x, y, z61);
15152
- let v = v_fn(x, y, z61);
15413
+ let u = u_fn(x, y, z64);
15414
+ let v = v_fn(x, y, z64);
15153
15415
  if (!isFinite(u) || !isFinite(v)) {
15154
15416
  l2 = u = v = 0;
15155
15417
  } else {
@@ -15170,8 +15432,8 @@ var convertXyz50ToLuv = ({ x, y, z: z61, alpha }) => {
15170
15432
  var convertXyz50ToLuv_default = convertXyz50ToLuv;
15171
15433
 
15172
15434
  // ../../node_modules/culori/src/luv/convertLuvToXyz50.js
15173
- var u_fn2 = (x, y, z61) => 4 * x / (x + 15 * y + 3 * z61);
15174
- var v_fn2 = (x, y, z61) => 9 * y / (x + 15 * y + 3 * z61);
15435
+ var u_fn2 = (x, y, z64) => 4 * x / (x + 15 * y + 3 * z64);
15436
+ var v_fn2 = (x, y, z64) => 9 * y / (x + 15 * y + 3 * z64);
15175
15437
  var un2 = u_fn2(D50.X, D50.Y, D50.Z);
15176
15438
  var vn2 = v_fn2(D50.X, D50.Y, D50.Z);
15177
15439
  var convertLuvToXyz50 = ({ l: l2, u, v, alpha }) => {
@@ -15185,8 +15447,8 @@ var convertLuvToXyz50 = ({ l: l2, u, v, alpha }) => {
15185
15447
  let vp = v / (13 * l2) + vn2;
15186
15448
  let y = D50.Y * (l2 <= 8 ? l2 / k3 : Math.pow((l2 + 16) / 116, 3));
15187
15449
  let x = y * (9 * up) / (4 * vp);
15188
- let z61 = y * (12 - 3 * up - 20 * vp) / (4 * vp);
15189
- let res = { mode: "xyz50", x, y, z: z61 };
15450
+ let z64 = y * (12 - 3 * up - 20 * vp) / (4 * vp);
15451
+ let res = { mode: "xyz50", x, y, z: z64 };
15190
15452
  if (alpha !== void 0) {
15191
15453
  res.alpha = alpha;
15192
15454
  }
@@ -15803,15 +16065,15 @@ var convertP3ToXyz65 = (rgb2) => {
15803
16065
  var convertP3ToXyz65_default = convertP3ToXyz65;
15804
16066
 
15805
16067
  // ../../node_modules/culori/src/p3/convertXyz65ToP3.js
15806
- var convertXyz65ToP3 = ({ x, y, z: z61, alpha }) => {
16068
+ var convertXyz65ToP3 = ({ x, y, z: z64, alpha }) => {
15807
16069
  if (x === void 0) x = 0;
15808
16070
  if (y === void 0) y = 0;
15809
- if (z61 === void 0) z61 = 0;
16071
+ if (z64 === void 0) z64 = 0;
15810
16072
  let res = convertLrgbToRgb_default(
15811
16073
  {
15812
- r: x * 2.4934969119414263 - y * 0.9313836179191242 - 0.402710784450717 * z61,
15813
- g: x * -0.8294889695615749 + y * 1.7626640603183465 + 0.0236246858419436 * z61,
15814
- b: x * 0.0358458302437845 - y * 0.0761723892680418 + 0.9568845240076871 * z61
16074
+ r: x * 2.4934969119414263 - y * 0.9313836179191242 - 0.402710784450717 * z64,
16075
+ g: x * -0.8294889695615749 + y * 1.7626640603183465 + 0.0236246858419436 * z64,
16076
+ b: x * 0.0358458302437845 - y * 0.0761723892680418 + 0.9568845240076871 * z64
15815
16077
  },
15816
16078
  "p3"
15817
16079
  );
@@ -15846,19 +16108,19 @@ var gamma2 = (v) => {
15846
16108
  }
15847
16109
  return 16 * v;
15848
16110
  };
15849
- var convertXyz50ToProphoto = ({ x, y, z: z61, alpha }) => {
16111
+ var convertXyz50ToProphoto = ({ x, y, z: z64, alpha }) => {
15850
16112
  if (x === void 0) x = 0;
15851
16113
  if (y === void 0) y = 0;
15852
- if (z61 === void 0) z61 = 0;
16114
+ if (z64 === void 0) z64 = 0;
15853
16115
  let res = {
15854
16116
  mode: "prophoto",
15855
16117
  r: gamma2(
15856
- x * 1.3457868816471585 - y * 0.2555720873797946 - 0.0511018649755453 * z61
16118
+ x * 1.3457868816471585 - y * 0.2555720873797946 - 0.0511018649755453 * z64
15857
16119
  ),
15858
16120
  g: gamma2(
15859
- x * -0.5446307051249019 + y * 1.5082477428451466 + 0.0205274474364214 * z61
16121
+ x * -0.5446307051249019 + y * 1.5082477428451466 + 0.0205274474364214 * z64
15860
16122
  ),
15861
- b: gamma2(x * 0 + y * 0 + 1.2119675456389452 * z61)
16123
+ b: gamma2(x * 0 + y * 0 + 1.2119675456389452 * z64)
15862
16124
  };
15863
16125
  if (alpha !== void 0) {
15864
16126
  res.alpha = alpha;
@@ -15918,20 +16180,20 @@ var gamma3 = (v) => {
15918
16180
  }
15919
16181
  return 4.5 * v;
15920
16182
  };
15921
- var convertXyz65ToRec2020 = ({ x, y, z: z61, alpha }) => {
16183
+ var convertXyz65ToRec2020 = ({ x, y, z: z64, alpha }) => {
15922
16184
  if (x === void 0) x = 0;
15923
16185
  if (y === void 0) y = 0;
15924
- if (z61 === void 0) z61 = 0;
16186
+ if (z64 === void 0) z64 = 0;
15925
16187
  let res = {
15926
16188
  mode: "rec2020",
15927
16189
  r: gamma3(
15928
- x * 1.7166511879712683 - y * 0.3556707837763925 - 0.2533662813736599 * z61
16190
+ x * 1.7166511879712683 - y * 0.3556707837763925 - 0.2533662813736599 * z64
15929
16191
  ),
15930
16192
  g: gamma3(
15931
- x * -0.6666843518324893 + y * 1.6164812366349395 + 0.0157685458139111 * z61
16193
+ x * -0.6666843518324893 + y * 1.6164812366349395 + 0.0157685458139111 * z64
15932
16194
  ),
15933
16195
  b: gamma3(
15934
- x * 0.0176398574453108 - y * 0.0427706132578085 + 0.9421031212354739 * z61
16196
+ x * 0.0176398574453108 - y * 0.0427706132578085 + 0.9421031212354739 * z64
15935
16197
  )
15936
16198
  };
15937
16199
  if (alpha !== void 0) {
@@ -16084,15 +16346,15 @@ var definition_default26 = definition26;
16084
16346
 
16085
16347
  // ../../node_modules/culori/src/xyz65/convertXyz65ToXyz50.js
16086
16348
  var convertXyz65ToXyz50 = (xyz652) => {
16087
- let { x, y, z: z61, alpha } = xyz652;
16349
+ let { x, y, z: z64, alpha } = xyz652;
16088
16350
  if (x === void 0) x = 0;
16089
16351
  if (y === void 0) y = 0;
16090
- if (z61 === void 0) z61 = 0;
16352
+ if (z64 === void 0) z64 = 0;
16091
16353
  let res = {
16092
16354
  mode: "xyz50",
16093
- x: 1.0479298208405488 * x + 0.0229467933410191 * y - 0.0501922295431356 * z61,
16094
- y: 0.0296278156881593 * x + 0.990434484573249 * y - 0.0170738250293851 * z61,
16095
- z: -0.0092430581525912 * x + 0.0150551448965779 * y + 0.7518742899580008 * z61
16355
+ x: 1.0479298208405488 * x + 0.0229467933410191 * y - 0.0501922295431356 * z64,
16356
+ y: 0.0296278156881593 * x + 0.990434484573249 * y - 0.0170738250293851 * z64,
16357
+ z: -0.0092430581525912 * x + 0.0150551448965779 * y + 0.7518742899580008 * z64
16096
16358
  };
16097
16359
  if (alpha !== void 0) {
16098
16360
  res.alpha = alpha;
@@ -16103,15 +16365,15 @@ var convertXyz65ToXyz50_default = convertXyz65ToXyz50;
16103
16365
 
16104
16366
  // ../../node_modules/culori/src/xyz65/convertXyz50ToXyz65.js
16105
16367
  var convertXyz50ToXyz65 = (xyz502) => {
16106
- let { x, y, z: z61, alpha } = xyz502;
16368
+ let { x, y, z: z64, alpha } = xyz502;
16107
16369
  if (x === void 0) x = 0;
16108
16370
  if (y === void 0) y = 0;
16109
- if (z61 === void 0) z61 = 0;
16371
+ if (z64 === void 0) z64 = 0;
16110
16372
  let res = {
16111
16373
  mode: "xyz65",
16112
- x: 0.9554734527042182 * x - 0.0230985368742614 * y + 0.0632593086610217 * z61,
16113
- y: -0.0283697069632081 * x + 1.0099954580058226 * y + 0.021041398966943 * z61,
16114
- z: 0.0123140016883199 * x - 0.0205076964334779 * y + 1.3303659366080753 * z61
16374
+ x: 0.9554734527042182 * x - 0.0230985368742614 * y + 0.0632593086610217 * z64,
16375
+ y: -0.0283697069632081 * x + 1.0099954580058226 * y + 0.021041398966943 * z64,
16376
+ z: 0.0123140016883199 * x - 0.0205076964334779 * y + 1.3303659366080753 * z64
16115
16377
  };
16116
16378
  if (alpha !== void 0) {
16117
16379
  res.alpha = alpha;
@@ -16348,6 +16610,13 @@ function validateTermsString(termsString) {
16348
16610
  };
16349
16611
  }
16350
16612
  } else {
16613
+ if (term.startsWith("*") || term.endsWith("*")) {
16614
+ const inner = term.replace(/^\*+|\*+$/g, "");
16615
+ return {
16616
+ valid: false,
16617
+ error: `Term "${term}" has an unmatched asterisk. Use *${inner}* for exact matching, or ${inner} for loose matching.`
16618
+ };
16619
+ }
16351
16620
  normalizedTerm = term.replace(/\s+/g, "");
16352
16621
  if (normalizedTerm.length < 6) {
16353
16622
  return {
@@ -16945,6 +17214,8 @@ var SCAN_TEMPLATES = [
16945
17214
  new Map(
16946
17215
  SCAN_TEMPLATES.map((template) => [template.id, template])
16947
17216
  );
17217
+ var DARK_WEB_ENTITY_SEARCH_KINDS = ["domain", "email", "crypto"];
17218
+ z.enum(DARK_WEB_ENTITY_SEARCH_KINDS);
16948
17219
 
16949
17220
  // src/client.ts
16950
17221
  function trimTrailingSlashes(url) {