@slicedearth/whoisleuth-cli 2.3.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 (418) hide show
  1. package/NOTICE +8 -2
  2. package/README.md +19 -15
  3. package/bin/whoisleuth.mjs +8 -1
  4. package/cli/archive-content-digest.mjs +14 -0
  5. package/cli/archive-inspect.mjs +20 -53
  6. package/cli/argument-values.mjs +55 -0
  7. package/cli/arguments.mjs +24 -408
  8. package/cli/artifact-validation/case-response.mjs +65 -44
  9. package/cli/artifact-validation/investigation-capsule.mjs +52 -31
  10. package/cli/artifact-validation/lookup-evidence.mjs +15 -9
  11. package/cli/artifact-validation/signed-review.mjs +136 -68
  12. package/cli/artifact-validation/structure-primitives.mjs +1 -105
  13. package/cli/artifact-verify.mjs +92 -24
  14. package/cli/assurance-arguments.mjs +56 -0
  15. package/cli/assurance-command-definitions.mjs +179 -0
  16. package/cli/assurance-command-runner.mjs +40 -5
  17. package/cli/bagit-folder.mjs +57 -0
  18. package/cli/bagit-review.mjs +23 -0
  19. package/cli/bounded-json.mjs +1 -1
  20. package/cli/bulk-checkpoint.mjs +1 -1
  21. package/cli/bulk-command-runner.mjs +4 -2
  22. package/cli/bulk-output.mjs +29 -3
  23. package/cli/bulk.mjs +2 -3
  24. package/cli/case-command.mjs +212 -0
  25. package/cli/case-pack.mjs +50 -32
  26. package/cli/ci-report.mjs +6 -3
  27. package/cli/collection-arguments.mjs +123 -0
  28. package/cli/collection-command-definitions.mjs +330 -0
  29. package/cli/collection-preflight.mjs +8 -1
  30. package/cli/command-argument-grammar.mjs +8 -206
  31. package/cli/command-definition.mjs +329 -0
  32. package/cli/command-reference.mjs +94 -1357
  33. package/cli/command-seeds.mjs +18 -0
  34. package/cli/compare.mjs +1 -1
  35. package/cli/completion.mjs +298 -79
  36. package/cli/config-profile.mjs +8 -6
  37. package/cli/ct-event-intake.mjs +16 -16
  38. package/cli/discover.mjs +5 -4
  39. package/cli/discovery-observation-snapshot.mjs +46 -18
  40. package/cli/discovery-scan-command-runner.mjs +5 -3
  41. package/cli/discovery-scan.mjs +7 -4
  42. package/cli/discovery-snapshot.mjs +2 -2
  43. package/cli/discovery-workflow.mjs +5 -5
  44. package/cli/domain-control-monitor.mjs +50 -20
  45. package/cli/domain-control-observations.mjs +151 -103
  46. package/cli/errors.mjs +37 -6
  47. package/cli/evidence-arguments.mjs +46 -0
  48. package/cli/evidence-command-definitions.mjs +69 -0
  49. package/cli/evidence-command-runner.mjs +18 -8
  50. package/cli/evidence-signing.mjs +5 -4
  51. package/cli/external-observation-mapping.mjs +9 -10
  52. package/cli/formatters/terminal-command-formats.mjs +6 -0
  53. package/cli/formatters/terminal-lookup.mjs +24 -46
  54. package/cli/formatters/terminal-shared.mjs +5 -3
  55. package/cli/formatters/terminal-technology.mjs +114 -0
  56. package/cli/history-arguments.mjs +39 -0
  57. package/cli/history-command-definitions.mjs +88 -0
  58. package/cli/indicator-set-command.mjs +33 -0
  59. package/cli/inline-command-families.mjs +6 -46
  60. package/cli/inline-command-runner.mjs +4 -31
  61. package/cli/input.mjs +2 -2
  62. package/cli/intake-command.mjs +107 -0
  63. package/cli/interactive-launcher.mjs +2 -160
  64. package/cli/interchange-report.mjs +8 -10
  65. package/cli/investigation-artifacts.mjs +176 -0
  66. package/cli/investigation-checkpoint.mjs +10 -0
  67. package/cli/investigation-folder.mjs +114 -0
  68. package/cli/investigation-manifest.mjs +1 -112
  69. package/cli/investigation-package-review.mjs +103 -0
  70. package/cli/investigation-plan.mjs +38 -147
  71. package/cli/investigation-recipes.mjs +177 -0
  72. package/cli/investigation-run.mjs +256 -35
  73. package/cli/local-document-checkpoint.mjs +170 -0
  74. package/cli/local-mmdb-review.mjs +197 -17
  75. package/cli/lookalike-calibration.mjs +1 -1
  76. package/cli/lookup-brief.mjs +2 -2
  77. package/cli/lookup-browser.mjs +5 -12
  78. package/cli/lookup-command-runner.mjs +33 -39
  79. package/cli/lookup-diff.mjs +47 -12
  80. package/cli/lookup-plan.mjs +16 -14
  81. package/cli/lookup-reconcile.mjs +15 -12
  82. package/cli/lookup-timeline.mjs +7 -6
  83. package/cli/mail-header-review.mjs +24 -247
  84. package/cli/mail-review.mjs +75 -21
  85. package/cli/manual.mjs +1 -0
  86. package/cli/network-arguments.mjs +51 -0
  87. package/cli/network-command-definitions.mjs +130 -0
  88. package/cli/network-command-runner.mjs +45 -31
  89. package/cli/offline-evidence-review.mjs +39 -6
  90. package/cli/output-file.mjs +31 -5
  91. package/cli/posture.mjs +1 -1
  92. package/cli/registry-doctor.mjs +3 -1
  93. package/cli/registry-fixture-scaffold.mjs +1 -1
  94. package/cli/registry-support.mjs +1 -1
  95. package/cli/retained-artifact-diff.mjs +10 -9
  96. package/cli/review-arguments.mjs +131 -0
  97. package/cli/review-command-definitions.mjs +273 -0
  98. package/cli/review-command-runner.mjs +104 -149
  99. package/cli/risk-calibration.mjs +8 -8
  100. package/cli/runner.mjs +74 -37
  101. package/cli/saved-lookup.mjs +2 -2
  102. package/cli/selected-input-worker.mjs +63 -0
  103. package/cli/sharing-review.mjs +8 -80
  104. package/cli/signer-trust.mjs +104 -0
  105. package/cli/source-reliability.mjs +75 -84
  106. package/cli/support-arguments.mjs +49 -0
  107. package/cli/support-command-definitions.mjs +209 -0
  108. package/cli/support-command-runner.mjs +2 -2
  109. package/cli/terminal-input.mjs +168 -0
  110. package/cli/workflow-arguments.mjs +86 -0
  111. package/cli/workflow-command-definitions.mjs +78 -0
  112. package/cli/workflow-command-runner.mjs +75 -13
  113. package/docs/cli-reference.md +103 -30
  114. package/docs/cli.md +510 -25
  115. package/docs/contextual-reviews.md +155 -0
  116. package/lib/abort.mjs +4 -1
  117. package/lib/analyst-taxonomy.mjs +2 -40
  118. package/lib/application-version.mjs +1 -1
  119. package/lib/availability.mjs +27 -754
  120. package/lib/bounded-contract-normalizers.mjs +4 -0
  121. package/lib/bounded-file.mjs +3 -1
  122. package/lib/bounded-html-document.mjs +125 -0
  123. package/lib/bounded-json.mjs +2 -290
  124. package/lib/browser-library-profile.mjs +99 -130
  125. package/lib/browser-library-worker.mjs +112 -0
  126. package/lib/candidate-provenance-bounds.mjs +2 -0
  127. package/lib/classify.mjs +1 -1
  128. package/lib/client-behavior-profile.mjs +3 -3
  129. package/lib/ct-query.mjs +2 -27
  130. package/lib/ct-response-bounds.mjs +2 -9
  131. package/lib/ct-search.mjs +89 -46
  132. package/lib/dmarc-discovery.mjs +62 -0
  133. package/lib/dns-convergence-review.mjs +21 -8
  134. package/lib/dns-delegation-health.mjs +36 -22
  135. package/lib/dns-inheritance-review.mjs +207 -0
  136. package/lib/dns-intelligence.mjs +44 -29
  137. package/lib/dns-mx.mjs +1 -1
  138. package/lib/dns-query-coverage.mjs +40 -0
  139. package/lib/dnssec-evidence-validation.mjs +11 -3
  140. package/lib/domain-assurance.mjs +1 -1
  141. package/lib/domain-change-packet.mjs +18 -14
  142. package/lib/domain-change-review.mjs +40 -16
  143. package/lib/domain-control-flight-recorder.mjs +301 -124
  144. package/lib/domain-control-manifest.mjs +126 -58
  145. package/lib/domain-posture-analysis.mjs +41 -11
  146. package/lib/domain-posture-parsers.mjs +88 -6
  147. package/lib/domain-posture.mjs +120 -32
  148. package/lib/domain-registration.mjs +392 -0
  149. package/lib/evidence-export-privacy.mjs +568 -0
  150. package/lib/evidence-export.mjs +12 -593
  151. package/lib/evidence-report.mjs +7 -2
  152. package/lib/external-intelligence-risk.mjs +2 -124
  153. package/lib/favicon.mjs +117 -41
  154. package/lib/generated/cisa-kev-catalog.mjs +50 -4
  155. package/lib/generated/registrar-standing-catalogue.mjs +18 -10
  156. package/lib/generated/retire-browser-catalog.mjs +2742 -1034
  157. package/lib/generated/{unicode-confusables-17.mjs → unicode-confusables.mjs} +33 -33
  158. package/lib/html-signals.mjs +87 -85
  159. package/lib/http-evidence-bounds.mjs +2 -7
  160. package/lib/http-intelligence.mjs +52 -27
  161. package/lib/idn-confusable-policy.mjs +6 -4
  162. package/lib/idn-confusables.mjs +1 -1
  163. package/lib/interchange-fidelity-registry.mjs +10 -0
  164. package/lib/lookup-cache.mjs +34 -11
  165. package/lib/lookup-child-profile-contract.mjs +24 -15
  166. package/lib/lookup-contract-primitives.mjs +1 -1
  167. package/lib/lookup-diagnostics.mjs +2 -1
  168. package/lib/lookup-network-evidence-bounds.mjs +1 -10
  169. package/lib/lookup-progress.mjs +79 -13
  170. package/lib/lookup-response-contract.mjs +1077 -0
  171. package/lib/lookup-response.mjs +11 -24
  172. package/lib/lookup-source-progress.mjs +24 -35
  173. package/lib/lookup.mjs +49 -28
  174. package/lib/observed-network-context.mjs +43 -27
  175. package/lib/opportunity-scoring.mjs +2 -107
  176. package/lib/outbound-identity.mjs +1 -1
  177. package/lib/outbound-request-bounds.mjs +4 -1
  178. package/lib/page-fingerprints.mjs +87 -134
  179. package/lib/page-role-profile.mjs +12 -8
  180. package/lib/perceptual-hash-comparison.mjs +2 -34
  181. package/lib/perceptual-hash.mjs +79 -24
  182. package/lib/portable-generator.mjs +2 -29
  183. package/lib/project-metadata.mjs +2 -8
  184. package/lib/rdap-bootstrap.mjs +72 -22
  185. package/lib/rdap-client.mjs +26 -14
  186. package/lib/rdap-normalization.mjs +33 -18
  187. package/lib/rdap-search-workbench.mjs +1 -1
  188. package/lib/rdap-transport.mjs +47 -20
  189. package/lib/rdap-types.mjs +2 -1
  190. package/lib/rdap.mjs +18 -3
  191. package/lib/registrable-domain.mjs +2 -36
  192. package/lib/registrar-standing-contract.mjs +2 -1
  193. package/lib/registrar-standing.mjs +9 -13
  194. package/lib/registry-capabilities.mjs +7 -3
  195. package/lib/registry-capability-catalogue.mjs +29 -20
  196. package/lib/registry-dates.mjs +2 -190
  197. package/lib/registry-insights.mjs +56 -18
  198. package/lib/response-policy.mjs +86 -48
  199. package/lib/risk-calibration-summary.mjs +2 -338
  200. package/lib/risk-scoring.mjs +2 -345
  201. package/lib/rpki-evidence.mjs +8 -5
  202. package/lib/safe-fetch.mjs +54 -47
  203. package/lib/scoring-evidence-quality.mjs +2 -107
  204. package/lib/security-txt.mjs +10 -7
  205. package/lib/semantic-version.mjs +2 -54
  206. package/lib/service-binding-dns.mjs +35 -0
  207. package/lib/smtp-transport-review.mjs +75 -34
  208. package/lib/sslbl-certificates.generated.mjs +141 -138
  209. package/lib/static-html-analysis.mjs +117 -146
  210. package/lib/structured-data-identity.mjs +2 -1
  211. package/lib/technology-markup.mjs +100 -0
  212. package/lib/threat-intelligence-manifests.mjs +11 -139
  213. package/lib/threat-intelligence-runtime.mjs +24 -52
  214. package/lib/threat-intelligence-targets.mjs +6 -34
  215. package/lib/threat-intelligence-types.mjs +2 -36
  216. package/lib/typosquat-generator.mjs +29 -16
  217. package/lib/urlhaus-intelligence.mjs +8 -3
  218. package/lib/urlscan-intelligence.mjs +1 -1
  219. package/lib/website-enrichment.mjs +388 -0
  220. package/lib/website-security-posture.mjs +30 -6
  221. package/lib/website-technology.mjs +111 -71
  222. package/lib/whois-authority.mjs +55 -5
  223. package/lib/whois-chain.mjs +9 -2
  224. package/lib/whois-common-formats.mjs +5 -5
  225. package/lib/whois-contracts.mjs +2 -1
  226. package/lib/whois-dialects.mjs +2 -2
  227. package/lib/whois-normalization.mjs +3 -1
  228. package/lib/whois-parser-support.mjs +8 -1
  229. package/lib/whois-parser.mjs +5 -3
  230. package/lib/whois-transport.mjs +23 -7
  231. package/package.json +14 -14
  232. package/packages/analysis/analyst-taxonomy.mjs +40 -0
  233. package/packages/analysis/bounded-json.mjs +330 -0
  234. package/packages/analysis/candidate-provenance-bounds.mjs +4 -0
  235. package/packages/analysis/cli-argument-grammar.mjs +216 -0
  236. package/packages/analysis/ct-query.mjs +27 -0
  237. package/packages/analysis/ct-response-bounds.mjs +9 -0
  238. package/packages/analysis/external-intelligence-risk.mjs +124 -0
  239. package/packages/analysis/http-evidence-bounds.mjs +8 -0
  240. package/packages/analysis/lookup-network-evidence-bounds.mjs +10 -0
  241. package/packages/analysis/opportunity-scoring.mjs +107 -0
  242. package/packages/analysis/perceptual-hash-comparison.mjs +34 -0
  243. package/packages/analysis/portable-generator.mjs +29 -0
  244. package/packages/analysis/project-metadata.mjs +8 -0
  245. package/packages/analysis/registrable-domain.mjs +56 -0
  246. package/packages/analysis/risk-calibration-summary.mjs +352 -0
  247. package/packages/analysis/risk-scoring.mjs +345 -0
  248. package/packages/analysis/scoring-evidence-quality.mjs +107 -0
  249. package/packages/analysis/semantic-version.mjs +54 -0
  250. package/packages/analysis/threat-intelligence-types.mjs +75 -0
  251. package/packages/cases/case-attachment-model.mjs +83 -0
  252. package/packages/cases/case-evidence-links.mjs +135 -0
  253. package/packages/cases/case-evidence-model.mjs +229 -69
  254. package/packages/cases/case-evidence-quality.mjs +5 -0
  255. package/packages/cases/case-export-input.mjs +55 -0
  256. package/packages/cases/case-incident-context.mjs +52 -0
  257. package/packages/cases/case-markdown.mjs +11 -0
  258. package/packages/cases/case-migration-model.mjs +98 -48
  259. package/packages/cases/case-model.mjs +1 -0
  260. package/packages/cases/case-recheck-model.mjs +149 -0
  261. package/packages/cases/case-record-contracts.mjs +1 -1
  262. package/packages/cases/case-record-core.mjs +4 -3
  263. package/packages/cases/case-record-operations.mjs +123 -133
  264. package/packages/cases/case-record-projection.mjs +30 -20
  265. package/packages/cases/case-record-version-input.mjs +19 -0
  266. package/packages/cases/case-report.mjs +114 -67
  267. package/packages/cases/case-requested-evidence.mjs +146 -0
  268. package/packages/cases/case-response-actions.mjs +756 -0
  269. package/packages/cases/case-response-model.mjs +49 -1129
  270. package/packages/cases/case-response-outcomes.mjs +338 -0
  271. package/packages/cases/case-response-packet-render.mjs +157 -0
  272. package/packages/cases/case-response-packet-types.mjs +1 -0
  273. package/packages/cases/case-response-packet-vocabulary.mjs +48 -0
  274. package/packages/cases/case-response-packet.mjs +58 -593
  275. package/packages/cases/case-response-records.mjs +93 -0
  276. package/packages/cases/case-response-review-inputs.mjs +382 -0
  277. package/packages/cases/case-response-values.mjs +85 -0
  278. package/packages/cases/case-review-package.mjs +45 -0
  279. package/packages/cases/case-selection.mjs +46 -0
  280. package/packages/cases/case-storage-model.mjs +26 -1
  281. package/packages/cases/case-workflow-metadata.mjs +225 -0
  282. package/packages/cases/case-workflow-migration.mjs +43 -0
  283. package/packages/cases/http-summary.mjs +6 -1
  284. package/packages/cases/response-route-freshness.mjs +16 -0
  285. package/packages/comparison/capture-context.mjs +61 -0
  286. package/packages/comparison/comparison-ledger-bulk.mjs +4 -1
  287. package/packages/comparison/favicon-similarity.mjs +1 -1
  288. package/packages/comparison/page-similarity.mjs +3 -2
  289. package/packages/comparison/relationship-evidence.mjs +103 -14
  290. package/packages/comparison/relationship-provenance.mjs +99 -0
  291. package/packages/contracts/analyst-interchange.mjs +234 -0
  292. package/packages/contracts/analyst-review-state-contract.mjs +11 -0
  293. package/packages/contracts/analyst-review-state.mjs +5 -4
  294. package/packages/contracts/case-portability.mjs +370 -114
  295. package/packages/contracts/case-views-contract.mjs +12 -0
  296. package/packages/contracts/case-views.mjs +26 -0
  297. package/packages/contracts/cli-command-semantics.mjs +3 -0
  298. package/packages/contracts/cli-grammar.mjs +6 -0
  299. package/packages/contracts/cli-lookup-brief.mjs +2 -0
  300. package/packages/contracts/cli-lookup.mjs +0 -1
  301. package/packages/contracts/context-review.mjs +24 -0
  302. package/packages/contracts/document-intake.mjs +11 -0
  303. package/packages/contracts/domain-control-flight-recorder.mjs +98 -44
  304. package/packages/contracts/domain-control-manifest.mjs +128 -74
  305. package/packages/contracts/domain-control-monitor.mjs +59 -45
  306. package/packages/contracts/domain-control-review.mjs +200 -121
  307. package/packages/contracts/domain-name.mjs +21 -0
  308. package/packages/contracts/external-observation-interchange.mjs +2 -1
  309. package/packages/contracts/extracted-domain-lifecycle.mjs +11 -32
  310. package/packages/contracts/har-review.mjs +2 -0
  311. package/packages/contracts/http-url.mjs +2 -0
  312. package/packages/contracts/identity-events.mjs +4 -0
  313. package/packages/contracts/investigation-package-limits.mjs +24 -0
  314. package/packages/contracts/investigation-portability.mjs +56 -27
  315. package/packages/contracts/investigation-run.mjs +18 -0
  316. package/packages/contracts/ip-address.mjs +44 -0
  317. package/packages/contracts/lookup-evidence.mjs +35 -0
  318. package/packages/contracts/mail-authentication.mjs +5 -0
  319. package/packages/contracts/message-intake.mjs +31 -0
  320. package/packages/contracts/offline-comparison.mjs +4 -2
  321. package/packages/contracts/page-fingerprints.mjs +15 -0
  322. package/packages/contracts/passive-mail.mjs +10 -0
  323. package/packages/contracts/risk-calibration.mjs +0 -1
  324. package/packages/contracts/schema-compatibility.mjs +1 -1
  325. package/packages/contracts/schema-lifecycle.mjs +83 -153
  326. package/packages/contracts/selected-file-limits.mjs +6 -0
  327. package/packages/contracts/vulnerability-identifiers.mjs +5 -0
  328. package/packages/contracts/web-capture.mjs +10 -0
  329. package/packages/contracts/workspace-portability.mjs +219 -238
  330. package/packages/evidence/artifact-integrity.mjs +8 -2
  331. package/packages/evidence/artifact-structure.mjs +105 -0
  332. package/packages/evidence/collection-quality.mjs +67 -0
  333. package/packages/evidence/decision-fact.mjs +4 -1
  334. package/packages/evidence/dns-query-outcome.mjs +72 -0
  335. package/packages/evidence/domain-control-runtime.mjs +155 -27
  336. package/packages/evidence/domain-posture-context.mjs +79 -0
  337. package/packages/evidence/email-recipient.mjs +18 -0
  338. package/packages/evidence/image-regions.mjs +56 -0
  339. package/packages/evidence/latest-observations.mjs +28 -0
  340. package/packages/evidence/lookup-target.mjs +108 -0
  341. package/packages/evidence/observation.mjs +18 -1
  342. package/packages/evidence/passphrase-encryption.mjs +44 -0
  343. package/packages/evidence/png-pixels.mjs +117 -0
  344. package/packages/evidence/public-address-policy.mjs +83 -0
  345. package/packages/evidence/record-identity.mjs +72 -0
  346. package/packages/evidence/registry-dates.mjs +190 -0
  347. package/packages/evidence/retained-file.mjs +69 -0
  348. package/packages/evidence/review-age.mjs +14 -0
  349. package/packages/interchange/bagit.mjs +342 -0
  350. package/packages/interchange/bounded-zip-extraction.mjs +278 -0
  351. package/packages/interchange/crc32.mjs +17 -0
  352. package/packages/interchange/defensive-indicator-export.mjs +264 -0
  353. package/packages/interchange/external-findings-import.mjs +93 -61
  354. package/packages/interchange/managed-indicator-export.mjs +35 -0
  355. package/packages/interchange/managed-indicator-set.mjs +210 -0
  356. package/packages/interchange/misp-indicator-export.mjs +93 -0
  357. package/packages/interchange/sharing-policy.mjs +56 -0
  358. package/packages/interchange/stix-indicator-export.mjs +129 -0
  359. package/packages/interchange/web-capture-import.mjs +389 -0
  360. package/packages/investigation/acquisition-decision-packet.mjs +1 -1
  361. package/packages/investigation/bulk-mail-exposure.mjs +9 -14
  362. package/packages/investigation/capture-coverage.mjs +57 -0
  363. package/packages/investigation/connector-provenance-review.mjs +100 -0
  364. package/packages/investigation/context-review.mjs +35 -0
  365. package/packages/investigation/document-intake.mjs +81 -0
  366. package/packages/investigation/docx-intake.mjs +133 -0
  367. package/packages/investigation/domain-history-review.mjs +100 -0
  368. package/packages/investigation/domain-transition-review.mjs +47 -0
  369. package/packages/investigation/evidence-coverage-ledger.mjs +9 -1
  370. package/packages/investigation/har-intake.mjs +68 -0
  371. package/packages/investigation/identity-event-intake.mjs +131 -0
  372. package/packages/investigation/identity-incident-review.mjs +39 -0
  373. package/packages/investigation/incident-sequence-review.mjs +58 -0
  374. package/packages/investigation/intake-report.mjs +19 -0
  375. package/packages/investigation/investigation-bagit.mjs +14 -0
  376. package/packages/investigation/investigation-capsule.mjs +33 -5
  377. package/packages/investigation/investigation-manifest.mjs +200 -0
  378. package/packages/investigation/investigation-package-crypto.mjs +98 -0
  379. package/packages/investigation/investigation-package.mjs +200 -0
  380. package/packages/investigation/link-intake.mjs +179 -0
  381. package/packages/investigation/lookup-asset-graph-inputs.mjs +38 -0
  382. package/packages/investigation/lookup-asset-graph.mjs +161 -141
  383. package/packages/investigation/lookup-claim-readiness.mjs +18 -0
  384. package/packages/investigation/lookup-investigation-brief.mjs +3 -3
  385. package/packages/investigation/lookup-task-guidance.mjs +58 -0
  386. package/packages/investigation/mail-authentication-review.mjs +222 -0
  387. package/packages/investigation/mail-header-identity.mjs +209 -0
  388. package/packages/investigation/message-intake.mjs +195 -0
  389. package/packages/investigation/page-behaviour.mjs +113 -0
  390. package/packages/investigation/pdf-intake.mjs +155 -0
  391. package/packages/investigation/platform-continuity-review.mjs +60 -0
  392. package/packages/investigation/qr-intake.mjs +56 -0
  393. package/packages/investigation/requested-action-hints.mjs +11 -0
  394. package/packages/investigation/selected-input-review.mjs +17 -0
  395. package/packages/investigation/storefront-review.mjs +70 -0
  396. package/packages/monitoring/analyst-review-state.mjs +38 -90
  397. package/packages/workspace/brand-profile-model.mjs +160 -22
  398. package/packages/workspace/bulk-columns.mjs +17 -0
  399. package/packages/workspace/bulk-review-model.mjs +39 -31
  400. package/packages/workspace/bulk-session-model.mjs +112 -27
  401. package/packages/workspace/bulk-sort.mjs +1 -0
  402. package/packages/workspace/campaign-model.mjs +1 -1
  403. package/packages/workspace/case-views.mjs +102 -0
  404. package/packages/workspace/detection-rule-model.mjs +1 -1
  405. package/packages/workspace/hostile-input.mjs +29 -8
  406. package/packages/workspace/investigation-guide.mjs +2 -2
  407. package/packages/workspace/investigation-template-model.mjs +45 -6
  408. package/packages/workspace/page-baseline.mjs +20 -17
  409. package/packages/workspace/relationship-observation-model.mjs +54 -35
  410. package/packages/workspace/shortlist-model.mjs +14 -5
  411. package/packages/workspace/watchlist-history.mjs +30 -14
  412. package/packages/workspace/watchlist-store.mjs +24 -6
  413. package/packages/workspace/website-snapshot-model.mjs +98 -33
  414. package/packages/workspace/workspace-archive-crypto.mjs +41 -61
  415. package/packages/workspace/workspace-archive.mjs +90 -25
  416. package/third-party-notices.txt +577 -17
  417. package/lib/hostname.mjs +0 -38
  418. package/packages/investigation/bulk-review-export.mjs +0 -63
@@ -1,14 +1,19 @@
1
1
  import { defineSchemaCompatibility } from "./schema-compatibility.mjs";
2
2
  import { defineSchemaLifecycleFamily } from "./schema-lifecycle.mjs";
3
- import { DOMAIN_CONTROL_MANIFEST_ENTRY_KEYS, DOMAIN_CONTROL_MANIFEST_INTEGRITY_KEYS, DOMAIN_CONTROL_MANIFEST_LIMITATIONS, DOMAIN_CONTROL_MANIFEST_ROOT_KEYS, DOMAIN_CONTROL_SPKI_SHA256_HEX_LENGTH, DOMAIN_CONTROL_TEXT_INPUT_BOUND_FACTOR, MAX_CANONICAL_DOMAIN_CONTROL_RECORDS, MAX_DOMAIN_CONTROL_CLI_REVIEW_JSON_DEPTH, MAX_DOMAIN_CONTROL_CLI_REVIEW_JSON_KEYS, MAX_DOMAIN_CONTROL_CLI_REVIEW_JSON_VALUES, MAX_DOMAIN_CONTROL_DOMAIN_LENGTH, MAX_DOMAIN_CONTROL_INPUT_RECORDS, MAX_DOMAIN_CONTROL_JSON_CONTAINER_ITEMS, MAX_DOMAIN_CONTROL_MANIFEST_BYTES, MAX_DOMAIN_CONTROL_MANIFEST_ENTRIES, MAX_DOMAIN_CONTROL_TIMESTAMP_LENGTH, } from "./domain-control-manifest.mjs";
3
+ import { PUBLIC_DOMAIN_CONTROL_MANIFEST_ENTRY_KEYS, PUBLIC_DOMAIN_CONTROL_MANIFEST_LIMITATIONS, DOMAIN_CONTROL_MANIFEST_INTEGRITY_KEYS, DOMAIN_CONTROL_MANIFEST_ROOT_KEYS, DOMAIN_CONTROL_SPKI_SHA256_HEX_LENGTH, DOMAIN_CONTROL_TEXT_INPUT_BOUND_FACTOR, MAX_CURRENT_DOMAIN_CONTROL_RECORDS, MAX_CANONICAL_DOMAIN_CONTROL_RECORDS, MAX_DOMAIN_CONTROL_CLI_REVIEW_JSON_DEPTH, MAX_DOMAIN_CONTROL_CLI_REVIEW_JSON_KEYS, MAX_DOMAIN_CONTROL_CLI_REVIEW_JSON_VALUES, MAX_DOMAIN_CONTROL_DOMAIN_LENGTH, MAX_DOMAIN_CONTROL_INPUT_RECORDS, MAX_DOMAIN_CONTROL_JSON_CONTAINER_ITEMS, MAX_DOMAIN_CONTROL_MANIFEST_BYTES, MAX_DOMAIN_CONTROL_MANIFEST_ENTRIES, MAX_DOMAIN_CONTROL_TIMESTAMP_LENGTH, } from "./domain-control-manifest.mjs";
4
4
  import { MAX_DOMAIN_CONTROL_MONITOR_CONCURRENCY, MAX_DOMAIN_CONTROL_MONITOR_DOMAINS, MIN_DOMAIN_CONTROL_MONITOR_CONCURRENCY, MIN_DOMAIN_CONTROL_MONITOR_DOMAINS, } from "./domain-control-monitor.mjs";
5
5
  import { MAX_CLI_LOOKUP_BYTES } from "./cli-lookup.mjs";
6
+ import { DOMAIN_CONTROL_FLIGHT_RECORDER_OBSERVATION_KEYS, PUBLIC_DOMAIN_CONTROL_FLIGHT_RECORDER_OBSERVATION_KEYS, DOMAIN_CONTROL_FLIGHT_RECORDER_FIELD_KEYS, PUBLIC_DOMAIN_CONTROL_FLIGHT_RECORDER_FIELD_KEYS, } from "./domain-control-flight-recorder.mjs";
6
7
  export const DOMAIN_CONTROL_REVIEW_INPUT_SCHEMA = 'whoisleuth.domain-control-review-input';
7
8
  export const DOMAIN_CONTROL_REVIEW_SCHEMA = 'whoisleuth.domain-control-review';
8
9
  export const CLI_DOMAIN_CONTROL_REVIEW_INPUT_SCHEMA = 'whoisleuth.cli.domain-control-review-input';
9
10
  export const CLI_DOMAIN_CONTROL_REVIEW_SCHEMA = 'whoisleuth.cli.domain-control-review';
10
- export const DOMAIN_CONTROL_REVIEW_VERSION = 1;
11
- export const CLI_DOMAIN_CONTROL_REVIEW_VERSION = 1;
11
+ export const PUBLIC_DOMAIN_CONTROL_REVIEW_VERSION = 1;
12
+ export const PUBLIC_CLI_DOMAIN_CONTROL_REVIEW_VERSION = 1;
13
+ export const DOMAIN_CONTROL_REVIEW_VERSION = 3;
14
+ export const CLI_DOMAIN_CONTROL_REVIEW_VERSION = 3;
15
+ export const SUPPORTED_DOMAIN_CONTROL_REVIEW_VERSIONS = [PUBLIC_DOMAIN_CONTROL_REVIEW_VERSION, 2, DOMAIN_CONTROL_REVIEW_VERSION];
16
+ export const SUPPORTED_CLI_DOMAIN_CONTROL_REVIEW_VERSIONS = [PUBLIC_CLI_DOMAIN_CONTROL_REVIEW_VERSION, 2, CLI_DOMAIN_CONTROL_REVIEW_VERSION];
12
17
  export const DOMAIN_CONTROL_REVIEW_OBSERVATION_FACTOR = 2;
13
18
  export const MAX_DOMAIN_CONTROL_REVIEW_OBSERVATIONS = MAX_DOMAIN_CONTROL_MANIFEST_ENTRIES
14
19
  * DOMAIN_CONTROL_REVIEW_OBSERVATION_FACTOR;
@@ -73,7 +78,7 @@ export const DOMAIN_CONTROL_REVIEW_MANIFEST_SUMMARY_KEYS = Object.freeze([
73
78
  'digestSha256',
74
79
  'expired',
75
80
  ]);
76
- export const DOMAIN_CONTROL_REVIEW_COUNT_KEYS = Object.freeze([
81
+ export const PUBLIC_DOMAIN_CONTROL_REVIEW_COUNT_KEYS = Object.freeze([
77
82
  'aligned',
78
83
  'drift',
79
84
  'partial',
@@ -82,12 +87,14 @@ export const DOMAIN_CONTROL_REVIEW_COUNT_KEYS = Object.freeze([
82
87
  'not_configured',
83
88
  'due',
84
89
  ]);
90
+ export const DOMAIN_CONTROL_REVIEW_V2_COUNT_KEYS = Object.freeze([...PUBLIC_DOMAIN_CONTROL_REVIEW_COUNT_KEYS, 'observed']);
91
+ export const DOMAIN_CONTROL_REVIEW_COUNT_KEYS = Object.freeze([...DOMAIN_CONTROL_REVIEW_V2_COUNT_KEYS, 'not_due']);
85
92
  export const DOMAIN_CONTROL_REVIEW_DOMAIN_KEYS = Object.freeze([
86
93
  'domain',
87
94
  'state',
88
95
  'comparisons',
89
96
  ]);
90
- export const DOMAIN_CONTROL_REVIEW_COMPARISON_KEYS = Object.freeze([
97
+ export const PUBLIC_DOMAIN_CONTROL_REVIEW_COMPARISON_KEYS = Object.freeze([
91
98
  'field',
92
99
  'state',
93
100
  'desired',
@@ -96,11 +103,27 @@ export const DOMAIN_CONTROL_REVIEW_COMPARISON_KEYS = Object.freeze([
96
103
  'observedAt',
97
104
  'explanation',
98
105
  ]);
99
- export const DOMAIN_CONTROL_REVIEW_LIMITATIONS = Object.freeze([
106
+ export const DOMAIN_CONTROL_REVIEW_COMPARISON_KEYS = Object.freeze([...PUBLIC_DOMAIN_CONTROL_REVIEW_COMPARISON_KEYS, 'expectation']);
107
+ export const PUBLIC_DOMAIN_CONTROL_REVIEW_LIMITATIONS = Object.freeze([
100
108
  'This local review compares analyst-authored desired state with separately supplied observations and performs no collection or configuration change.',
101
109
  'Only complete observations can produce drift. Partial, unavailable, unsupported, or missing evidence remains inconclusive.',
102
110
  'A valid manifest digest or signature establishes file integrity, not the correctness of the desired state or supplied observations.',
103
111
  ]);
112
+ export const DOMAIN_CONTROL_REVIEW_V2_LIMITATIONS = Object.freeze([
113
+ PUBLIC_DOMAIN_CONTROL_REVIEW_LIMITATIONS[0],
114
+ 'Only complete observations with valid source times within the current review-age window can establish alignment, drift or expected absence. Observation-only fields do not establish alignment.',
115
+ PUBLIC_DOMAIN_CONTROL_REVIEW_LIMITATIONS[2],
116
+ ]);
117
+ export const DOMAIN_CONTROL_REVIEW_LIMITATIONS = Object.freeze([
118
+ ...DOMAIN_CONTROL_REVIEW_V2_LIMITATIONS,
119
+ 'Renewal dates are analyst-authored reminders, not observations of configuration.',
120
+ ]);
121
+ export function domainControlReviewCountKeys(version) {
122
+ return version === 1 ? PUBLIC_DOMAIN_CONTROL_REVIEW_COUNT_KEYS : version === 2 ? DOMAIN_CONTROL_REVIEW_V2_COUNT_KEYS : DOMAIN_CONTROL_REVIEW_COUNT_KEYS;
123
+ }
124
+ export function domainControlReviewLimitations(version) {
125
+ return version === 1 ? PUBLIC_DOMAIN_CONTROL_REVIEW_LIMITATIONS : version === 2 ? DOMAIN_CONTROL_REVIEW_V2_LIMITATIONS : DOMAIN_CONTROL_REVIEW_LIMITATIONS;
126
+ }
104
127
  export const CLI_DOMAIN_CONTROL_REVIEW_INPUT_KEYS = Object.freeze([
105
128
  'schema',
106
129
  'version',
@@ -116,37 +139,34 @@ export const CLI_DOMAIN_CONTROL_REVIEW_ROOT_KEYS = Object.freeze([
116
139
  'input',
117
140
  'limitations',
118
141
  ]);
119
- export const CLI_DOMAIN_CONTROL_REVIEW_OBSERVATION_KEYS = Object.freeze([
120
- 'domain',
121
- 'observedAt',
122
- 'collectionDepth',
123
- 'fields',
124
- ]);
125
- export const CLI_DOMAIN_CONTROL_REVIEW_FIELD_KEYS = Object.freeze([
126
- 'id',
127
- 'source',
128
- 'state',
129
- 'values',
130
- ]);
142
+ export const PUBLIC_CLI_DOMAIN_CONTROL_REVIEW_OBSERVATION_KEYS = PUBLIC_DOMAIN_CONTROL_FLIGHT_RECORDER_OBSERVATION_KEYS;
143
+ export const CLI_DOMAIN_CONTROL_REVIEW_OBSERVATION_KEYS = DOMAIN_CONTROL_FLIGHT_RECORDER_OBSERVATION_KEYS;
144
+ export const PUBLIC_CLI_DOMAIN_CONTROL_REVIEW_FIELD_KEYS = PUBLIC_DOMAIN_CONTROL_FLIGHT_RECORDER_FIELD_KEYS;
145
+ export const CLI_DOMAIN_CONTROL_REVIEW_FIELD_KEYS = DOMAIN_CONTROL_FLIGHT_RECORDER_FIELD_KEYS;
131
146
  export const CLI_DOMAIN_CONTROL_REVIEW_INPUT_SUMMARY_KEYS = Object.freeze([
132
147
  'lookupsReceived',
133
148
  'latestDomainObservations',
134
149
  'ignoredHistoricalLookups',
135
150
  ]);
136
- export const CLI_DOMAIN_CONTROL_REVIEW_LIMITATIONS = Object.freeze([
151
+ export const PUBLIC_CLI_DOMAIN_CONTROL_REVIEW_LIMITATIONS = Object.freeze([
137
152
  'The review uses only supplied saved Lookup documents and performs no request.',
138
153
  'The newest supplied observation per domain is used for desired-state comparison; all supplied observations remain available to a separate flight-recorder review.',
139
154
  'Raw RDAP, WHOIS, HTTP, TLS, and page payloads are not copied into this output.',
140
155
  ]);
156
+ export const CLI_DOMAIN_CONTROL_REVIEW_LIMITATIONS = Object.freeze([
157
+ PUBLIC_CLI_DOMAIN_CONTROL_REVIEW_LIMITATIONS[0],
158
+ 'The newest supplied capture per domain is reviewed using each field’s retained source time. Missing or conflicting source times remain inconclusive.',
159
+ PUBLIC_CLI_DOMAIN_CONTROL_REVIEW_LIMITATIONS[2],
160
+ ]);
141
161
  export const DOMAIN_CONTROL_REVIEW_INPUT_COMPATIBILITY = defineSchemaCompatibility({
142
162
  id: 'cli.domain-control-review-core-input',
143
163
  kind: 'cli_document',
144
164
  schema: DOMAIN_CONTROL_REVIEW_INPUT_SCHEMA,
145
165
  currentVersion: DOMAIN_CONTROL_REVIEW_VERSION,
146
- supportedVersions: [DOMAIN_CONTROL_REVIEW_VERSION],
166
+ supportedVersions: SUPPORTED_DOMAIN_CONTROL_REVIEW_VERSIONS,
147
167
  acceptsUnversionedLegacy: false,
148
168
  futureVersionBehavior: 'reject',
149
- migration: 'exact_current_only',
169
+ migration: 'read_only',
150
170
  writeSemantics: 'read_only',
151
171
  byteBudget: null,
152
172
  owner: 'packages/contracts/domain-control-review.mts',
@@ -157,10 +177,10 @@ export const DOMAIN_CONTROL_REVIEW_COMPATIBILITY = defineSchemaCompatibility({
157
177
  kind: 'cli_document',
158
178
  schema: DOMAIN_CONTROL_REVIEW_SCHEMA,
159
179
  currentVersion: DOMAIN_CONTROL_REVIEW_VERSION,
160
- supportedVersions: [DOMAIN_CONTROL_REVIEW_VERSION],
180
+ supportedVersions: SUPPORTED_DOMAIN_CONTROL_REVIEW_VERSIONS,
161
181
  acceptsUnversionedLegacy: false,
162
182
  futureVersionBehavior: 'reject',
163
- migration: 'exact_current_only',
183
+ migration: 'read_only',
164
184
  writeSemantics: 'read_only',
165
185
  byteBudget: null,
166
186
  owner: 'packages/contracts/domain-control-review.mts',
@@ -171,10 +191,10 @@ export const CLI_DOMAIN_CONTROL_REVIEW_INPUT_COMPATIBILITY = defineSchemaCompati
171
191
  kind: 'cli_document',
172
192
  schema: CLI_DOMAIN_CONTROL_REVIEW_INPUT_SCHEMA,
173
193
  currentVersion: CLI_DOMAIN_CONTROL_REVIEW_VERSION,
174
- supportedVersions: [CLI_DOMAIN_CONTROL_REVIEW_VERSION],
194
+ supportedVersions: SUPPORTED_CLI_DOMAIN_CONTROL_REVIEW_VERSIONS,
175
195
  acceptsUnversionedLegacy: false,
176
196
  futureVersionBehavior: 'reject',
177
- migration: 'exact_current_only',
197
+ migration: 'read_only',
178
198
  writeSemantics: 'read_only',
179
199
  byteBudget: MAX_DOMAIN_CONTROL_REVIEW_INPUT_BYTES,
180
200
  owner: 'packages/contracts/domain-control-review.mts',
@@ -185,7 +205,7 @@ export const CLI_DOMAIN_CONTROL_REVIEW_COMPATIBILITY = defineSchemaCompatibility
185
205
  kind: 'cli_document',
186
206
  schema: CLI_DOMAIN_CONTROL_REVIEW_SCHEMA,
187
207
  currentVersion: CLI_DOMAIN_CONTROL_REVIEW_VERSION,
188
- supportedVersions: [CLI_DOMAIN_CONTROL_REVIEW_VERSION],
208
+ supportedVersions: SUPPORTED_CLI_DOMAIN_CONTROL_REVIEW_VERSIONS,
189
209
  acceptsUnversionedLegacy: false,
190
210
  futureVersionBehavior: 'not_applicable',
191
211
  migration: 'read_only',
@@ -194,15 +214,15 @@ export const CLI_DOMAIN_CONTROL_REVIEW_COMPATIBILITY = defineSchemaCompatibility
194
214
  owner: 'packages/contracts/domain-control-review.mts',
195
215
  note: 'Compact source-qualified control observations and desired-state comparison.',
196
216
  });
197
- const CORE_REVIEW_SHAPES = [
217
+ const CORE_REVIEW_SHAPES = SUPPORTED_DOMAIN_CONTROL_REVIEW_VERSIONS.flatMap((version) => [
198
218
  {
199
- id: 'domain-control-review.input.v1',
219
+ id: `domain-control-review.input.v${version}`,
200
220
  schema: DOMAIN_CONTROL_REVIEW_INPUT_SCHEMA,
201
- versions: [DOMAIN_CONTROL_REVIEW_VERSION],
221
+ versions: [version],
202
222
  objects: [
203
223
  { path: '$', requiredKeys: DOMAIN_CONTROL_REVIEW_INPUT_KEYS, optionalKeys: [], unknownKeys: 'reject' },
204
224
  { path: '$.manifest', requiredKeys: DOMAIN_CONTROL_MANIFEST_ROOT_KEYS, optionalKeys: [], unknownKeys: 'reject' },
205
- { path: '$.manifest.entries[]', requiredKeys: DOMAIN_CONTROL_MANIFEST_ENTRY_KEYS, optionalKeys: [], unknownKeys: 'reject' },
225
+ { path: '$.manifest.entries[]', requiredKeys: PUBLIC_DOMAIN_CONTROL_MANIFEST_ENTRY_KEYS, optionalKeys: version === PUBLIC_DOMAIN_CONTROL_REVIEW_VERSION ? [] : ['recordModes'], unknownKeys: 'reject' },
206
226
  { path: '$.manifest.integrity', requiredKeys: DOMAIN_CONTROL_MANIFEST_INTEGRITY_KEYS, optionalKeys: [], unknownKeys: 'reject' },
207
227
  { path: '$.observations[]', requiredKeys: DOMAIN_CONTROL_REVIEW_OBSERVATION_KEYS, optionalKeys: [], unknownKeys: 'reject' },
208
228
  { path: '$.observations[].fields', requiredKeys: [], optionalKeys: DOMAIN_CONTROL_REVIEW_FIELDS, unknownKeys: 'reject' },
@@ -213,26 +233,58 @@ const CORE_REVIEW_SHAPES = [
213
233
  unknownKeys: 'reject',
214
234
  })),
215
235
  ],
216
- fixedArrays: [{ path: '$.manifest.limitations', values: DOMAIN_CONTROL_MANIFEST_LIMITATIONS }],
236
+ fixedArrays: version === PUBLIC_DOMAIN_CONTROL_REVIEW_VERSION ? [{ path: '$.manifest.limitations', values: PUBLIC_DOMAIN_CONTROL_MANIFEST_LIMITATIONS }] : [],
217
237
  normalisation: 'input_to_current',
218
238
  target: { schema: DOMAIN_CONTROL_REVIEW_SCHEMA, version: DOMAIN_CONTROL_REVIEW_VERSION },
219
239
  },
220
240
  {
221
- id: 'domain-control-review.document.v1',
241
+ id: `domain-control-review.document.v${version}`,
222
242
  schema: DOMAIN_CONTROL_REVIEW_SCHEMA,
223
- versions: [DOMAIN_CONTROL_REVIEW_VERSION],
243
+ versions: [version],
224
244
  objects: [
225
245
  { path: '$', requiredKeys: DOMAIN_CONTROL_REVIEW_ROOT_KEYS, optionalKeys: [], unknownKeys: 'reject' },
226
246
  { path: '$.manifest', requiredKeys: DOMAIN_CONTROL_REVIEW_MANIFEST_SUMMARY_KEYS, optionalKeys: [], unknownKeys: 'reject' },
227
- { path: '$.counts', requiredKeys: DOMAIN_CONTROL_REVIEW_COUNT_KEYS, optionalKeys: [], unknownKeys: 'reject' },
247
+ { path: '$.counts', requiredKeys: domainControlReviewCountKeys(version), optionalKeys: [], unknownKeys: 'reject' },
228
248
  { path: '$.domains[]', requiredKeys: DOMAIN_CONTROL_REVIEW_DOMAIN_KEYS, optionalKeys: [], unknownKeys: 'reject' },
229
- { path: '$.domains[].comparisons[]', requiredKeys: DOMAIN_CONTROL_REVIEW_COMPARISON_KEYS, optionalKeys: [], unknownKeys: 'reject' },
249
+ { path: '$.domains[].comparisons[]', requiredKeys: version === PUBLIC_DOMAIN_CONTROL_REVIEW_VERSION ? PUBLIC_DOMAIN_CONTROL_REVIEW_COMPARISON_KEYS : DOMAIN_CONTROL_REVIEW_COMPARISON_KEYS, optionalKeys: [], unknownKeys: 'reject' },
230
250
  ],
231
- fixedArrays: [{ path: '$.limitations', values: DOMAIN_CONTROL_REVIEW_LIMITATIONS }],
251
+ fixedArrays: [{ path: '$.limitations', values: domainControlReviewLimitations(version) }],
232
252
  normalisation: 'preserve_document',
233
253
  target: null,
234
254
  },
235
- ];
255
+ ]);
256
+ const CORE_BOUND_PROFILE_IDS = SUPPORTED_DOMAIN_CONTROL_REVIEW_VERSIONS.map((version) => `domain-control-review.core.v${version}`);
257
+ const CORE_INPUT_SHAPE_IDS = SUPPORTED_DOMAIN_CONTROL_REVIEW_VERSIONS.map((version) => `domain-control-review.input.v${version}`);
258
+ const CORE_DOCUMENT_SHAPE_IDS = SUPPORTED_DOMAIN_CONTROL_REVIEW_VERSIONS.map((version) => `domain-control-review.document.v${version}`);
259
+ const CURRENT_CORE_DOCUMENT_SHAPE_ID = `domain-control-review.document.v${DOMAIN_CONTROL_REVIEW_VERSION}`;
260
+ const CLI_INPUT_SHAPE_IDS = SUPPORTED_CLI_DOMAIN_CONTROL_REVIEW_VERSIONS.map((version) => `domain-control-review.cli-input.v${version}`);
261
+ const CURRENT_CLI_DOCUMENT_SHAPE_ID = `domain-control-review.cli-document.v${CLI_DOMAIN_CONTROL_REVIEW_VERSION}`;
262
+ function reviewFixtureShapeId(schema, version) {
263
+ const cli = schema.startsWith('whoisleuth.cli.');
264
+ return `domain-control-review.${cli ? 'cli-' : ''}${schema.endsWith('-input') ? 'input' : 'document'}.v${version}`;
265
+ }
266
+ const CURRENT_REVIEW_FIXTURE_CONTENT = {
267
+ "domain-control-review-input-v3": { "bytes": 1879, "sha256": "747cccb9a0610dd5b77ebd2a01f44dc7bd6a929b09b6e52037596427d0c2275b" },
268
+ "domain-control-review-v3": { "bytes": 4496, "sha256": "736926cf402ca868ddc832c229b88d3c91b44a4c73563c356633a69c1ec8d06c" },
269
+ "cli-domain-control-review-input-v3": { "bytes": 4123, "sha256": "0283efe6f78551a8aa5a9449a608fb4f3b46b39a9f11f6ffe93244979b16d30b" },
270
+ "cli-domain-control-review-v3": { "bytes": 9194, "sha256": "31c263f17cd663be74ab9801970a8800894da4023842137e41f602fde633452e" },
271
+ "domain-control-review-input-v2": {
272
+ "bytes": 1879,
273
+ "sha256": "ac3b5913a44c47bd179cd69e4a8bf4268f10e9f01dd7f59c7d722a8c0d241ad1"
274
+ },
275
+ "domain-control-review-v2": {
276
+ "bytes": 4386,
277
+ "sha256": "e85870d7c978f484a47c807104cab038af2aa30265d05cae1b129ce663e7b9b8"
278
+ },
279
+ "cli-domain-control-review-input-v2": {
280
+ "bytes": 4123,
281
+ "sha256": "ae360c4bcc2f6c3b48b5e9cef524b51ac25f958a88184d6f7efdf26eadfd815f"
282
+ },
283
+ "cli-domain-control-review-v2": {
284
+ "bytes": 9084,
285
+ "sha256": "4befd3e6e81873497a0d56b8337a6540516f36cfdb81d35a26c807875488e309"
286
+ }
287
+ };
236
288
  export const DOMAIN_CONTROL_REVIEW_SCHEMA_LIFECYCLE = defineSchemaLifecycleFamily({
237
289
  id: 'domain-control-review',
238
290
  owner: 'packages/contracts/domain-control-review.mts',
@@ -283,7 +335,7 @@ export const DOMAIN_CONTROL_REVIEW_SCHEMA_LIFECYCLE = defineSchemaLifecycleFamil
283
335
  role: 'input',
284
336
  lifecycle: 'current',
285
337
  readable: true,
286
- emitted: true,
338
+ emitted: false,
287
339
  exactKeys: true,
288
340
  extensionPolicy: 'reject',
289
341
  futureVersionBehaviour: 'reject',
@@ -308,7 +360,15 @@ export const DOMAIN_CONTROL_REVIEW_SCHEMA_LIFECYCLE = defineSchemaLifecycleFamil
308
360
  byteBudget: null,
309
361
  fixtureIds: ['cli-domain-control-review-v1'],
310
362
  },
311
- ],
363
+ ].flatMap((contract) => {
364
+ const versions = contract.schema.startsWith('whoisleuth.cli.') ? SUPPORTED_CLI_DOMAIN_CONTROL_REVIEW_VERSIONS : SUPPORTED_DOMAIN_CONTROL_REVIEW_VERSIONS;
365
+ return versions.map((version) => ({
366
+ ...contract, version,
367
+ lifecycle: version === contract.version ? 'current' : contract.readable ? 'legacy' : 'retired',
368
+ emitted: contract.emitted && version === contract.version,
369
+ fixtureIds: contract.fixtureIds.map((id) => id.replace(/v\d+$/u, `v${version}`)),
370
+ }));
371
+ }),
312
372
  fixtures: [
313
373
  {
314
374
  id: 'domain-control-review-input-v1',
@@ -317,7 +377,7 @@ export const DOMAIN_CONTROL_REVIEW_SCHEMA_LIFECYCLE = defineSchemaLifecycleFamil
317
377
  sha256: 'ca6e894a67715fa93a872d189fe22a21dc516200f672546de7cc8ffe2df12329',
318
378
  contentDigestSha256: null,
319
379
  schema: DOMAIN_CONTROL_REVIEW_INPUT_SCHEMA,
320
- version: DOMAIN_CONTROL_REVIEW_VERSION,
380
+ version: PUBLIC_DOMAIN_CONTROL_REVIEW_VERSION,
321
381
  role: 'input',
322
382
  expectation: 'normalises_to_current_output',
323
383
  expectedOutputFixtureId: 'domain-control-review-v1',
@@ -330,7 +390,7 @@ export const DOMAIN_CONTROL_REVIEW_SCHEMA_LIFECYCLE = defineSchemaLifecycleFamil
330
390
  sha256: '1ac47d146aee742dd9e1c2b9755bfd8d59d1104b005bedd21d63f42c68d255ec',
331
391
  contentDigestSha256: null,
332
392
  schema: DOMAIN_CONTROL_REVIEW_SCHEMA,
333
- version: DOMAIN_CONTROL_REVIEW_VERSION,
393
+ version: PUBLIC_DOMAIN_CONTROL_REVIEW_VERSION,
334
394
  role: 'current',
335
395
  expectation: 'accepted_exact',
336
396
  expectedOutputFixtureId: null,
@@ -343,7 +403,7 @@ export const DOMAIN_CONTROL_REVIEW_SCHEMA_LIFECYCLE = defineSchemaLifecycleFamil
343
403
  sha256: 'b4f2005738bf6d8f12433304f20b503eb3ee47778bef9daa1cf1d4fdddae8621',
344
404
  contentDigestSha256: null,
345
405
  schema: CLI_DOMAIN_CONTROL_REVIEW_INPUT_SCHEMA,
346
- version: CLI_DOMAIN_CONTROL_REVIEW_VERSION,
406
+ version: PUBLIC_CLI_DOMAIN_CONTROL_REVIEW_VERSION,
347
407
  role: 'input',
348
408
  expectation: 'normalises_to_current_output',
349
409
  expectedOutputFixtureId: 'cli-domain-control-review-v1',
@@ -356,58 +416,73 @@ export const DOMAIN_CONTROL_REVIEW_SCHEMA_LIFECYCLE = defineSchemaLifecycleFamil
356
416
  sha256: 'd6e24209da9d4e41d2065bab493c035adf117faa5bacc8c8ce30c56c8aef0b93',
357
417
  contentDigestSha256: null,
358
418
  schema: CLI_DOMAIN_CONTROL_REVIEW_SCHEMA,
359
- version: CLI_DOMAIN_CONTROL_REVIEW_VERSION,
419
+ version: PUBLIC_CLI_DOMAIN_CONTROL_REVIEW_VERSION,
360
420
  role: 'current',
361
421
  expectation: 'accepted_exact',
362
422
  expectedOutputFixtureId: null,
363
423
  scope: 'repository',
364
424
  },
365
- ],
425
+ ].flatMap((fixture) => {
426
+ const currentVersion = fixture.schema.startsWith('whoisleuth.cli.') ? CLI_DOMAIN_CONTROL_REVIEW_VERSION : DOMAIN_CONTROL_REVIEW_VERSION;
427
+ const versions = fixture.schema.startsWith('whoisleuth.cli.') ? SUPPORTED_CLI_DOMAIN_CONTROL_REVIEW_VERSIONS : SUPPORTED_DOMAIN_CONTROL_REVIEW_VERSIONS;
428
+ return versions.map((version) => {
429
+ const id = fixture.id.replace(/v\d+$/u, `v${version}`);
430
+ const current = version === currentVersion;
431
+ return {
432
+ ...fixture, ...(version === 1 ? {} : CURRENT_REVIEW_FIXTURE_CONTENT[id]), id,
433
+ path: `test/fixtures/${id}.json`, version, shapeId: reviewFixtureShapeId(fixture.schema, version),
434
+ role: fixture.role === 'input' ? 'input' : current ? 'current' : 'historical',
435
+ expectation: current ? fixture.expectation : fixture.schema === CLI_DOMAIN_CONTROL_REVIEW_SCHEMA ? 'historical_output_exact' : 'accepted_exact',
436
+ expectedOutputFixtureId: current ? fixture.expectedOutputFixtureId?.replace(/v\d+$/u, `v${version}`) ?? null : null,
437
+ };
438
+ });
439
+ }),
366
440
  metadata: {
367
- metadataVersion: 2,
368
441
  enforcement: 'declarative_only',
369
442
  shapes: [
370
443
  ...CORE_REVIEW_SHAPES,
371
- {
372
- id: 'domain-control-review.cli-input.v1',
373
- schema: CLI_DOMAIN_CONTROL_REVIEW_INPUT_SCHEMA,
374
- versions: [CLI_DOMAIN_CONTROL_REVIEW_VERSION],
375
- objects: [
376
- { path: '$', requiredKeys: CLI_DOMAIN_CONTROL_REVIEW_INPUT_KEYS, optionalKeys: [], unknownKeys: 'reject' },
377
- { path: '$.manifest', requiredKeys: DOMAIN_CONTROL_MANIFEST_ROOT_KEYS, optionalKeys: [], unknownKeys: 'reject' },
378
- { path: '$.manifest.entries[]', requiredKeys: DOMAIN_CONTROL_MANIFEST_ENTRY_KEYS, optionalKeys: [], unknownKeys: 'reject' },
379
- { path: '$.manifest.integrity', requiredKeys: DOMAIN_CONTROL_MANIFEST_INTEGRITY_KEYS, optionalKeys: [], unknownKeys: 'reject' },
380
- ],
381
- fixedArrays: [{ path: '$.manifest.limitations', values: DOMAIN_CONTROL_MANIFEST_LIMITATIONS }],
382
- normalisation: 'input_to_current',
383
- target: { schema: CLI_DOMAIN_CONTROL_REVIEW_SCHEMA, version: CLI_DOMAIN_CONTROL_REVIEW_VERSION },
384
- },
385
- {
386
- id: 'domain-control-review.cli-document.v1',
387
- schema: CLI_DOMAIN_CONTROL_REVIEW_SCHEMA,
388
- versions: [CLI_DOMAIN_CONTROL_REVIEW_VERSION],
389
- objects: [
390
- { path: '$', requiredKeys: CLI_DOMAIN_CONTROL_REVIEW_ROOT_KEYS, optionalKeys: [], unknownKeys: 'reject' },
391
- { path: '$.review', requiredKeys: DOMAIN_CONTROL_REVIEW_ROOT_KEYS, optionalKeys: [], unknownKeys: 'reject' },
392
- { path: '$.review.manifest', requiredKeys: DOMAIN_CONTROL_REVIEW_MANIFEST_SUMMARY_KEYS, optionalKeys: [], unknownKeys: 'reject' },
393
- { path: '$.review.counts', requiredKeys: DOMAIN_CONTROL_REVIEW_COUNT_KEYS, optionalKeys: [], unknownKeys: 'reject' },
394
- { path: '$.review.domains[]', requiredKeys: DOMAIN_CONTROL_REVIEW_DOMAIN_KEYS, optionalKeys: [], unknownKeys: 'reject' },
395
- { path: '$.review.domains[].comparisons[]', requiredKeys: DOMAIN_CONTROL_REVIEW_COMPARISON_KEYS, optionalKeys: [], unknownKeys: 'reject' },
396
- { path: '$.observations[]', requiredKeys: CLI_DOMAIN_CONTROL_REVIEW_OBSERVATION_KEYS, optionalKeys: [], unknownKeys: 'reject' },
397
- { path: '$.observations[].fields[]', requiredKeys: CLI_DOMAIN_CONTROL_REVIEW_FIELD_KEYS, optionalKeys: [], unknownKeys: 'reject' },
398
- { path: '$.input', requiredKeys: CLI_DOMAIN_CONTROL_REVIEW_INPUT_SUMMARY_KEYS, optionalKeys: [], unknownKeys: 'reject' },
399
- ],
400
- fixedArrays: [
401
- { path: '$.review.limitations', values: DOMAIN_CONTROL_REVIEW_LIMITATIONS },
402
- { path: '$.limitations', values: CLI_DOMAIN_CONTROL_REVIEW_LIMITATIONS },
403
- ],
404
- normalisation: 'preserve_document',
405
- target: null,
406
- },
407
- ],
444
+ ...SUPPORTED_CLI_DOMAIN_CONTROL_REVIEW_VERSIONS.flatMap((version) => [
445
+ {
446
+ id: `domain-control-review.cli-input.v${version}`,
447
+ schema: CLI_DOMAIN_CONTROL_REVIEW_INPUT_SCHEMA,
448
+ versions: [version],
449
+ objects: [
450
+ { path: '$', requiredKeys: CLI_DOMAIN_CONTROL_REVIEW_INPUT_KEYS, optionalKeys: [], unknownKeys: 'reject' },
451
+ { path: '$.manifest', requiredKeys: DOMAIN_CONTROL_MANIFEST_ROOT_KEYS, optionalKeys: [], unknownKeys: 'reject' },
452
+ { path: '$.manifest.entries[]', requiredKeys: PUBLIC_DOMAIN_CONTROL_MANIFEST_ENTRY_KEYS, optionalKeys: version === PUBLIC_CLI_DOMAIN_CONTROL_REVIEW_VERSION ? [] : ['recordModes'], unknownKeys: 'reject' },
453
+ { path: '$.manifest.integrity', requiredKeys: DOMAIN_CONTROL_MANIFEST_INTEGRITY_KEYS, optionalKeys: [], unknownKeys: 'reject' },
454
+ ],
455
+ fixedArrays: version === PUBLIC_CLI_DOMAIN_CONTROL_REVIEW_VERSION ? [{ path: '$.manifest.limitations', values: PUBLIC_DOMAIN_CONTROL_MANIFEST_LIMITATIONS }] : [],
456
+ normalisation: 'input_to_current',
457
+ target: { schema: CLI_DOMAIN_CONTROL_REVIEW_SCHEMA, version: CLI_DOMAIN_CONTROL_REVIEW_VERSION },
458
+ },
459
+ {
460
+ id: `domain-control-review.cli-document.v${version}`,
461
+ schema: CLI_DOMAIN_CONTROL_REVIEW_SCHEMA,
462
+ versions: [version],
463
+ objects: [
464
+ { path: '$', requiredKeys: CLI_DOMAIN_CONTROL_REVIEW_ROOT_KEYS, optionalKeys: [], unknownKeys: 'reject' },
465
+ { path: '$.review', requiredKeys: DOMAIN_CONTROL_REVIEW_ROOT_KEYS, optionalKeys: [], unknownKeys: 'reject' },
466
+ { path: '$.review.manifest', requiredKeys: DOMAIN_CONTROL_REVIEW_MANIFEST_SUMMARY_KEYS, optionalKeys: [], unknownKeys: 'reject' },
467
+ { path: '$.review.counts', requiredKeys: version === PUBLIC_CLI_DOMAIN_CONTROL_REVIEW_VERSION ? PUBLIC_DOMAIN_CONTROL_REVIEW_COUNT_KEYS : DOMAIN_CONTROL_REVIEW_COUNT_KEYS, optionalKeys: [], unknownKeys: 'reject' },
468
+ { path: '$.review.domains[]', requiredKeys: DOMAIN_CONTROL_REVIEW_DOMAIN_KEYS, optionalKeys: [], unknownKeys: 'reject' },
469
+ { path: '$.review.domains[].comparisons[]', requiredKeys: version === PUBLIC_CLI_DOMAIN_CONTROL_REVIEW_VERSION ? PUBLIC_DOMAIN_CONTROL_REVIEW_COMPARISON_KEYS : DOMAIN_CONTROL_REVIEW_COMPARISON_KEYS, optionalKeys: [], unknownKeys: 'reject' },
470
+ { path: '$.observations[]', requiredKeys: version === PUBLIC_CLI_DOMAIN_CONTROL_REVIEW_VERSION ? PUBLIC_CLI_DOMAIN_CONTROL_REVIEW_OBSERVATION_KEYS : CLI_DOMAIN_CONTROL_REVIEW_OBSERVATION_KEYS, optionalKeys: [], unknownKeys: 'reject' },
471
+ { path: '$.observations[].fields[]', requiredKeys: version === PUBLIC_CLI_DOMAIN_CONTROL_REVIEW_VERSION ? PUBLIC_CLI_DOMAIN_CONTROL_REVIEW_FIELD_KEYS : CLI_DOMAIN_CONTROL_REVIEW_FIELD_KEYS, optionalKeys: [], unknownKeys: 'reject' },
472
+ { path: '$.input', requiredKeys: CLI_DOMAIN_CONTROL_REVIEW_INPUT_SUMMARY_KEYS, optionalKeys: [], unknownKeys: 'reject' },
473
+ ],
474
+ fixedArrays: [
475
+ { path: '$.review.limitations', values: version === PUBLIC_CLI_DOMAIN_CONTROL_REVIEW_VERSION ? PUBLIC_DOMAIN_CONTROL_REVIEW_LIMITATIONS : DOMAIN_CONTROL_REVIEW_LIMITATIONS },
476
+ { path: '$.limitations', values: version === PUBLIC_CLI_DOMAIN_CONTROL_REVIEW_VERSION ? PUBLIC_CLI_DOMAIN_CONTROL_REVIEW_LIMITATIONS : CLI_DOMAIN_CONTROL_REVIEW_LIMITATIONS },
477
+ ],
478
+ normalisation: 'preserve_document',
479
+ target: null,
480
+ },
481
+ ]),
482
+ ].map((shape) => ({ ...shape, discriminator: null, objects: shape.objects.map((object) => ({ ...object, alternativeRequiredKeys: [] })) })),
408
483
  boundProfiles: [
409
- {
410
- id: 'domain-control-review.core.v1',
484
+ ...SUPPORTED_DOMAIN_CONTROL_REVIEW_VERSIONS.map((version) => ({
485
+ id: `domain-control-review.core.v${version}`,
411
486
  bounds: [
412
487
  { id: 'observations', path: '$.observations', phase: 'pre_accumulation', unit: 'items', minimum: 0, maximum: MAX_DOMAIN_CONTROL_REVIEW_OBSERVATIONS, handling: 'reject' },
413
488
  { id: 'observation-fields', path: '$.observations[].fields', phase: 'pre_accumulation', unit: 'keys', minimum: 0, maximum: MAX_DOMAIN_CONTROL_REVIEW_FIELDS, handling: 'reject' },
@@ -415,7 +490,7 @@ export const DOMAIN_CONTROL_REVIEW_SCHEMA_LIFECYCLE = defineSchemaLifecycleFamil
415
490
  const boundId = field.replace(/([A-Z])/gu, '-$1').toLowerCase();
416
491
  return [
417
492
  { id: `${boundId}-input-values`, path: `$.observations[].fields.${field}.values`, phase: 'pre_accumulation', unit: 'items', minimum: 0, maximum: MAX_DOMAIN_CONTROL_REVIEW_FIELD_INPUT_VALUES, handling: 'reject' },
418
- { id: `${boundId}-values`, path: `$.observations[].fields.${field}.values`, phase: 'normalised', unit: 'items', minimum: 0, maximum: MAX_CANONICAL_DOMAIN_CONTROL_RECORDS, handling: 'truncate' },
493
+ { id: `${boundId}-values`, path: `$.observations[].fields.${field}.values`, phase: 'normalised', unit: 'items', minimum: 0, maximum: version === PUBLIC_DOMAIN_CONTROL_REVIEW_VERSION ? MAX_CANONICAL_DOMAIN_CONTROL_RECORDS : MAX_CURRENT_DOMAIN_CONTROL_RECORDS, handling: 'reject' },
419
494
  { id: `${boundId}-source-input`, path: `$.observations[].fields.${field}.source`, phase: 'pre_accumulation', unit: 'characters', minimum: 1, maximum: MAX_DOMAIN_CONTROL_REVIEW_SOURCE_INPUT_LENGTH, handling: 'reject' },
420
495
  { id: `${boundId}-source`, path: `$.observations[].fields.${field}.source`, phase: 'normalised', unit: 'characters', minimum: 1, maximum: MAX_DOMAIN_CONTROL_REVIEW_SOURCE_LENGTH, handling: 'truncate' },
421
496
  { id: `${boundId}-observed-at-input`, path: `$.observations[].fields.${field}.observedAt`, phase: 'pre_accumulation', unit: 'characters', minimum: 0, maximum: MAX_DOMAIN_CONTROL_TIMESTAMP_LENGTH * DOMAIN_CONTROL_TEXT_INPUT_BOUND_FACTOR, handling: 'reject' },
@@ -430,7 +505,7 @@ export const DOMAIN_CONTROL_REVIEW_SCHEMA_LIFECYCLE = defineSchemaLifecycleFamil
430
505
  { id: 'tls-spki-text', path: '$.observations[].fields.tlsSpkiSha256.values[]', phase: 'normalised', unit: 'characters', minimum: DOMAIN_CONTROL_SPKI_SHA256_HEX_LENGTH, maximum: DOMAIN_CONTROL_SPKI_SHA256_HEX_LENGTH, handling: 'reject' },
431
506
  { id: 'output-domains', path: '$.domains', phase: 'normalised', unit: 'entries', minimum: 1, maximum: MAX_DOMAIN_CONTROL_MANIFEST_ENTRIES, handling: 'reject' },
432
507
  ],
433
- },
508
+ })),
434
509
  {
435
510
  id: 'domain-control-review.cli-library.v1',
436
511
  bounds: [
@@ -471,7 +546,7 @@ export const DOMAIN_CONTROL_REVIEW_SCHEMA_LIFECYCLE = defineSchemaLifecycleFamil
471
546
  {
472
547
  id: 'domain-control-review.core-json.v1',
473
548
  schema: DOMAIN_CONTROL_REVIEW_SCHEMA,
474
- versions: [DOMAIN_CONTROL_REVIEW_VERSION],
549
+ versions: SUPPORTED_DOMAIN_CONTROL_REVIEW_VERSIONS,
475
550
  mediaType: 'application/json',
476
551
  encoding: 'utf-8',
477
552
  bom: false,
@@ -486,7 +561,7 @@ export const DOMAIN_CONTROL_REVIEW_SCHEMA_LIFECYCLE = defineSchemaLifecycleFamil
486
561
  {
487
562
  id: 'domain-control-review.cli-json.v1',
488
563
  schema: CLI_DOMAIN_CONTROL_REVIEW_SCHEMA,
489
- versions: [CLI_DOMAIN_CONTROL_REVIEW_VERSION],
564
+ versions: SUPPORTED_CLI_DOMAIN_CONTROL_REVIEW_VERSIONS,
490
565
  mediaType: 'application/json',
491
566
  encoding: 'utf-8',
492
567
  bom: false,
@@ -583,10 +658,10 @@ export const DOMAIN_CONTROL_REVIEW_SCHEMA_LIFECYCLE = defineSchemaLifecycleFamil
583
658
  id: 'domain-control-review.node-core',
584
659
  plane: 'node',
585
660
  operation: 'review',
586
- acceptedContracts: [{ schema: DOMAIN_CONTROL_REVIEW_INPUT_SCHEMA, versions: [DOMAIN_CONTROL_REVIEW_VERSION], mode: 'direct' }],
661
+ acceptedContracts: [{ schema: DOMAIN_CONTROL_REVIEW_INPUT_SCHEMA, versions: SUPPORTED_DOMAIN_CONTROL_REVIEW_VERSIONS, mode: 'direct' }],
587
662
  emittedContract: { schema: DOMAIN_CONTROL_REVIEW_SCHEMA, version: DOMAIN_CONTROL_REVIEW_VERSION },
588
- shapeIds: ['domain-control-review.input.v1', 'domain-control-review.document.v1'],
589
- boundProfileIds: ['domain-control-review.core.v1'],
663
+ shapeIds: [...CORE_INPUT_SHAPE_IDS, CURRENT_CORE_DOCUMENT_SHAPE_ID],
664
+ boundProfileIds: [...CORE_BOUND_PROFILE_IDS],
590
665
  hookIds: ['domain-control-review.node.verify-manifest', 'domain-control-review.node.build-core'],
591
666
  serialisationProfileId: null,
592
667
  privacyProfileId: 'domain-control-review.sensitive.v1',
@@ -600,10 +675,10 @@ export const DOMAIN_CONTROL_REVIEW_SCHEMA_LIFECYCLE = defineSchemaLifecycleFamil
600
675
  id: 'domain-control-review.cli-core-json-stdout',
601
676
  plane: 'cli',
602
677
  operation: 'review-json-stdout',
603
- acceptedContracts: [{ schema: DOMAIN_CONTROL_REVIEW_INPUT_SCHEMA, versions: [DOMAIN_CONTROL_REVIEW_VERSION], mode: 'direct' }],
678
+ acceptedContracts: [{ schema: DOMAIN_CONTROL_REVIEW_INPUT_SCHEMA, versions: SUPPORTED_DOMAIN_CONTROL_REVIEW_VERSIONS, mode: 'direct' }],
604
679
  emittedContract: { schema: DOMAIN_CONTROL_REVIEW_SCHEMA, version: DOMAIN_CONTROL_REVIEW_VERSION },
605
- shapeIds: ['domain-control-review.input.v1', 'domain-control-review.document.v1'],
606
- boundProfileIds: ['domain-control-review.core.v1', 'domain-control-review.cli-command.v1'],
680
+ shapeIds: [...CORE_INPUT_SHAPE_IDS, CURRENT_CORE_DOCUMENT_SHAPE_ID],
681
+ boundProfileIds: [...CORE_BOUND_PROFILE_IDS, 'domain-control-review.cli-command.v1'],
607
682
  hookIds: [
608
683
  'domain-control-review.node.verify-manifest',
609
684
  'domain-control-review.node.build-core',
@@ -621,10 +696,10 @@ export const DOMAIN_CONTROL_REVIEW_SCHEMA_LIFECYCLE = defineSchemaLifecycleFamil
621
696
  id: 'domain-control-review.cli-core-terminal-stdout',
622
697
  plane: 'cli',
623
698
  operation: 'review-terminal-stdout',
624
- acceptedContracts: [{ schema: DOMAIN_CONTROL_REVIEW_INPUT_SCHEMA, versions: [DOMAIN_CONTROL_REVIEW_VERSION], mode: 'direct' }],
699
+ acceptedContracts: [{ schema: DOMAIN_CONTROL_REVIEW_INPUT_SCHEMA, versions: SUPPORTED_DOMAIN_CONTROL_REVIEW_VERSIONS, mode: 'direct' }],
625
700
  emittedContract: { schema: DOMAIN_CONTROL_REVIEW_SCHEMA, version: DOMAIN_CONTROL_REVIEW_VERSION },
626
- shapeIds: ['domain-control-review.input.v1', 'domain-control-review.document.v1'],
627
- boundProfileIds: ['domain-control-review.core.v1', 'domain-control-review.cli-command.v1'],
701
+ shapeIds: [...CORE_INPUT_SHAPE_IDS, CURRENT_CORE_DOCUMENT_SHAPE_ID],
702
+ boundProfileIds: [...CORE_BOUND_PROFILE_IDS, 'domain-control-review.cli-command.v1'],
628
703
  hookIds: [
629
704
  'domain-control-review.node.verify-manifest',
630
705
  'domain-control-review.node.build-core',
@@ -642,10 +717,10 @@ export const DOMAIN_CONTROL_REVIEW_SCHEMA_LIFECYCLE = defineSchemaLifecycleFamil
642
717
  id: 'domain-control-review.cli-core-json-file',
643
718
  plane: 'cli',
644
719
  operation: 'review-json-file',
645
- acceptedContracts: [{ schema: DOMAIN_CONTROL_REVIEW_INPUT_SCHEMA, versions: [DOMAIN_CONTROL_REVIEW_VERSION], mode: 'direct' }],
720
+ acceptedContracts: [{ schema: DOMAIN_CONTROL_REVIEW_INPUT_SCHEMA, versions: SUPPORTED_DOMAIN_CONTROL_REVIEW_VERSIONS, mode: 'direct' }],
646
721
  emittedContract: { schema: DOMAIN_CONTROL_REVIEW_SCHEMA, version: DOMAIN_CONTROL_REVIEW_VERSION },
647
- shapeIds: ['domain-control-review.input.v1', 'domain-control-review.document.v1'],
648
- boundProfileIds: ['domain-control-review.core.v1', 'domain-control-review.cli-command.v1'],
722
+ shapeIds: [...CORE_INPUT_SHAPE_IDS, CURRENT_CORE_DOCUMENT_SHAPE_ID],
723
+ boundProfileIds: [...CORE_BOUND_PROFILE_IDS, 'domain-control-review.cli-command.v1'],
649
724
  hookIds: [
650
725
  'domain-control-review.node.verify-manifest',
651
726
  'domain-control-review.node.build-core',
@@ -663,10 +738,10 @@ export const DOMAIN_CONTROL_REVIEW_SCHEMA_LIFECYCLE = defineSchemaLifecycleFamil
663
738
  id: 'domain-control-review.cli-core-terminal-file',
664
739
  plane: 'cli',
665
740
  operation: 'review-terminal-file',
666
- acceptedContracts: [{ schema: DOMAIN_CONTROL_REVIEW_INPUT_SCHEMA, versions: [DOMAIN_CONTROL_REVIEW_VERSION], mode: 'direct' }],
741
+ acceptedContracts: [{ schema: DOMAIN_CONTROL_REVIEW_INPUT_SCHEMA, versions: SUPPORTED_DOMAIN_CONTROL_REVIEW_VERSIONS, mode: 'direct' }],
667
742
  emittedContract: { schema: DOMAIN_CONTROL_REVIEW_SCHEMA, version: DOMAIN_CONTROL_REVIEW_VERSION },
668
- shapeIds: ['domain-control-review.input.v1', 'domain-control-review.document.v1'],
669
- boundProfileIds: ['domain-control-review.core.v1', 'domain-control-review.cli-command.v1'],
743
+ shapeIds: [...CORE_INPUT_SHAPE_IDS, CURRENT_CORE_DOCUMENT_SHAPE_ID],
744
+ boundProfileIds: [...CORE_BOUND_PROFILE_IDS, 'domain-control-review.cli-command.v1'],
670
745
  hookIds: [
671
746
  'domain-control-review.node.verify-manifest',
672
747
  'domain-control-review.node.build-core',
@@ -684,10 +759,10 @@ export const DOMAIN_CONTROL_REVIEW_SCHEMA_LIFECYCLE = defineSchemaLifecycleFamil
684
759
  id: 'domain-control-review.cli-saved-lookup-library',
685
760
  plane: 'cli',
686
761
  operation: 'review',
687
- acceptedContracts: [{ schema: CLI_DOMAIN_CONTROL_REVIEW_INPUT_SCHEMA, versions: [CLI_DOMAIN_CONTROL_REVIEW_VERSION], mode: 'direct' }],
762
+ acceptedContracts: [{ schema: CLI_DOMAIN_CONTROL_REVIEW_INPUT_SCHEMA, versions: SUPPORTED_CLI_DOMAIN_CONTROL_REVIEW_VERSIONS, mode: 'direct' }],
688
763
  emittedContract: { schema: CLI_DOMAIN_CONTROL_REVIEW_SCHEMA, version: CLI_DOMAIN_CONTROL_REVIEW_VERSION },
689
- shapeIds: ['domain-control-review.cli-input.v1', 'domain-control-review.cli-document.v1'],
690
- boundProfileIds: ['domain-control-review.core.v1', 'domain-control-review.cli-library.v1'],
764
+ shapeIds: [...CLI_INPUT_SHAPE_IDS, CURRENT_CLI_DOCUMENT_SHAPE_ID],
765
+ boundProfileIds: [...CORE_BOUND_PROFILE_IDS, 'domain-control-review.cli-library.v1'],
691
766
  hookIds: [
692
767
  'domain-control-review.node.verify-manifest',
693
768
  'domain-control-review.node.build-core',
@@ -705,11 +780,11 @@ export const DOMAIN_CONTROL_REVIEW_SCHEMA_LIFECYCLE = defineSchemaLifecycleFamil
705
780
  id: 'domain-control-review.cli-saved-json-stdout',
706
781
  plane: 'cli',
707
782
  operation: 'review-json-stdout',
708
- acceptedContracts: [{ schema: CLI_DOMAIN_CONTROL_REVIEW_INPUT_SCHEMA, versions: [CLI_DOMAIN_CONTROL_REVIEW_VERSION], mode: 'direct' }],
783
+ acceptedContracts: [{ schema: CLI_DOMAIN_CONTROL_REVIEW_INPUT_SCHEMA, versions: SUPPORTED_CLI_DOMAIN_CONTROL_REVIEW_VERSIONS, mode: 'direct' }],
709
784
  emittedContract: { schema: CLI_DOMAIN_CONTROL_REVIEW_SCHEMA, version: CLI_DOMAIN_CONTROL_REVIEW_VERSION },
710
- shapeIds: ['domain-control-review.cli-input.v1', 'domain-control-review.cli-document.v1'],
785
+ shapeIds: [...CLI_INPUT_SHAPE_IDS, CURRENT_CLI_DOCUMENT_SHAPE_ID],
711
786
  boundProfileIds: [
712
- 'domain-control-review.core.v1',
787
+ ...CORE_BOUND_PROFILE_IDS,
713
788
  'domain-control-review.cli-library.v1',
714
789
  'domain-control-review.cli-command.v1',
715
790
  ],
@@ -731,11 +806,11 @@ export const DOMAIN_CONTROL_REVIEW_SCHEMA_LIFECYCLE = defineSchemaLifecycleFamil
731
806
  id: 'domain-control-review.cli-saved-terminal-stdout',
732
807
  plane: 'cli',
733
808
  operation: 'review-terminal-stdout',
734
- acceptedContracts: [{ schema: CLI_DOMAIN_CONTROL_REVIEW_INPUT_SCHEMA, versions: [CLI_DOMAIN_CONTROL_REVIEW_VERSION], mode: 'direct' }],
809
+ acceptedContracts: [{ schema: CLI_DOMAIN_CONTROL_REVIEW_INPUT_SCHEMA, versions: SUPPORTED_CLI_DOMAIN_CONTROL_REVIEW_VERSIONS, mode: 'direct' }],
735
810
  emittedContract: { schema: CLI_DOMAIN_CONTROL_REVIEW_SCHEMA, version: CLI_DOMAIN_CONTROL_REVIEW_VERSION },
736
- shapeIds: ['domain-control-review.cli-input.v1', 'domain-control-review.cli-document.v1'],
811
+ shapeIds: [...CLI_INPUT_SHAPE_IDS, CURRENT_CLI_DOCUMENT_SHAPE_ID],
737
812
  boundProfileIds: [
738
- 'domain-control-review.core.v1',
813
+ ...CORE_BOUND_PROFILE_IDS,
739
814
  'domain-control-review.cli-library.v1',
740
815
  'domain-control-review.cli-command.v1',
741
816
  ],
@@ -757,11 +832,11 @@ export const DOMAIN_CONTROL_REVIEW_SCHEMA_LIFECYCLE = defineSchemaLifecycleFamil
757
832
  id: 'domain-control-review.cli-saved-json-file',
758
833
  plane: 'cli',
759
834
  operation: 'review-json-file',
760
- acceptedContracts: [{ schema: CLI_DOMAIN_CONTROL_REVIEW_INPUT_SCHEMA, versions: [CLI_DOMAIN_CONTROL_REVIEW_VERSION], mode: 'direct' }],
835
+ acceptedContracts: [{ schema: CLI_DOMAIN_CONTROL_REVIEW_INPUT_SCHEMA, versions: SUPPORTED_CLI_DOMAIN_CONTROL_REVIEW_VERSIONS, mode: 'direct' }],
761
836
  emittedContract: { schema: CLI_DOMAIN_CONTROL_REVIEW_SCHEMA, version: CLI_DOMAIN_CONTROL_REVIEW_VERSION },
762
- shapeIds: ['domain-control-review.cli-input.v1', 'domain-control-review.cli-document.v1'],
837
+ shapeIds: [...CLI_INPUT_SHAPE_IDS, CURRENT_CLI_DOCUMENT_SHAPE_ID],
763
838
  boundProfileIds: [
764
- 'domain-control-review.core.v1',
839
+ ...CORE_BOUND_PROFILE_IDS,
765
840
  'domain-control-review.cli-library.v1',
766
841
  'domain-control-review.cli-command.v1',
767
842
  ],
@@ -783,11 +858,11 @@ export const DOMAIN_CONTROL_REVIEW_SCHEMA_LIFECYCLE = defineSchemaLifecycleFamil
783
858
  id: 'domain-control-review.cli-saved-terminal-file',
784
859
  plane: 'cli',
785
860
  operation: 'review-terminal-file',
786
- acceptedContracts: [{ schema: CLI_DOMAIN_CONTROL_REVIEW_INPUT_SCHEMA, versions: [CLI_DOMAIN_CONTROL_REVIEW_VERSION], mode: 'direct' }],
861
+ acceptedContracts: [{ schema: CLI_DOMAIN_CONTROL_REVIEW_INPUT_SCHEMA, versions: SUPPORTED_CLI_DOMAIN_CONTROL_REVIEW_VERSIONS, mode: 'direct' }],
787
862
  emittedContract: { schema: CLI_DOMAIN_CONTROL_REVIEW_SCHEMA, version: CLI_DOMAIN_CONTROL_REVIEW_VERSION },
788
- shapeIds: ['domain-control-review.cli-input.v1', 'domain-control-review.cli-document.v1'],
863
+ shapeIds: [...CLI_INPUT_SHAPE_IDS, CURRENT_CLI_DOCUMENT_SHAPE_ID],
789
864
  boundProfileIds: [
790
- 'domain-control-review.core.v1',
865
+ ...CORE_BOUND_PROFILE_IDS,
791
866
  'domain-control-review.cli-library.v1',
792
867
  'domain-control-review.cli-command.v1',
793
868
  ],
@@ -809,9 +884,9 @@ export const DOMAIN_CONTROL_REVIEW_SCHEMA_LIFECYCLE = defineSchemaLifecycleFamil
809
884
  id: 'domain-control-review.cli-monitor-embedding',
810
885
  plane: 'cli',
811
886
  operation: 'embed-review-after-bounded-passive-collection',
812
- acceptedContracts: [{ schema: DOMAIN_CONTROL_REVIEW_SCHEMA, versions: [DOMAIN_CONTROL_REVIEW_VERSION], mode: 'embedded' }],
887
+ acceptedContracts: [{ schema: DOMAIN_CONTROL_REVIEW_SCHEMA, versions: SUPPORTED_DOMAIN_CONTROL_REVIEW_VERSIONS, mode: 'embedded' }],
813
888
  emittedContract: null,
814
- shapeIds: ['domain-control-review.document.v1'],
889
+ shapeIds: CORE_DOCUMENT_SHAPE_IDS,
815
890
  boundProfileIds: ['domain-control-review.monitor-action.v1'],
816
891
  hookIds: ['domain-control-review.node.validate-core', 'domain-control-review.cli.monitor'],
817
892
  serialisationProfileId: null,
@@ -822,7 +897,11 @@ export const DOMAIN_CONTROL_REVIEW_SCHEMA_LIFECYCLE = defineSchemaLifecycleFamil
822
897
  bindingState: 'declared_unenforced',
823
898
  policyState: 'current',
824
899
  },
825
- ],
900
+ ].map((edge) => ({
901
+ ...edge,
902
+ acceptedContracts: edge.acceptedContracts.map((contract) => ({ ...contract, discriminator: null })),
903
+ emittedContract: edge.emittedContract ? { ...edge.emittedContract, discriminator: null } : null,
904
+ })),
826
905
  consumerRelationships: [],
827
906
  },
828
907
  });