@slicedearth/whoisleuth-cli 2.4.0 → 2.6.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.
Files changed (340) hide show
  1. package/DISCLOSURE +1 -1
  2. package/NOTICE +2 -2
  3. package/cli/argument-values.mjs +55 -0
  4. package/cli/arguments.mjs +24 -470
  5. package/cli/artifact-validation/case-response.mjs +67 -9
  6. package/cli/artifact-validation/lookup-evidence.mjs +18 -4
  7. package/cli/artifact-validation/signed-review.mjs +61 -64
  8. package/cli/artifact-verify.mjs +11 -2
  9. package/cli/assurance-arguments.mjs +56 -0
  10. package/cli/assurance-command-definitions.mjs +179 -0
  11. package/cli/assurance-command-runner.mjs +1 -1
  12. package/cli/bounded-json.mjs +1 -1
  13. package/cli/bulk-checkpoint.mjs +1 -1
  14. package/cli/bulk-command-runner.mjs +6 -8
  15. package/cli/bulk.mjs +2 -3
  16. package/cli/case-command.mjs +99 -6
  17. package/cli/case-pack.mjs +19 -4
  18. package/cli/ci-report.mjs +6 -3
  19. package/cli/collection-arguments.mjs +123 -0
  20. package/cli/collection-command-definitions.mjs +330 -0
  21. package/cli/collection-preflight.mjs +8 -1
  22. package/cli/command-argument-grammar.mjs +8 -210
  23. package/cli/command-definition.mjs +330 -0
  24. package/cli/command-reference.mjs +55 -1388
  25. package/cli/command-seeds.mjs +18 -0
  26. package/cli/compare.mjs +1 -1
  27. package/cli/config-profile.mjs +1 -1
  28. package/cli/ct-event-intake.mjs +4 -4
  29. package/cli/discover.mjs +2 -2
  30. package/cli/discovery-observation-snapshot.mjs +2 -2
  31. package/cli/discovery-scan-command-runner.mjs +7 -9
  32. package/cli/discovery-scan.mjs +1 -1
  33. package/cli/discovery-snapshot.mjs +2 -2
  34. package/cli/discovery-workflow.mjs +4 -4
  35. package/cli/domain-control-monitor.mjs +6 -6
  36. package/cli/domain-control-observations.mjs +2 -1
  37. package/cli/domain-feed.mjs +61 -0
  38. package/cli/errors.mjs +5 -6
  39. package/cli/evidence-arguments.mjs +46 -0
  40. package/cli/evidence-command-definitions.mjs +69 -0
  41. package/cli/evidence-command-runner.mjs +2 -3
  42. package/cli/evidence-signing.mjs +3 -2
  43. package/cli/external-observation-mapping.mjs +2 -2
  44. package/cli/formatters/json.mjs +1 -13
  45. package/cli/formatters/terminal-command-formats.mjs +6 -0
  46. package/cli/formatters/terminal-lookup.mjs +6 -0
  47. package/cli/history-arguments.mjs +39 -0
  48. package/cli/history-command-definitions.mjs +88 -0
  49. package/cli/indicator-set-command.mjs +32 -0
  50. package/cli/inline-command-families.mjs +6 -47
  51. package/cli/inline-command-runner.mjs +4 -31
  52. package/cli/input.mjs +2 -2
  53. package/cli/intake-command.mjs +147 -0
  54. package/cli/interchange-report.mjs +4 -2
  55. package/cli/investigation-artifacts.mjs +3 -4
  56. package/cli/investigation-package-review.mjs +2 -0
  57. package/cli/investigation-plan.mjs +32 -154
  58. package/cli/investigation-recipes.mjs +177 -0
  59. package/cli/investigation-run.mjs +78 -12
  60. package/cli/local-mmdb-review.mjs +220 -17
  61. package/cli/lookalike-calibration.mjs +1 -1
  62. package/cli/lookup-brief.mjs +2 -2
  63. package/cli/lookup-command-runner.mjs +19 -35
  64. package/cli/lookup-diff.mjs +10 -9
  65. package/cli/lookup-plan.mjs +10 -14
  66. package/cli/lookup-reconcile.mjs +6 -5
  67. package/cli/lookup-timeline.mjs +7 -6
  68. package/cli/mail-header-review.mjs +24 -247
  69. package/cli/mail-review.mjs +9 -7
  70. package/cli/network-arguments.mjs +51 -0
  71. package/cli/network-command-definitions.mjs +130 -0
  72. package/cli/network-command-runner.mjs +43 -31
  73. package/cli/offline-evidence-review.mjs +85 -6
  74. package/cli/posture.mjs +1 -1
  75. package/cli/registry-fixture-scaffold.mjs +1 -1
  76. package/cli/retained-artifact-diff.mjs +8 -7
  77. package/cli/review-arguments.mjs +132 -0
  78. package/cli/review-command-definitions.mjs +279 -0
  79. package/cli/review-command-runner.mjs +72 -159
  80. package/cli/risk-calibration.mjs +14 -12
  81. package/cli/runner.mjs +20 -32
  82. package/cli/saved-lookup.mjs +2 -2
  83. package/cli/selected-input-worker.mjs +73 -0
  84. package/cli/sharing-review.mjs +5 -64
  85. package/cli/source-reliability.mjs +2 -2
  86. package/cli/support-arguments.mjs +49 -0
  87. package/cli/support-command-definitions.mjs +209 -0
  88. package/cli/support-command-runner.mjs +4 -4
  89. package/cli/watchlist-review.mjs +43 -0
  90. package/cli/workflow-arguments.mjs +100 -0
  91. package/cli/workflow-command-definitions.mjs +103 -0
  92. package/cli/workflow-command-runner.mjs +40 -1
  93. package/docs/cli-reference.md +27 -0
  94. package/docs/cli.md +322 -4
  95. package/docs/contextual-reviews.md +178 -0
  96. package/docs/infrastructure-observations.md +126 -0
  97. package/docs/offline-intake-context.md +213 -0
  98. package/lib/analyst-taxonomy.mjs +2 -40
  99. package/lib/application-version.mjs +1 -1
  100. package/lib/availability.mjs +13 -789
  101. package/lib/bounded-contract-normalizers.mjs +4 -0
  102. package/lib/bounded-json.mjs +2 -330
  103. package/lib/browser-library-profile.mjs +62 -84
  104. package/lib/candidate-provenance-bounds.mjs +2 -0
  105. package/lib/classify.mjs +1 -1
  106. package/lib/credential-form-attribution.mjs +136 -0
  107. package/lib/credential-surface-profile.mjs +6 -2
  108. package/lib/ct-query.mjs +2 -27
  109. package/lib/ct-response-bounds.mjs +2 -9
  110. package/lib/ct-search.mjs +83 -47
  111. package/lib/dmarc-discovery.mjs +62 -0
  112. package/lib/dns-convergence-review.mjs +21 -8
  113. package/lib/dns-delegation-health.mjs +35 -15
  114. package/lib/dns-inheritance-review.mjs +53 -63
  115. package/lib/dns-intelligence.mjs +27 -11
  116. package/lib/dns-query-coverage.mjs +40 -0
  117. package/lib/domain-assurance.mjs +1 -1
  118. package/lib/domain-change-packet.mjs +12 -13
  119. package/lib/domain-change-review.mjs +32 -14
  120. package/lib/domain-control-flight-recorder.mjs +103 -27
  121. package/lib/domain-control-manifest.mjs +25 -17
  122. package/lib/domain-posture-analysis.mjs +75 -7
  123. package/lib/domain-posture-parsers.mjs +9 -0
  124. package/lib/domain-posture.mjs +45 -25
  125. package/lib/domain-registration.mjs +392 -0
  126. package/lib/evidence-export-privacy.mjs +27 -17
  127. package/lib/evidence-export.mjs +3 -3
  128. package/lib/evidence-report.mjs +5 -1
  129. package/lib/external-intelligence-risk.mjs +2 -124
  130. package/lib/favicon.mjs +13 -4
  131. package/lib/generated/cisa-kev-catalog.mjs +41 -3
  132. package/lib/generated/registrar-standing-catalogue.mjs +18 -10
  133. package/lib/generated/retire-browser-catalog.mjs +332 -19
  134. package/lib/generated/{unicode-confusables-17.mjs → unicode-confusables.mjs} +33 -33
  135. package/lib/html-signals.mjs +13 -2
  136. package/lib/http-evidence-bounds.mjs +2 -8
  137. package/lib/http-intelligence.mjs +13 -1
  138. package/lib/idn-confusable-policy.mjs +6 -4
  139. package/lib/idn-confusables.mjs +1 -1
  140. package/lib/interchange-fidelity-registry.mjs +10 -0
  141. package/lib/lookup-child-profile-contract.mjs +28 -11
  142. package/lib/lookup-contract-primitives.mjs +1 -1
  143. package/lib/lookup-diagnostics.mjs +1 -23
  144. package/lib/lookup-network-evidence-bounds.mjs +1 -10
  145. package/lib/lookup-progress.mjs +50 -1
  146. package/lib/lookup-response-contract.mjs +70 -40
  147. package/lib/lookup-response.mjs +5 -15
  148. package/lib/lookup-source-progress.mjs +8 -22
  149. package/lib/lookup.mjs +1 -1
  150. package/lib/operation-budget.mjs +4 -0
  151. package/lib/opportunity-scoring.mjs +2 -107
  152. package/lib/outbound-identity.mjs +1 -1
  153. package/lib/page-fingerprints.mjs +18 -1
  154. package/lib/perceptual-hash-comparison.mjs +2 -34
  155. package/lib/perceptual-hash.mjs +36 -10
  156. package/lib/portable-generator.mjs +2 -29
  157. package/lib/project-metadata.mjs +2 -8
  158. package/lib/rdap-client.mjs +11 -7
  159. package/lib/registrable-domain.mjs +2 -56
  160. package/lib/registrar-standing-contract.mjs +1 -1
  161. package/lib/registrar-standing.mjs +9 -13
  162. package/lib/registry-capabilities.mjs +2 -2
  163. package/lib/registry-capability-catalogue.mjs +27 -19
  164. package/lib/risk-calibration-summary.mjs +2 -352
  165. package/lib/risk-scoring.mjs +2 -345
  166. package/lib/scoring-evidence-quality.mjs +2 -107
  167. package/lib/semantic-version.mjs +2 -54
  168. package/lib/service-binding-dns.mjs +46 -2
  169. package/lib/smtp-transport-review.mjs +48 -19
  170. package/lib/sslbl-certificates.generated.mjs +142 -139
  171. package/lib/static-html-analysis.mjs +32 -4
  172. package/lib/structured-data-identity.mjs +1 -1
  173. package/lib/technology-evidence-role.mjs +1 -51
  174. package/lib/threat-intelligence-manifests.mjs +1 -1
  175. package/lib/threat-intelligence-runtime.mjs +1 -1
  176. package/lib/threat-intelligence-targets.mjs +1 -1
  177. package/lib/threat-intelligence-types.mjs +2 -75
  178. package/lib/tls-intelligence.mjs +30 -5
  179. package/lib/typosquat-generator.mjs +11 -2
  180. package/lib/website-enrichment.mjs +404 -0
  181. package/lib/whois-authority.mjs +43 -5
  182. package/lib/whois-chain.mjs +12 -3
  183. package/lib/whois-common-formats.mjs +3 -1
  184. package/lib/whois-contacts.mjs +13 -2
  185. package/lib/whois-normalization.mjs +3 -1
  186. package/lib/whois-parser.mjs +5 -3
  187. package/package.json +15 -14
  188. package/packages/analysis/analyst-taxonomy.mjs +40 -0
  189. package/packages/analysis/bounded-json.mjs +330 -0
  190. package/packages/analysis/candidate-provenance-bounds.mjs +4 -0
  191. package/packages/analysis/cli-argument-grammar.mjs +216 -0
  192. package/packages/analysis/ct-query.mjs +27 -0
  193. package/packages/analysis/ct-response-bounds.mjs +9 -0
  194. package/packages/analysis/external-intelligence-risk.mjs +124 -0
  195. package/packages/analysis/http-evidence-bounds.mjs +8 -0
  196. package/packages/analysis/lookup-network-evidence-bounds.mjs +10 -0
  197. package/packages/analysis/opportunity-scoring.mjs +107 -0
  198. package/packages/analysis/perceptual-hash-comparison.mjs +34 -0
  199. package/packages/analysis/portable-generator.mjs +29 -0
  200. package/packages/analysis/project-metadata.mjs +8 -0
  201. package/packages/analysis/registrable-domain.mjs +56 -0
  202. package/packages/analysis/risk-calibration-summary.mjs +352 -0
  203. package/packages/analysis/risk-scoring.mjs +348 -0
  204. package/packages/analysis/scoring-evidence-quality.mjs +107 -0
  205. package/packages/analysis/semantic-version.mjs +54 -0
  206. package/packages/analysis/threat-intelligence-types.mjs +75 -0
  207. package/packages/cases/case-containment-handoff.mjs +195 -0
  208. package/packages/cases/case-evidence-links.mjs +151 -0
  209. package/packages/cases/case-evidence-model.mjs +89 -12
  210. package/packages/cases/case-evidence-quality.mjs +5 -0
  211. package/packages/cases/case-export-input.mjs +7 -5
  212. package/packages/cases/case-incident-context.mjs +52 -0
  213. package/packages/cases/case-markdown.mjs +11 -0
  214. package/packages/cases/case-migration-model.mjs +40 -24
  215. package/packages/cases/case-object-coverage.mjs +33 -0
  216. package/packages/cases/case-packet-correction.mjs +106 -0
  217. package/packages/cases/case-recheck-model.mjs +124 -36
  218. package/packages/cases/case-record-contracts.mjs +1 -1
  219. package/packages/cases/case-record-core.mjs +1 -1
  220. package/packages/cases/case-record-operations.mjs +111 -118
  221. package/packages/cases/case-record-projection.mjs +23 -4
  222. package/packages/cases/case-record-version-input.mjs +41 -0
  223. package/packages/cases/case-report.mjs +93 -27
  224. package/packages/cases/case-requested-evidence.mjs +146 -0
  225. package/packages/cases/case-response-actions.mjs +159 -1
  226. package/packages/cases/case-response-model.mjs +16 -1
  227. package/packages/cases/case-response-object.mjs +119 -0
  228. package/packages/cases/case-response-outcomes.mjs +108 -20
  229. package/packages/cases/case-response-packet-render.mjs +35 -12
  230. package/packages/cases/case-response-packet.mjs +55 -13
  231. package/packages/cases/case-response-records.mjs +0 -1
  232. package/packages/cases/case-response-review-inputs.mjs +60 -8
  233. package/packages/cases/case-storage-model.mjs +1 -1
  234. package/packages/cases/case-workflow-metadata.mjs +217 -0
  235. package/packages/cases/case-workflow-migration.mjs +43 -0
  236. package/packages/cases/http-summary.mjs +6 -1
  237. package/packages/comparison/favicon-similarity.mjs +1 -1
  238. package/packages/comparison/page-similarity.mjs +1 -1
  239. package/packages/comparison/relationship-evidence.mjs +21 -9
  240. package/packages/comparison/relationship-provenance.mjs +7 -1
  241. package/packages/contracts/analyst-interchange.mjs +35 -15
  242. package/packages/contracts/candidate-watch-review.mjs +54 -0
  243. package/packages/contracts/case-portability.mjs +360 -49
  244. package/packages/contracts/cli-command-semantics.mjs +5 -0
  245. package/packages/contracts/cli-grammar.mjs +6 -0
  246. package/packages/contracts/cli-lookup-brief.mjs +2 -0
  247. package/packages/contracts/context-review.mjs +25 -0
  248. package/packages/contracts/document-intake.mjs +11 -0
  249. package/packages/contracts/domain-control-flight-recorder.mjs +30 -14
  250. package/packages/contracts/domain-control-manifest.mjs +1 -1
  251. package/packages/contracts/domain-control-monitor.mjs +13 -2
  252. package/packages/contracts/domain-control-review.mjs +36 -15
  253. package/packages/contracts/external-observation-interchange.mjs +96 -28
  254. package/packages/contracts/har-review.mjs +2 -0
  255. package/packages/contracts/identity-events.mjs +4 -0
  256. package/packages/contracts/investigation-run.mjs +2 -0
  257. package/packages/contracts/ip-address.mjs +10 -0
  258. package/packages/contracts/lookup-evidence.mjs +3 -2
  259. package/packages/contracts/mail-authentication.mjs +5 -0
  260. package/packages/contracts/message-intake.mjs +37 -0
  261. package/packages/contracts/offline-comparison.mjs +4 -1
  262. package/packages/contracts/passive-mail.mjs +10 -0
  263. package/packages/contracts/risk-calibration.mjs +44 -29
  264. package/packages/contracts/schema-lifecycle.mjs +3 -1
  265. package/packages/contracts/web-capture.mjs +2 -2
  266. package/packages/contracts/workspace-portability.mjs +144 -28
  267. package/packages/evidence/collection-quality.mjs +67 -0
  268. package/packages/evidence/credential-form-attribution.mjs +60 -0
  269. package/packages/evidence/dns-query-outcome.mjs +72 -0
  270. package/packages/evidence/email-recipient.mjs +18 -0
  271. package/packages/evidence/image-regions.mjs +15 -0
  272. package/packages/evidence/lookup-target.mjs +5 -1
  273. package/packages/evidence/observation.mjs +2 -0
  274. package/packages/evidence/png-pixels.mjs +117 -0
  275. package/packages/evidence/public-address-policy.mjs +83 -0
  276. package/packages/evidence/record-identity.mjs +60 -16
  277. package/packages/evidence/technology-evidence-role.mjs +51 -0
  278. package/packages/interchange/defensive-indicator-export.mjs +264 -0
  279. package/packages/interchange/external-findings-import.mjs +36 -29
  280. package/packages/interchange/json-output.mjs +14 -0
  281. package/packages/interchange/managed-indicator-export.mjs +36 -0
  282. package/packages/interchange/managed-indicator-set.mjs +223 -0
  283. package/packages/interchange/misp-indicator-export.mjs +93 -0
  284. package/packages/interchange/sharing-policy.mjs +56 -0
  285. package/packages/interchange/stix-indicator-export.mjs +129 -0
  286. package/packages/interchange/web-capture-import.mjs +22 -15
  287. package/packages/investigation/acquisition-decision-packet.mjs +79 -1
  288. package/packages/investigation/bulk-mail-exposure.mjs +7 -13
  289. package/packages/investigation/capture-coverage.mjs +57 -0
  290. package/packages/investigation/connector-provenance-review.mjs +100 -0
  291. package/packages/investigation/context-review.mjs +35 -0
  292. package/packages/investigation/document-intake.mjs +87 -0
  293. package/packages/investigation/docx-intake.mjs +133 -0
  294. package/packages/investigation/domain-history-review.mjs +132 -0
  295. package/packages/investigation/domain-transition-review.mjs +49 -0
  296. package/packages/investigation/evidence-coverage-ledger.mjs +9 -1
  297. package/packages/investigation/har-intake.mjs +68 -0
  298. package/packages/investigation/identity-event-intake.mjs +131 -0
  299. package/packages/investigation/identity-incident-review.mjs +39 -0
  300. package/packages/investigation/incident-sequence-review.mjs +58 -0
  301. package/packages/investigation/infrastructure-observation.mjs +234 -0
  302. package/packages/investigation/intake-context.mjs +284 -0
  303. package/packages/investigation/intake-indicators.mjs +116 -0
  304. package/packages/investigation/intake-phones.mjs +155 -0
  305. package/packages/investigation/intake-report.mjs +20 -0
  306. package/packages/investigation/investigation-manifest.mjs +35 -9
  307. package/packages/investigation/link-intake.mjs +209 -0
  308. package/packages/investigation/lookup-asset-graph.mjs +1 -1
  309. package/packages/investigation/mail-authentication-review.mjs +222 -0
  310. package/packages/investigation/mail-header-identity.mjs +209 -0
  311. package/packages/investigation/message-intake.mjs +235 -0
  312. package/packages/investigation/page-behaviour.mjs +113 -0
  313. package/packages/investigation/pdf-intake.mjs +155 -0
  314. package/packages/investigation/platform-continuity-review.mjs +60 -0
  315. package/packages/investigation/qr-intake.mjs +56 -0
  316. package/packages/investigation/requested-action-hints.mjs +11 -0
  317. package/packages/investigation/selected-input-review.mjs +17 -0
  318. package/packages/investigation/storefront-review.mjs +70 -0
  319. package/packages/monitoring/domain-feed.mjs +321 -0
  320. package/packages/workspace/brand-candidate-workflow.mjs +351 -0
  321. package/packages/workspace/brand-keyword-campaign.mjs +231 -0
  322. package/packages/workspace/brand-profile-model.mjs +48 -4
  323. package/packages/workspace/bulk-review-model.mjs +28 -26
  324. package/packages/workspace/bulk-session-model.mjs +27 -13
  325. package/packages/workspace/campaign-model.mjs +1 -1
  326. package/packages/workspace/candidate-watch-handoff.mjs +195 -0
  327. package/packages/workspace/detection-rule-model.mjs +11 -3
  328. package/packages/workspace/hostile-input.mjs +1 -1
  329. package/packages/workspace/investigation-guide.mjs +2 -2
  330. package/packages/workspace/investigation-template-model.mjs +26 -2
  331. package/packages/workspace/page-baseline.mjs +2 -2
  332. package/packages/workspace/relationship-observation-model.mjs +17 -13
  333. package/packages/workspace/shortlist-model.mjs +24 -7
  334. package/packages/workspace/watchlist-history.mjs +59 -16
  335. package/packages/workspace/watchlist-store.mjs +152 -11
  336. package/packages/workspace/website-snapshot-model.mjs +28 -3
  337. package/packages/workspace/workspace-archive-crypto.mjs +1 -1
  338. package/packages/workspace/workspace-archive.mjs +5 -4
  339. package/third-party-notices.txt +549 -16
  340. 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
  });
@@ -6,6 +6,8 @@
6
6
  import { isIP } from 'node:net';
7
7
  import { domainToASCII } from 'node:url';
8
8
  import { analyzeCredentialSurfaceProfile } from "./credential-surface-profile.mjs";
9
+ import { attributeCredentialForms } from "./credential-form-attribution.mjs";
10
+ import { externalPasswordFormObservation } from "../packages/evidence/credential-form-attribution.mjs";
9
11
  import { analyzeClientBehavior } from "./client-behavior-profile.mjs";
10
12
  import { createObservation } from "../packages/evidence/observation.mjs";
11
13
  import { createPageFingerprints } from "./page-fingerprints.mjs";
@@ -280,6 +282,7 @@ function extractPageRelationships(analysis, domain, options = {}) {
280
282
  let downloadFileTypeLimitReached = false;
281
283
  let perTagLimitReached = false;
282
284
  let resourceCountLimitReached = false;
285
+ let resourceIdentityTruncated = false;
283
286
  for (const element of analysis.elements) {
284
287
  if (!element.html || !RELATIONSHIP_TAGS.has(element.name))
285
288
  continue;
@@ -337,6 +340,8 @@ function extractPageRelationships(analysis, domain, options = {}) {
337
340
  discardedUrls += 1;
338
341
  continue;
339
342
  }
343
+ if (normalized.pathTruncated)
344
+ resourceIdentityTruncated = true;
340
345
  const key = `${reference.type}:${normalized.url}`;
341
346
  if (!resourceKeys.has(key)) {
342
347
  if (resourceKeys.size >= MAX_RESOURCE_TAGS) {
@@ -362,7 +367,7 @@ function extractPageRelationships(analysis, domain, options = {}) {
362
367
  tracking.truncated = true;
363
368
  const truncated = tagLimitReached || resourceOriginLimitReached || embeddedOriginLimitReached
364
369
  || contactDomainLimitReached || downloadOriginLimitReached || downloadFileTypeLimitReached
365
- || perTagLimitReached || resourceCountLimitReached || tracking.truncated;
370
+ || perTagLimitReached || resourceCountLimitReached || resourceIdentityTruncated || tracking.truncated;
366
371
  const limitations = [];
367
372
  if (tagLimitReached)
368
373
  limitations.push(`Resource parsing reached the ${MAX_RESOURCE_TAGS}-tag or ${MAX_IDENTITY_TAG_LENGTH}-character tag limit.`);
@@ -380,6 +385,8 @@ function extractPageRelationships(analysis, domain, options = {}) {
380
385
  limitations.push(`Some srcset URL candidates could not be safely enumerated within the ${MAX_URLS_PER_TAG}-candidate per-tag boundary.`);
381
386
  if (resourceCountLimitReached)
382
387
  limitations.push(`Only the first ${MAX_RESOURCE_TAGS} distinct resource references were examined.`);
388
+ if (resourceIdentityTruncated)
389
+ limitations.push('Overlong resource paths were reduced to origins; distinct resource counts may be incomplete.');
383
390
  if (tracking.truncated)
384
391
  limitations.push(`Only the first ${MAX_TRACKING_IDENTIFIERS} tracking identifiers were retained.`);
385
392
  return {
@@ -387,7 +394,7 @@ function extractPageRelationships(analysis, domain, options = {}) {
387
394
  count: resourceKeys.size,
388
395
  byType,
389
396
  externalOrigins: [...resourceOrigins].sort(),
390
- truncated: tagLimitReached || resourceOriginLimitReached || perTagLimitReached || resourceCountLimitReached,
397
+ truncated: tagLimitReached || resourceOriginLimitReached || perTagLimitReached || resourceCountLimitReached || resourceIdentityTruncated,
391
398
  },
392
399
  embeddedOrigins: [...embeddedOrigins].sort(),
393
400
  contactDomains: [...contactDomains].sort(),
@@ -714,10 +721,12 @@ async function extractHtmlSignals(html, domain, options = {}) {
714
721
  const pageLanguageSignal = detectPageLanguageSignal(html, pageIdentity?.documentLanguage, htmlAnalysis);
715
722
  const domainSaleSignal = options.sourceTruncated !== true && domainSaleLandingPage(htmlAnalysis, domain)
716
723
  ? 'explicit domain-sale landing-page content' : null;
724
+ const formAttribution = attributeCredentialForms(htmlAnalysis, documentUrl, options.sourceTruncated);
717
725
  return {
718
726
  domainSaleSignal,
719
727
  pageTitle: htmlAnalysis.title,
720
728
  hasPasswordField: htmlAnalysis.forms.categories.password > 0,
729
+ hasExternalPasswordForm: externalPasswordFormObservation(formAttribution),
721
730
  phishingLanguageMatch: pageLanguageSignal?.label ?? null,
722
731
  hasExternalFormAction: pageIdentity
723
732
  ? pageIdentity.forms.externalActionOrigins.length > 0
@@ -727,6 +736,8 @@ async function extractHtmlSignals(html, domain, options = {}) {
727
736
  pageIdentity: pageIdentityOutput,
728
737
  credentialSurfaceProfile: includeCredentialSurfaceProfile && htmlAnalysis ? analyzeCredentialSurfaceProfile({
729
738
  htmlAnalysis,
739
+ formAttribution,
740
+ baseUrl: documentUrl,
730
741
  observedAt: options.observedAt,
731
742
  sourceTruncated: options.sourceTruncated,
732
743
  }) : null,
@@ -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;