@slicedearth/whoisleuth-cli 2.4.0 → 2.5.1

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 (300) hide show
  1. package/NOTICE +2 -2
  2. package/cli/argument-values.mjs +55 -0
  3. package/cli/arguments.mjs +24 -470
  4. package/cli/artifact-validation/case-response.mjs +21 -6
  5. package/cli/artifact-validation/lookup-evidence.mjs +3 -3
  6. package/cli/artifact-validation/signed-review.mjs +59 -13
  7. package/cli/artifact-verify.mjs +2 -0
  8. package/cli/assurance-arguments.mjs +56 -0
  9. package/cli/assurance-command-definitions.mjs +179 -0
  10. package/cli/assurance-command-runner.mjs +1 -1
  11. package/cli/bounded-json.mjs +1 -1
  12. package/cli/bulk-checkpoint.mjs +1 -1
  13. package/cli/bulk-command-runner.mjs +2 -2
  14. package/cli/bulk.mjs +2 -3
  15. package/cli/case-command.mjs +20 -3
  16. package/cli/case-pack.mjs +12 -2
  17. package/cli/ci-report.mjs +6 -3
  18. package/cli/collection-arguments.mjs +123 -0
  19. package/cli/collection-command-definitions.mjs +330 -0
  20. package/cli/collection-preflight.mjs +8 -1
  21. package/cli/command-argument-grammar.mjs +8 -210
  22. package/cli/command-definition.mjs +329 -0
  23. package/cli/command-reference.mjs +55 -1388
  24. package/cli/command-seeds.mjs +18 -0
  25. package/cli/compare.mjs +1 -1
  26. package/cli/config-profile.mjs +1 -1
  27. package/cli/ct-event-intake.mjs +4 -4
  28. package/cli/discover.mjs +2 -2
  29. package/cli/discovery-observation-snapshot.mjs +2 -2
  30. package/cli/discovery-scan-command-runner.mjs +3 -3
  31. package/cli/discovery-scan.mjs +1 -1
  32. package/cli/discovery-snapshot.mjs +2 -2
  33. package/cli/discovery-workflow.mjs +4 -4
  34. package/cli/domain-control-monitor.mjs +6 -6
  35. package/cli/domain-control-observations.mjs +2 -1
  36. package/cli/errors.mjs +5 -6
  37. package/cli/evidence-arguments.mjs +46 -0
  38. package/cli/evidence-command-definitions.mjs +69 -0
  39. package/cli/evidence-command-runner.mjs +2 -3
  40. package/cli/evidence-signing.mjs +3 -2
  41. package/cli/external-observation-mapping.mjs +2 -2
  42. package/cli/formatters/terminal-command-formats.mjs +6 -0
  43. package/cli/formatters/terminal-lookup.mjs +6 -0
  44. package/cli/history-arguments.mjs +39 -0
  45. package/cli/history-command-definitions.mjs +88 -0
  46. package/cli/indicator-set-command.mjs +33 -0
  47. package/cli/inline-command-families.mjs +6 -47
  48. package/cli/inline-command-runner.mjs +4 -31
  49. package/cli/input.mjs +2 -2
  50. package/cli/intake-command.mjs +107 -0
  51. package/cli/interchange-report.mjs +4 -2
  52. package/cli/investigation-artifacts.mjs +1 -1
  53. package/cli/investigation-plan.mjs +32 -154
  54. package/cli/investigation-recipes.mjs +177 -0
  55. package/cli/investigation-run.mjs +78 -12
  56. package/cli/local-mmdb-review.mjs +197 -17
  57. package/cli/lookalike-calibration.mjs +1 -1
  58. package/cli/lookup-brief.mjs +2 -2
  59. package/cli/lookup-command-runner.mjs +18 -35
  60. package/cli/lookup-diff.mjs +10 -9
  61. package/cli/lookup-plan.mjs +10 -14
  62. package/cli/lookup-reconcile.mjs +6 -5
  63. package/cli/lookup-timeline.mjs +7 -6
  64. package/cli/mail-header-review.mjs +24 -247
  65. package/cli/mail-review.mjs +9 -7
  66. package/cli/network-arguments.mjs +51 -0
  67. package/cli/network-command-definitions.mjs +130 -0
  68. package/cli/network-command-runner.mjs +43 -31
  69. package/cli/offline-evidence-review.mjs +39 -6
  70. package/cli/posture.mjs +1 -1
  71. package/cli/registry-fixture-scaffold.mjs +1 -1
  72. package/cli/retained-artifact-diff.mjs +8 -7
  73. package/cli/review-arguments.mjs +131 -0
  74. package/cli/review-command-definitions.mjs +273 -0
  75. package/cli/review-command-runner.mjs +68 -158
  76. package/cli/risk-calibration.mjs +8 -8
  77. package/cli/runner.mjs +20 -32
  78. package/cli/saved-lookup.mjs +2 -2
  79. package/cli/selected-input-worker.mjs +63 -0
  80. package/cli/sharing-review.mjs +5 -64
  81. package/cli/source-reliability.mjs +2 -2
  82. package/cli/support-arguments.mjs +49 -0
  83. package/cli/support-command-definitions.mjs +209 -0
  84. package/cli/support-command-runner.mjs +2 -2
  85. package/cli/workflow-arguments.mjs +86 -0
  86. package/cli/workflow-command-definitions.mjs +78 -0
  87. package/cli/workflow-command-runner.mjs +8 -1
  88. package/docs/cli-reference.md +27 -0
  89. package/docs/cli.md +223 -2
  90. package/docs/contextual-reviews.md +155 -0
  91. package/lib/analyst-taxonomy.mjs +2 -40
  92. package/lib/application-version.mjs +1 -1
  93. package/lib/availability.mjs +13 -789
  94. package/lib/bounded-contract-normalizers.mjs +4 -0
  95. package/lib/bounded-json.mjs +2 -330
  96. package/lib/browser-library-profile.mjs +62 -84
  97. package/lib/candidate-provenance-bounds.mjs +2 -0
  98. package/lib/classify.mjs +1 -1
  99. package/lib/ct-query.mjs +2 -27
  100. package/lib/ct-response-bounds.mjs +2 -9
  101. package/lib/ct-search.mjs +83 -47
  102. package/lib/dmarc-discovery.mjs +62 -0
  103. package/lib/dns-convergence-review.mjs +21 -8
  104. package/lib/dns-delegation-health.mjs +12 -8
  105. package/lib/dns-inheritance-review.mjs +53 -63
  106. package/lib/dns-intelligence.mjs +9 -7
  107. package/lib/dns-query-coverage.mjs +40 -0
  108. package/lib/domain-assurance.mjs +1 -1
  109. package/lib/domain-change-packet.mjs +12 -13
  110. package/lib/domain-change-review.mjs +32 -14
  111. package/lib/domain-control-flight-recorder.mjs +103 -27
  112. package/lib/domain-control-manifest.mjs +25 -17
  113. package/lib/domain-posture-analysis.mjs +22 -5
  114. package/lib/domain-posture.mjs +16 -15
  115. package/lib/domain-registration.mjs +392 -0
  116. package/lib/evidence-export-privacy.mjs +22 -15
  117. package/lib/evidence-export.mjs +3 -3
  118. package/lib/evidence-report.mjs +4 -1
  119. package/lib/external-intelligence-risk.mjs +2 -124
  120. package/lib/generated/cisa-kev-catalog.mjs +41 -3
  121. package/lib/generated/registrar-standing-catalogue.mjs +18 -10
  122. package/lib/generated/retire-browser-catalog.mjs +332 -19
  123. package/lib/generated/{unicode-confusables-17.mjs → unicode-confusables.mjs} +33 -33
  124. package/lib/html-signals.mjs +7 -2
  125. package/lib/http-evidence-bounds.mjs +2 -8
  126. package/lib/http-intelligence.mjs +13 -1
  127. package/lib/idn-confusable-policy.mjs +6 -4
  128. package/lib/idn-confusables.mjs +1 -1
  129. package/lib/interchange-fidelity-registry.mjs +10 -0
  130. package/lib/lookup-contract-primitives.mjs +1 -1
  131. package/lib/lookup-diagnostics.mjs +1 -23
  132. package/lib/lookup-network-evidence-bounds.mjs +1 -10
  133. package/lib/lookup-progress.mjs +50 -1
  134. package/lib/lookup-response-contract.mjs +69 -40
  135. package/lib/lookup-response.mjs +5 -15
  136. package/lib/lookup-source-progress.mjs +8 -22
  137. package/lib/lookup.mjs +1 -1
  138. package/lib/opportunity-scoring.mjs +2 -107
  139. package/lib/outbound-identity.mjs +1 -1
  140. package/lib/page-fingerprints.mjs +18 -1
  141. package/lib/perceptual-hash-comparison.mjs +2 -34
  142. package/lib/perceptual-hash.mjs +36 -10
  143. package/lib/portable-generator.mjs +2 -29
  144. package/lib/project-metadata.mjs +2 -8
  145. package/lib/rdap-client.mjs +11 -7
  146. package/lib/registrable-domain.mjs +2 -56
  147. package/lib/registrar-standing-contract.mjs +1 -1
  148. package/lib/registrar-standing.mjs +9 -13
  149. package/lib/registry-capabilities.mjs +2 -2
  150. package/lib/registry-capability-catalogue.mjs +27 -19
  151. package/lib/risk-calibration-summary.mjs +2 -352
  152. package/lib/risk-scoring.mjs +2 -345
  153. package/lib/scoring-evidence-quality.mjs +2 -107
  154. package/lib/semantic-version.mjs +2 -54
  155. package/lib/service-binding-dns.mjs +27 -0
  156. package/lib/smtp-transport-review.mjs +48 -19
  157. package/lib/sslbl-certificates.generated.mjs +141 -139
  158. package/lib/static-html-analysis.mjs +1 -1
  159. package/lib/structured-data-identity.mjs +1 -1
  160. package/lib/threat-intelligence-manifests.mjs +1 -1
  161. package/lib/threat-intelligence-runtime.mjs +1 -1
  162. package/lib/threat-intelligence-targets.mjs +1 -1
  163. package/lib/threat-intelligence-types.mjs +2 -75
  164. package/lib/typosquat-generator.mjs +11 -2
  165. package/lib/website-enrichment.mjs +388 -0
  166. package/lib/whois-authority.mjs +43 -5
  167. package/lib/whois-normalization.mjs +3 -1
  168. package/lib/whois-parser.mjs +5 -3
  169. package/package.json +13 -14
  170. package/packages/analysis/analyst-taxonomy.mjs +40 -0
  171. package/packages/analysis/bounded-json.mjs +330 -0
  172. package/packages/analysis/candidate-provenance-bounds.mjs +4 -0
  173. package/packages/analysis/cli-argument-grammar.mjs +216 -0
  174. package/packages/analysis/ct-query.mjs +27 -0
  175. package/packages/analysis/ct-response-bounds.mjs +9 -0
  176. package/packages/analysis/external-intelligence-risk.mjs +124 -0
  177. package/packages/analysis/http-evidence-bounds.mjs +8 -0
  178. package/packages/analysis/lookup-network-evidence-bounds.mjs +10 -0
  179. package/packages/analysis/opportunity-scoring.mjs +107 -0
  180. package/packages/analysis/perceptual-hash-comparison.mjs +34 -0
  181. package/packages/analysis/portable-generator.mjs +29 -0
  182. package/packages/analysis/project-metadata.mjs +8 -0
  183. package/packages/analysis/registrable-domain.mjs +56 -0
  184. package/packages/analysis/risk-calibration-summary.mjs +352 -0
  185. package/packages/analysis/risk-scoring.mjs +345 -0
  186. package/packages/analysis/scoring-evidence-quality.mjs +107 -0
  187. package/packages/analysis/semantic-version.mjs +54 -0
  188. package/packages/analysis/threat-intelligence-types.mjs +75 -0
  189. package/packages/cases/case-evidence-links.mjs +135 -0
  190. package/packages/cases/case-evidence-model.mjs +78 -12
  191. package/packages/cases/case-evidence-quality.mjs +5 -0
  192. package/packages/cases/case-export-input.mjs +7 -5
  193. package/packages/cases/case-incident-context.mjs +52 -0
  194. package/packages/cases/case-markdown.mjs +11 -0
  195. package/packages/cases/case-migration-model.mjs +40 -24
  196. package/packages/cases/case-recheck-model.mjs +90 -32
  197. package/packages/cases/case-record-contracts.mjs +1 -1
  198. package/packages/cases/case-record-core.mjs +1 -1
  199. package/packages/cases/case-record-operations.mjs +40 -112
  200. package/packages/cases/case-record-projection.mjs +8 -1
  201. package/packages/cases/case-record-version-input.mjs +19 -0
  202. package/packages/cases/case-report.mjs +63 -27
  203. package/packages/cases/case-requested-evidence.mjs +146 -0
  204. package/packages/cases/case-response-actions.mjs +103 -1
  205. package/packages/cases/case-response-model.mjs +9 -1
  206. package/packages/cases/case-response-outcomes.mjs +29 -8
  207. package/packages/cases/case-response-packet-render.mjs +13 -9
  208. package/packages/cases/case-response-packet.mjs +25 -11
  209. package/packages/cases/case-response-records.mjs +0 -1
  210. package/packages/cases/case-response-review-inputs.mjs +14 -3
  211. package/packages/cases/case-storage-model.mjs +1 -1
  212. package/packages/cases/case-workflow-metadata.mjs +225 -0
  213. package/packages/cases/case-workflow-migration.mjs +43 -0
  214. package/packages/cases/http-summary.mjs +6 -1
  215. package/packages/comparison/favicon-similarity.mjs +1 -1
  216. package/packages/comparison/page-similarity.mjs +1 -1
  217. package/packages/comparison/relationship-evidence.mjs +21 -9
  218. package/packages/comparison/relationship-provenance.mjs +7 -1
  219. package/packages/contracts/analyst-interchange.mjs +28 -10
  220. package/packages/contracts/case-portability.mjs +118 -25
  221. package/packages/contracts/cli-command-semantics.mjs +2 -0
  222. package/packages/contracts/cli-grammar.mjs +6 -0
  223. package/packages/contracts/cli-lookup-brief.mjs +2 -0
  224. package/packages/contracts/context-review.mjs +24 -0
  225. package/packages/contracts/document-intake.mjs +11 -0
  226. package/packages/contracts/domain-control-flight-recorder.mjs +30 -14
  227. package/packages/contracts/domain-control-manifest.mjs +1 -1
  228. package/packages/contracts/domain-control-monitor.mjs +13 -2
  229. package/packages/contracts/domain-control-review.mjs +36 -15
  230. package/packages/contracts/har-review.mjs +2 -0
  231. package/packages/contracts/identity-events.mjs +4 -0
  232. package/packages/contracts/investigation-run.mjs +2 -0
  233. package/packages/contracts/ip-address.mjs +10 -0
  234. package/packages/contracts/mail-authentication.mjs +5 -0
  235. package/packages/contracts/message-intake.mjs +31 -0
  236. package/packages/contracts/offline-comparison.mjs +4 -1
  237. package/packages/contracts/passive-mail.mjs +10 -0
  238. package/packages/contracts/web-capture.mjs +2 -2
  239. package/packages/contracts/workspace-portability.mjs +63 -17
  240. package/packages/evidence/collection-quality.mjs +67 -0
  241. package/packages/evidence/dns-query-outcome.mjs +72 -0
  242. package/packages/evidence/email-recipient.mjs +18 -0
  243. package/packages/evidence/lookup-target.mjs +5 -1
  244. package/packages/evidence/observation.mjs +2 -0
  245. package/packages/evidence/png-pixels.mjs +117 -0
  246. package/packages/evidence/public-address-policy.mjs +83 -0
  247. package/packages/interchange/defensive-indicator-export.mjs +264 -0
  248. package/packages/interchange/external-findings-import.mjs +4 -12
  249. package/packages/interchange/managed-indicator-export.mjs +35 -0
  250. package/packages/interchange/managed-indicator-set.mjs +210 -0
  251. package/packages/interchange/misp-indicator-export.mjs +93 -0
  252. package/packages/interchange/sharing-policy.mjs +56 -0
  253. package/packages/interchange/stix-indicator-export.mjs +129 -0
  254. package/packages/interchange/web-capture-import.mjs +22 -15
  255. package/packages/investigation/acquisition-decision-packet.mjs +1 -1
  256. package/packages/investigation/bulk-mail-exposure.mjs +7 -13
  257. package/packages/investigation/capture-coverage.mjs +57 -0
  258. package/packages/investigation/connector-provenance-review.mjs +100 -0
  259. package/packages/investigation/context-review.mjs +35 -0
  260. package/packages/investigation/document-intake.mjs +81 -0
  261. package/packages/investigation/docx-intake.mjs +133 -0
  262. package/packages/investigation/domain-history-review.mjs +100 -0
  263. package/packages/investigation/domain-transition-review.mjs +47 -0
  264. package/packages/investigation/evidence-coverage-ledger.mjs +9 -1
  265. package/packages/investigation/har-intake.mjs +68 -0
  266. package/packages/investigation/identity-event-intake.mjs +131 -0
  267. package/packages/investigation/identity-incident-review.mjs +39 -0
  268. package/packages/investigation/incident-sequence-review.mjs +58 -0
  269. package/packages/investigation/intake-report.mjs +19 -0
  270. package/packages/investigation/investigation-manifest.mjs +2 -2
  271. package/packages/investigation/link-intake.mjs +179 -0
  272. package/packages/investigation/lookup-asset-graph.mjs +1 -1
  273. package/packages/investigation/mail-authentication-review.mjs +222 -0
  274. package/packages/investigation/mail-header-identity.mjs +209 -0
  275. package/packages/investigation/message-intake.mjs +195 -0
  276. package/packages/investigation/page-behaviour.mjs +113 -0
  277. package/packages/investigation/pdf-intake.mjs +155 -0
  278. package/packages/investigation/platform-continuity-review.mjs +60 -0
  279. package/packages/investigation/qr-intake.mjs +56 -0
  280. package/packages/investigation/requested-action-hints.mjs +11 -0
  281. package/packages/investigation/selected-input-review.mjs +17 -0
  282. package/packages/investigation/storefront-review.mjs +70 -0
  283. package/packages/workspace/brand-profile-model.mjs +2 -2
  284. package/packages/workspace/bulk-review-model.mjs +28 -26
  285. package/packages/workspace/bulk-session-model.mjs +23 -13
  286. package/packages/workspace/campaign-model.mjs +1 -1
  287. package/packages/workspace/detection-rule-model.mjs +1 -1
  288. package/packages/workspace/hostile-input.mjs +1 -1
  289. package/packages/workspace/investigation-guide.mjs +2 -2
  290. package/packages/workspace/investigation-template-model.mjs +26 -2
  291. package/packages/workspace/page-baseline.mjs +2 -2
  292. package/packages/workspace/relationship-observation-model.mjs +17 -13
  293. package/packages/workspace/shortlist-model.mjs +14 -5
  294. package/packages/workspace/watchlist-history.mjs +28 -12
  295. package/packages/workspace/watchlist-store.mjs +17 -5
  296. package/packages/workspace/website-snapshot-model.mjs +28 -3
  297. package/packages/workspace/workspace-archive-crypto.mjs +1 -1
  298. package/packages/workspace/workspace-archive.mjs +5 -4
  299. package/third-party-notices.txt +549 -16
  300. package/lib/hostname.mjs +0 -2
@@ -1,10 +1,11 @@
1
1
  // Generated by tools/retire-browser-catalog.mts from the pinned Retire.js
2
2
  // browser-library catalogue. Apache-2.0 licensed source; do not edit by hand.
3
3
  const RETIRE_BROWSER_CATALOG = Object.freeze({
4
- catalogVersion: "retire.js-5.4.3",
5
- sourceRevision: "db79fa77c86e24d91c9ce1934ad9f2a640242774",
6
- sourceSha256: "574f68690a6f5031ac7602936196a3f4531407bc79fafec0f49278241fda857a",
7
- sourceUrl: "https://github.com/RetireJS/retire.js/blob/db79fa77c86e24d91c9ce1934ad9f2a640242774/repository/jsrepository.json",
4
+ catalogVersion: "retire.js-2026.10.02",
5
+ sourceRevision: "305423aa277cd6aa55c75c37c51090eb98e72e62",
6
+ sourceUpdatedAt: "2026-10-02T11:46:05.000Z",
7
+ sourceSha256: "3b444e8cec14dfb4c77f519db559a6c03d626b4c5730cd062b07ca4395c96ad7",
8
+ sourceUrl: "https://github.com/RetireJS/retire.js/blob/305423aa277cd6aa55c75c37c51090eb98e72e62/repository/jsrepository.json",
8
9
  components: {
9
10
  "jquery": {
10
11
  "extractors": {
@@ -3545,6 +3546,17 @@ const RETIRE_BROWSER_CATALOG = Object.freeze({
3545
3546
  ],
3546
3547
  "githubID": "GHSA-55Q2-FJHQ-7XH7"
3547
3548
  }
3549
+ },
3550
+ {
3551
+ "below": "3.4.16",
3552
+ "severity": "low",
3553
+ "atOrAbove": "3.4.13",
3554
+ "cwe": [
3555
+ "CWE-79"
3556
+ ],
3557
+ "identifiers": {
3558
+ "githubID": "GHSA-P98J-92PF-MC4P"
3559
+ }
3548
3560
  }
3549
3561
  ]
3550
3562
  },
@@ -3911,6 +3923,20 @@ const RETIRE_BROWSER_CATALOG = Object.freeze({
3911
3923
  ],
3912
3924
  "githubID": "GHSA-WC69-RHJR-HC9G"
3913
3925
  }
3926
+ },
3927
+ {
3928
+ "below": "2.31.0",
3929
+ "severity": "medium",
3930
+ "atOrAbove": "2.29.2",
3931
+ "cwe": [
3932
+ "CWE-27"
3933
+ ],
3934
+ "identifiers": {
3935
+ "CVE": [
3936
+ "CVE-2026-17495"
3937
+ ],
3938
+ "githubID": "GHSA-4P3W-J4W9-5JQW"
3939
+ }
3914
3940
  }
3915
3941
  ]
3916
3942
  },
@@ -5222,21 +5248,6 @@ const RETIRE_BROWSER_CATALOG = Object.freeze({
5222
5248
  "githubID": "GHSA-42H9-826W-CGV3"
5223
5249
  }
5224
5250
  },
5225
- {
5226
- "below": "0.33.0",
5227
- "severity": "medium",
5228
- "atOrAbove": "0.28.0",
5229
- "cwe": [
5230
- "CWE-400",
5231
- "CWE-770"
5232
- ],
5233
- "identifiers": {
5234
- "CVE": [
5235
- "CVE-2026-67312"
5236
- ],
5237
- "githubID": "GHSA-PMV8-RQ9R-6J72"
5238
- }
5239
- },
5240
5251
  {
5241
5252
  "below": "0.33.0",
5242
5253
  "severity": "medium",
@@ -5295,6 +5306,49 @@ const RETIRE_BROWSER_CATALOG = Object.freeze({
5295
5306
  "githubID": "GHSA-MMX7-HFXF-JPPX"
5296
5307
  }
5297
5308
  },
5309
+ {
5310
+ "below": "0.33.0",
5311
+ "severity": "medium",
5312
+ "atOrAbove": "0.28.0",
5313
+ "cwe": [
5314
+ "CWE-400",
5315
+ "CWE-770"
5316
+ ],
5317
+ "identifiers": {
5318
+ "CVE": [
5319
+ "CVE-2026-67312"
5320
+ ],
5321
+ "githubID": "GHSA-PMV8-RQ9R-6J72"
5322
+ }
5323
+ },
5324
+ {
5325
+ "below": "0.34.0",
5326
+ "severity": "medium",
5327
+ "atOrAbove": "0.27.2",
5328
+ "cwe": [
5329
+ "CWE-1321"
5330
+ ],
5331
+ "identifiers": {
5332
+ "CVE": [
5333
+ "CVE-2026-101902"
5334
+ ],
5335
+ "githubID": "GHSA-9FR6-4GFG-395G"
5336
+ }
5337
+ },
5338
+ {
5339
+ "below": "0.34.0",
5340
+ "severity": "high",
5341
+ "atOrAbove": "0.28.0",
5342
+ "cwe": [
5343
+ "CWE-1321"
5344
+ ],
5345
+ "identifiers": {
5346
+ "CVE": [
5347
+ "CVE-2026-101909"
5348
+ ],
5349
+ "githubID": "GHSA-X97P-JQ2G-JP4F"
5350
+ }
5351
+ },
5298
5352
  {
5299
5353
  "below": "1.6.0",
5300
5354
  "severity": "medium",
@@ -5881,6 +5935,180 @@ const RETIRE_BROWSER_CATALOG = Object.freeze({
5881
5935
  ],
5882
5936
  "githubID": "GHSA-XJ6Q-8X83-JV6G"
5883
5937
  }
5938
+ },
5939
+ {
5940
+ "below": "1.20.0",
5941
+ "severity": "medium",
5942
+ "atOrAbove": "1.0.0",
5943
+ "cwe": [
5944
+ "CWE-1321"
5945
+ ],
5946
+ "identifiers": {
5947
+ "CVE": [
5948
+ "CVE-2026-101902"
5949
+ ],
5950
+ "githubID": "GHSA-9FR6-4GFG-395G"
5951
+ }
5952
+ },
5953
+ {
5954
+ "below": "1.20.0",
5955
+ "severity": "medium",
5956
+ "atOrAbove": "1.0.0",
5957
+ "cwe": [
5958
+ "CWE-1321",
5959
+ "CWE-74"
5960
+ ],
5961
+ "identifiers": {
5962
+ "CVE": [
5963
+ "CVE-2026-101904"
5964
+ ],
5965
+ "githubID": "GHSA-J8RH-479H-CP32"
5966
+ }
5967
+ },
5968
+ {
5969
+ "below": "1.20.0",
5970
+ "severity": "medium",
5971
+ "atOrAbove": "1.7.0",
5972
+ "cwe": [
5973
+ "CWE-1321"
5974
+ ],
5975
+ "identifiers": {
5976
+ "CVE": [
5977
+ "CVE-2026-101908"
5978
+ ],
5979
+ "githubID": "GHSA-VH66-26GQ-Q6X8"
5980
+ }
5981
+ },
5982
+ {
5983
+ "below": "1.20.0",
5984
+ "severity": "medium",
5985
+ "atOrAbove": "1.12.0",
5986
+ "cwe": [
5987
+ "CWE-1321",
5988
+ "CWE-693",
5989
+ "CWE-74"
5990
+ ],
5991
+ "identifiers": {
5992
+ "CVE": [
5993
+ "CVE-2026-101900"
5994
+ ],
5995
+ "githubID": "GHSA-4HQW-QXG8-JXX2"
5996
+ }
5997
+ },
5998
+ {
5999
+ "below": "1.20.0",
6000
+ "severity": "high",
6001
+ "atOrAbove": "1.13.0",
6002
+ "cwe": [
6003
+ "CWE-918"
6004
+ ],
6005
+ "identifiers": {
6006
+ "CVE": [
6007
+ "CVE-2026-101898"
6008
+ ],
6009
+ "githubID": "GHSA-3PQ3-5FJ3-CG6V"
6010
+ }
6011
+ },
6012
+ {
6013
+ "below": "1.20.0",
6014
+ "severity": "high",
6015
+ "atOrAbove": "1.13.0",
6016
+ "cwe": [
6017
+ "CWE-400"
6018
+ ],
6019
+ "identifiers": {
6020
+ "CVE": [
6021
+ "CVE-2026-101901"
6022
+ ],
6023
+ "githubID": "GHSA-542G-H47M-68V8"
6024
+ }
6025
+ },
6026
+ {
6027
+ "below": "1.20.0",
6028
+ "severity": "medium",
6029
+ "atOrAbove": "1.15.0",
6030
+ "cwe": [
6031
+ "CWE-693"
6032
+ ],
6033
+ "identifiers": {
6034
+ "CVE": [
6035
+ "CVE-2026-101899"
6036
+ ],
6037
+ "githubID": "GHSA-44G4-M2MJ-WPVX"
6038
+ }
6039
+ },
6040
+ {
6041
+ "below": "1.20.0",
6042
+ "severity": "high",
6043
+ "atOrAbove": "1.15.0",
6044
+ "cwe": [
6045
+ "CWE-1333",
6046
+ "CWE-400"
6047
+ ],
6048
+ "identifiers": {
6049
+ "CVE": [
6050
+ "CVE-2026-101906"
6051
+ ],
6052
+ "githubID": "GHSA-MGHH-PGCX-3JJJ"
6053
+ }
6054
+ },
6055
+ {
6056
+ "below": "1.20.0",
6057
+ "severity": "high",
6058
+ "atOrAbove": "1.15.1",
6059
+ "cwe": [
6060
+ "CWE-1321"
6061
+ ],
6062
+ "identifiers": {
6063
+ "CVE": [
6064
+ "CVE-2026-101909"
6065
+ ],
6066
+ "githubID": "GHSA-X97P-JQ2G-JP4F"
6067
+ }
6068
+ },
6069
+ {
6070
+ "below": "1.20.0",
6071
+ "severity": "high",
6072
+ "atOrAbove": "1.15.2",
6073
+ "cwe": [
6074
+ "CWE-1321",
6075
+ "CWE-441"
6076
+ ],
6077
+ "identifiers": {
6078
+ "CVE": [
6079
+ "CVE-2026-101905"
6080
+ ],
6081
+ "githubID": "GHSA-M8M8-QJ5V-23W3"
6082
+ }
6083
+ },
6084
+ {
6085
+ "below": "1.20.0",
6086
+ "severity": "high",
6087
+ "atOrAbove": "1.16.1",
6088
+ "cwe": [
6089
+ "CWE-1333"
6090
+ ],
6091
+ "identifiers": {
6092
+ "CVE": [
6093
+ "CVE-2026-101903"
6094
+ ],
6095
+ "githubID": "GHSA-C29M-XWM3-CM6R"
6096
+ }
6097
+ },
6098
+ {
6099
+ "below": "1.20.0",
6100
+ "severity": "high",
6101
+ "atOrAbove": "1.17.0",
6102
+ "cwe": [
6103
+ "CWE-441",
6104
+ "CWE-601"
6105
+ ],
6106
+ "identifiers": {
6107
+ "CVE": [
6108
+ "CVE-2026-101907"
6109
+ ],
6110
+ "githubID": "GHSA-R4GJ-5M52-G5WH"
6111
+ }
5884
6112
  }
5885
6113
  ]
5886
6114
  },
@@ -5986,6 +6214,30 @@ const RETIRE_BROWSER_CATALOG = Object.freeze({
5986
6214
  ],
5987
6215
  "githubID": "GHSA-6V5V-WF23-FMFQ"
5988
6216
  }
6217
+ },
6218
+ {
6219
+ "below": "14.3.1",
6220
+ "severity": "medium",
6221
+ "atOrAbove": "0",
6222
+ "cwe": [
6223
+ "CWE-400",
6224
+ "CWE-407"
6225
+ ],
6226
+ "identifiers": {
6227
+ "githubID": "GHSA-253C-MCHW-3W2R"
6228
+ }
6229
+ },
6230
+ {
6231
+ "below": "15.0.1",
6232
+ "severity": "medium",
6233
+ "atOrAbove": "15.0.0",
6234
+ "cwe": [
6235
+ "CWE-400",
6236
+ "CWE-407"
6237
+ ],
6238
+ "identifiers": {
6239
+ "githubID": "GHSA-253C-MCHW-3W2R"
6240
+ }
5989
6241
  }
5990
6242
  ]
5991
6243
  },
@@ -7740,6 +7992,31 @@ const RETIRE_BROWSER_CATALOG = Object.freeze({
7740
7992
  "githubID": "GHSA-Q8WF-6R8G-63CH"
7741
7993
  }
7742
7994
  },
7995
+ {
7996
+ "below": "15.5.24",
7997
+ "severity": "critical",
7998
+ "atOrAbove": "10.0.0",
7999
+ "cwe": [
8000
+ "CWE-1395"
8001
+ ],
8002
+ "identifiers": {
8003
+ "githubID": "GHSA-2XP9-VWFH-VXW4"
8004
+ }
8005
+ },
8006
+ {
8007
+ "below": "15.5.24",
8008
+ "severity": "critical",
8009
+ "atOrAbove": "13.4.0",
8010
+ "cwe": [
8011
+ "CWE-22"
8012
+ ],
8013
+ "identifiers": {
8014
+ "CVE": [
8015
+ "CVE-2026-75604"
8016
+ ],
8017
+ "githubID": "GHSA-P293-QW3H-JR36"
8018
+ }
8019
+ },
7743
8020
  {
7744
8021
  "below": "15.6.0-canary.59",
7745
8022
  "severity": "high",
@@ -8336,6 +8613,42 @@ const RETIRE_BROWSER_CATALOG = Object.freeze({
8336
8613
  ],
8337
8614
  "githubID": "GHSA-Q8WF-6R8G-63CH"
8338
8615
  }
8616
+ },
8617
+ {
8618
+ "below": "16.3.3",
8619
+ "severity": "critical",
8620
+ "atOrAbove": "16.0.0",
8621
+ "cwe": [
8622
+ "CWE-1395"
8623
+ ],
8624
+ "identifiers": {
8625
+ "githubID": "GHSA-2XP9-VWFH-VXW4"
8626
+ }
8627
+ },
8628
+ {
8629
+ "below": "16.3.3",
8630
+ "severity": "critical",
8631
+ "atOrAbove": "16.0.0",
8632
+ "cwe": [
8633
+ "CWE-22"
8634
+ ],
8635
+ "identifiers": {
8636
+ "CVE": [
8637
+ "CVE-2026-75604"
8638
+ ],
8639
+ "githubID": "GHSA-P293-QW3H-JR36"
8640
+ }
8641
+ },
8642
+ {
8643
+ "below": "16.3.6",
8644
+ "severity": "critical",
8645
+ "atOrAbove": "16.2.0",
8646
+ "cwe": [
8647
+ "CWE-1395"
8648
+ ],
8649
+ "identifiers": {
8650
+ "githubID": "GHSA-VCVR-R3JV-PC5J"
8651
+ }
8339
8652
  }
8340
8653
  ]
8341
8654
  },
@@ -1,11 +1,11 @@
1
1
  // Generated by tools/unicode-confusable-audit.mts from the pinned Unicode
2
2
  // UTS #39 data file. Do not edit this projection by hand.
3
- export const GENERATED_CONFUSABLE_MAPPING_VERSION = "tr39-17.0.0-bounded-ascii-v3";
3
+ export const GENERATED_CONFUSABLE_MAPPING_VERSION = "tr39-18.0.0-bounded-ascii-v3";
4
4
  export const GENERATED_CONFUSABLE_SOURCE = Object.freeze({
5
5
  "standard": "Unicode UTS #39",
6
- "unicodeVersion": "17.0.0",
7
- "url": "https://www.unicode.org/Public/17.0.0/security/confusables.txt",
8
- "sha256": "091c7f82fc39ef208faf8f94d29c244de99254675e09de163160c810d13ef22a",
6
+ "unicodeVersion": "18.0.0",
7
+ "url": "https://www.unicode.org/Public/18.0.0/security/confusables.txt",
8
+ "sha256": "6ed3ee967c9dfdf6677d563c9985182fbc50a2efb7d6059cd57b2e2ce18f5b92",
9
9
  "license": "Unicode-3.0"
10
10
  });
11
11
  export const GENERATED_CONFUSABLE_POLICY = Object.freeze({
@@ -24,33 +24,33 @@ export const GENERATED_CONFUSABLE_POLICY = Object.freeze({
24
24
  "totalMappings": 312
25
25
  });
26
26
  export const GENERATED_CONFUSABLE_STATS = Object.freeze({
27
- "sourceBytes": 745683,
28
- "sourceLines": 9995,
29
- "parsedMappings": 6565,
30
- "eligibleMappings": 232,
31
- "projectedMappings": 111,
32
- "generationMappings": 101,
27
+ "sourceBytes": 763128,
28
+ "sourceLines": 9863,
29
+ "parsedMappings": 6712,
30
+ "eligibleMappings": 255,
31
+ "projectedMappings": 126,
32
+ "generationMappings": 115,
33
33
  "rejectedMalformedLines": 0,
34
- "rejectedOutsidePolicy": 5695,
34
+ "rejectedOutsidePolicy": 5780,
35
35
  "skeletonCapHits": 0,
36
- "generationCapHits": 3
36
+ "generationCapHits": 4
37
37
  });
38
38
  export const GENERATED_CONFUSABLE_GROUPS = Object.freeze({
39
- a: "аαɑ",
40
- b: "ьƄ",
41
- c: "сϲⅽᴄⲥ𐐽",
42
- d: "ԁⅾꓒ",
39
+ a: "аαɑꭤ",
40
+ b: "ьƄ𝈇",
41
+ c: "сϲⅽᴄⲥ𐐽ᲃ",
42
+ d: "ԁⅾꓒ𐆋",
43
43
  e: "еεҽꬲ",
44
- f: "ϝꞙƒẝꬵք",
44
+ f: "ϝꞙƒʄẝꬵ𐅾ք",
45
45
  g: "ɡƍᶃց",
46
46
  h: "һհ",
47
47
  i: "іιıɪɩⲓꙇւ",
48
- j: "јϳ",
48
+ j: "јϳȷյ",
49
49
  k: "κк",
50
- l: "ӏⅼǀꓲ",
51
- m: "мⅿ",
50
+ l: "ӏⅼǀꓲꞁꟾ",
51
+ m: "мⅿՠ",
52
52
  n: "ոռ",
53
- o: "оοօᴏⲟᴑꬽσϭ𐐬",
53
+ o: "оοօᴏⲟᴑꬽᲂσϭ𐐬",
54
54
  p: "рρϱⲣþƿϸⳏ",
55
55
  q: "ԛգզ",
56
56
  r: "гꭇꭈᴦⲅ",
@@ -58,25 +58,25 @@ export const GENERATED_CONFUSABLE_GROUPS = Object.freeze({
58
58
  t: "тτ",
59
59
  u: "υսᴜꭎʋꞟꭒ",
60
60
  v: "ѵνᴠ",
61
- w: "ԝաᴡшɯѡⲽ",
61
+ w: "ԝաᴡшɯꟺѡⲽ",
62
62
  x: "хχ",
63
63
  y: "уүʏγⲩɣᶌỿꭚ",
64
- z: "ᴢ",
64
+ z: "ᴢⱬⲍ",
65
65
  });
66
66
  export const GENERATED_GENERATION_CONFUSABLE_GROUPS = Object.freeze({
67
- a: "аαɑ",
68
- b: "ь",
69
- c: "сᴄⲥ𐐽",
70
- d: "ԁꓒ",
67
+ a: "аαɑꭤ",
68
+ b: "ь𝈇",
69
+ c: "сᴄⲥ𐐽ᲃ",
70
+ d: "ԁꓒ𐆋",
71
71
  e: "еεҽꬲ",
72
- f: "ϝꞙƒẝꬵք",
72
+ f: "ϝꞙƒʄẝꬵ𐅾ք",
73
73
  g: "ɡƍᶃց",
74
74
  h: "һհ",
75
75
  i: "іιıɪɩⲓꙇւ",
76
- j: "јϳ",
76
+ j: "јϳȷյ",
77
77
  k: "κк",
78
- l: "ӏǀꓲ",
79
- m: "м",
78
+ l: "ӏǀꓲꞁꟾ",
79
+ m: "мՠ",
80
80
  n: "ոռ",
81
81
  o: "оοօᴏⲟᴑꬽσ",
82
82
  p: "рρⲣþƿϸⳏ",
@@ -86,8 +86,8 @@ export const GENERATED_GENERATION_CONFUSABLE_GROUPS = Object.freeze({
86
86
  t: "тτ",
87
87
  u: "υսᴜꭎʋꞟꭒ",
88
88
  v: "ѵνᴠ",
89
- w: "ԝաᴡшɯѡⲽ",
89
+ w: "ԝաᴡшɯꟺѡⲽ",
90
90
  x: "хχ",
91
91
  y: "уүʏγⲩɣᶌỿ",
92
- z: "ᴢ",
92
+ z: "ᴢⱬⲍ",
93
93
  });
@@ -280,6 +280,7 @@ function extractPageRelationships(analysis, domain, options = {}) {
280
280
  let downloadFileTypeLimitReached = false;
281
281
  let perTagLimitReached = false;
282
282
  let resourceCountLimitReached = false;
283
+ let resourceIdentityTruncated = false;
283
284
  for (const element of analysis.elements) {
284
285
  if (!element.html || !RELATIONSHIP_TAGS.has(element.name))
285
286
  continue;
@@ -337,6 +338,8 @@ function extractPageRelationships(analysis, domain, options = {}) {
337
338
  discardedUrls += 1;
338
339
  continue;
339
340
  }
341
+ if (normalized.pathTruncated)
342
+ resourceIdentityTruncated = true;
340
343
  const key = `${reference.type}:${normalized.url}`;
341
344
  if (!resourceKeys.has(key)) {
342
345
  if (resourceKeys.size >= MAX_RESOURCE_TAGS) {
@@ -362,7 +365,7 @@ function extractPageRelationships(analysis, domain, options = {}) {
362
365
  tracking.truncated = true;
363
366
  const truncated = tagLimitReached || resourceOriginLimitReached || embeddedOriginLimitReached
364
367
  || contactDomainLimitReached || downloadOriginLimitReached || downloadFileTypeLimitReached
365
- || perTagLimitReached || resourceCountLimitReached || tracking.truncated;
368
+ || perTagLimitReached || resourceCountLimitReached || resourceIdentityTruncated || tracking.truncated;
366
369
  const limitations = [];
367
370
  if (tagLimitReached)
368
371
  limitations.push(`Resource parsing reached the ${MAX_RESOURCE_TAGS}-tag or ${MAX_IDENTITY_TAG_LENGTH}-character tag limit.`);
@@ -380,6 +383,8 @@ function extractPageRelationships(analysis, domain, options = {}) {
380
383
  limitations.push(`Some srcset URL candidates could not be safely enumerated within the ${MAX_URLS_PER_TAG}-candidate per-tag boundary.`);
381
384
  if (resourceCountLimitReached)
382
385
  limitations.push(`Only the first ${MAX_RESOURCE_TAGS} distinct resource references were examined.`);
386
+ if (resourceIdentityTruncated)
387
+ limitations.push('Overlong resource paths were reduced to origins; distinct resource counts may be incomplete.');
383
388
  if (tracking.truncated)
384
389
  limitations.push(`Only the first ${MAX_TRACKING_IDENTIFIERS} tracking identifiers were retained.`);
385
390
  return {
@@ -387,7 +392,7 @@ function extractPageRelationships(analysis, domain, options = {}) {
387
392
  count: resourceKeys.size,
388
393
  byType,
389
394
  externalOrigins: [...resourceOrigins].sort(),
390
- truncated: tagLimitReached || resourceOriginLimitReached || perTagLimitReached || resourceCountLimitReached,
395
+ truncated: tagLimitReached || resourceOriginLimitReached || perTagLimitReached || resourceCountLimitReached || resourceIdentityTruncated,
391
396
  },
392
397
  embeddedOrigins: [...embeddedOrigins].sort(),
393
398
  contactDomains: [...contactDomains].sort(),
@@ -1,8 +1,2 @@
1
- // Browser-safe bounds for the rich HTTP evidence contract and its compact
2
- // browser-local projection. Both producers and consumers import these values
3
- // so valid retained evidence is not rejected by a stale projection.
4
- import { MAX_OUTBOUND_HTTP_URL_CHARACTERS } from "../packages/contracts/http-url.mjs";
5
- export const MAX_HTTP_EVIDENCE_REDIRECTS = 5;
6
- export const MAX_HTTP_ATTEMPTS = 2;
7
- export const MAX_HTTP_PROVENANCE_URL = MAX_OUTBOUND_HTTP_URL_CHARACTERS;
8
- export const MAX_HTTP_ERROR_LENGTH = 180;
1
+ // Retained public import; the runtime-neutral implementation lives in the domain layer.
2
+ export * from "../packages/analysis/http-evidence-bounds.mjs";
@@ -4,8 +4,20 @@
4
4
  // additive evidence object suitable for API responses and exports.
5
5
  import { createObservation } from "../packages/evidence/observation.mjs";
6
6
  import { MAX_OUTBOUND_HTTP_URL_CHARACTERS } from "../packages/contracts/http-url.mjs";
7
- import { MAX_HTTP_ATTEMPTS, MAX_HTTP_ERROR_LENGTH, MAX_HTTP_EVIDENCE_REDIRECTS, MAX_HTTP_PROVENANCE_URL, } from "./http-evidence-bounds.mjs";
7
+ import { MAX_HTTP_ATTEMPTS, MAX_HTTP_ERROR_LENGTH, MAX_HTTP_EVIDENCE_REDIRECTS, MAX_HTTP_PROVENANCE_URL, } from "../packages/analysis/http-evidence-bounds.mjs";
8
8
  import { HTTP_DELIVERY_LIMITATIONS, HTTP_DELIVERY_METADATA_VERSION, MAX_HTTP_CACHE_SECONDS, MAX_HTTP_DELIVERY_HEADER_BYTES, MAX_HTTP_DELIVERY_TOKENS, } from "./homepage-metadata-contract.mjs";
9
+ /** Publish delivery metadata only at its owning response boundary. */
10
+ export function withoutHttpDeliveryMetadata(value) {
11
+ if (!value || typeof value !== 'object' || Array.isArray(value))
12
+ return value;
13
+ const output = { ...value };
14
+ if (output.response && typeof output.response === 'object' && !Array.isArray(output.response)) {
15
+ const response = { ...output.response };
16
+ delete response.deliveryMetadata;
17
+ output.response = response;
18
+ }
19
+ return output;
20
+ }
9
21
  const MAX_HTTP_REDIRECTS = MAX_HTTP_EVIDENCE_REDIRECTS;
10
22
  const MAX_HTTP_HEADER_LENGTH = 1024;
11
23
  const MAX_HTTP_DELIVERY_HEADER_LENGTH = MAX_HTTP_DELIVERY_HEADER_BYTES;
@@ -1,9 +1,9 @@
1
1
  // Versioned policy for projecting the Unicode UTS #39 confusables data into
2
2
  // WHOISleuth's intentionally small domain-label mapping. The full upstream
3
3
  // table is never shipped to browsers or consulted at runtime.
4
- export const UNICODE_CONFUSABLE_DATA_VERSION = '17.0.0';
5
- export const UNICODE_CONFUSABLE_SOURCE_URL = 'https://www.unicode.org/Public/17.0.0/security/confusables.txt';
6
- export const UNICODE_CONFUSABLE_SOURCE_SHA256 = '091c7f82fc39ef208faf8f94d29c244de99254675e09de163160c810d13ef22a';
4
+ export const UNICODE_CONFUSABLE_DATA_VERSION = '18.0.0';
5
+ export const UNICODE_CONFUSABLE_SOURCE_URL = `https://www.unicode.org/Public/${UNICODE_CONFUSABLE_DATA_VERSION}/security/confusables.txt`;
6
+ export const UNICODE_CONFUSABLE_SOURCE_SHA256 = '6ed3ee967c9dfdf6677d563c9985182fbc50a2efb7d6059cd57b2e2ce18f5b92';
7
7
  export const UNICODE_CONFUSABLE_LICENSE = 'Unicode-3.0';
8
8
  export const CONFUSABLE_PROJECTION_SCHEMA = 'whoisleuth.unicode-confusable-projection';
9
9
  export const CONFUSABLE_PROJECTION_VERSION = 1;
@@ -71,7 +71,9 @@ export const REVIEWED_GENERATION_CONFUSABLES = Object.freeze({
71
71
  l: 'ӏǀꓲ',
72
72
  m: 'м',
73
73
  n: 'ոռ',
74
- o: 'оοօᴏⲟ',
74
+ // Keep the complete previously generated o-set when newer source mappings
75
+ // compete for the same bounded generation slots.
76
+ o: 'оοօᴏⲟᴑꬽσ',
75
77
  p: 'рρⲣ',
76
78
  q: 'ԛգզ',
77
79
  r: 'гꭇ',
@@ -4,7 +4,7 @@
4
4
  // bounded projection of Unicode Technical Standard #39 data plus the existing
5
5
  // reviewed compatibility set. It focuses on characters that visually collapse
6
6
  // to common ASCII domain-label characters.
7
- import { GENERATED_CONFUSABLE_GROUPS, GENERATED_CONFUSABLE_MAPPING_VERSION, GENERATED_GENERATION_CONFUSABLE_GROUPS, } from "./generated/unicode-confusables-17.mjs";
7
+ import { GENERATED_CONFUSABLE_GROUPS, GENERATED_CONFUSABLE_MAPPING_VERSION, GENERATED_GENERATION_CONFUSABLE_GROUPS, } from "./generated/unicode-confusables.mjs";
8
8
  import { MAX_GENERATION_CONFUSABLES_PER_ASCII, REVIEWED_GENERATION_CONFUSABLES, } from "./idn-confusable-policy.mjs";
9
9
  export const IDN_ANALYSIS_VERSION = 1;
10
10
  export const CONFUSABLE_MAPPING_VERSION = GENERATED_CONFUSABLE_MAPPING_VERSION;
@@ -1,4 +1,5 @@
1
1
  import { DOMAIN_CONTROL_MANIFEST_COMPATIBILITY } from "../packages/contracts/domain-control-manifest.mjs";
2
+ import { MANAGED_INDICATOR_SET_COMPATIBILITY } from "../packages/contracts/analyst-interchange.mjs";
2
3
  import { CLI_CASE_PACK_COMPATIBILITY, ENCRYPTED_WORKSPACE_ARCHIVE_COMPATIBILITY, WORKSPACE_ARCHIVE_COMPATIBILITY, } from "../packages/contracts/case-portability.mjs";
3
4
  import { LOOKUP_CLAIM_PASSPORT_COMPATIBILITY } from "../packages/contracts/investigation-portability.mjs";
4
5
  import { BRAND_PROFILE_EXPORT_COMPATIBILITY } from "../packages/contracts/workspace-portability.mjs";
@@ -16,6 +17,15 @@ function compatibilityReference(descriptor) {
16
17
  });
17
18
  }
18
19
  export const INTERCHANGE_ARTIFACT_CONTRACTS = Object.freeze([
20
+ Object.freeze({
21
+ id: 'managed_indicators', ...compatibilityReference(MANAGED_INDICATOR_SET_COMPATIBILITY),
22
+ versionField: 'version', nestedSchemaPath: Object.freeze([]),
23
+ browser: Object.freeze({ import: 'supported', export: 'supported' }),
24
+ cli: Object.freeze({ read: 'supported', write: 'supported', verify: 'supported' }),
25
+ fidelity: 'semantic_exact_after_normalisation', requiredAssurance: 'whole_integrity',
26
+ preservedFieldGroups: Object.freeze(['stable_indicator_identities', 'original_observations', 'review_windows', 'withdrawal_records', 'preceding_revision_digest']),
27
+ excludedFieldGroups: Object.freeze(['raw_responses', 'browser_local_records', 'credentials', 'remote_publication', 'author_authentication', 'unavailable_revision_history']),
28
+ }),
19
29
  Object.freeze({
20
30
  id: 'lookup_claim_passport',
21
31
  ...compatibilityReference(LOOKUP_CLAIM_PASSPORT_COMPATIBILITY),
@@ -2,7 +2,7 @@
2
2
  // child-profile contracts. These checks validate without normalising or
3
3
  // copying untrusted values.
4
4
  import { MAX_OBSERVATION_DIAGNOSTICS } from "../packages/evidence/observation.mjs";
5
- import { MAX_HTTP_PROVENANCE_URL } from "./http-evidence-bounds.mjs";
5
+ import { MAX_HTTP_PROVENANCE_URL } from "../packages/analysis/http-evidence-bounds.mjs";
6
6
  const LOOKUP_CONTROL_CHAR_RE = /[\u0000-\u001f\u007f-\u009f]|\p{Default_Ignorable_Code_Point}/u;
7
7
  const MAX_LOOKUP_CONTRACT_HOST_LENGTH = 253;
8
8
  function isJsonObject(value) {