@zxyycom/vibe-check 0.0.2 → 0.0.3

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 (670) hide show
  1. package/README.md +36 -5
  2. package/dist/esm/check/check.mjs +4 -0
  3. package/dist/esm/check/check.mjs.map +1 -1
  4. package/dist/esm/check/flag-enablement.mjs +32 -0
  5. package/dist/esm/check/flag-enablement.mjs.map +1 -0
  6. package/dist/esm/check/handoff-provider-identity.mjs +18 -0
  7. package/dist/esm/check/handoff-provider-identity.mjs.map +1 -0
  8. package/dist/esm/check/inherited-collection.mjs +1 -1
  9. package/dist/esm/check/inherited-collection.mjs.map +1 -1
  10. package/dist/esm/check/project-changes.mjs +2 -0
  11. package/dist/esm/check/project-changes.mjs.map +1 -0
  12. package/dist/esm/check/project-context.mjs +2 -0
  13. package/dist/esm/check/project-context.mjs.map +1 -0
  14. package/dist/esm/check-settlement/facts.mjs.map +1 -1
  15. package/dist/esm/check-settlement/record-store.mjs +1 -1
  16. package/dist/esm/check-settlement/record-store.mjs.map +1 -1
  17. package/dist/esm/data-boundary/canonical-data.mjs +36 -7
  18. package/dist/esm/data-boundary/canonical-data.mjs.map +1 -1
  19. package/dist/esm/data-boundary/canonical-json.mjs.map +1 -1
  20. package/dist/esm/data-boundary/closed-values.mjs +28 -4
  21. package/dist/esm/data-boundary/closed-values.mjs.map +1 -1
  22. package/dist/esm/{package-checks/project-files → data-boundary}/config-glob.mjs +3 -3
  23. package/dist/esm/data-boundary/config-glob.mjs.map +1 -0
  24. package/dist/esm/data-boundary/project-path.mjs +19 -0
  25. package/dist/esm/data-boundary/project-path.mjs.map +1 -0
  26. package/dist/esm/index.mjs +12 -5
  27. package/dist/esm/index.mjs.map +1 -1
  28. package/dist/esm/machine-output/v4/atomic-publication.mjs +4 -1
  29. package/dist/esm/machine-output/v4/atomic-publication.mjs.map +1 -1
  30. package/dist/esm/package-checks/check-authoring.mjs +69 -0
  31. package/dist/esm/package-checks/check-authoring.mjs.map +1 -0
  32. package/dist/esm/package-checks/code-quality-findings/finding-waiver-authoring.mjs.map +1 -1
  33. package/dist/esm/package-checks/code-quality-findings/finding-waiver-evidence.mjs.map +1 -1
  34. package/dist/esm/package-checks/command-check/command-check.mjs +55 -0
  35. package/dist/esm/package-checks/command-check/command-check.mjs.map +1 -0
  36. package/dist/esm/package-checks/command-check/contract.mjs +2 -0
  37. package/dist/esm/package-checks/command-check/contract.mjs.map +1 -0
  38. package/dist/esm/package-checks/command-check/execution.mjs +134 -0
  39. package/dist/esm/package-checks/command-check/execution.mjs.map +1 -0
  40. package/dist/esm/package-checks/command-check/options.mjs +284 -0
  41. package/dist/esm/package-checks/command-check/options.mjs.map +1 -0
  42. package/dist/esm/package-checks/command-check/transcript.mjs +26 -0
  43. package/dist/esm/package-checks/command-check/transcript.mjs.map +1 -0
  44. package/dist/esm/package-checks/duplicate-detection/default-check.mjs +9 -11
  45. package/dist/esm/package-checks/duplicate-detection/default-check.mjs.map +1 -1
  46. package/dist/esm/package-checks/duplicate-detection/execution.mjs +2 -4
  47. package/dist/esm/package-checks/duplicate-detection/execution.mjs.map +1 -1
  48. package/dist/esm/package-checks/duplicate-detection/finding-messages.mjs +1 -1
  49. package/dist/esm/package-checks/duplicate-detection/finding-messages.mjs.map +1 -1
  50. package/dist/esm/package-checks/duplicate-detection/jscpd/availability.mjs +1 -1
  51. package/dist/esm/package-checks/duplicate-detection/jscpd/availability.mjs.map +1 -1
  52. package/dist/esm/package-checks/duplicate-detection/options.mjs.map +1 -1
  53. package/dist/esm/package-checks/duplicate-detection/records.mjs.map +1 -1
  54. package/dist/esm/package-checks/file-metrics/constructor.mjs +9 -11
  55. package/dist/esm/package-checks/file-metrics/constructor.mjs.map +1 -1
  56. package/dist/esm/package-checks/file-metrics/execution.mjs +2 -4
  57. package/dist/esm/package-checks/file-metrics/execution.mjs.map +1 -1
  58. package/dist/esm/package-checks/file-metrics/finding-messages.mjs +1 -1
  59. package/dist/esm/package-checks/file-metrics/finding-messages.mjs.map +1 -1
  60. package/dist/esm/package-checks/file-metrics/options.mjs.map +1 -1
  61. package/dist/esm/package-checks/file-metrics/records.mjs.map +1 -1
  62. package/dist/esm/package-checks/file-metrics/scc/availability.mjs +1 -1
  63. package/dist/esm/package-checks/file-metrics/scc/availability.mjs.map +1 -1
  64. package/dist/esm/package-checks/file-metrics/scc/batch-planner.mjs +38 -0
  65. package/dist/esm/package-checks/file-metrics/scc/batch-planner.mjs.map +1 -0
  66. package/dist/esm/package-checks/file-metrics/scc/logical-scan-resources.mjs +35 -0
  67. package/dist/esm/package-checks/file-metrics/scc/logical-scan-resources.mjs.map +1 -0
  68. package/dist/esm/package-checks/file-metrics/scc/scanner.mjs +102 -29
  69. package/dist/esm/package-checks/file-metrics/scc/scanner.mjs.map +1 -1
  70. package/dist/esm/package-checks/function-metrics/analysis.mjs +7 -2
  71. package/dist/esm/package-checks/function-metrics/analysis.mjs.map +1 -1
  72. package/dist/esm/package-checks/function-metrics/analyzer/analysis-model.mjs +1 -1
  73. package/dist/esm/package-checks/function-metrics/analyzer/analysis-model.mjs.map +1 -1
  74. package/dist/esm/package-checks/function-metrics/analyzer/extensions/lizardcomplextags.mjs +1 -3
  75. package/dist/esm/package-checks/function-metrics/analyzer/extensions/lizardcomplextags.mjs.map +1 -1
  76. package/dist/esm/package-checks/function-metrics/analyzer/extensions/protocol.mjs.map +1 -1
  77. package/dist/esm/package-checks/function-metrics/analyzer/pipeline.mjs +3 -2
  78. package/dist/esm/package-checks/function-metrics/analyzer/pipeline.mjs.map +1 -1
  79. package/dist/esm/package-checks/function-metrics/analyzer/readers/erlang.mjs +6 -6
  80. package/dist/esm/package-checks/function-metrics/analyzer/readers/erlang.mjs.map +1 -1
  81. package/dist/esm/package-checks/function-metrics/analyzer/readers/fortran.mjs +1 -1
  82. package/dist/esm/package-checks/function-metrics/analyzer/readers/fortran.mjs.map +1 -1
  83. package/dist/esm/package-checks/function-metrics/analyzer/readers/objc.mjs +9 -3
  84. package/dist/esm/package-checks/function-metrics/analyzer/readers/objc.mjs.map +1 -1
  85. package/dist/esm/package-checks/function-metrics/analyzer/readers/php-states.mjs +12 -7
  86. package/dist/esm/package-checks/function-metrics/analyzer/readers/php-states.mjs.map +1 -1
  87. package/dist/esm/package-checks/function-metrics/analyzer/readers/plsql.mjs +6 -6
  88. package/dist/esm/package-checks/function-metrics/analyzer/readers/plsql.mjs.map +1 -1
  89. package/dist/esm/package-checks/function-metrics/analyzer/readers/python.mjs +5 -3
  90. package/dist/esm/package-checks/function-metrics/analyzer/readers/python.mjs.map +1 -1
  91. package/dist/esm/package-checks/function-metrics/analyzer/readers/r.mjs +2 -0
  92. package/dist/esm/package-checks/function-metrics/analyzer/readers/r.mjs.map +1 -1
  93. package/dist/esm/package-checks/function-metrics/analyzer/readers/ttcn.mjs +9 -3
  94. package/dist/esm/package-checks/function-metrics/analyzer/readers/ttcn.mjs.map +1 -1
  95. package/dist/esm/package-checks/function-metrics/analyzer/readers/typescript.mjs +9 -3
  96. package/dist/esm/package-checks/function-metrics/analyzer/readers/typescript.mjs.map +1 -1
  97. package/dist/esm/package-checks/function-metrics/analyzer/readers/zig.mjs +3 -1
  98. package/dist/esm/package-checks/function-metrics/analyzer/readers/zig.mjs.map +1 -1
  99. package/dist/esm/package-checks/function-metrics/analyzer/shared/code-reader.mjs +3 -1
  100. package/dist/esm/package-checks/function-metrics/analyzer/shared/code-reader.mjs.map +1 -1
  101. package/dist/esm/package-checks/function-metrics/analyzer/shared/js-style-regex.mjs +12 -5
  102. package/dist/esm/package-checks/function-metrics/analyzer/shared/js-style-regex.mjs.map +1 -1
  103. package/dist/esm/package-checks/function-metrics/analyzer-worker-port.mjs +20 -8
  104. package/dist/esm/package-checks/function-metrics/analyzer-worker-port.mjs.map +1 -1
  105. package/dist/esm/package-checks/function-metrics/constructor.mjs +9 -11
  106. package/dist/esm/package-checks/function-metrics/constructor.mjs.map +1 -1
  107. package/dist/esm/package-checks/function-metrics/execution.mjs +2 -4
  108. package/dist/esm/package-checks/function-metrics/execution.mjs.map +1 -1
  109. package/dist/esm/package-checks/function-metrics/finding-messages.mjs +1 -1
  110. package/dist/esm/package-checks/function-metrics/finding-messages.mjs.map +1 -1
  111. package/dist/esm/package-checks/function-metrics/measurement.mjs +3 -1
  112. package/dist/esm/package-checks/function-metrics/measurement.mjs.map +1 -1
  113. package/dist/esm/package-checks/function-metrics/options.mjs.map +1 -1
  114. package/dist/esm/package-checks/function-metrics/records.mjs.map +1 -1
  115. package/dist/esm/package-checks/host-environment/git.mjs +11 -0
  116. package/dist/esm/package-checks/host-environment/git.mjs.map +1 -1
  117. package/dist/esm/package-checks/host-environment/path.mjs +1 -17
  118. package/dist/esm/package-checks/host-environment/path.mjs.map +1 -1
  119. package/dist/esm/package-checks/host-environment/process/contract.mjs.map +1 -1
  120. package/dist/esm/package-checks/host-environment/process/result.mjs +43 -17
  121. package/dist/esm/package-checks/host-environment/process/result.mjs.map +1 -1
  122. package/dist/esm/package-checks/host-environment/process/runner.mjs +7 -5
  123. package/dist/esm/package-checks/host-environment/process/runner.mjs.map +1 -1
  124. package/dist/esm/package-checks/json-schema-validation/default-check.mjs +9 -11
  125. package/dist/esm/package-checks/json-schema-validation/default-check.mjs.map +1 -1
  126. package/dist/esm/package-checks/json-schema-validation/options.mjs.map +1 -1
  127. package/dist/esm/package-checks/json-schema-validation/reference-resolver.mjs +6 -2
  128. package/dist/esm/package-checks/json-schema-validation/reference-resolver.mjs.map +1 -1
  129. package/dist/esm/package-checks/json-schema-validation/schema-policy.mjs +11 -3
  130. package/dist/esm/package-checks/json-schema-validation/schema-policy.mjs.map +1 -1
  131. package/dist/esm/package-checks/json-validation/default-check.mjs +9 -11
  132. package/dist/esm/package-checks/json-validation/default-check.mjs.map +1 -1
  133. package/dist/esm/package-checks/json-validation/options.mjs.map +1 -1
  134. package/dist/esm/package-checks/local-cache-options.mjs +28 -0
  135. package/dist/esm/package-checks/local-cache-options.mjs.map +1 -0
  136. package/dist/esm/package-checks/maintenance-reminders/maintenance-reminders.mjs +37 -45
  137. package/dist/esm/package-checks/maintenance-reminders/maintenance-reminders.mjs.map +1 -1
  138. package/dist/esm/package-checks/maintenance-reminders/maintenance-support.mjs +3 -1
  139. package/dist/esm/package-checks/maintenance-reminders/maintenance-support.mjs.map +1 -1
  140. package/dist/esm/package-checks/markdown-link-validation/default-check.mjs +19 -33
  141. package/dist/esm/package-checks/markdown-link-validation/default-check.mjs.map +1 -1
  142. package/dist/esm/package-checks/markdown-link-validation/execution.mjs +1 -1
  143. package/dist/esm/package-checks/markdown-link-validation/execution.mjs.map +1 -1
  144. package/dist/esm/package-checks/markdown-link-validation/finding-messages.mjs +1 -1
  145. package/dist/esm/package-checks/markdown-link-validation/finding-messages.mjs.map +1 -1
  146. package/dist/esm/package-checks/markdown-link-validation/markdown-parser.mjs +1 -3
  147. package/dist/esm/package-checks/markdown-link-validation/markdown-parser.mjs.map +1 -1
  148. package/dist/esm/package-checks/markdown-link-validation/options-resolution.mjs +3 -18
  149. package/dist/esm/package-checks/markdown-link-validation/options-resolution.mjs.map +1 -1
  150. package/dist/esm/package-checks/markdown-link-validation/options-validation.mjs +2 -14
  151. package/dist/esm/package-checks/markdown-link-validation/options-validation.mjs.map +1 -1
  152. package/dist/esm/package-checks/markdown-link-validation/options.mjs.map +1 -1
  153. package/dist/esm/package-checks/markdown-link-validation/parse-facts-cache-payload.mjs +4 -5
  154. package/dist/esm/package-checks/markdown-link-validation/parse-facts-cache-payload.mjs.map +1 -1
  155. package/dist/esm/package-checks/markdown-lint/adapter.mjs +125 -0
  156. package/dist/esm/package-checks/markdown-lint/adapter.mjs.map +1 -0
  157. package/dist/esm/package-checks/markdown-lint/default-check.mjs +37 -0
  158. package/dist/esm/package-checks/markdown-lint/default-check.mjs.map +1 -0
  159. package/dist/esm/package-checks/markdown-lint/execution.mjs +202 -0
  160. package/dist/esm/package-checks/markdown-lint/execution.mjs.map +1 -0
  161. package/dist/esm/package-checks/markdown-lint/final-data.mjs +16 -0
  162. package/dist/esm/package-checks/markdown-lint/final-data.mjs.map +1 -0
  163. package/dist/esm/package-checks/markdown-lint/finding-messages.mjs +72 -0
  164. package/dist/esm/package-checks/markdown-lint/finding-messages.mjs.map +1 -0
  165. package/dist/esm/package-checks/markdown-lint/finding-waiver-identity.mjs +41 -0
  166. package/dist/esm/package-checks/markdown-lint/finding-waiver-identity.mjs.map +1 -0
  167. package/dist/esm/package-checks/markdown-lint/findings-cache.mjs +110 -0
  168. package/dist/esm/package-checks/markdown-lint/findings-cache.mjs.map +1 -0
  169. package/dist/esm/package-checks/markdown-lint/options-resolution.mjs +74 -0
  170. package/dist/esm/package-checks/markdown-lint/options-resolution.mjs.map +1 -0
  171. package/dist/esm/package-checks/markdown-lint/options-validation.mjs +41 -0
  172. package/dist/esm/package-checks/markdown-lint/options-validation.mjs.map +1 -0
  173. package/dist/esm/package-checks/markdown-lint/options.mjs +13 -0
  174. package/dist/esm/package-checks/markdown-lint/options.mjs.map +1 -0
  175. package/dist/esm/package-checks/markdown-lint/records.mjs +65 -0
  176. package/dist/esm/package-checks/markdown-lint/records.mjs.map +1 -0
  177. package/dist/esm/package-checks/markdown-lint/unavailable-reasons.mjs +14 -0
  178. package/dist/esm/package-checks/markdown-lint/unavailable-reasons.mjs.map +1 -0
  179. package/dist/esm/package-checks/project-files/collection.mjs +23 -19
  180. package/dist/esm/package-checks/project-files/collection.mjs.map +1 -1
  181. package/dist/esm/package-checks/project-files/configuration.mjs +1 -1
  182. package/dist/esm/package-checks/project-files/configuration.mjs.map +1 -1
  183. package/dist/esm/package-checks/project-files/gitlink-revision.mjs +2 -5
  184. package/dist/esm/package-checks/project-files/gitlink-revision.mjs.map +1 -1
  185. package/dist/esm/package-checks/project-files/gitlink-worktree.mjs +22 -6
  186. package/dist/esm/package-checks/project-files/gitlink-worktree.mjs.map +1 -1
  187. package/dist/esm/package-checks/project-files/public-collection.mjs +1 -1
  188. package/dist/esm/package-checks/project-files/public-collection.mjs.map +1 -1
  189. package/dist/esm/package-checks/project-files/revision-paths.mjs +3 -3
  190. package/dist/esm/package-checks/project-files/revision-paths.mjs.map +1 -1
  191. package/dist/esm/package-checks/project-files/revision-worktree-files.mjs +11 -15
  192. package/dist/esm/package-checks/project-files/revision-worktree-files.mjs.map +1 -1
  193. package/dist/esm/package-checks/secret-detection/default-check.mjs +9 -11
  194. package/dist/esm/package-checks/secret-detection/default-check.mjs.map +1 -1
  195. package/dist/esm/package-checks/secret-detection/execution.mjs +2 -2
  196. package/dist/esm/package-checks/secret-detection/execution.mjs.map +1 -1
  197. package/dist/esm/package-checks/secret-detection/input-preparation.mjs +46 -7
  198. package/dist/esm/package-checks/secret-detection/input-preparation.mjs.map +1 -1
  199. package/dist/esm/package-checks/secret-detection/options.mjs.map +1 -1
  200. package/dist/esm/package-checks/secret-detection/records.mjs.map +1 -1
  201. package/dist/esm/package-checks/secret-detection/secretlint/adapter.mjs +3 -4
  202. package/dist/esm/package-checks/secret-detection/secretlint/adapter.mjs.map +1 -1
  203. package/dist/esm/package-tools/admission-policy/define-admission-policy.mjs +10 -0
  204. package/dist/esm/package-tools/admission-policy/define-admission-policy.mjs.map +1 -0
  205. package/dist/esm/{cache → package-tools/cache}/cache-json-by-key.mjs +13 -14
  206. package/dist/esm/package-tools/cache/cache-json-by-key.mjs.map +1 -0
  207. package/dist/esm/package-tools/finding-presentation/finding-presentation.mjs.map +1 -0
  208. package/dist/esm/{finding-waivers → package-tools/finding-waivers}/reconciliation.mjs +14 -5
  209. package/dist/esm/package-tools/finding-waivers/reconciliation.mjs.map +1 -0
  210. package/dist/esm/package-tools/learned-critical-path/critical-path-ranking.mjs.map +1 -0
  211. package/dist/esm/package-tools/learned-critical-path/duration-model/bounded-history.mjs.map +1 -0
  212. package/dist/esm/{learned-critical-path → package-tools/learned-critical-path}/duration-model/prediction.mjs +2 -2
  213. package/dist/esm/package-tools/learned-critical-path/duration-model/prediction.mjs.map +1 -0
  214. package/dist/esm/{learned-critical-path → package-tools/learned-critical-path}/duration-model/preparation.mjs +4 -2
  215. package/dist/esm/package-tools/learned-critical-path/duration-model/preparation.mjs.map +1 -0
  216. package/dist/esm/package-tools/learned-critical-path/duration-model/recording.mjs.map +1 -0
  217. package/dist/esm/{learned-critical-path → package-tools/learned-critical-path}/duration-model/storage.mjs +8 -8
  218. package/dist/esm/package-tools/learned-critical-path/duration-model/storage.mjs.map +1 -0
  219. package/dist/esm/{learned-critical-path → package-tools/learned-critical-path}/selection-layers.mjs +1 -2
  220. package/dist/esm/package-tools/learned-critical-path/selection-layers.mjs.map +1 -0
  221. package/dist/esm/package-tools/learned-critical-path/static-decision.mjs.map +1 -0
  222. package/dist/esm/{learned-critical-path → package-tools/learned-critical-path}/strategy.mjs +3 -3
  223. package/dist/esm/package-tools/learned-critical-path/strategy.mjs.map +1 -0
  224. package/dist/esm/project-definition/check-tree/authoring.mjs +8 -5
  225. package/dist/esm/project-definition/check-tree/authoring.mjs.map +1 -1
  226. package/dist/esm/project-definition/check-tree/check-fields-authoring.mjs +79 -66
  227. package/dist/esm/project-definition/check-tree/check-fields-authoring.mjs.map +1 -1
  228. package/dist/esm/project-definition/check-tree/flag-conditions.mjs +71 -0
  229. package/dist/esm/project-definition/check-tree/flag-conditions.mjs.map +1 -0
  230. package/dist/esm/project-definition/check-tree/materialization.mjs +13 -8
  231. package/dist/esm/project-definition/check-tree/materialization.mjs.map +1 -1
  232. package/dist/esm/project-definition/check-tree/resolution.mjs +7 -6
  233. package/dist/esm/project-definition/check-tree/resolution.mjs.map +1 -1
  234. package/dist/esm/project-definition/declarative-snapshot.mjs +2 -1
  235. package/dist/esm/project-definition/declarative-snapshot.mjs.map +1 -1
  236. package/dist/esm/project-definition/project-changes.mjs +70 -0
  237. package/dist/esm/project-definition/project-changes.mjs.map +1 -0
  238. package/dist/esm/project-definition/project-definition-validation.mjs +40 -8
  239. package/dist/esm/project-definition/project-definition-validation.mjs.map +1 -1
  240. package/dist/esm/project-definition/project-definition.mjs +22 -15
  241. package/dist/esm/project-definition/project-definition.mjs.map +1 -1
  242. package/dist/esm/project-definition/scheduler-policy.mjs.map +1 -1
  243. package/dist/esm/project-run/admission-strategy-provider/custom-strategy-preparation.mjs +9 -6
  244. package/dist/esm/project-run/admission-strategy-provider/custom-strategy-preparation.mjs.map +1 -1
  245. package/dist/esm/project-run/admission-strategy-provider/prepared-admission-strategy.mjs.map +1 -1
  246. package/dist/esm/project-run/aggregation.mjs +42 -59
  247. package/dist/esm/project-run/aggregation.mjs.map +1 -1
  248. package/dist/esm/project-run/changes/git.mjs +161 -0
  249. package/dist/esm/project-run/changes/git.mjs.map +1 -0
  250. package/dist/esm/project-run/check-execution/admitted-check-execution.mjs +41 -0
  251. package/dist/esm/project-run/check-execution/admitted-check-execution.mjs.map +1 -0
  252. package/dist/esm/project-run/check-execution/callback.mjs +3 -2
  253. package/dist/esm/project-run/check-execution/callback.mjs.map +1 -1
  254. package/dist/esm/project-run/check-execution/dependencies.mjs +80 -5
  255. package/dist/esm/project-run/check-execution/dependencies.mjs.map +1 -1
  256. package/dist/esm/project-run/check-execution/execution-finalization.mjs +5 -3
  257. package/dist/esm/project-run/check-execution/execution-finalization.mjs.map +1 -1
  258. package/dist/esm/project-run/check-execution/execution-settlement.mjs +37 -16
  259. package/dist/esm/project-run/check-execution/execution-settlement.mjs.map +1 -1
  260. package/dist/esm/project-run/check-execution/flag-controls.mjs +15 -7
  261. package/dist/esm/project-run/check-execution/flag-controls.mjs.map +1 -1
  262. package/dist/esm/project-run/check-execution/lifecycle.mjs.map +1 -1
  263. package/dist/esm/project-run/check-execution/{preflight-result.mjs → preparation-result.mjs} +24 -24
  264. package/dist/esm/project-run/check-execution/preparation-result.mjs.map +1 -0
  265. package/dist/esm/project-run/check-execution/{preflight.mjs → preparation.mjs} +52 -52
  266. package/dist/esm/project-run/check-execution/preparation.mjs.map +1 -0
  267. package/dist/esm/project-run/check-execution/ready-check-execution.mjs +71 -0
  268. package/dist/esm/project-run/check-execution/ready-check-execution.mjs.map +1 -0
  269. package/dist/esm/project-run/check-execution/resolved-checks.mjs +27 -164
  270. package/dist/esm/project-run/check-execution/resolved-checks.mjs.map +1 -1
  271. package/dist/esm/project-run/check-execution/scheduled-check-run.mjs +79 -0
  272. package/dist/esm/project-run/check-execution/scheduled-check-run.mjs.map +1 -0
  273. package/dist/esm/project-run/check-execution/terminal-result.mjs +70 -25
  274. package/dist/esm/project-run/check-execution/terminal-result.mjs.map +1 -1
  275. package/dist/esm/project-run/completion/completion.mjs +18 -1
  276. package/dist/esm/project-run/completion/completion.mjs.map +1 -1
  277. package/dist/esm/project-run/controls/contract.mjs.map +1 -1
  278. package/dist/esm/project-run/controls/validation.mjs +7 -54
  279. package/dist/esm/project-run/controls/validation.mjs.map +1 -1
  280. package/dist/esm/project-run/diagnostic-logging/diagnostic-detail-rendering.mjs +3 -3
  281. package/dist/esm/project-run/diagnostic-logging/diagnostic-detail-rendering.mjs.map +1 -1
  282. package/dist/esm/project-run/diagnostic-logging/observation-rendering.mjs +1 -1
  283. package/dist/esm/project-run/diagnostic-logging/observation-rendering.mjs.map +1 -1
  284. package/dist/esm/project-run/invocation/candidate.mjs +17 -13
  285. package/dist/esm/project-run/invocation/candidate.mjs.map +1 -1
  286. package/dist/esm/project-run/invocation/candidates.mjs +26 -0
  287. package/dist/esm/project-run/invocation/candidates.mjs.map +1 -0
  288. package/dist/esm/project-run/invocation/creation.mjs +7 -3
  289. package/dist/esm/project-run/invocation/creation.mjs.map +1 -1
  290. package/dist/esm/project-run/invocation/execution.mjs +98 -0
  291. package/dist/esm/project-run/invocation/execution.mjs.map +1 -0
  292. package/dist/esm/project-run/invocation/run.mjs +13 -112
  293. package/dist/esm/project-run/invocation/run.mjs.map +1 -1
  294. package/dist/esm/project-run/invocation/scheduler.mjs +13 -6
  295. package/dist/esm/project-run/invocation/scheduler.mjs.map +1 -1
  296. package/dist/esm/project-run/outputs/status.mjs +12 -12
  297. package/dist/esm/project-run/outputs/status.mjs.map +1 -1
  298. package/dist/esm/project-run/progress-rendering/presentation.mjs +31 -11
  299. package/dist/esm/project-run/progress-rendering/presentation.mjs.map +1 -1
  300. package/dist/esm/project-run/progress-rendering/renderer-formatting.mjs +11 -4
  301. package/dist/esm/project-run/progress-rendering/renderer-formatting.mjs.map +1 -1
  302. package/dist/esm/project-run/progress-rendering/renderer-lifecycle.mjs +20 -6
  303. package/dist/esm/project-run/progress-rendering/renderer-lifecycle.mjs.map +1 -1
  304. package/dist/esm/project-run/progress-rendering/renderer.mjs +6 -2
  305. package/dist/esm/project-run/progress-rendering/renderer.mjs.map +1 -1
  306. package/dist/esm/project-run/project-context.mjs +2 -1
  307. package/dist/esm/project-run/project-context.mjs.map +1 -1
  308. package/dist/esm/project-run/result.mjs +2 -2
  309. package/dist/esm/project-run/result.mjs.map +1 -1
  310. package/dist/esm/project-run/run.mjs.map +1 -1
  311. package/dist/esm/project-run/task-scheduler/admission-core/compiled-graph-lookup.mjs +45 -0
  312. package/dist/esm/project-run/task-scheduler/admission-core/compiled-graph-lookup.mjs.map +1 -0
  313. package/dist/esm/project-run/task-scheduler/admission-core/compiled-graph.mjs +9 -4
  314. package/dist/esm/project-run/task-scheduler/admission-core/compiled-graph.mjs.map +1 -1
  315. package/dist/esm/project-run/task-scheduler/admission-core/selection-query.mjs +3 -5
  316. package/dist/esm/project-run/task-scheduler/admission-core/selection-query.mjs.map +1 -1
  317. package/dist/esm/project-run/task-scheduler/admission-core/selection-seed.mjs +25 -8
  318. package/dist/esm/project-run/task-scheduler/admission-core/selection-seed.mjs.map +1 -1
  319. package/dist/esm/project-run/task-scheduler/admission-core/selection-transition.mjs +8 -8
  320. package/dist/esm/project-run/task-scheduler/admission-core/selection-transition.mjs.map +1 -1
  321. package/dist/esm/project-run/task-scheduler/execution-state.mjs.map +1 -1
  322. package/dist/esm/project-run/task-scheduler/measurement/diagnostics.mjs +8 -4
  323. package/dist/esm/project-run/task-scheduler/measurement/diagnostics.mjs.map +1 -1
  324. package/dist/esm/project-run/task-scheduler/measurement/timing.mjs +12 -6
  325. package/dist/esm/project-run/task-scheduler/measurement/timing.mjs.map +1 -1
  326. package/dist/esm/project-run/task-scheduler/scheduler-observation.mjs +3 -1
  327. package/dist/esm/project-run/task-scheduler/scheduler-observation.mjs.map +1 -1
  328. package/dist/esm/project-run/task-scheduler/scheduler-terminal-measurement.mjs +17 -17
  329. package/dist/esm/project-run/task-scheduler/scheduler-terminal-measurement.mjs.map +1 -1
  330. package/dist/esm/project-run/task-scheduler/scheduler.mjs +18 -6
  331. package/dist/esm/project-run/task-scheduler/scheduler.mjs.map +1 -1
  332. package/docs/api-mechanics.md +147 -28
  333. package/docs/changelog.md +145 -2
  334. package/docs/checks/duplicate-detection.md +22 -3
  335. package/docs/checks/file-metrics.md +25 -6
  336. package/docs/checks/function-metrics.md +21 -2
  337. package/docs/checks/json-schema-validation.md +25 -4
  338. package/docs/checks/json-validation.md +24 -5
  339. package/docs/checks/maintenance-reminders.md +30 -6
  340. package/docs/checks/markdown-link-validation.md +24 -4
  341. package/docs/checks/markdown-lint.md +167 -0
  342. package/docs/checks/secret-detection.md +31 -7
  343. package/docs/examples/artifacts/mixed-outcomes/definition.ts +10 -10
  344. package/docs/guides/building-project-gate.md +706 -0
  345. package/docs/guides/callbacks.md +81 -22
  346. package/docs/guides/check-dependencies.md +41 -10
  347. package/docs/guides/collecting-project-files.md +7 -7
  348. package/docs/guides/command-check.md +155 -0
  349. package/docs/guides/data-boundaries.md +140 -0
  350. package/docs/guides/extending-check-lifecycle.md +77 -25
  351. package/docs/guides/finding-waivers.md +43 -1
  352. package/docs/guides/learned-scheduling.md +1 -1
  353. package/docs/guides/run-outputs.md +35 -9
  354. package/docs/guides/scheduling.md +15 -15
  355. package/docs/output.md +6 -5
  356. package/package.json +2 -1
  357. package/src/check/check.ts +332 -92
  358. package/src/check/flag-enablement.ts +76 -0
  359. package/src/check/handoff-provider-identity.ts +34 -0
  360. package/src/check/inherited-collection.ts +1 -1
  361. package/src/check/project-changes.ts +14 -0
  362. package/src/check/project-context.ts +11 -0
  363. package/src/check-settlement/facts.ts +1 -1
  364. package/src/check-settlement/record-store.ts +1 -1
  365. package/src/data-boundary/canonical-data.ts +36 -9
  366. package/src/data-boundary/canonical-json.ts +18 -1
  367. package/src/data-boundary/closed-values.ts +26 -6
  368. package/src/data-boundary/config-glob.ts +17 -0
  369. package/src/data-boundary/project-path.ts +21 -0
  370. package/src/index.ts +72 -11
  371. package/src/machine-output/v4/atomic-publication.ts +3 -1
  372. package/src/package-checks/check-authoring.ts +136 -0
  373. package/src/package-checks/code-quality-findings/finding-waiver-authoring.ts +1 -1
  374. package/src/package-checks/code-quality-findings/finding-waiver-evidence.ts +1 -1
  375. package/src/package-checks/command-check/command-check.ts +152 -0
  376. package/src/package-checks/command-check/contract.ts +168 -0
  377. package/src/package-checks/command-check/execution.ts +211 -0
  378. package/src/package-checks/command-check/options.ts +331 -0
  379. package/src/package-checks/command-check/transcript.ts +35 -0
  380. package/src/package-checks/duplicate-detection/default-check.ts +37 -6
  381. package/src/package-checks/duplicate-detection/execution.ts +2 -4
  382. package/src/package-checks/duplicate-detection/finding-messages.ts +2 -2
  383. package/src/package-checks/duplicate-detection/jscpd/availability.ts +1 -1
  384. package/src/package-checks/duplicate-detection/options.ts +6 -3
  385. package/src/package-checks/duplicate-detection/records.ts +1 -1
  386. package/src/package-checks/file-metrics/constructor.ts +29 -6
  387. package/src/package-checks/file-metrics/execution.ts +2 -4
  388. package/src/package-checks/file-metrics/finding-messages.ts +1 -1
  389. package/src/package-checks/file-metrics/options.ts +6 -3
  390. package/src/package-checks/file-metrics/records.ts +1 -1
  391. package/src/package-checks/file-metrics/scc/availability.ts +1 -1
  392. package/src/package-checks/file-metrics/scc/batch-planner.ts +56 -0
  393. package/src/package-checks/file-metrics/scc/logical-scan-resources.ts +59 -0
  394. package/src/package-checks/file-metrics/scc/scanner.ts +134 -32
  395. package/src/package-checks/function-metrics/analysis.ts +7 -2
  396. package/src/package-checks/function-metrics/analyzer/analysis-model.ts +1 -1
  397. package/src/package-checks/function-metrics/analyzer/extension-output.ts +14 -6
  398. package/src/package-checks/function-metrics/analyzer/extensions/lizardcomplextags.ts +1 -3
  399. package/src/package-checks/function-metrics/analyzer/extensions/protocol.ts +3 -3
  400. package/src/package-checks/function-metrics/analyzer/pipeline.ts +4 -2
  401. package/src/package-checks/function-metrics/analyzer/readers/erlang.ts +6 -6
  402. package/src/package-checks/function-metrics/analyzer/readers/fortran.ts +1 -1
  403. package/src/package-checks/function-metrics/analyzer/readers/objc.ts +9 -3
  404. package/src/package-checks/function-metrics/analyzer/readers/php-states.ts +14 -7
  405. package/src/package-checks/function-metrics/analyzer/readers/plsql.ts +8 -4
  406. package/src/package-checks/function-metrics/analyzer/readers/python.ts +4 -3
  407. package/src/package-checks/function-metrics/analyzer/readers/r.ts +2 -1
  408. package/src/package-checks/function-metrics/analyzer/readers/ttcn.ts +9 -3
  409. package/src/package-checks/function-metrics/analyzer/readers/typescript.ts +9 -3
  410. package/src/package-checks/function-metrics/analyzer/readers/zig.ts +2 -1
  411. package/src/package-checks/function-metrics/analyzer/shared/code-reader.ts +3 -1
  412. package/src/package-checks/function-metrics/analyzer/shared/js-style-regex.ts +10 -5
  413. package/src/package-checks/function-metrics/analyzer-worker-port.ts +20 -6
  414. package/src/package-checks/function-metrics/constructor.ts +30 -7
  415. package/src/package-checks/function-metrics/execution.ts +2 -4
  416. package/src/package-checks/function-metrics/finding-messages.ts +2 -2
  417. package/src/package-checks/function-metrics/measurement.ts +3 -1
  418. package/src/package-checks/function-metrics/options.ts +6 -3
  419. package/src/package-checks/function-metrics/records.ts +1 -1
  420. package/src/package-checks/host-environment/git.ts +11 -0
  421. package/src/package-checks/host-environment/path.ts +1 -20
  422. package/src/package-checks/host-environment/process/contract.ts +17 -9
  423. package/src/package-checks/host-environment/process/result.ts +48 -20
  424. package/src/package-checks/host-environment/process/runner.ts +8 -4
  425. package/src/package-checks/json-schema-validation/default-check.ts +38 -5
  426. package/src/package-checks/json-schema-validation/options.ts +4 -1
  427. package/src/package-checks/json-schema-validation/reference-resolver.ts +6 -2
  428. package/src/package-checks/json-schema-validation/schema-policy.ts +10 -5
  429. package/src/package-checks/json-validation/default-check.ts +27 -6
  430. package/src/package-checks/json-validation/options.ts +4 -1
  431. package/src/package-checks/local-cache-options.ts +40 -0
  432. package/src/package-checks/maintenance-reminders/maintenance-reminders.ts +89 -9
  433. package/src/package-checks/maintenance-reminders/maintenance-support.ts +3 -3
  434. package/src/package-checks/markdown-link-validation/default-check.ts +48 -5
  435. package/src/package-checks/markdown-link-validation/execution.ts +1 -1
  436. package/src/package-checks/markdown-link-validation/finding-messages.ts +1 -1
  437. package/src/package-checks/markdown-link-validation/markdown-parser.ts +1 -5
  438. package/src/package-checks/markdown-link-validation/options-resolution.ts +2 -19
  439. package/src/package-checks/markdown-link-validation/options-validation.ts +2 -17
  440. package/src/package-checks/markdown-link-validation/options.ts +6 -7
  441. package/src/package-checks/markdown-link-validation/parse-facts-cache-payload.ts +4 -5
  442. package/src/package-checks/markdown-lint/adapter.ts +167 -0
  443. package/src/package-checks/markdown-lint/default-check.ts +92 -0
  444. package/src/package-checks/markdown-lint/execution.ts +266 -0
  445. package/src/package-checks/markdown-lint/final-data.ts +33 -0
  446. package/src/package-checks/markdown-lint/finding-messages.ts +87 -0
  447. package/src/package-checks/markdown-lint/finding-waiver-identity.ts +54 -0
  448. package/src/package-checks/markdown-lint/findings-cache.ts +141 -0
  449. package/src/package-checks/markdown-lint/options-resolution.ts +102 -0
  450. package/src/package-checks/markdown-lint/options-validation.ts +50 -0
  451. package/src/package-checks/markdown-lint/options.ts +82 -0
  452. package/src/package-checks/markdown-lint/records.ts +132 -0
  453. package/src/package-checks/markdown-lint/unavailable-reasons.ts +33 -0
  454. package/src/package-checks/project-files/collection.ts +38 -22
  455. package/src/package-checks/project-files/config-glob.ts +1 -17
  456. package/src/package-checks/project-files/configuration.ts +1 -1
  457. package/src/package-checks/project-files/gitlink-revision.ts +4 -6
  458. package/src/package-checks/project-files/gitlink-worktree.ts +35 -7
  459. package/src/package-checks/project-files/public-collection.ts +1 -1
  460. package/src/package-checks/project-files/revision-paths.ts +3 -3
  461. package/src/package-checks/project-files/revision-worktree-files.ts +16 -16
  462. package/src/package-checks/secret-detection/default-check.ts +29 -6
  463. package/src/package-checks/secret-detection/execution.ts +2 -2
  464. package/src/package-checks/secret-detection/input-preparation.ts +64 -7
  465. package/src/package-checks/secret-detection/options.ts +5 -2
  466. package/src/package-checks/secret-detection/records.ts +1 -1
  467. package/src/package-checks/secret-detection/secretlint/adapter.ts +3 -4
  468. package/src/package-tools/admission-policy/define-admission-policy.ts +54 -0
  469. package/src/{cache → package-tools/cache}/cache-json-by-key.ts +13 -17
  470. package/src/{check → package-tools/finding-presentation}/finding-presentation.ts +3 -1
  471. package/src/{finding-waivers → package-tools/finding-waivers}/reconciliation.ts +16 -8
  472. package/src/{learned-critical-path → package-tools/learned-critical-path}/duration-model/prediction.ts +5 -2
  473. package/src/{learned-critical-path → package-tools/learned-critical-path}/duration-model/preparation.ts +5 -3
  474. package/src/{learned-critical-path → package-tools/learned-critical-path}/duration-model/recording.ts +5 -4
  475. package/src/{learned-critical-path → package-tools/learned-critical-path}/duration-model/storage.ts +9 -10
  476. package/src/{learned-critical-path → package-tools/learned-critical-path}/selection-layers.ts +2 -3
  477. package/src/{learned-critical-path → package-tools/learned-critical-path}/static-decision.ts +1 -1
  478. package/src/{learned-critical-path → package-tools/learned-critical-path}/strategy.ts +7 -4
  479. package/src/project-definition/check-tree/authoring.ts +15 -8
  480. package/src/project-definition/check-tree/check-fields-authoring.ts +106 -91
  481. package/src/project-definition/check-tree/flag-conditions.ts +99 -0
  482. package/src/project-definition/check-tree/materialization.ts +12 -8
  483. package/src/project-definition/check-tree/resolution.ts +13 -15
  484. package/src/project-definition/declarative-snapshot.ts +9 -2
  485. package/src/project-definition/project-changes.ts +112 -0
  486. package/src/project-definition/project-definition-validation.ts +58 -10
  487. package/src/project-definition/project-definition.ts +41 -68
  488. package/src/project-definition/scheduler-policy.ts +6 -3
  489. package/src/project-run/admission-strategy-provider/custom-strategy-preparation.ts +11 -8
  490. package/src/project-run/admission-strategy-provider/prepared-admission-strategy.ts +2 -2
  491. package/src/project-run/aggregation.ts +51 -74
  492. package/src/project-run/changes/git.ts +206 -0
  493. package/src/project-run/check-execution/admitted-check-execution.ts +62 -0
  494. package/src/project-run/check-execution/callback.ts +3 -2
  495. package/src/project-run/check-execution/dependencies.ts +120 -6
  496. package/src/project-run/check-execution/execution-finalization.ts +6 -4
  497. package/src/project-run/check-execution/execution-settlement.ts +88 -29
  498. package/src/project-run/check-execution/flag-controls.ts +22 -8
  499. package/src/project-run/check-execution/lifecycle.ts +14 -6
  500. package/src/project-run/check-execution/{preflight-result.ts → preparation-result.ts} +34 -32
  501. package/src/project-run/check-execution/{preflight.ts → preparation.ts} +92 -84
  502. package/src/project-run/check-execution/ready-check-execution.ts +97 -0
  503. package/src/project-run/check-execution/resolved-checks.ts +40 -219
  504. package/src/project-run/check-execution/scheduled-check-run.ts +119 -0
  505. package/src/project-run/check-execution/terminal-result.ts +108 -29
  506. package/src/project-run/completion/completion.ts +17 -3
  507. package/src/project-run/controls/contract.ts +6 -16
  508. package/src/project-run/controls/validation.ts +7 -60
  509. package/src/project-run/diagnostic-logging/diagnostic-detail-rendering.ts +1 -2
  510. package/src/project-run/diagnostic-logging/observation-rendering.ts +1 -1
  511. package/src/project-run/invocation/candidate.ts +28 -15
  512. package/src/project-run/invocation/candidates.ts +56 -0
  513. package/src/project-run/invocation/creation.ts +7 -3
  514. package/src/project-run/invocation/execution.ts +136 -0
  515. package/src/project-run/invocation/run.ts +15 -179
  516. package/src/project-run/invocation/scheduler.ts +13 -6
  517. package/src/project-run/outputs/status.ts +15 -15
  518. package/src/project-run/progress-rendering/presentation.ts +35 -13
  519. package/src/project-run/progress-rendering/renderer-formatting.ts +20 -7
  520. package/src/project-run/progress-rendering/renderer-lifecycle.ts +23 -6
  521. package/src/project-run/progress-rendering/renderer.ts +10 -4
  522. package/src/project-run/project-context.ts +8 -4
  523. package/src/project-run/result.ts +5 -5
  524. package/src/project-run/run.ts +1 -1
  525. package/src/project-run/task-scheduler/admission-core/compiled-graph-lookup.ts +71 -0
  526. package/src/project-run/task-scheduler/admission-core/compiled-graph.ts +9 -4
  527. package/src/project-run/task-scheduler/admission-core/selection-query.ts +6 -4
  528. package/src/project-run/task-scheduler/admission-core/selection-seed.ts +36 -6
  529. package/src/project-run/task-scheduler/admission-core/selection-transition.ts +17 -8
  530. package/src/project-run/task-scheduler/execution-state.ts +4 -4
  531. package/src/project-run/task-scheduler/measurement/diagnostics.ts +10 -4
  532. package/src/project-run/task-scheduler/measurement/timing.ts +13 -5
  533. package/src/project-run/task-scheduler/scheduler-observation.ts +3 -1
  534. package/src/project-run/task-scheduler/scheduler-terminal-measurement.ts +24 -22
  535. package/src/project-run/task-scheduler/scheduler.ts +23 -6
  536. package/types/check/check.d.ts +178 -67
  537. package/types/check/flag-enablement.d.ts +42 -0
  538. package/types/check/handoff-provider-identity.d.ts +12 -0
  539. package/types/check/project-changes.d.ts +13 -0
  540. package/types/check/project-context.d.ts +10 -0
  541. package/types/check-settlement/facts.d.ts +1 -1
  542. package/types/data-boundary/canonical-data.d.ts +28 -5
  543. package/types/data-boundary/canonical-json.d.ts +18 -1
  544. package/types/data-boundary/closed-values.d.ts +17 -1
  545. package/types/data-boundary/config-glob.d.ts +5 -0
  546. package/types/data-boundary/project-path.d.ts +4 -0
  547. package/types/index.d.ts +27 -11
  548. package/types/package-checks/check-authoring.d.ts +45 -0
  549. package/types/package-checks/code-quality-findings/finding-waiver-authoring.d.ts +1 -1
  550. package/types/package-checks/code-quality-findings/finding-waiver-evidence.d.ts +1 -1
  551. package/types/package-checks/command-check/command-check.d.ts +48 -0
  552. package/types/package-checks/command-check/contract.d.ts +108 -0
  553. package/types/package-checks/command-check/execution.d.ts +7 -0
  554. package/types/package-checks/command-check/options.d.ts +11 -0
  555. package/types/package-checks/command-check/transcript.d.ts +8 -0
  556. package/types/package-checks/duplicate-detection/default-check.d.ts +5 -2
  557. package/types/package-checks/duplicate-detection/finding-messages.d.ts +1 -1
  558. package/types/package-checks/duplicate-detection/options.d.ts +4 -3
  559. package/types/package-checks/duplicate-detection/records.d.ts +1 -1
  560. package/types/package-checks/file-metrics/constructor.d.ts +5 -2
  561. package/types/package-checks/file-metrics/options.d.ts +4 -3
  562. package/types/package-checks/file-metrics/records.d.ts +1 -1
  563. package/types/package-checks/file-metrics/scc/batch-planner.d.ts +18 -0
  564. package/types/package-checks/file-metrics/scc/logical-scan-resources.d.ts +14 -0
  565. package/types/package-checks/function-metrics/analyzer/extensions/protocol.d.ts +3 -3
  566. package/types/package-checks/function-metrics/constructor.d.ts +5 -2
  567. package/types/package-checks/function-metrics/finding-messages.d.ts +1 -1
  568. package/types/package-checks/function-metrics/options.d.ts +4 -3
  569. package/types/package-checks/function-metrics/records.d.ts +1 -1
  570. package/types/package-checks/host-environment/git.d.ts +2 -0
  571. package/types/package-checks/host-environment/path.d.ts +1 -3
  572. package/types/package-checks/host-environment/process/contract.d.ts +17 -9
  573. package/types/package-checks/json-schema-validation/default-check.d.ts +4 -1
  574. package/types/package-checks/json-schema-validation/options.d.ts +2 -1
  575. package/types/package-checks/json-validation/default-check.d.ts +4 -1
  576. package/types/package-checks/json-validation/options.d.ts +2 -1
  577. package/types/package-checks/local-cache-options.d.ts +9 -0
  578. package/types/package-checks/maintenance-reminders/maintenance-reminders.d.ts +11 -2
  579. package/types/package-checks/markdown-link-validation/default-check.d.ts +4 -1
  580. package/types/package-checks/markdown-link-validation/options.d.ts +4 -7
  581. package/types/package-checks/markdown-lint/adapter.d.ts +10 -0
  582. package/types/package-checks/markdown-lint/default-check.d.ts +37 -0
  583. package/types/package-checks/markdown-lint/execution.d.ts +24 -0
  584. package/types/package-checks/markdown-lint/final-data.d.ts +8 -0
  585. package/types/package-checks/markdown-lint/finding-messages.d.ts +6 -0
  586. package/types/package-checks/markdown-lint/finding-waiver-identity.d.ts +3 -0
  587. package/types/package-checks/markdown-lint/findings-cache.d.ts +17 -0
  588. package/types/package-checks/markdown-lint/options-resolution.d.ts +3 -0
  589. package/types/package-checks/markdown-lint/options-validation.d.ts +2 -0
  590. package/types/package-checks/markdown-lint/options.d.ts +65 -0
  591. package/types/package-checks/markdown-lint/records.d.ts +39 -0
  592. package/types/package-checks/markdown-lint/unavailable-reasons.d.ts +3 -0
  593. package/types/package-checks/secret-detection/default-check.d.ts +4 -1
  594. package/types/package-checks/secret-detection/options.d.ts +3 -2
  595. package/types/package-tools/admission-policy/define-admission-policy.d.ts +26 -0
  596. package/types/{check → package-tools/finding-presentation}/finding-presentation.d.ts +3 -1
  597. package/types/{finding-waivers → package-tools/finding-waivers}/reconciliation.d.ts +3 -3
  598. package/types/{learned-critical-path → package-tools/learned-critical-path}/duration-model/prediction.d.ts +2 -2
  599. package/types/{learned-critical-path → package-tools/learned-critical-path}/duration-model/preparation.d.ts +1 -1
  600. package/types/{learned-critical-path → package-tools/learned-critical-path}/duration-model/recording.d.ts +1 -1
  601. package/types/{learned-critical-path → package-tools/learned-critical-path}/selection-layers.d.ts +1 -1
  602. package/types/{learned-critical-path → package-tools/learned-critical-path}/static-decision.d.ts +1 -1
  603. package/types/{learned-critical-path → package-tools/learned-critical-path}/strategy.d.ts +1 -1
  604. package/types/project-definition/check-tree/authoring.d.ts +5 -3
  605. package/types/project-definition/check-tree/check-fields-authoring.d.ts +12 -7
  606. package/types/project-definition/check-tree/flag-conditions.d.ts +5 -0
  607. package/types/project-definition/check-tree/resolution.d.ts +6 -4
  608. package/types/project-definition/declarative-snapshot.d.ts +4 -1
  609. package/types/project-definition/project-changes.d.ts +30 -0
  610. package/types/project-definition/project-definition.d.ts +15 -30
  611. package/types/project-definition/scheduler-policy.d.ts +3 -3
  612. package/types/project-run/admission-strategy-provider/prepared-admission-strategy.d.ts +2 -2
  613. package/types/project-run/aggregation.d.ts +8 -6
  614. package/types/project-run/changes/git.d.ts +14 -0
  615. package/types/project-run/check-execution/admitted-check-execution.d.ts +18 -0
  616. package/types/project-run/check-execution/dependencies.d.ts +3 -0
  617. package/types/project-run/check-execution/execution-finalization.d.ts +1 -1
  618. package/types/project-run/check-execution/execution-settlement.d.ts +15 -7
  619. package/types/project-run/check-execution/flag-controls.d.ts +1 -1
  620. package/types/project-run/check-execution/lifecycle.d.ts +9 -5
  621. package/types/project-run/check-execution/{preflight-result.d.ts → preparation-result.d.ts} +3 -3
  622. package/types/project-run/check-execution/{preflight.d.ts → preparation.d.ts} +10 -9
  623. package/types/project-run/check-execution/ready-check-execution.d.ts +18 -0
  624. package/types/project-run/check-execution/resolved-checks.d.ts +12 -13
  625. package/types/project-run/check-execution/scheduled-check-run.d.ts +10 -0
  626. package/types/project-run/check-execution/terminal-result.d.ts +13 -1
  627. package/types/project-run/completion/completion.d.ts +3 -1
  628. package/types/project-run/controls/contract.d.ts +6 -16
  629. package/types/project-run/invocation/candidates.d.ts +8 -0
  630. package/types/project-run/invocation/execution.d.ts +5 -0
  631. package/types/project-run/invocation/run.d.ts +2 -2
  632. package/types/project-run/outputs/status.d.ts +4 -4
  633. package/types/project-run/progress-rendering/presentation.d.ts +4 -3
  634. package/types/project-run/progress-rendering/renderer-formatting.d.ts +5 -2
  635. package/types/project-run/progress-rendering/renderer-lifecycle.d.ts +2 -0
  636. package/types/project-run/progress-rendering/renderer.d.ts +4 -2
  637. package/types/project-run/project-context.d.ts +3 -3
  638. package/types/project-run/result.d.ts +3 -3
  639. package/types/project-run/run.d.ts +1 -1
  640. package/types/project-run/task-scheduler/admission-core/compiled-graph-lookup.d.ts +10 -0
  641. package/types/project-run/task-scheduler/execution-state.d.ts +4 -4
  642. package/types/project-run/task-scheduler/measurement/diagnostics.d.ts +2 -2
  643. package/types/project-run/task-scheduler/scheduler-terminal-measurement.d.ts +1 -1
  644. package/dist/esm/cache/cache-json-by-key.mjs.map +0 -1
  645. package/dist/esm/check/finding-presentation.mjs.map +0 -1
  646. package/dist/esm/finding-waivers/reconciliation.mjs.map +0 -1
  647. package/dist/esm/learned-critical-path/duration-model/bounded-history.mjs.map +0 -1
  648. package/dist/esm/learned-critical-path/duration-model/prediction.mjs.map +0 -1
  649. package/dist/esm/learned-critical-path/duration-model/preparation.mjs.map +0 -1
  650. package/dist/esm/learned-critical-path/duration-model/recording.mjs.map +0 -1
  651. package/dist/esm/learned-critical-path/duration-model/storage.mjs.map +0 -1
  652. package/dist/esm/learned-critical-path/selection-layers.mjs.map +0 -1
  653. package/dist/esm/learned-critical-path/static-decision.mjs.map +0 -1
  654. package/dist/esm/learned-critical-path/strategy.mjs.map +0 -1
  655. package/dist/esm/package-checks/project-files/config-glob.mjs.map +0 -1
  656. package/dist/esm/project-run/check-execution/preflight-result.mjs.map +0 -1
  657. package/dist/esm/project-run/check-execution/preflight.mjs.map +0 -1
  658. package/dist/esm/project-run/task-scheduler/critical-path-ranking.mjs.map +0 -1
  659. package/types/package-checks/project-files/config-glob.d.ts +0 -5
  660. /package/dist/esm/{check → package-tools/finding-presentation}/finding-presentation.mjs +0 -0
  661. /package/dist/esm/{project-run/task-scheduler → package-tools/learned-critical-path}/critical-path-ranking.mjs +0 -0
  662. /package/dist/esm/{learned-critical-path → package-tools/learned-critical-path}/duration-model/bounded-history.mjs +0 -0
  663. /package/dist/esm/{learned-critical-path → package-tools/learned-critical-path}/duration-model/recording.mjs +0 -0
  664. /package/dist/esm/{learned-critical-path → package-tools/learned-critical-path}/static-decision.mjs +0 -0
  665. /package/src/{project-run/task-scheduler → package-tools/learned-critical-path}/critical-path-ranking.ts +0 -0
  666. /package/src/{learned-critical-path → package-tools/learned-critical-path}/duration-model/bounded-history.ts +0 -0
  667. /package/types/{cache → package-tools/cache}/cache-json-by-key.d.ts +0 -0
  668. /package/types/{project-run/task-scheduler → package-tools/learned-critical-path}/critical-path-ranking.d.ts +0 -0
  669. /package/types/{learned-critical-path → package-tools/learned-critical-path}/duration-model/bounded-history.d.ts +0 -0
  670. /package/types/{learned-critical-path → package-tools/learned-critical-path}/duration-model/storage.d.ts +0 -0
@@ -93,8 +93,25 @@ export function finalizeInvocation(invocation, candidate) {
93
93
  invocation.progressRendering.close();
94
94
  return resolveFinalRunResult(candidate, invocation.outputs.value());
95
95
  }
96
+ /** Closes invocation-owned writers after aggregation rejects without fabricating a terminal Run result. */
97
+ export function closeAggregationFailure(invocation) {
98
+ try {
99
+ invocation.diagnosticLogging.close();
100
+ }
101
+ catch {
102
+ // Cleanup must not replace the callback error returned to the caller.
103
+ }
104
+ try {
105
+ invocation.progressRendering.close();
106
+ }
107
+ catch {
108
+ // Cleanup must not replace the callback error returned to the caller.
109
+ }
110
+ }
96
111
  function terminalStatusTag(candidate) {
97
- if ("aggregate" in candidate && candidate.aggregate !== null)
112
+ if (candidate.kind === "output")
113
+ return "OUTPUT";
114
+ if ("aggregate" in candidate)
98
115
  return candidate.aggregate.toUpperCase();
99
116
  if (candidate.kind === "cancelled")
100
117
  return "CANCELLED";
@@ -1 +1 @@
1
- {"version":3,"file":"completion.mjs","sourceRoot":"","sources":["../../../../src/project-run/completion/completion.ts"],"names":[],"mappings":"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","sourcesContent":["import { failedOutput } from \"../outputs/status.ts\";\nimport { resolveFinalRunResult } from \"./result-resolver.ts\";\nimport { publishMachineOutput } from \"./machine-publication.ts\";\nimport {\n outputFailure,\n type CheckDuration,\n type CheckRunMessage,\n type NonConfigurationRunResult,\n type RunResultFacts\n} from \"../result.ts\";\nimport type { CheckAggregate } from \"../controls/contract.ts\";\nimport { DIAGNOSTIC_CHANNELS, diagnosticTags } from \"../diagnostic-logging/logger.ts\";\nimport type { Invocation } from \"../invocation/run.ts\";\nimport {\n createPublicationModelV4,\n type TrustedPublicationModelV4\n} from \"../../machine-output/v4/publication-model.ts\";\nimport type { CoreCheck, CoreSnapshot } from \"../../check-settlement/facts.ts\";\n\ntype OutcomeCounts = {\n readonly failed: number;\n readonly notApplicable: number;\n readonly passed: number;\n readonly unavailable: number;\n};\n\n/** Settled Check facts consumed by completion and output publication. */\nexport type CoreExecution = Readonly<{\n readonly aggregate: CheckAggregate | null;\n readonly checkDurations: readonly CheckDuration[];\n readonly checkMessages: readonly CheckRunMessage[];\n readonly snapshot: CoreSnapshot;\n}>;\n\nexport function completeInvocation(\n invocation: Invocation,\n core: CoreExecution\n): NonConfigurationRunResult {\n const facts = runFacts(core);\n if (invocation.outputConfiguration.machinePublication.enabled) {\n const model = createModel(invocation, core.snapshot);\n if (isExecutionResult(model)) return model;\n const published = publishMachineOutput({\n configuration: invocation.outputConfiguration.machinePublication,\n statuses: invocation.outputs,\n model,\n directory: invocation.paths.machinePublicationDirectory\n });\n if (!published) return failure(invocation, facts);\n }\n const output = failedOutput(invocation.outputs.value());\n return output === undefined\n ? Object.freeze({\n kind: \"completed\",\n declarativeFingerprint: invocation.declarativeFingerprint,\n definitionWarnings: invocation.definitionWarnings,\n outputs: invocation.outputs.value(),\n ...facts\n })\n : failure(invocation, facts);\n}\nfunction failure(invocation: Invocation, facts: RunResultFacts): ReturnType<typeof outputFailure> {\n const output = failedOutput(invocation.outputs.value());\n if (output === undefined) throw new Error(\"Run output failed without a failed status\");\n return outputFailure(\n invocation.declarativeFingerprint,\n invocation.definitionWarnings,\n invocation.outputs.value(),\n output,\n facts\n );\n}\nfunction runFacts(core: CoreExecution): RunResultFacts {\n return Object.freeze({\n aggregate: core.aggregate,\n checkDurations: core.checkDurations,\n checkMessages: core.checkMessages,\n snapshot: core.snapshot\n });\n}\nfunction createModel(\n invocation: Invocation,\n snapshot: CoreExecution[\"snapshot\"]\n): TrustedPublicationModelV4 | Extract<NonConfigurationRunResult, { readonly kind: \"execution\" }> {\n try {\n if (invocation.startedAtUtc === null)\n throw new Error(\"Machine publication requires an invocation timestamp\");\n return createPublicationModelV4({\n invocation: {\n invocationId: invocation.invocationId,\n projectRoot: \".\",\n timestamp: invocation.startedAtUtc\n },\n snapshot\n });\n } catch {\n return Object.freeze({\n kind: \"execution\",\n declarativeFingerprint: invocation.declarativeFingerprint,\n definitionWarnings: invocation.definitionWarnings,\n diagnostic: Object.freeze({ code: \"publication-model-failed\" }),\n outputs: invocation.outputs.value()\n });\n }\n}\nfunction isExecutionResult(\n value:\n | TrustedPublicationModelV4\n | Extract<NonConfigurationRunResult, { readonly kind: \"execution\" }>\n): value is Extract<NonConfigurationRunResult, { readonly kind: \"execution\" }> {\n return \"kind\" in value;\n}\n\n/** Closes diagnostic logging and applies final output priority to a non-configuration candidate. */\nexport function finalizeInvocation(\n invocation: Invocation,\n candidate: NonConfigurationRunResult\n): NonConfigurationRunResult {\n const preCloseOutputs = invocation.outputs.value();\n invocation.diagnosticLogging.core.observe({\n event: \"run.terminal-before-log-close\",\n tags: diagnosticTags(\"RUN\", \"TERMINAL\", terminalStatusTag(candidate)),\n details: {\n ...closingFacts(candidate),\n diagnosticLogging: \"close-not-yet-confirmed\",\n outputs: preCloseOutputDetails(preCloseOutputs)\n }\n });\n const diagnosticLoggingStatuses = invocation.diagnosticLogging.close();\n for (const channel of DIAGNOSTIC_CHANNELS) {\n const status = diagnosticLoggingStatuses[channel];\n if (status === \"failed\") invocation.outputs.failedDiagnosticChannel(channel);\n if (status === \"succeeded\") invocation.outputs.succeededDiagnosticChannel(channel);\n }\n invocation.progressRendering.close();\n return resolveFinalRunResult(candidate, invocation.outputs.value());\n}\n\nfunction terminalStatusTag(candidate: NonConfigurationRunResult): string {\n if (\"aggregate\" in candidate && candidate.aggregate !== null)\n return candidate.aggregate.toUpperCase();\n if (candidate.kind === \"cancelled\") return \"CANCELLED\";\n return candidate.kind.toUpperCase();\n}\n\nfunction preCloseOutputDetails(outputs: ReturnType<Invocation[\"outputs\"][\"value\"]>): Readonly<{\n readonly machinePublication: (typeof outputs)[\"machinePublication\"];\n readonly progressRendering: (typeof outputs)[\"progressRendering\"];\n}> {\n return Object.freeze({\n machinePublication: outputs.machinePublication,\n progressRendering: outputs.progressRendering\n });\n}\n\nfunction closingFacts(candidate: NonConfigurationRunResult): Readonly<{\n readonly aggregate: CheckAggregate | null;\n readonly candidateKind: NonConfigurationRunResult[\"kind\"];\n readonly counts: Readonly<{\n readonly failed: number;\n readonly notApplicable: number;\n readonly passed: number;\n readonly unavailable: number;\n }> | null;\n readonly nonPassed: readonly Readonly<{\n readonly checkId: string;\n readonly reason: unknown;\n readonly status: string;\n }>[];\n}> {\n if (!(\"snapshot\" in candidate)) {\n return Object.freeze({\n aggregate: null,\n candidateKind: candidate.kind,\n counts: null,\n nonPassed: []\n });\n }\n const summary = summarizeSnapshot(candidate.snapshot);\n return Object.freeze({\n aggregate: \"aggregate\" in candidate ? candidate.aggregate : null,\n candidateKind: candidate.kind,\n ...summary\n });\n}\n\nfunction summarizeSnapshot(snapshot: CoreSnapshot): Readonly<{\n readonly counts: OutcomeCounts;\n readonly nonPassed: readonly Readonly<{\n readonly checkId: string;\n readonly reason: unknown;\n readonly status: string;\n }>[];\n}> {\n const counts = { failed: 0, notApplicable: 0, passed: 0, unavailable: 0 };\n const nonPassed: Array<Readonly<{ checkId: string; reason: unknown; status: string }>> = [];\n for (const check of snapshot.checks) {\n counts[statusCountKey(check)] += 1;\n const fact = nonPassedFact(check);\n if (fact !== undefined) nonPassed.push(fact);\n }\n return Object.freeze({\n counts: Object.freeze(counts),\n nonPassed: Object.freeze(nonPassed)\n });\n}\n\nfunction statusCountKey(check: CoreCheck): keyof OutcomeCounts {\n return check.outcome.status === \"not-applicable\" ? \"notApplicable\" : check.outcome.status;\n}\n\nfunction nonPassedFact(\n check: CoreCheck\n):\n | Readonly<{ readonly checkId: string; readonly reason: unknown; readonly status: string }>\n | undefined {\n if (check.outcome.status === \"passed\") return undefined;\n return Object.freeze({\n checkId: check.checkId,\n reason: check.outcome.status === \"failed\" ? null : (check.outcome.reason ?? null),\n status: check.outcome.status\n });\n}\n"]}
1
+ {"version":3,"file":"completion.mjs","sourceRoot":"","sources":["../../../../src/project-run/completion/completion.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EACL,aAAa,EAKd,MAAM,cAAc,CAAC;AAEtB,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AAEtF,OAAO,EACL,wBAAwB,EAEzB,MAAM,8CAA8C,CAAC;AAkBtD,MAAM,UAAU,kBAAkB,CAChC,UAAsB,EACtB,IAAmB;IAEnB,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC7B,IAAI,UAAU,CAAC,mBAAmB,CAAC,kBAAkB,CAAC,OAAO,EAAE,CAAC;QAC9D,MAAM,KAAK,GAAG,WAAW,CAAC,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QACrD,IAAI,iBAAiB,CAAC,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC;QAC3C,MAAM,SAAS,GAAG,oBAAoB,CAAC;YACrC,aAAa,EAAE,UAAU,CAAC,mBAAmB,CAAC,kBAAkB;YAChE,QAAQ,EAAE,UAAU,CAAC,OAAO;YAC5B,KAAK;YACL,SAAS,EAAE,UAAU,CAAC,KAAK,CAAC,2BAA2B;SACxD,CAAC,CAAC;QACH,IAAI,CAAC,SAAS;YAAE,OAAO,OAAO,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;IACpD,CAAC;IACD,MAAM,MAAM,GAAG,YAAY,CAAC,UAAU,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;IACxD,OAAO,MAAM,KAAK,SAAS;QACzB,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC;YACZ,IAAI,EAAE,WAAW;YACjB,sBAAsB,EAAE,UAAU,CAAC,sBAAsB;YACzD,kBAAkB,EAAE,UAAU,CAAC,kBAAkB;YACjD,OAAO,EAAE,UAAU,CAAC,OAAO,CAAC,KAAK,EAAE;YACnC,GAAG,KAAK;SACT,CAAC;QACJ,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;AACjC,CAAC;AACD,SAAS,OAAO,CAAC,UAAsB,EAAE,KAAqB;IAC5D,MAAM,MAAM,GAAG,YAAY,CAAC,UAAU,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;IACxD,IAAI,MAAM,KAAK,SAAS;QAAE,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;IACvF,OAAO,aAAa,CAClB,UAAU,CAAC,sBAAsB,EACjC,UAAU,CAAC,kBAAkB,EAC7B,UAAU,CAAC,OAAO,CAAC,KAAK,EAAE,EAC1B,MAAM,EACN,KAAK,CACN,CAAC;AACJ,CAAC;AACD,SAAS,QAAQ,CAAC,IAAmB;IACnC,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,cAAc,EAAE,IAAI,CAAC,cAAc;QACnC,aAAa,EAAE,IAAI,CAAC,aAAa;QACjC,QAAQ,EAAE,IAAI,CAAC,QAAQ;KACxB,CAAC,CAAC;AACL,CAAC;AACD,SAAS,WAAW,CAClB,UAAsB,EACtB,QAAmC;IAEnC,IAAI,CAAC;QACH,IAAI,UAAU,CAAC,YAAY,KAAK,IAAI;YAClC,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;QAC1E,OAAO,wBAAwB,CAAC;YAC9B,UAAU,EAAE;gBACV,YAAY,EAAE,UAAU,CAAC,YAAY;gBACrC,WAAW,EAAE,GAAG;gBAChB,SAAS,EAAE,UAAU,CAAC,YAAY;aACnC;YACD,QAAQ;SACT,CAAC,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,MAAM,CAAC,MAAM,CAAC;YACnB,IAAI,EAAE,WAAW;YACjB,sBAAsB,EAAE,UAAU,CAAC,sBAAsB;YACzD,kBAAkB,EAAE,UAAU,CAAC,kBAAkB;YACjD,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,0BAA0B,EAAE,CAAC;YAC/D,OAAO,EAAE,UAAU,CAAC,OAAO,CAAC,KAAK,EAAE;SACpC,CAAC,CAAC;IACL,CAAC;AACH,CAAC;AACD,SAAS,iBAAiB,CACxB,KAEsE;IAEtE,OAAO,MAAM,IAAI,KAAK,CAAC;AACzB,CAAC;AAED,oGAAoG;AACpG,MAAM,UAAU,kBAAkB,CAChC,UAAsB,EACtB,SAAoC;IAEpC,MAAM,eAAe,GAAG,UAAU,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;IACnD,UAAU,CAAC,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC;QACxC,KAAK,EAAE,+BAA+B;QACtC,IAAI,EAAE,cAAc,CAAC,KAAK,EAAE,UAAU,EAAE,iBAAiB,CAAC,SAAS,CAAC,CAAC;QACrE,OAAO,EAAE;YACP,GAAG,YAAY,CAAC,SAAS,CAAC;YAC1B,iBAAiB,EAAE,yBAAyB;YAC5C,OAAO,EAAE,qBAAqB,CAAC,eAAe,CAAC;SAChD;KACF,CAAC,CAAC;IACH,MAAM,yBAAyB,GAAG,UAAU,CAAC,iBAAiB,CAAC,KAAK,EAAE,CAAC;IACvE,KAAK,MAAM,OAAO,IAAI,mBAAmB,EAAE,CAAC;QAC1C,MAAM,MAAM,GAAG,yBAAyB,CAAC,OAAO,CAAC,CAAC;QAClD,IAAI,MAAM,KAAK,QAAQ;YAAE,UAAU,CAAC,OAAO,CAAC,uBAAuB,CAAC,OAAO,CAAC,CAAC;QAC7E,IAAI,MAAM,KAAK,WAAW;YAAE,UAAU,CAAC,OAAO,CAAC,0BAA0B,CAAC,OAAO,CAAC,CAAC;IACrF,CAAC;IACD,UAAU,CAAC,iBAAiB,CAAC,KAAK,EAAE,CAAC;IACrC,OAAO,qBAAqB,CAAC,SAAS,EAAE,UAAU,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;AACtE,CAAC;AAED,2GAA2G;AAC3G,MAAM,UAAU,uBAAuB,CAAC,UAAsB;IAC5D,IAAI,CAAC;QACH,UAAU,CAAC,iBAAiB,CAAC,KAAK,EAAE,CAAC;IACvC,CAAC;IAAC,MAAM,CAAC;QACP,sEAAsE;IACxE,CAAC;IACD,IAAI,CAAC;QACH,UAAU,CAAC,iBAAiB,CAAC,KAAK,EAAE,CAAC;IACvC,CAAC;IAAC,MAAM,CAAC;QACP,sEAAsE;IACxE,CAAC;AACH,CAAC;AAED,SAAS,iBAAiB,CAAC,SAAoC;IAC7D,IAAI,SAAS,CAAC,IAAI,KAAK,QAAQ;QAAE,OAAO,QAAQ,CAAC;IACjD,IAAI,WAAW,IAAI,SAAS;QAAE,OAAO,SAAS,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC;IACvE,IAAI,SAAS,CAAC,IAAI,KAAK,WAAW;QAAE,OAAO,WAAW,CAAC;IACvD,OAAO,SAAS,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;AACtC,CAAC;AAED,SAAS,qBAAqB,CAAC,OAAmD;IAIhF,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,kBAAkB,EAAE,OAAO,CAAC,kBAAkB;QAC9C,iBAAiB,EAAE,OAAO,CAAC,iBAAiB;KAC7C,CAAC,CAAC;AACL,CAAC;AAED,SAAS,YAAY,CAAC,SAAoC;IAexD,IAAI,CAAC,CAAC,UAAU,IAAI,SAAS,CAAC,EAAE,CAAC;QAC/B,OAAO,MAAM,CAAC,MAAM,CAAC;YACnB,SAAS,EAAE,IAAI;YACf,aAAa,EAAE,SAAS,CAAC,IAAI;YAC7B,MAAM,EAAE,IAAI;YACZ,SAAS,EAAE,EAAE;SACd,CAAC,CAAC;IACL,CAAC;IACD,MAAM,OAAO,GAAG,iBAAiB,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IACtD,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,SAAS,EAAE,WAAW,IAAI,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI;QAChE,aAAa,EAAE,SAAS,CAAC,IAAI;QAC7B,GAAG,OAAO;KACX,CAAC,CAAC;AACL,CAAC;AAED,SAAS,iBAAiB,CAAC,QAAsB;IAQ/C,MAAM,MAAM,GAAG,EAAE,MAAM,EAAE,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC;IAC1E,MAAM,SAAS,GAA0E,EAAE,CAAC;IAC5F,KAAK,MAAM,KAAK,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC;QACpC,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC;QACnC,MAAM,IAAI,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;QAClC,IAAI,IAAI,KAAK,SAAS;YAAE,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/C,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC;QAC7B,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC;KACpC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,cAAc,CAAC,KAAgB;IACtC,OAAO,KAAK,CAAC,OAAO,CAAC,MAAM,KAAK,gBAAgB,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;AAC5F,CAAC;AAED,SAAS,aAAa,CACpB,KAAgB;IAIhB,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IACxD,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,MAAM,EAAE,KAAK,CAAC,OAAO,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,IAAI,IAAI,CAAC;QACjF,MAAM,EAAE,KAAK,CAAC,OAAO,CAAC,MAAM;KAC7B,CAAC,CAAC;AACL,CAAC","sourcesContent":["import { failedOutput } from \"../outputs/status.ts\";\nimport { resolveFinalRunResult } from \"./result-resolver.ts\";\nimport { publishMachineOutput } from \"./machine-publication.ts\";\nimport {\n outputFailure,\n type CheckDuration,\n type CheckRunMessage,\n type NonConfigurationRunResult,\n type RunResultFacts\n} from \"../result.ts\";\nimport type { CheckAggregate } from \"../controls/contract.ts\";\nimport { DIAGNOSTIC_CHANNELS, diagnosticTags } from \"../diagnostic-logging/logger.ts\";\nimport type { Invocation } from \"../invocation/run.ts\";\nimport {\n createPublicationModelV4,\n type TrustedPublicationModelV4\n} from \"../../machine-output/v4/publication-model.ts\";\nimport type { CoreCheck, CoreSnapshot } from \"../../check-settlement/facts.ts\";\n\ntype OutcomeCounts = {\n readonly failed: number;\n readonly notApplicable: number;\n readonly passed: number;\n readonly unavailable: number;\n};\n\n/** Settled Check facts consumed by completion and output publication. */\nexport type CoreExecution = Readonly<{\n readonly aggregate: CheckAggregate;\n readonly checkDurations: readonly CheckDuration[];\n readonly checkMessages: readonly CheckRunMessage[];\n readonly snapshot: CoreSnapshot;\n}>;\n\nexport function completeInvocation(\n invocation: Invocation,\n core: CoreExecution\n): NonConfigurationRunResult {\n const facts = runFacts(core);\n if (invocation.outputConfiguration.machinePublication.enabled) {\n const model = createModel(invocation, core.snapshot);\n if (isExecutionResult(model)) return model;\n const published = publishMachineOutput({\n configuration: invocation.outputConfiguration.machinePublication,\n statuses: invocation.outputs,\n model,\n directory: invocation.paths.machinePublicationDirectory\n });\n if (!published) return failure(invocation, facts);\n }\n const output = failedOutput(invocation.outputs.value());\n return output === undefined\n ? Object.freeze({\n kind: \"completed\",\n declarativeFingerprint: invocation.declarativeFingerprint,\n definitionWarnings: invocation.definitionWarnings,\n outputs: invocation.outputs.value(),\n ...facts\n })\n : failure(invocation, facts);\n}\nfunction failure(invocation: Invocation, facts: RunResultFacts): ReturnType<typeof outputFailure> {\n const output = failedOutput(invocation.outputs.value());\n if (output === undefined) throw new Error(\"Run output failed without a failed status\");\n return outputFailure(\n invocation.declarativeFingerprint,\n invocation.definitionWarnings,\n invocation.outputs.value(),\n output,\n facts\n );\n}\nfunction runFacts(core: CoreExecution): RunResultFacts {\n return Object.freeze({\n aggregate: core.aggregate,\n checkDurations: core.checkDurations,\n checkMessages: core.checkMessages,\n snapshot: core.snapshot\n });\n}\nfunction createModel(\n invocation: Invocation,\n snapshot: CoreExecution[\"snapshot\"]\n): TrustedPublicationModelV4 | Extract<NonConfigurationRunResult, { readonly kind: \"execution\" }> {\n try {\n if (invocation.startedAtUtc === null)\n throw new Error(\"Machine publication requires an invocation timestamp\");\n return createPublicationModelV4({\n invocation: {\n invocationId: invocation.invocationId,\n projectRoot: \".\",\n timestamp: invocation.startedAtUtc\n },\n snapshot\n });\n } catch {\n return Object.freeze({\n kind: \"execution\",\n declarativeFingerprint: invocation.declarativeFingerprint,\n definitionWarnings: invocation.definitionWarnings,\n diagnostic: Object.freeze({ code: \"publication-model-failed\" }),\n outputs: invocation.outputs.value()\n });\n }\n}\nfunction isExecutionResult(\n value:\n | TrustedPublicationModelV4\n | Extract<NonConfigurationRunResult, { readonly kind: \"execution\" }>\n): value is Extract<NonConfigurationRunResult, { readonly kind: \"execution\" }> {\n return \"kind\" in value;\n}\n\n/** Closes diagnostic logging and applies final output priority to a non-configuration candidate. */\nexport function finalizeInvocation(\n invocation: Invocation,\n candidate: NonConfigurationRunResult\n): NonConfigurationRunResult {\n const preCloseOutputs = invocation.outputs.value();\n invocation.diagnosticLogging.core.observe({\n event: \"run.terminal-before-log-close\",\n tags: diagnosticTags(\"RUN\", \"TERMINAL\", terminalStatusTag(candidate)),\n details: {\n ...closingFacts(candidate),\n diagnosticLogging: \"close-not-yet-confirmed\",\n outputs: preCloseOutputDetails(preCloseOutputs)\n }\n });\n const diagnosticLoggingStatuses = invocation.diagnosticLogging.close();\n for (const channel of DIAGNOSTIC_CHANNELS) {\n const status = diagnosticLoggingStatuses[channel];\n if (status === \"failed\") invocation.outputs.failedDiagnosticChannel(channel);\n if (status === \"succeeded\") invocation.outputs.succeededDiagnosticChannel(channel);\n }\n invocation.progressRendering.close();\n return resolveFinalRunResult(candidate, invocation.outputs.value());\n}\n\n/** Closes invocation-owned writers after aggregation rejects without fabricating a terminal Run result. */\nexport function closeAggregationFailure(invocation: Invocation): void {\n try {\n invocation.diagnosticLogging.close();\n } catch {\n // Cleanup must not replace the callback error returned to the caller.\n }\n try {\n invocation.progressRendering.close();\n } catch {\n // Cleanup must not replace the callback error returned to the caller.\n }\n}\n\nfunction terminalStatusTag(candidate: NonConfigurationRunResult): string {\n if (candidate.kind === \"output\") return \"OUTPUT\";\n if (\"aggregate\" in candidate) return candidate.aggregate.toUpperCase();\n if (candidate.kind === \"cancelled\") return \"CANCELLED\";\n return candidate.kind.toUpperCase();\n}\n\nfunction preCloseOutputDetails(outputs: ReturnType<Invocation[\"outputs\"][\"value\"]>): Readonly<{\n readonly machinePublication: (typeof outputs)[\"machinePublication\"];\n readonly progressRendering: (typeof outputs)[\"progressRendering\"];\n}> {\n return Object.freeze({\n machinePublication: outputs.machinePublication,\n progressRendering: outputs.progressRendering\n });\n}\n\nfunction closingFacts(candidate: NonConfigurationRunResult): Readonly<{\n readonly aggregate: CheckAggregate | null;\n readonly candidateKind: NonConfigurationRunResult[\"kind\"];\n readonly counts: Readonly<{\n readonly failed: number;\n readonly notApplicable: number;\n readonly passed: number;\n readonly unavailable: number;\n }> | null;\n readonly nonPassed: readonly Readonly<{\n readonly checkId: string;\n readonly reason: unknown;\n readonly status: string;\n }>[];\n}> {\n if (!(\"snapshot\" in candidate)) {\n return Object.freeze({\n aggregate: null,\n candidateKind: candidate.kind,\n counts: null,\n nonPassed: []\n });\n }\n const summary = summarizeSnapshot(candidate.snapshot);\n return Object.freeze({\n aggregate: \"aggregate\" in candidate ? candidate.aggregate : null,\n candidateKind: candidate.kind,\n ...summary\n });\n}\n\nfunction summarizeSnapshot(snapshot: CoreSnapshot): Readonly<{\n readonly counts: OutcomeCounts;\n readonly nonPassed: readonly Readonly<{\n readonly checkId: string;\n readonly reason: unknown;\n readonly status: string;\n }>[];\n}> {\n const counts = { failed: 0, notApplicable: 0, passed: 0, unavailable: 0 };\n const nonPassed: Array<Readonly<{ checkId: string; reason: unknown; status: string }>> = [];\n for (const check of snapshot.checks) {\n counts[statusCountKey(check)] += 1;\n const fact = nonPassedFact(check);\n if (fact !== undefined) nonPassed.push(fact);\n }\n return Object.freeze({\n counts: Object.freeze(counts),\n nonPassed: Object.freeze(nonPassed)\n });\n}\n\nfunction statusCountKey(check: CoreCheck): keyof OutcomeCounts {\n return check.outcome.status === \"not-applicable\" ? \"notApplicable\" : check.outcome.status;\n}\n\nfunction nonPassedFact(\n check: CoreCheck\n):\n | Readonly<{ readonly checkId: string; readonly reason: unknown; readonly status: string }>\n | undefined {\n if (check.outcome.status === \"passed\") return undefined;\n return Object.freeze({\n checkId: check.checkId,\n reason: check.outcome.status === \"failed\" ? null : (check.outcome.reason ?? null),\n status: check.outcome.status\n });\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"contract.mjs","sourceRoot":"","sources":["../../../../src/project-run/controls/contract.ts"],"names":[],"mappings":"","sourcesContent":["import type { ProjectOutputs } from \"../../project-definition/project-definition.ts\";\n/**\n * `run(definition, controls?)` 的第二个参数,只指定这一次怎么运行。\n *\n * root、flags、signal、Check 产物与日志目标以及显式 aggregation 属于本次调用;`outputs` 只逐字段\n * 覆盖 Definition 的输出默认值,不修改原 Definition。Checks、Check options 与 scheduler 仍在\n * `defineConfig(...)` 中声明,不能从这里替换;这些 Controls 不进入 Definition fingerprint。\n */\nexport interface RunControls {\n /** 单次 diagnostic 文件命名;默认 `unique`,独占目录可选 `channel` 使用固定 Core/Scheduler 名,同名目标失败且不覆盖。 */\n readonly diagnosticLogFileNaming?: DiagnosticLogFileNaming;\n /** caller 为当前 Run 选择的 progress log exact target;省略时只写 terminal。 */\n readonly progressLogFile?: string;\n /** caller 选择的 Check-owned invocation artifact base;省略时不授予 artifact capability。 */\n readonly checkArtifactBaseDirectory?: string;\n /** 为本次 Run 选择并折叠 Check statuses;省略时结果的 `aggregate` 为 `null`。 */\n readonly checkAggregation?: CheckAggregation;\n /** 仅为本次调用覆盖 Run-owned outputs。 */\n readonly outputs?: Partial<{\n machinePublication: Partial<ProjectOutputs[\"machinePublication\"]>;\n progressRendering: Partial<ProjectOutputs[\"progressRendering\"]>;\n diagnosticLogging: Partial<ProjectOutputs[\"diagnosticLogging\"]>;\n }>;\n /** 本次 Run 的 flag tokens;Product 去重排序后用于 Check selection 与 callback project context。 */\n readonly flags?: readonly string[];\n /** 项目相对输入与 output target 的解析根;省略时使用调用进程的当前工作目录。 */\n readonly projectRoot?: string;\n /** 供 planning、preflight 与 execution 协作响应的 caller cancellation signal。 */\n readonly signal?: AbortSignal;\n}\n/** Diagnostic 文件名选择;不改变目录、日志内容或 invocation identity。 */\nexport type DiagnosticLogFileNaming = \"unique\" | \"channel\";\n/** 将选定 Check statuses 折叠为 invocation aggregate 的规则。 */\nexport interface CheckAggregation {\n /** `all` 选择全部 Check,ID 数组选择明确集合,`effective` 复用本 invocation 的 flag-and-dependency selection。 */\n readonly checks: \"all\" | \"effective\" | readonly string[];\n /** `all` 要求所有纳入状态通过;`any` 只要求至少一个纳入状态通过。 */\n readonly mode: \"all\" | \"any\";\n /** 将 `unavailable` 原样传播、按失败纳入,或从 `all`/`any` 计算中排除。 */\n readonly unavailable: \"propagate\" | \"fail\" | \"exclude\";\n /** 将 `not-applicable` 从计算中排除,或按通过/失败纳入。 */\n readonly notApplicable: \"exclude\" | \"pass\" | \"fail\";\n /** 选择为空或所有状态都被排除时返回的明确 aggregate。 */\n readonly empty: \"passed\" | \"failed\" | \"not-applicable\";\n}\n/** `CheckAggregation` 计算出的 invocation 级结果。 */\nexport type CheckAggregate = \"passed\" | \"failed\" | \"not-applicable\" | \"unavailable\";\n"]}
1
+ {"version":3,"file":"contract.mjs","sourceRoot":"","sources":["../../../../src/project-run/controls/contract.ts"],"names":[],"mappings":"","sourcesContent":["import type { ProjectOutputs } from \"../../project-definition/project-definition.ts\";\nimport type { CoreCheck } from \"../../check-settlement/facts.ts\";\n/**\n * `run(definition, controls?)` 的第二个参数,只指定这一次怎么运行。\n *\n * root、flags、signal、Check 产物与日志目标以及 aggregation 属于本次调用;`outputs` 只逐字段\n * 覆盖 Definition 的输出默认值,不修改原 Definition。Checks、Check options 与 scheduler 仍在\n * `defineConfig(...)` 中声明,不能从这里替换;这些 Controls 不进入 Definition fingerprint。\n */\nexport interface RunControls {\n /** 单次 diagnostic 文件命名;默认 `unique`,独占目录可选 `channel` 使用固定 Core/Scheduler 名,同名目标失败且不覆盖。 */\n readonly diagnosticLogFileNaming?: DiagnosticLogFileNaming;\n /** caller 为当前 Run 选择的 progress log exact target;省略时只写 terminal。 */\n readonly progressLogFile?: string;\n /** caller 选择的 Check-owned invocation artifact base;省略时不授予 artifact capability。 */\n readonly checkArtifactBaseDirectory?: string;\n /** 为本次 Run 解释有效 Check facts;省略时使用严格的 all-passed 默认折叠。 */\n readonly checkAggregation?: CheckAggregation;\n /** 仅为本次调用覆盖 Run-owned outputs。 */\n readonly outputs?: Partial<{\n machinePublication: Partial<ProjectOutputs[\"machinePublication\"]>;\n progressRendering: Partial<ProjectOutputs[\"progressRendering\"]>;\n diagnosticLogging: Partial<ProjectOutputs[\"diagnosticLogging\"]>;\n }>;\n /** 本次 Run 的 flag tokens;Product 去重排序后用于 Check selection 与 callback project context。 */\n readonly flags?: readonly string[];\n /** 项目相对输入与 output target 的解析根;省略时使用调用进程的当前工作目录。 */\n readonly projectRoot?: string;\n /** 供 planning、preparation 与 execution 协作响应的 caller cancellation signal。 */\n readonly signal?: AbortSignal;\n}\n/** Diagnostic 文件名选择;不改变目录、日志内容或 invocation identity。 */\nexport type DiagnosticLogFileNaming = \"unique\" | \"channel\";\n/** `CheckAggregation` 计算出的 invocation 级结果。 */\nexport type CheckAggregate = \"passed\" | \"failed\" | \"not-applicable\" | \"unavailable\";\n/** 同步解释本次有效 Check facts 的 caller-local aggregation。 */\nexport type CheckAggregation = (checks: readonly CoreCheck[]) => CheckAggregate;\n"]}
@@ -1,7 +1,7 @@
1
- import { snapshotClosedArray } from "../../data-boundary/closed-values.mjs";
2
1
  import { isOutputDirectory } from "../../project-definition/output-validation.mjs";
3
2
  import { isNonArrayRecord, isUnknownArray } from "../../data-boundary/value-shapes.mjs";
4
3
  import { parseOutputsOverride } from "./outputs-override-validation.mjs";
4
+ import { CHANGE_FLAG_PREFIX } from "../changes/git.mjs";
5
5
  const RUN_CONTROL_KEYS = [
6
6
  "checkArtifactBaseDirectory",
7
7
  "checkAggregation",
@@ -12,10 +12,6 @@ const RUN_CONTROL_KEYS = [
12
12
  "projectRoot",
13
13
  "signal"
14
14
  ];
15
- const CHECK_AGGREGATION_MODES = ["all", "any"];
16
- const UNAVAILABLE_HANDLING = ["propagate", "fail", "exclude"];
17
- const NOT_APPLICABLE_HANDLING = ["exclude", "pass", "fail"];
18
- const EMPTY_AGGREGATION_RESULTS = ["passed", "failed", "not-applicable"];
19
15
  export function validateRunControls(value = {}) {
20
16
  try {
21
17
  return validateRunControlsValue(value);
@@ -128,7 +124,7 @@ function parseFlags(value) {
128
124
  if (!Object.hasOwn(value, index))
129
125
  return invalidControls("controls.flags");
130
126
  const flag = value[index];
131
- if (typeof flag !== "string" || flag.length === 0) {
127
+ if (typeof flag !== "string" || flag.length === 0 || flag.startsWith(CHANGE_FLAG_PREFIX)) {
132
128
  return invalidControls("controls.flags");
133
129
  }
134
130
  flags.push(flag);
@@ -141,59 +137,16 @@ function parseFlags(value) {
141
137
  function parseOptionalCheckAggregation(value) {
142
138
  if (value === undefined)
143
139
  return Object.freeze({ ok: true, value: undefined });
144
- const data = exactKeys(value, ["checks", "mode", "unavailable", "notApplicable", "empty"]);
145
- if (data === undefined)
146
- return invalidControls("controls.checkAggregation");
147
- const checks = data.checks === "all" || data.checks === "effective"
148
- ? data.checks
149
- : parseClosedCheckIds(data.checks);
150
- if (checks === undefined)
151
- return invalidControls("controls.checkAggregation.checks");
152
- const mode = parseLiteral(data.mode, CHECK_AGGREGATION_MODES);
153
- const unavailable = parseLiteral(data.unavailable, UNAVAILABLE_HANDLING);
154
- const notApplicable = parseLiteral(data.notApplicable, NOT_APPLICABLE_HANDLING);
155
- const empty = parseLiteral(data.empty, EMPTY_AGGREGATION_RESULTS);
156
- if (mode === undefined ||
157
- unavailable === undefined ||
158
- notApplicable === undefined ||
159
- empty === undefined)
160
- return invalidControls("controls.checkAggregation");
161
- return Object.freeze({
162
- ok: true,
163
- value: Object.freeze({
164
- checks,
165
- mode,
166
- unavailable,
167
- notApplicable,
168
- empty
169
- })
170
- });
171
- }
172
- function parseClosedCheckIds(value) {
173
- const values = snapshotClosedArray(value);
174
- if (values === undefined)
175
- return undefined;
176
- const checkIds = [];
177
- for (const checkId of values) {
178
- if (typeof checkId !== "string" || checkId.length === 0)
179
- return undefined;
180
- checkIds.push(checkId);
181
- }
182
- return Object.freeze(checkIds);
140
+ return isCheckAggregation(value)
141
+ ? Object.freeze({ ok: true, value })
142
+ : invalidControls("controls.checkAggregation");
183
143
  }
184
- function parseLiteral(value, allowed) {
185
- return typeof value === "string" ? allowed.find((option) => option === value) : undefined;
144
+ function isCheckAggregation(value) {
145
+ return typeof value === "function";
186
146
  }
187
147
  function isRunControlKey(value) {
188
148
  return RUN_CONTROL_KEYS.some((key) => key === value);
189
149
  }
190
- function exactKeys(value, keys) {
191
- if (!isNonArrayRecord(value))
192
- return undefined;
193
- return Object.keys(value).length === keys.length && keys.every((key) => Object.hasOwn(value, key))
194
- ? value
195
- : undefined;
196
- }
197
150
  function isAbortSignal(value) {
198
151
  return (isNonArrayRecord(value) &&
199
152
  typeof value.aborted === "boolean" &&
@@ -1 +1 @@
1
- {"version":3,"file":"validation.mjs","sourceRoot":"","sources":["../../../../src/project-run/controls/validation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,sCAAsC,CAAC;AAC3E,OAAO,EAAE,iBAAiB,EAAE,MAAM,+CAA+C,CAAC;AAClF,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,qCAAqC,CAAC;AACvF,OAAO,EAAE,oBAAoB,EAAE,MAAM,kCAAkC,CAAC;AAIxE,MAAM,gBAAgB,GAAG;IACvB,4BAA4B;IAC5B,kBAAkB;IAClB,yBAAyB;IACzB,iBAAiB;IACjB,SAAS;IACT,OAAO;IACP,aAAa;IACb,QAAQ;CACA,CAAC;AACX,MAAM,uBAAuB,GAAG,CAAC,KAAK,EAAE,KAAK,CAAU,CAAC;AACxD,MAAM,oBAAoB,GAAG,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,CAAU,CAAC;AACvE,MAAM,uBAAuB,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,CAAU,CAAC;AACrE,MAAM,yBAAyB,GAAG,CAAC,QAAQ,EAAE,QAAQ,EAAE,gBAAgB,CAAU,CAAC;AAgBlF,MAAM,UAAU,mBAAmB,CAAC,KAAK,GAAY,EAAE;IACrD,IAAI,CAAC;QACH,OAAO,wBAAwB,CAAC,KAAK,CAAC,CAAC;IACzC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,eAAe,CAAC,UAAU,CAAC,CAAC;IACrC,CAAC;AACH,CAAC;AAED,SAAS,wBAAwB,CAAC,KAAc;IAC9C,MAAM,IAAI,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;IACvC,IAAI,CAAC,IAAI,CAAC,EAAE;QAAE,OAAO,IAAI,CAAC;IAC1B,MAAM,MAAM,GAAG,qBAAqB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACjD,IAAI,CAAC,MAAM,CAAC,EAAE;QAAE,OAAO,MAAM,CAAC;IAC9B,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,qBAAqB,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;AACjF,CAAC;AAED,SAAS,qBAAqB,CAC5B,IAAuC;IAEvC,MAAM,aAAa,GAAG,4BAA4B,CAAC,IAAI,CAAC,CAAC;IACzD,IAAI,CAAC,aAAa,CAAC,EAAE;QAAE,OAAO,aAAa,CAAC;IAC5C,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrC,IAAI,CAAC,KAAK,CAAC,EAAE;QAAE,OAAO,KAAK,CAAC;IAC5B,MAAM,gBAAgB,GAAG,6BAA6B,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;IAC9E,IAAI,CAAC,gBAAgB,CAAC,EAAE;QAAE,OAAO,gBAAgB,CAAC;IAClD,MAAM,OAAO,GAAG,oBAAoB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACnD,IAAI,CAAC,OAAO,CAAC,EAAE;QAAE,OAAO,OAAO,CAAC;IAChC,MAAM,WAAW,GAAG,eAAe,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,EAAE,sBAAsB,CAAC,CAAC;IAC3F,IAAI,CAAC,WAAW,CAAC,EAAE;QAAE,OAAO,WAAW,CAAC;IACxC,MAAM,MAAM,GAAG,eAAe,CAAC,IAAI,CAAC,MAAM,EAAE,gBAAgB,EAAE,iBAAiB,CAAC,CAAC;IACjF,IAAI,CAAC,MAAM,CAAC,EAAE;QAAE,OAAO,MAAM,CAAC;IAC9B,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,EAAE,EAAE,IAAI;QACR,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC;YACnB,GAAG,aAAa,CAAC,KAAK;YACtB,gBAAgB,EAAE,gBAAgB,CAAC,KAAK;YACxC,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,OAAO,EAAE,OAAO,CAAC,KAAK;YACtB,WAAW,EAAE,WAAW,CAAC,KAAK;YAC9B,MAAM,EAAE,MAAM,CAAC,KAAK;SACrB,CAAC;KACH,CAAC,CAAC;AACL,CAAC;AAED,2FAA2F;AAC3F,SAAS,4BAA4B,CACnC,IAAuC;IAEvC,MAAM,uBAAuB,GAAG,eAAe,CAC7C,IAAI,CAAC,uBAAuB,EAC5B,4BAA4B,EAC5B,kCAAkC,CACnC,CAAC;IACF,IAAI,CAAC,uBAAuB,CAAC,EAAE;QAAE,OAAO,uBAAuB,CAAC;IAChE,MAAM,0BAA0B,GAAG,eAAe,CAChD,IAAI,CAAC,0BAA0B,EAC/B,oBAAoB,EACpB,qCAAqC,CACtC,CAAC;IACF,IAAI,CAAC,0BAA0B,CAAC,EAAE;QAAE,OAAO,0BAA0B,CAAC;IACtE,MAAM,eAAe,GAAG,eAAe,CACrC,IAAI,CAAC,eAAe,EACpB,oBAAoB,EACpB,0BAA0B,CAC3B,CAAC;IACF,IAAI,CAAC,eAAe,CAAC,EAAE;QAAE,OAAO,eAAe,CAAC;IAChD,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,EAAE,EAAE,IAAI;QACR,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC;YACnB,uBAAuB,EAAE,uBAAuB,CAAC,KAAK;YACtD,0BAA0B,EAAE,0BAA0B,CAAC,KAAK;YAC5D,eAAe,EAAE,eAAe,CAAC,KAAK;SACvC,CAAC;KACH,CAAC,CAAC;AACL,CAAC;AAED,SAAS,qBAAqB,CAAC,MAA8B;IAC3D,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,GAAG,CAAC,MAAM,CAAC,uBAAuB,KAAK,SAAS;YAC9C,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC,EAAE,uBAAuB,EAAE,MAAM,CAAC,uBAAuB,EAAE,CAAC;QAChE,GAAG,CAAC,MAAM,CAAC,0BAA0B,KAAK,SAAS;YACjD,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC,EAAE,0BAA0B,EAAE,MAAM,CAAC,0BAA0B,EAAE,CAAC;QACtE,GAAG,CAAC,MAAM,CAAC,gBAAgB,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,gBAAgB,EAAE,MAAM,CAAC,gBAAgB,EAAE,CAAC;QAC/F,GAAG,CAAC,MAAM,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC;QACpE,GAAG,CAAC,MAAM,CAAC,eAAe,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,MAAM,CAAC,eAAe,EAAE,CAAC;QAC5F,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,GAAG,CAAC,MAAM,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,MAAM,CAAC,WAAW,EAAE,CAAC;QAChF,GAAG,CAAC,MAAM,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;KAClE,CAAC,CAAC;AACL,CAAC;AAED,SAAS,kBAAkB,CACzB,KAAc;IAEd,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC;QAAE,OAAO,eAAe,CAAC,UAAU,CAAC,CAAC;IACjE,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC;IAC3E,OAAO,UAAU,KAAK,SAAS;QAC7B,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;QACpC,CAAC,CAAC,iBAAiB,CAAC,YAAY,UAAU,EAAE,EAAE,aAAa,CAAC,CAAC;AACjE,CAAC;AAED,SAAS,4BAA4B,CAAC,KAAc;IAClD,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AACvE,CAAC;AAED,SAAS,eAAe,CACtB,KAAc,EACd,KAA4C,EAC5C,IAAY;IAEZ,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;IAC9E,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;IAC5B,OAAO,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;AACnG,CAAC;AAED,SAAS,UAAU,CAAC,KAAc;IAChC,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IACtF,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC;QAAE,OAAO,eAAe,CAAC,gBAAgB,CAAC,CAAC;IACrE,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;IAC5B,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QAC/C,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC;YAAE,OAAO,eAAe,CAAC,gBAAgB,CAAC,CAAC;QAC3E,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;QAC1B,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAClD,OAAO,eAAe,CAAC,gBAAgB,CAAC,CAAC;QAC3C,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnB,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,EAAE,EAAE,IAAI;QACR,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;KACjD,CAAC,CAAC;AACL,CAAC;AAED,SAAS,6BAA6B,CACpC,KAAc;IAEd,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;IAC9E,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,aAAa,EAAE,eAAe,EAAE,OAAO,CAAC,CAAC,CAAC;IAC3F,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,eAAe,CAAC,2BAA2B,CAAC,CAAC;IAC5E,MAAM,MAAM,GACV,IAAI,CAAC,MAAM,KAAK,KAAK,IAAI,IAAI,CAAC,MAAM,KAAK,WAAW;QAClD,CAAC,CAAC,IAAI,CAAC,MAAM;QACb,CAAC,CAAC,mBAAmB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACvC,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,eAAe,CAAC,kCAAkC,CAAC,CAAC;IACrF,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,uBAAuB,CAAC,CAAC;IAC9D,MAAM,WAAW,GAAG,YAAY,CAAC,IAAI,CAAC,WAAW,EAAE,oBAAoB,CAAC,CAAC;IACzE,MAAM,aAAa,GAAG,YAAY,CAAC,IAAI,CAAC,aAAa,EAAE,uBAAuB,CAAC,CAAC;IAChF,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,KAAK,EAAE,yBAAyB,CAAC,CAAC;IAClE,IACE,IAAI,KAAK,SAAS;QAClB,WAAW,KAAK,SAAS;QACzB,aAAa,KAAK,SAAS;QAC3B,KAAK,KAAK,SAAS;QAEnB,OAAO,eAAe,CAAC,2BAA2B,CAAC,CAAC;IACtD,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,EAAE,EAAE,IAAI;QACR,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC;YACnB,MAAM;YACN,IAAI;YACJ,WAAW;YACX,aAAa;YACb,KAAK;SACN,CAAC;KACH,CAAC,CAAC;AACL,CAAC;AAED,SAAS,mBAAmB,CAAC,KAAc;IACzC,MAAM,MAAM,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC;IAC1C,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC3C,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,KAAK,MAAM,OAAO,IAAI,MAAM,EAAE,CAAC;QAC7B,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,SAAS,CAAC;QAC1E,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACzB,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;AACjC,CAAC;AAED,SAAS,YAAY,CACnB,KAAc,EACd,OAAyB;IAEzB,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AAC5F,CAAC;AAED,SAAS,eAAe,CAAC,KAAa;IACpC,OAAO,gBAAgB,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,KAAK,KAAK,CAAC,CAAC;AACvD,CAAC;AAED,SAAS,SAAS,CAChB,KAAc,EACd,IAAuB;IAEvB,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAC/C,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,KAAK,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAChG,CAAC,CAAC,KAAK;QACP,CAAC,CAAC,SAAS,CAAC;AAChB,CAAC;AAED,SAAS,aAAa,CAAC,KAAc;IACnC,OAAO,CACL,gBAAgB,CAAC,KAAK,CAAC;QACvB,OAAO,KAAK,CAAC,OAAO,KAAK,SAAS;QAClC,OAAO,KAAK,CAAC,gBAAgB,KAAK,UAAU,CAC7C,CAAC;AACJ,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAc;IACtC,OAAO,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AAClD,CAAC;AAED,SAAS,WAAW,CAAC,KAAc;IACjC,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AACvD,CAAC;AAED,SAAS,oBAAoB,CAAC,KAAc;IAC1C,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,iBAAiB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AACnF,CAAC;AAED,SAAS,eAAe,CAAC,IAAY;IACnC,OAAO,iBAAiB,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC;AAClD,CAAC;AAED,SAAS,iBAAiB,CACxB,IAAY,EACZ,MAAsC;IAEtC,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,EAAE,EAAE,KAAK;QACT,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,sBAAsB,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;KACrE,CAAC,CAAC;AACL,CAAC","sourcesContent":["import { snapshotClosedArray } from \"../../data-boundary/closed-values.ts\";\nimport { isOutputDirectory } from \"../../project-definition/output-validation.ts\";\nimport { isNonArrayRecord, isUnknownArray } from \"../../data-boundary/value-shapes.ts\";\nimport { parseOutputsOverride } from \"./outputs-override-validation.ts\";\nimport type { RunControlDiagnostic, RunControlValidationResult } from \"./validation-result.ts\";\nimport type { CheckAggregation, DiagnosticLogFileNaming, RunControls } from \"./contract.ts\";\n\nconst RUN_CONTROL_KEYS = [\n \"checkArtifactBaseDirectory\",\n \"checkAggregation\",\n \"diagnosticLogFileNaming\",\n \"progressLogFile\",\n \"outputs\",\n \"flags\",\n \"projectRoot\",\n \"signal\"\n] as const;\nconst CHECK_AGGREGATION_MODES = [\"all\", \"any\"] as const;\nconst UNAVAILABLE_HANDLING = [\"propagate\", \"fail\", \"exclude\"] as const;\nconst NOT_APPLICABLE_HANDLING = [\"exclude\", \"pass\", \"fail\"] as const;\nconst EMPTY_AGGREGATION_RESULTS = [\"passed\", \"failed\", \"not-applicable\"] as const;\n\ninterface ParsedInvocationOutputTargets {\n readonly diagnosticLogFileNaming: DiagnosticLogFileNaming | undefined;\n readonly checkArtifactBaseDirectory: string | undefined;\n readonly progressLogFile: string | undefined;\n}\n\ninterface ParsedRunControlFields extends ParsedInvocationOutputTargets {\n readonly checkAggregation: CheckAggregation | undefined;\n readonly flags: readonly string[];\n readonly outputs: RunControls[\"outputs\"] | undefined;\n readonly projectRoot: string | undefined;\n readonly signal: AbortSignal | undefined;\n}\n\nexport function validateRunControls(value: unknown = {}): RunControlValidationResult<RunControls> {\n try {\n return validateRunControlsValue(value);\n } catch {\n return invalidControls(\"controls\");\n }\n}\n\nfunction validateRunControlsValue(value: unknown): RunControlValidationResult<RunControls> {\n const data = exactControlRecord(value);\n if (!data.ok) return data;\n const fields = parseRunControlFields(data.value);\n if (!fields.ok) return fields;\n return Object.freeze({ ok: true, value: runControlsFromFields(fields.value) });\n}\n\nfunction parseRunControlFields(\n data: Readonly<Record<string, unknown>>\n): RunControlValidationResult<ParsedRunControlFields> {\n const outputTargets = parseInvocationOutputTargets(data);\n if (!outputTargets.ok) return outputTargets;\n const flags = parseFlags(data.flags);\n if (!flags.ok) return flags;\n const checkAggregation = parseOptionalCheckAggregation(data.checkAggregation);\n if (!checkAggregation.ok) return checkAggregation;\n const outputs = parseOutputsOverride(data.outputs);\n if (!outputs.ok) return outputs;\n const projectRoot = optionalControl(data.projectRoot, parseString, \"controls.projectRoot\");\n if (!projectRoot.ok) return projectRoot;\n const signal = optionalControl(data.signal, parseAbortSignal, \"controls.signal\");\n if (!signal.ok) return signal;\n return Object.freeze({\n ok: true,\n value: Object.freeze({\n ...outputTargets.value,\n checkAggregation: checkAggregation.value,\n flags: flags.value,\n outputs: outputs.value,\n projectRoot: projectRoot.value,\n signal: signal.value\n })\n });\n}\n\n/** Parse caller-owned invocation output targets separately from Run execution controls. */\nfunction parseInvocationOutputTargets(\n data: Readonly<Record<string, unknown>>\n): RunControlValidationResult<ParsedInvocationOutputTargets> {\n const diagnosticLogFileNaming = optionalControl(\n data.diagnosticLogFileNaming,\n parseDiagnosticLogFileNaming,\n \"controls.diagnosticLogFileNaming\"\n );\n if (!diagnosticLogFileNaming.ok) return diagnosticLogFileNaming;\n const checkArtifactBaseDirectory = optionalControl(\n data.checkArtifactBaseDirectory,\n parseOutputDirectory,\n \"controls.checkArtifactBaseDirectory\"\n );\n if (!checkArtifactBaseDirectory.ok) return checkArtifactBaseDirectory;\n const progressLogFile = optionalControl(\n data.progressLogFile,\n parseOutputDirectory,\n \"controls.progressLogFile\"\n );\n if (!progressLogFile.ok) return progressLogFile;\n return Object.freeze({\n ok: true,\n value: Object.freeze({\n diagnosticLogFileNaming: diagnosticLogFileNaming.value,\n checkArtifactBaseDirectory: checkArtifactBaseDirectory.value,\n progressLogFile: progressLogFile.value\n })\n });\n}\n\nfunction runControlsFromFields(fields: ParsedRunControlFields): RunControls {\n return Object.freeze({\n ...(fields.diagnosticLogFileNaming === undefined\n ? {}\n : { diagnosticLogFileNaming: fields.diagnosticLogFileNaming }),\n ...(fields.checkArtifactBaseDirectory === undefined\n ? {}\n : { checkArtifactBaseDirectory: fields.checkArtifactBaseDirectory }),\n ...(fields.checkAggregation === undefined ? {} : { checkAggregation: fields.checkAggregation }),\n ...(fields.outputs === undefined ? {} : { outputs: fields.outputs }),\n ...(fields.progressLogFile === undefined ? {} : { progressLogFile: fields.progressLogFile }),\n flags: fields.flags,\n ...(fields.projectRoot === undefined ? {} : { projectRoot: fields.projectRoot }),\n ...(fields.signal === undefined ? {} : { signal: fields.signal })\n });\n}\n\nfunction exactControlRecord(\n value: unknown\n): RunControlValidationResult<Readonly<Record<string, unknown>>> {\n if (!isNonArrayRecord(value)) return invalidControls(\"controls\");\n const unknownKey = Object.keys(value).find((key) => !isRunControlKey(key));\n return unknownKey === undefined\n ? Object.freeze({ ok: true, value })\n : invalidRunControl(`controls.${unknownKey}`, \"unknown-key\");\n}\n\nfunction parseDiagnosticLogFileNaming(value: unknown): DiagnosticLogFileNaming | undefined {\n return value === \"unique\" || value === \"channel\" ? value : undefined;\n}\n\nfunction optionalControl<T>(\n value: unknown,\n parse: (candidate: unknown) => T | undefined,\n path: string\n): RunControlValidationResult<T | undefined> {\n if (value === undefined) return Object.freeze({ ok: true, value: undefined });\n const parsed = parse(value);\n return parsed === undefined ? invalidControls(path) : Object.freeze({ ok: true, value: parsed });\n}\n\nfunction parseFlags(value: unknown): RunControlValidationResult<readonly string[]> {\n if (value === undefined) return Object.freeze({ ok: true, value: Object.freeze([]) });\n if (!isUnknownArray(value)) return invalidControls(\"controls.flags\");\n const flags: string[] = [];\n const length = value.length;\n for (let index = 0; index < length; index += 1) {\n if (!Object.hasOwn(value, index)) return invalidControls(\"controls.flags\");\n const flag = value[index];\n if (typeof flag !== \"string\" || flag.length === 0) {\n return invalidControls(\"controls.flags\");\n }\n flags.push(flag);\n }\n return Object.freeze({\n ok: true,\n value: Object.freeze([...new Set(flags)].sort())\n });\n}\n\nfunction parseOptionalCheckAggregation(\n value: unknown\n): RunControlValidationResult<CheckAggregation | undefined> {\n if (value === undefined) return Object.freeze({ ok: true, value: undefined });\n const data = exactKeys(value, [\"checks\", \"mode\", \"unavailable\", \"notApplicable\", \"empty\"]);\n if (data === undefined) return invalidControls(\"controls.checkAggregation\");\n const checks =\n data.checks === \"all\" || data.checks === \"effective\"\n ? data.checks\n : parseClosedCheckIds(data.checks);\n if (checks === undefined) return invalidControls(\"controls.checkAggregation.checks\");\n const mode = parseLiteral(data.mode, CHECK_AGGREGATION_MODES);\n const unavailable = parseLiteral(data.unavailable, UNAVAILABLE_HANDLING);\n const notApplicable = parseLiteral(data.notApplicable, NOT_APPLICABLE_HANDLING);\n const empty = parseLiteral(data.empty, EMPTY_AGGREGATION_RESULTS);\n if (\n mode === undefined ||\n unavailable === undefined ||\n notApplicable === undefined ||\n empty === undefined\n )\n return invalidControls(\"controls.checkAggregation\");\n return Object.freeze({\n ok: true,\n value: Object.freeze({\n checks,\n mode,\n unavailable,\n notApplicable,\n empty\n })\n });\n}\n\nfunction parseClosedCheckIds(value: unknown): readonly string[] | undefined {\n const values = snapshotClosedArray(value);\n if (values === undefined) return undefined;\n const checkIds: string[] = [];\n for (const checkId of values) {\n if (typeof checkId !== \"string\" || checkId.length === 0) return undefined;\n checkIds.push(checkId);\n }\n return Object.freeze(checkIds);\n}\n\nfunction parseLiteral<Value extends string>(\n value: unknown,\n allowed: readonly Value[]\n): Value | undefined {\n return typeof value === \"string\" ? allowed.find((option) => option === value) : undefined;\n}\n\nfunction isRunControlKey(value: string): boolean {\n return RUN_CONTROL_KEYS.some((key) => key === value);\n}\n\nfunction exactKeys(\n value: unknown,\n keys: readonly string[]\n): Readonly<Record<string, unknown>> | undefined {\n if (!isNonArrayRecord(value)) return undefined;\n return Object.keys(value).length === keys.length && keys.every((key) => Object.hasOwn(value, key))\n ? value\n : undefined;\n}\n\nfunction isAbortSignal(value: unknown): value is AbortSignal {\n return (\n isNonArrayRecord(value) &&\n typeof value.aborted === \"boolean\" &&\n typeof value.addEventListener === \"function\"\n );\n}\n\nfunction parseAbortSignal(value: unknown): AbortSignal | undefined {\n return isAbortSignal(value) ? value : undefined;\n}\n\nfunction parseString(value: unknown): string | undefined {\n return typeof value === \"string\" ? value : undefined;\n}\n\nfunction parseOutputDirectory(value: unknown): string | undefined {\n return typeof value === \"string\" && isOutputDirectory(value) ? value : undefined;\n}\n\nfunction invalidControls(path: string): RunControlValidationResult<never> {\n return invalidRunControl(path, \"invalid-value\");\n}\n\nfunction invalidRunControl(\n path: string,\n reason: RunControlDiagnostic[\"reason\"]\n): RunControlValidationResult<never> {\n return Object.freeze({\n ok: false,\n error: Object.freeze({ kind: \"invalid-run-controls\", path, reason })\n });\n}\n"]}
1
+ {"version":3,"file":"validation.mjs","sourceRoot":"","sources":["../../../../src/project-run/controls/validation.ts"],"names":[],"mappings":"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","sourcesContent":["import { isOutputDirectory } from \"../../project-definition/output-validation.ts\";\nimport { isNonArrayRecord, isUnknownArray } from \"../../data-boundary/value-shapes.ts\";\nimport { parseOutputsOverride } from \"./outputs-override-validation.ts\";\nimport { CHANGE_FLAG_PREFIX } from \"../changes/git.ts\";\nimport type { RunControlDiagnostic, RunControlValidationResult } from \"./validation-result.ts\";\nimport type { CheckAggregation, DiagnosticLogFileNaming, RunControls } from \"./contract.ts\";\n\nconst RUN_CONTROL_KEYS = [\n \"checkArtifactBaseDirectory\",\n \"checkAggregation\",\n \"diagnosticLogFileNaming\",\n \"progressLogFile\",\n \"outputs\",\n \"flags\",\n \"projectRoot\",\n \"signal\"\n] as const;\n\ninterface ParsedInvocationOutputTargets {\n readonly diagnosticLogFileNaming: DiagnosticLogFileNaming | undefined;\n readonly checkArtifactBaseDirectory: string | undefined;\n readonly progressLogFile: string | undefined;\n}\n\ninterface ParsedRunControlFields extends ParsedInvocationOutputTargets {\n readonly checkAggregation: CheckAggregation | undefined;\n readonly flags: readonly string[];\n readonly outputs: RunControls[\"outputs\"] | undefined;\n readonly projectRoot: string | undefined;\n readonly signal: AbortSignal | undefined;\n}\n\nexport function validateRunControls(value: unknown = {}): RunControlValidationResult<RunControls> {\n try {\n return validateRunControlsValue(value);\n } catch {\n return invalidControls(\"controls\");\n }\n}\n\nfunction validateRunControlsValue(value: unknown): RunControlValidationResult<RunControls> {\n const data = exactControlRecord(value);\n if (!data.ok) return data;\n const fields = parseRunControlFields(data.value);\n if (!fields.ok) return fields;\n return Object.freeze({ ok: true, value: runControlsFromFields(fields.value) });\n}\n\nfunction parseRunControlFields(\n data: Readonly<Record<string, unknown>>\n): RunControlValidationResult<ParsedRunControlFields> {\n const outputTargets = parseInvocationOutputTargets(data);\n if (!outputTargets.ok) return outputTargets;\n const flags = parseFlags(data.flags);\n if (!flags.ok) return flags;\n const checkAggregation = parseOptionalCheckAggregation(data.checkAggregation);\n if (!checkAggregation.ok) return checkAggregation;\n const outputs = parseOutputsOverride(data.outputs);\n if (!outputs.ok) return outputs;\n const projectRoot = optionalControl(data.projectRoot, parseString, \"controls.projectRoot\");\n if (!projectRoot.ok) return projectRoot;\n const signal = optionalControl(data.signal, parseAbortSignal, \"controls.signal\");\n if (!signal.ok) return signal;\n return Object.freeze({\n ok: true,\n value: Object.freeze({\n ...outputTargets.value,\n checkAggregation: checkAggregation.value,\n flags: flags.value,\n outputs: outputs.value,\n projectRoot: projectRoot.value,\n signal: signal.value\n })\n });\n}\n\n/** Parse caller-owned invocation output targets separately from Run execution controls. */\nfunction parseInvocationOutputTargets(\n data: Readonly<Record<string, unknown>>\n): RunControlValidationResult<ParsedInvocationOutputTargets> {\n const diagnosticLogFileNaming = optionalControl(\n data.diagnosticLogFileNaming,\n parseDiagnosticLogFileNaming,\n \"controls.diagnosticLogFileNaming\"\n );\n if (!diagnosticLogFileNaming.ok) return diagnosticLogFileNaming;\n const checkArtifactBaseDirectory = optionalControl(\n data.checkArtifactBaseDirectory,\n parseOutputDirectory,\n \"controls.checkArtifactBaseDirectory\"\n );\n if (!checkArtifactBaseDirectory.ok) return checkArtifactBaseDirectory;\n const progressLogFile = optionalControl(\n data.progressLogFile,\n parseOutputDirectory,\n \"controls.progressLogFile\"\n );\n if (!progressLogFile.ok) return progressLogFile;\n return Object.freeze({\n ok: true,\n value: Object.freeze({\n diagnosticLogFileNaming: diagnosticLogFileNaming.value,\n checkArtifactBaseDirectory: checkArtifactBaseDirectory.value,\n progressLogFile: progressLogFile.value\n })\n });\n}\n\nfunction runControlsFromFields(fields: ParsedRunControlFields): RunControls {\n return Object.freeze({\n ...(fields.diagnosticLogFileNaming === undefined\n ? {}\n : { diagnosticLogFileNaming: fields.diagnosticLogFileNaming }),\n ...(fields.checkArtifactBaseDirectory === undefined\n ? {}\n : { checkArtifactBaseDirectory: fields.checkArtifactBaseDirectory }),\n ...(fields.checkAggregation === undefined ? {} : { checkAggregation: fields.checkAggregation }),\n ...(fields.outputs === undefined ? {} : { outputs: fields.outputs }),\n ...(fields.progressLogFile === undefined ? {} : { progressLogFile: fields.progressLogFile }),\n flags: fields.flags,\n ...(fields.projectRoot === undefined ? {} : { projectRoot: fields.projectRoot }),\n ...(fields.signal === undefined ? {} : { signal: fields.signal })\n });\n}\n\nfunction exactControlRecord(\n value: unknown\n): RunControlValidationResult<Readonly<Record<string, unknown>>> {\n if (!isNonArrayRecord(value)) return invalidControls(\"controls\");\n const unknownKey = Object.keys(value).find((key) => !isRunControlKey(key));\n return unknownKey === undefined\n ? Object.freeze({ ok: true, value })\n : invalidRunControl(`controls.${unknownKey}`, \"unknown-key\");\n}\n\nfunction parseDiagnosticLogFileNaming(value: unknown): DiagnosticLogFileNaming | undefined {\n return value === \"unique\" || value === \"channel\" ? value : undefined;\n}\n\nfunction optionalControl<T>(\n value: unknown,\n parse: (candidate: unknown) => T | undefined,\n path: string\n): RunControlValidationResult<T | undefined> {\n if (value === undefined) return Object.freeze({ ok: true, value: undefined });\n const parsed = parse(value);\n return parsed === undefined ? invalidControls(path) : Object.freeze({ ok: true, value: parsed });\n}\n\nfunction parseFlags(value: unknown): RunControlValidationResult<readonly string[]> {\n if (value === undefined) return Object.freeze({ ok: true, value: Object.freeze([]) });\n if (!isUnknownArray(value)) return invalidControls(\"controls.flags\");\n const flags: string[] = [];\n const length = value.length;\n for (let index = 0; index < length; index += 1) {\n if (!Object.hasOwn(value, index)) return invalidControls(\"controls.flags\");\n const flag = value[index];\n if (typeof flag !== \"string\" || flag.length === 0 || flag.startsWith(CHANGE_FLAG_PREFIX)) {\n return invalidControls(\"controls.flags\");\n }\n flags.push(flag);\n }\n return Object.freeze({\n ok: true,\n value: Object.freeze([...new Set(flags)].sort())\n });\n}\n\nfunction parseOptionalCheckAggregation(\n value: unknown\n): RunControlValidationResult<CheckAggregation | undefined> {\n if (value === undefined) return Object.freeze({ ok: true, value: undefined });\n return isCheckAggregation(value)\n ? Object.freeze({ ok: true, value })\n : invalidControls(\"controls.checkAggregation\");\n}\n\nfunction isCheckAggregation(value: unknown): value is CheckAggregation {\n return typeof value === \"function\";\n}\n\nfunction isRunControlKey(value: string): boolean {\n return RUN_CONTROL_KEYS.some((key) => key === value);\n}\n\nfunction isAbortSignal(value: unknown): value is AbortSignal {\n return (\n isNonArrayRecord(value) &&\n typeof value.aborted === \"boolean\" &&\n typeof value.addEventListener === \"function\"\n );\n}\n\nfunction parseAbortSignal(value: unknown): AbortSignal | undefined {\n return isAbortSignal(value) ? value : undefined;\n}\n\nfunction parseString(value: unknown): string | undefined {\n return typeof value === \"string\" ? value : undefined;\n}\n\nfunction parseOutputDirectory(value: unknown): string | undefined {\n return typeof value === \"string\" && isOutputDirectory(value) ? value : undefined;\n}\n\nfunction invalidControls(path: string): RunControlValidationResult<never> {\n return invalidRunControl(path, \"invalid-value\");\n}\n\nfunction invalidRunControl(\n path: string,\n reason: RunControlDiagnostic[\"reason\"]\n): RunControlValidationResult<never> {\n return Object.freeze({\n ok: false,\n error: Object.freeze({ kind: \"invalid-run-controls\", path, reason })\n });\n}\n"]}
@@ -161,9 +161,9 @@ function renderDetailRecord(value, context, depth) {
161
161
  }
162
162
  }
163
163
  function isEnumerableDataDescriptor(descriptor) {
164
- return (descriptor !== undefined &&
165
- descriptor.enumerable === true &&
166
- descriptor.get === undefined &&
164
+ if (descriptor?.enumerable !== true)
165
+ return false;
166
+ return (descriptor.get === undefined &&
167
167
  descriptor.set === undefined &&
168
168
  Object.hasOwn(descriptor, "value"));
169
169
  }
@@ -1 +1 @@
1
- {"version":3,"file":"diagnostic-detail-rendering.mjs","sourceRoot":"","sources":["../../../../src/project-run/diagnostic-logging/diagnostic-detail-rendering.ts"],"names":[],"mappings":"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","sourcesContent":["import { types } from \"node:util\";\n\nimport type { DiagnosticValueSummary } from \"./logger.ts\";\n\nexport function summarizeDiagnosticValue(value: unknown): DiagnosticValueSummary {\n const rendered = renderSafeDiagnosticDetail(value);\n if (!rendered.ok) return Object.freeze({ availability: \"unavailable\", reason: rendered.reason });\n\n const parsed: unknown = JSON.parse(rendered.text);\n return summarizeRenderedDiagnosticValue(parsed, Buffer.byteLength(rendered.text, \"utf8\"));\n}\n\nfunction summarizeRenderedDiagnosticValue(value: unknown, bytes: number): DiagnosticValueSummary {\n if (value === null) return Object.freeze({ availability: \"available\", bytes, shape: \"null\" });\n if (Array.isArray(value)) {\n return Object.freeze({ availability: \"available\", bytes, items: value.length, shape: \"array\" });\n }\n return summarizeNonArrayDiagnosticValue(value, bytes);\n}\n\nfunction summarizeNonArrayDiagnosticValue(value: unknown, bytes: number): DiagnosticValueSummary {\n switch (typeof value) {\n case \"boolean\":\n return Object.freeze({ availability: \"available\", bytes, shape: \"boolean\" });\n case \"number\":\n return Object.freeze({ availability: \"available\", bytes, shape: \"number\" });\n case \"string\":\n return Object.freeze({ availability: \"available\", bytes, shape: \"string\" });\n case \"object\":\n return Object.freeze({\n availability: \"available\",\n bytes,\n keys: value === null ? 0 : Object.keys(value).length,\n shape: \"object\"\n });\n case \"bigint\":\n case \"function\":\n case \"symbol\":\n case \"undefined\":\n throw new Error(\"safe diagnostic rendering produced a non-JSON value\");\n default:\n throw new Error(\"safe diagnostic rendering produced an unknown value\");\n }\n}\n\nexport function renderSafeDiagnosticDetail(value: unknown): DetailRendering {\n return renderDetailValue(value, {\n ancestors: new Set<object>(),\n remainingCharacters: MAX_DETAIL_CHARACTERS,\n remainingValues: MAX_DETAIL_VALUES\n });\n}\n\n// These bounds admit ordinary package handoffs while keeping diagnostic work finite.\nconst MAX_DETAIL_CHARACTERS = 1_048_576;\nconst MAX_DETAIL_DEPTH = 16;\nconst MAX_DETAIL_VALUES = 32_768;\nconst MAX_DETAIL_WIDTH = 4_096;\n\ntype DetailRendering =\n | Readonly<{ readonly ok: true; readonly text: string }>\n | Readonly<{ readonly ok: false; readonly reason: string }>;\n\ninterface DetailRenderingContext {\n readonly ancestors: Set<object>;\n remainingCharacters: number;\n remainingValues: number;\n}\n\n/** Renders only descriptor-readable JSON values; diagnostics must never invoke author hooks. */\nfunction renderDetailValue(\n value: unknown,\n context: DetailRenderingContext,\n depth = 0\n): DetailRendering {\n if (context.remainingValues <= 0) return unavailable(\"value-limit\");\n context.remainingValues -= 1;\n const scalar = renderDetailScalar(value, context);\n if (scalar !== undefined) return scalar;\n return renderDetailCompound(value, context, depth);\n}\n\nfunction renderDetailScalar(\n value: unknown,\n context: DetailRenderingContext\n): DetailRendering | undefined {\n if (value === null || typeof value === \"boolean\" || typeof value === \"string\") {\n return renderDetailText(JSON.stringify(value), context);\n }\n if (typeof value !== \"number\") return undefined;\n return Number.isFinite(value)\n ? renderDetailText(JSON.stringify(value), context)\n : unavailable(\"non-finite-number\");\n}\n\nfunction renderDetailCompound(\n value: unknown,\n context: DetailRenderingContext,\n depth: number\n): DetailRendering {\n if (value === null || typeof value !== \"object\")\n return unavailable(`unsupported-${typeof value}`);\n if (types.isProxy(value)) return unavailable(\"proxy\");\n if (context.ancestors.has(value)) return unavailable(\"cycle\");\n if (depth >= MAX_DETAIL_DEPTH) return unavailable(\"depth-limit\");\n return Array.isArray(value)\n ? renderDetailArray(value, context, depth)\n : renderDetailRecord(value, context, depth);\n}\n\nfunction renderDetailArray(\n value: readonly unknown[],\n context: DetailRenderingContext,\n depth: number\n): DetailRendering {\n const inspection = inspectDetailArray(value);\n if (!inspection.ok) return inspection;\n context.ancestors.add(value);\n try {\n return renderDetailArrayItems(value, inspection.length, context, depth);\n } finally {\n context.ancestors.delete(value);\n }\n}\n\ntype DetailArrayInspection =\n | Readonly<{ readonly ok: false; readonly reason: string }>\n | Readonly<{ readonly ok: true; readonly length: number }>;\n\nfunction inspectDetailArray(value: readonly unknown[]): DetailArrayInspection {\n if (Object.getPrototypeOf(value) !== Array.prototype)\n return unavailableArray(\"unsupported-prototype\");\n const length = readableArrayLength(value);\n if (length === null) return unavailableArray(\"invalid-array\");\n if (length > MAX_DETAIL_WIDTH) return unavailableArray(\"width-limit\");\n return Reflect.ownKeys(value).length === length + 1\n ? Object.freeze({ length, ok: true })\n : unavailableArray(\"invalid-array\");\n}\n\nfunction readableArrayLength(value: readonly unknown[]): number | null {\n const descriptor = Object.getOwnPropertyDescriptor(value, \"length\");\n const length: unknown = descriptor?.value;\n if (descriptor?.get !== undefined || descriptor?.set !== undefined) return null;\n return typeof length === \"number\" && Number.isSafeInteger(length) && length >= 0 ? length : null;\n}\n\nfunction renderDetailArrayItems(\n value: readonly unknown[],\n length: number,\n context: DetailRenderingContext,\n depth: number\n): DetailRendering {\n const items: string[] = [];\n for (let index = 0; index < length; index += 1) {\n const descriptor = Object.getOwnPropertyDescriptor(value, String(index));\n if (!isEnumerableDataDescriptor(descriptor)) return unavailable(\"accessor-or-sparse-array\");\n const rendered = renderDetailValue(descriptor.value, context, depth + 1);\n if (!rendered.ok) return rendered;\n items.push(rendered.text);\n }\n return renderDetailText(`[${items.join(\",\")}]`, context);\n}\n\nfunction renderDetailRecord(\n value: object,\n context: DetailRenderingContext,\n depth: number\n): DetailRendering {\n const prototype: unknown = Object.getPrototypeOf(value);\n if (prototype !== Object.prototype && prototype !== null)\n return unavailable(\"unsupported-prototype\");\n const keys = Reflect.ownKeys(value);\n if (keys.length > MAX_DETAIL_WIDTH) return unavailable(\"width-limit\");\n const textKeys: string[] = [];\n for (let index = 0; index < keys.length; index += 1) {\n const key = keys[index];\n if (typeof key !== \"string\") return unavailable(\"symbol-key\");\n textKeys.push(key);\n }\n textKeys.sort();\n context.ancestors.add(value);\n try {\n const entries: string[] = [];\n for (const key of textKeys) {\n const descriptor = Object.getOwnPropertyDescriptor(value, key);\n if (!isEnumerableDataDescriptor(descriptor))\n return unavailable(\"accessor-or-hidden-property\");\n const rendered = renderDetailValue(descriptor.value, context, depth + 1);\n if (!rendered.ok) return rendered;\n entries.push(`${JSON.stringify(key)}:${rendered.text}`);\n }\n return renderDetailText(`{${entries.join(\",\")}}`, context);\n } finally {\n context.ancestors.delete(value);\n }\n}\n\nfunction isEnumerableDataDescriptor(\n descriptor: PropertyDescriptor | undefined\n): descriptor is PropertyDescriptor & Readonly<{ readonly value: unknown }> {\n return (\n descriptor !== undefined &&\n descriptor.enumerable === true &&\n descriptor.get === undefined &&\n descriptor.set === undefined &&\n Object.hasOwn(descriptor, \"value\")\n );\n}\n\nfunction renderDetailText(text: string, context: DetailRenderingContext): DetailRendering {\n if (text.length > context.remainingCharacters) return unavailable(\"size-limit\");\n context.remainingCharacters -= text.length;\n return Object.freeze({ ok: true, text });\n}\n\nfunction unavailable(reason: string): DetailRendering {\n return Object.freeze({ ok: false, reason });\n}\n\nfunction unavailableArray(reason: string): DetailArrayInspection {\n return Object.freeze({ ok: false, reason });\n}\n"]}
1
+ {"version":3,"file":"diagnostic-detail-rendering.mjs","sourceRoot":"","sources":["../../../../src/project-run/diagnostic-logging/diagnostic-detail-rendering.ts"],"names":[],"mappings":"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","sourcesContent":["import { types } from \"node:util\";\n\nimport type { DiagnosticValueSummary } from \"./logger.ts\";\n\nexport function summarizeDiagnosticValue(value: unknown): DiagnosticValueSummary {\n const rendered = renderSafeDiagnosticDetail(value);\n if (!rendered.ok) return Object.freeze({ availability: \"unavailable\", reason: rendered.reason });\n\n const parsed: unknown = JSON.parse(rendered.text);\n return summarizeRenderedDiagnosticValue(parsed, Buffer.byteLength(rendered.text, \"utf8\"));\n}\n\nfunction summarizeRenderedDiagnosticValue(value: unknown, bytes: number): DiagnosticValueSummary {\n if (value === null) return Object.freeze({ availability: \"available\", bytes, shape: \"null\" });\n if (Array.isArray(value)) {\n return Object.freeze({ availability: \"available\", bytes, items: value.length, shape: \"array\" });\n }\n return summarizeNonArrayDiagnosticValue(value, bytes);\n}\n\nfunction summarizeNonArrayDiagnosticValue(value: unknown, bytes: number): DiagnosticValueSummary {\n switch (typeof value) {\n case \"boolean\":\n return Object.freeze({ availability: \"available\", bytes, shape: \"boolean\" });\n case \"number\":\n return Object.freeze({ availability: \"available\", bytes, shape: \"number\" });\n case \"string\":\n return Object.freeze({ availability: \"available\", bytes, shape: \"string\" });\n case \"object\":\n return Object.freeze({\n availability: \"available\",\n bytes,\n keys: value === null ? 0 : Object.keys(value).length,\n shape: \"object\"\n });\n case \"bigint\":\n case \"function\":\n case \"symbol\":\n case \"undefined\":\n throw new Error(\"safe diagnostic rendering produced a non-JSON value\");\n default:\n throw new Error(\"safe diagnostic rendering produced an unknown value\");\n }\n}\n\nexport function renderSafeDiagnosticDetail(value: unknown): DetailRendering {\n return renderDetailValue(value, {\n ancestors: new Set<object>(),\n remainingCharacters: MAX_DETAIL_CHARACTERS,\n remainingValues: MAX_DETAIL_VALUES\n });\n}\n\n// These bounds admit ordinary package handoffs while keeping diagnostic work finite.\nconst MAX_DETAIL_CHARACTERS = 1_048_576;\nconst MAX_DETAIL_DEPTH = 16;\nconst MAX_DETAIL_VALUES = 32_768;\nconst MAX_DETAIL_WIDTH = 4_096;\n\ntype DetailRendering =\n | Readonly<{ readonly ok: true; readonly text: string }>\n | Readonly<{ readonly ok: false; readonly reason: string }>;\n\ninterface DetailRenderingContext {\n readonly ancestors: Set<object>;\n remainingCharacters: number;\n remainingValues: number;\n}\n\n/** Renders only descriptor-readable JSON values; diagnostics must never invoke author hooks. */\nfunction renderDetailValue(\n value: unknown,\n context: DetailRenderingContext,\n depth = 0\n): DetailRendering {\n if (context.remainingValues <= 0) return unavailable(\"value-limit\");\n context.remainingValues -= 1;\n const scalar = renderDetailScalar(value, context);\n if (scalar !== undefined) return scalar;\n return renderDetailCompound(value, context, depth);\n}\n\nfunction renderDetailScalar(\n value: unknown,\n context: DetailRenderingContext\n): DetailRendering | undefined {\n if (value === null || typeof value === \"boolean\" || typeof value === \"string\") {\n return renderDetailText(JSON.stringify(value), context);\n }\n if (typeof value !== \"number\") return undefined;\n return Number.isFinite(value)\n ? renderDetailText(JSON.stringify(value), context)\n : unavailable(\"non-finite-number\");\n}\n\nfunction renderDetailCompound(\n value: unknown,\n context: DetailRenderingContext,\n depth: number\n): DetailRendering {\n if (value === null || typeof value !== \"object\")\n return unavailable(`unsupported-${typeof value}`);\n if (types.isProxy(value)) return unavailable(\"proxy\");\n if (context.ancestors.has(value)) return unavailable(\"cycle\");\n if (depth >= MAX_DETAIL_DEPTH) return unavailable(\"depth-limit\");\n return Array.isArray(value)\n ? renderDetailArray(value, context, depth)\n : renderDetailRecord(value, context, depth);\n}\n\nfunction renderDetailArray(\n value: readonly unknown[],\n context: DetailRenderingContext,\n depth: number\n): DetailRendering {\n const inspection = inspectDetailArray(value);\n if (!inspection.ok) return inspection;\n context.ancestors.add(value);\n try {\n return renderDetailArrayItems(value, inspection.length, context, depth);\n } finally {\n context.ancestors.delete(value);\n }\n}\n\ntype DetailArrayInspection =\n | Readonly<{ readonly ok: false; readonly reason: string }>\n | Readonly<{ readonly ok: true; readonly length: number }>;\n\nfunction inspectDetailArray(value: readonly unknown[]): DetailArrayInspection {\n if (Object.getPrototypeOf(value) !== Array.prototype)\n return unavailableArray(\"unsupported-prototype\");\n const length = readableArrayLength(value);\n if (length === null) return unavailableArray(\"invalid-array\");\n if (length > MAX_DETAIL_WIDTH) return unavailableArray(\"width-limit\");\n return Reflect.ownKeys(value).length === length + 1\n ? Object.freeze({ length, ok: true })\n : unavailableArray(\"invalid-array\");\n}\n\nfunction readableArrayLength(value: readonly unknown[]): number | null {\n const descriptor = Object.getOwnPropertyDescriptor(value, \"length\");\n const length: unknown = descriptor?.value;\n if (descriptor?.get !== undefined || descriptor?.set !== undefined) return null;\n return typeof length === \"number\" && Number.isSafeInteger(length) && length >= 0 ? length : null;\n}\n\nfunction renderDetailArrayItems(\n value: readonly unknown[],\n length: number,\n context: DetailRenderingContext,\n depth: number\n): DetailRendering {\n const items: string[] = [];\n for (let index = 0; index < length; index += 1) {\n const descriptor = Object.getOwnPropertyDescriptor(value, String(index));\n if (!isEnumerableDataDescriptor(descriptor)) return unavailable(\"accessor-or-sparse-array\");\n const rendered = renderDetailValue(descriptor.value, context, depth + 1);\n if (!rendered.ok) return rendered;\n items.push(rendered.text);\n }\n return renderDetailText(`[${items.join(\",\")}]`, context);\n}\n\nfunction renderDetailRecord(\n value: object,\n context: DetailRenderingContext,\n depth: number\n): DetailRendering {\n const prototype: unknown = Object.getPrototypeOf(value);\n if (prototype !== Object.prototype && prototype !== null)\n return unavailable(\"unsupported-prototype\");\n const keys = Reflect.ownKeys(value);\n if (keys.length > MAX_DETAIL_WIDTH) return unavailable(\"width-limit\");\n const textKeys: string[] = [];\n for (let index = 0; index < keys.length; index += 1) {\n const key = keys[index];\n if (typeof key !== \"string\") return unavailable(\"symbol-key\");\n textKeys.push(key);\n }\n textKeys.sort();\n context.ancestors.add(value);\n try {\n const entries: string[] = [];\n for (const key of textKeys) {\n const descriptor = Object.getOwnPropertyDescriptor(value, key);\n if (!isEnumerableDataDescriptor(descriptor))\n return unavailable(\"accessor-or-hidden-property\");\n const rendered = renderDetailValue(descriptor.value, context, depth + 1);\n if (!rendered.ok) return rendered;\n entries.push(`${JSON.stringify(key)}:${rendered.text}`);\n }\n return renderDetailText(`{${entries.join(\",\")}}`, context);\n } finally {\n context.ancestors.delete(value);\n }\n}\n\nfunction isEnumerableDataDescriptor(\n descriptor: PropertyDescriptor | undefined\n): descriptor is PropertyDescriptor & Readonly<{ readonly value: unknown }> {\n if (descriptor?.enumerable !== true) return false;\n return (\n descriptor.get === undefined &&\n descriptor.set === undefined &&\n Object.hasOwn(descriptor, \"value\")\n );\n}\n\nfunction renderDetailText(text: string, context: DetailRenderingContext): DetailRendering {\n if (text.length > context.remainingCharacters) return unavailable(\"size-limit\");\n context.remainingCharacters -= text.length;\n return Object.freeze({ ok: true, text });\n}\n\nfunction unavailable(reason: string): DetailRendering {\n return Object.freeze({ ok: false, reason });\n}\n\nfunction unavailableArray(reason: string): DetailArrayInspection {\n return Object.freeze({ ok: false, reason });\n}\n"]}
@@ -93,7 +93,7 @@ function factKey(path) {
93
93
  }
94
94
  function factValue(path, value) {
95
95
  const key = path.at(-1);
96
- if (typeof value === "number" && key?.endsWith("Ms")) {
96
+ if (typeof value === "number" && key?.endsWith("Ms") === true) {
97
97
  return String(Math.round(value * 1_000) / 1_000);
98
98
  }
99
99
  return JSON.stringify(value);
@@ -1 +1 @@
1
- {"version":3,"file":"observation-rendering.mjs","sourceRoot":"","sources":["../../../../src/project-run/diagnostic-logging/observation-rendering.ts"],"names":[],"mappings":"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","sourcesContent":["import type { DiagnosticObservation } from \"./logger.ts\";\nimport { renderSafeDiagnosticDetail } from \"./diagnostic-detail-rendering.ts\";\n\nexport function renderDiagnosticObservation(\n input: Readonly<{\n readonly elapsedMs: number;\n readonly invocationId: string | undefined;\n readonly observation: DiagnosticObservation;\n readonly sequence: number;\n }>\n): string {\n const tags = input.observation.tags.map((tag) => `[${escapeLogHeaderField(tag)}]`).join(\" \");\n const invocation =\n input.invocationId === undefined ? \"\" : ` invocationId=${JSON.stringify(input.invocationId)}`;\n const header = `#${String(input.sequence).padStart(6, \"0\")} +${formatElapsed(input.elapsedMs)} ${tags}${invocation} ${escapeLogHeaderField(input.observation.event)}`;\n return renderFactLines(header, diagnosticFacts(input.observation));\n}\n\n/** Keeps author-controlled header fields on one physical header line. */\nfunction escapeLogHeaderField(text: string): string {\n let escaped = \"\";\n for (const character of text) {\n if (character === \"\\\\\") {\n escaped += \"\\\\\\\\\";\n continue;\n }\n const codeUnit = character.charCodeAt(0);\n escaped +=\n codeUnit <= 0x1f ||\n (codeUnit >= 0x7f && codeUnit <= 0x9f) ||\n codeUnit === 0x5b ||\n codeUnit === 0x5d ||\n codeUnit === 0x2028 ||\n codeUnit === 0x2029\n ? `\\\\u${codeUnit.toString(16).padStart(4, \"0\")}`\n : character;\n }\n return escaped;\n}\n\nfunction diagnosticFacts(observation: DiagnosticObservation): readonly string[] {\n if (observation.details === undefined) return Object.freeze([]);\n const rendered = renderSafeDiagnosticDetail(observation.details);\n if (!rendered.ok)\n return Object.freeze([`details=unavailable:${escapeLogHeaderField(rendered.reason)}`]);\n\n const value: unknown = JSON.parse(rendered.text);\n const facts: string[] = [];\n flattenDiagnosticFacts(value, [], facts, observation);\n return Object.freeze(facts);\n}\n\nfunction flattenDiagnosticFacts(\n value: unknown,\n path: readonly string[],\n facts: string[],\n observation: DiagnosticObservation\n): void {\n if (Array.isArray(value)) {\n flattenDiagnosticArrayFacts(value, path, facts, observation);\n return;\n }\n\n if (value !== null && typeof value === \"object\") {\n flattenDiagnosticRecordFacts(value, path, facts, observation);\n return;\n }\n\n facts.push(`${factKey(path)}=${factValue(path, value)}`);\n}\n\nfunction flattenDiagnosticArrayFacts(\n value: readonly unknown[],\n path: readonly string[],\n facts: string[],\n observation: DiagnosticObservation\n): void {\n const inline = JSON.stringify(value);\n if (inline.length <= MAX_INLINE_DIAGNOSTIC_VALUE_CHARACTERS) {\n facts.push(`${factKey(path)}=${inline}`);\n return;\n }\n const arrayPath = path.length === 0 ? [\"details\"] : path;\n for (let index = 0; index < value.length; index += 1) {\n flattenDiagnosticFacts(value[index], [...arrayPath, String(index)], facts, observation);\n }\n}\n\nfunction flattenDiagnosticRecordFacts(\n value: object,\n path: readonly string[],\n facts: string[],\n observation: DiagnosticObservation\n): void {\n const entries = Object.entries(value);\n if (entries.length === 0) {\n facts.push(`${factKey(path)}={}`);\n return;\n }\n for (const [key, nested] of entries) {\n if (path.length === 0 && isTopLevelFactRepresentedByTag(observation, key, nested)) continue;\n flattenDiagnosticFacts(nested, [...path, key], facts, observation);\n }\n}\n\n/** Omits only exact producer facts already visible in the observation's filter tags. */\nfunction isTopLevelFactRepresentedByTag(\n observation: DiagnosticObservation,\n key: string,\n value: unknown\n): boolean {\n if (typeof value !== \"string\") return false;\n if (observation.event === \"scheduler.decision\") {\n if (key === \"kind\") return observation.tags.includes(value.toUpperCase());\n return key === \"taskId\" && observation.tags.includes(`TASK:${value}`);\n }\n return (\n observation.event === \"record.reported\" &&\n key === \"result\" &&\n observation.tags.includes(value.toUpperCase())\n );\n}\n\nconst MAX_INLINE_DIAGNOSTIC_VALUE_CHARACTERS = 120;\n\nfunction factKey(path: readonly string[]): string {\n if (path.length === 0) return \"details\";\n const joined = path.join(\".\");\n return /^[A-Za-z_][A-Za-z0-9_.-]*$/u.test(joined) ? joined : JSON.stringify(joined);\n}\n\nfunction factValue(path: readonly string[], value: unknown): string {\n const key = path.at(-1);\n if (typeof value === \"number\" && key?.endsWith(\"Ms\")) {\n return String(Math.round(value * 1_000) / 1_000);\n }\n return JSON.stringify(value);\n}\n\nconst MAX_DIAGNOSTIC_LINE_CHARACTERS = 200;\n\nfunction renderFactLines(header: string, facts: readonly string[]): string {\n if (facts.length === 0) return `${header}\\n`;\n\n const lines: string[] = [];\n let current = header;\n for (const fact of facts) {\n if (current.length + 1 + fact.length <= MAX_DIAGNOSTIC_LINE_CHARACTERS) {\n current += ` ${fact}`;\n continue;\n }\n\n lines.push(current);\n const firstCapacity = MAX_DIAGNOSTIC_LINE_CHARACTERS - \"│ \".length;\n const continuationCapacity = MAX_DIAGNOSTIC_LINE_CHARACTERS - \"│ \".length;\n let offset = 0;\n let prefix = \"│ \";\n while (fact.length - offset > (prefix === \"│ \" ? firstCapacity : continuationCapacity)) {\n const capacity = prefix === \"│ \" ? firstCapacity : continuationCapacity;\n const end = diagnosticChunkEnd(fact, offset, capacity);\n lines.push(`${prefix}${fact.slice(offset, end)}`);\n offset = end;\n prefix = \"│ \";\n }\n current = `${prefix}${fact.slice(offset)}`;\n }\n lines.push(current);\n return `${lines.join(\"\\n\")}\\n`;\n}\n\nfunction diagnosticChunkEnd(text: string, offset: number, capacity: number): number {\n let end = offset + capacity;\n const preferredMinimum = offset + Math.floor(capacity * 0.6);\n for (let index = end - 1; index >= preferredMinimum; index -= 1) {\n if (text[index] === \" \") {\n end = index;\n break;\n }\n if (text[index] === \",\") {\n end = index + 1;\n break;\n }\n }\n if (\n end < text.length &&\n text.charCodeAt(end - 1) >= 0xd800 &&\n text.charCodeAt(end - 1) <= 0xdbff &&\n text.charCodeAt(end) >= 0xdc00 &&\n text.charCodeAt(end) <= 0xdfff\n ) {\n end -= 1;\n }\n return end;\n}\n\nfunction formatElapsed(elapsedMs: number): string {\n const totalMilliseconds = Math.round(elapsedMs);\n const hours = Math.floor(totalMilliseconds / 3_600_000);\n const minutes = Math.floor((totalMilliseconds % 3_600_000) / 60_000);\n const seconds = Math.floor((totalMilliseconds % 60_000) / 1_000);\n const milliseconds = totalMilliseconds % 1_000;\n return `${String(hours).padStart(2, \"0\")}:${String(minutes).padStart(2, \"0\")}:${String(seconds).padStart(2, \"0\")}.${String(milliseconds).padStart(3, \"0\")}`;\n}\n"]}
1
+ {"version":3,"file":"observation-rendering.mjs","sourceRoot":"","sources":["../../../../src/project-run/diagnostic-logging/observation-rendering.ts"],"names":[],"mappings":"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","sourcesContent":["import type { DiagnosticObservation } from \"./logger.ts\";\nimport { renderSafeDiagnosticDetail } from \"./diagnostic-detail-rendering.ts\";\n\nexport function renderDiagnosticObservation(\n input: Readonly<{\n readonly elapsedMs: number;\n readonly invocationId: string | undefined;\n readonly observation: DiagnosticObservation;\n readonly sequence: number;\n }>\n): string {\n const tags = input.observation.tags.map((tag) => `[${escapeLogHeaderField(tag)}]`).join(\" \");\n const invocation =\n input.invocationId === undefined ? \"\" : ` invocationId=${JSON.stringify(input.invocationId)}`;\n const header = `#${String(input.sequence).padStart(6, \"0\")} +${formatElapsed(input.elapsedMs)} ${tags}${invocation} ${escapeLogHeaderField(input.observation.event)}`;\n return renderFactLines(header, diagnosticFacts(input.observation));\n}\n\n/** Keeps author-controlled header fields on one physical header line. */\nfunction escapeLogHeaderField(text: string): string {\n let escaped = \"\";\n for (const character of text) {\n if (character === \"\\\\\") {\n escaped += \"\\\\\\\\\";\n continue;\n }\n const codeUnit = character.charCodeAt(0);\n escaped +=\n codeUnit <= 0x1f ||\n (codeUnit >= 0x7f && codeUnit <= 0x9f) ||\n codeUnit === 0x5b ||\n codeUnit === 0x5d ||\n codeUnit === 0x2028 ||\n codeUnit === 0x2029\n ? `\\\\u${codeUnit.toString(16).padStart(4, \"0\")}`\n : character;\n }\n return escaped;\n}\n\nfunction diagnosticFacts(observation: DiagnosticObservation): readonly string[] {\n if (observation.details === undefined) return Object.freeze([]);\n const rendered = renderSafeDiagnosticDetail(observation.details);\n if (!rendered.ok)\n return Object.freeze([`details=unavailable:${escapeLogHeaderField(rendered.reason)}`]);\n\n const value: unknown = JSON.parse(rendered.text);\n const facts: string[] = [];\n flattenDiagnosticFacts(value, [], facts, observation);\n return Object.freeze(facts);\n}\n\nfunction flattenDiagnosticFacts(\n value: unknown,\n path: readonly string[],\n facts: string[],\n observation: DiagnosticObservation\n): void {\n if (Array.isArray(value)) {\n flattenDiagnosticArrayFacts(value, path, facts, observation);\n return;\n }\n\n if (value !== null && typeof value === \"object\") {\n flattenDiagnosticRecordFacts(value, path, facts, observation);\n return;\n }\n\n facts.push(`${factKey(path)}=${factValue(path, value)}`);\n}\n\nfunction flattenDiagnosticArrayFacts(\n value: readonly unknown[],\n path: readonly string[],\n facts: string[],\n observation: DiagnosticObservation\n): void {\n const inline = JSON.stringify(value);\n if (inline.length <= MAX_INLINE_DIAGNOSTIC_VALUE_CHARACTERS) {\n facts.push(`${factKey(path)}=${inline}`);\n return;\n }\n const arrayPath = path.length === 0 ? [\"details\"] : path;\n for (let index = 0; index < value.length; index += 1) {\n flattenDiagnosticFacts(value[index], [...arrayPath, String(index)], facts, observation);\n }\n}\n\nfunction flattenDiagnosticRecordFacts(\n value: object,\n path: readonly string[],\n facts: string[],\n observation: DiagnosticObservation\n): void {\n const entries = Object.entries(value);\n if (entries.length === 0) {\n facts.push(`${factKey(path)}={}`);\n return;\n }\n for (const [key, nested] of entries) {\n if (path.length === 0 && isTopLevelFactRepresentedByTag(observation, key, nested)) continue;\n flattenDiagnosticFacts(nested, [...path, key], facts, observation);\n }\n}\n\n/** Omits only exact producer facts already visible in the observation's filter tags. */\nfunction isTopLevelFactRepresentedByTag(\n observation: DiagnosticObservation,\n key: string,\n value: unknown\n): boolean {\n if (typeof value !== \"string\") return false;\n if (observation.event === \"scheduler.decision\") {\n if (key === \"kind\") return observation.tags.includes(value.toUpperCase());\n return key === \"taskId\" && observation.tags.includes(`TASK:${value}`);\n }\n return (\n observation.event === \"record.reported\" &&\n key === \"result\" &&\n observation.tags.includes(value.toUpperCase())\n );\n}\n\nconst MAX_INLINE_DIAGNOSTIC_VALUE_CHARACTERS = 120;\n\nfunction factKey(path: readonly string[]): string {\n if (path.length === 0) return \"details\";\n const joined = path.join(\".\");\n return /^[A-Za-z_][A-Za-z0-9_.-]*$/u.test(joined) ? joined : JSON.stringify(joined);\n}\n\nfunction factValue(path: readonly string[], value: unknown): string {\n const key = path.at(-1);\n if (typeof value === \"number\" && key?.endsWith(\"Ms\") === true) {\n return String(Math.round(value * 1_000) / 1_000);\n }\n return JSON.stringify(value);\n}\n\nconst MAX_DIAGNOSTIC_LINE_CHARACTERS = 200;\n\nfunction renderFactLines(header: string, facts: readonly string[]): string {\n if (facts.length === 0) return `${header}\\n`;\n\n const lines: string[] = [];\n let current = header;\n for (const fact of facts) {\n if (current.length + 1 + fact.length <= MAX_DIAGNOSTIC_LINE_CHARACTERS) {\n current += ` ${fact}`;\n continue;\n }\n\n lines.push(current);\n const firstCapacity = MAX_DIAGNOSTIC_LINE_CHARACTERS - \"│ \".length;\n const continuationCapacity = MAX_DIAGNOSTIC_LINE_CHARACTERS - \"│ \".length;\n let offset = 0;\n let prefix = \"│ \";\n while (fact.length - offset > (prefix === \"│ \" ? firstCapacity : continuationCapacity)) {\n const capacity = prefix === \"│ \" ? firstCapacity : continuationCapacity;\n const end = diagnosticChunkEnd(fact, offset, capacity);\n lines.push(`${prefix}${fact.slice(offset, end)}`);\n offset = end;\n prefix = \"│ \";\n }\n current = `${prefix}${fact.slice(offset)}`;\n }\n lines.push(current);\n return `${lines.join(\"\\n\")}\\n`;\n}\n\nfunction diagnosticChunkEnd(text: string, offset: number, capacity: number): number {\n let end = offset + capacity;\n const preferredMinimum = offset + Math.floor(capacity * 0.6);\n for (let index = end - 1; index >= preferredMinimum; index -= 1) {\n if (text[index] === \" \") {\n end = index;\n break;\n }\n if (text[index] === \",\") {\n end = index + 1;\n break;\n }\n }\n if (\n end < text.length &&\n text.charCodeAt(end - 1) >= 0xd800 &&\n text.charCodeAt(end - 1) <= 0xdbff &&\n text.charCodeAt(end) >= 0xdc00 &&\n text.charCodeAt(end) <= 0xdfff\n ) {\n end -= 1;\n }\n return end;\n}\n\nfunction formatElapsed(elapsedMs: number): string {\n const totalMilliseconds = Math.round(elapsedMs);\n const hours = Math.floor(totalMilliseconds / 3_600_000);\n const minutes = Math.floor((totalMilliseconds % 3_600_000) / 60_000);\n const seconds = Math.floor((totalMilliseconds % 60_000) / 1_000);\n const milliseconds = totalMilliseconds % 1_000;\n return `${String(hours).padStart(2, \"0\")}:${String(minutes).padStart(2, \"0\")}:${String(seconds).padStart(2, \"0\")}.${String(milliseconds).padStart(3, \"0\")}`;\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { aggregateCheckOutcomes } from "../aggregation.mjs";
1
+ import { aggregateEffectiveChecks } from "../aggregation.mjs";
2
2
  import { completeInvocation } from "../completion/completion.mjs";
3
3
  import { diagnosticTags } from "../diagnostic-logging/logger.mjs";
4
4
  import { elapsedSince, outcomeCounts } from "./progress.mjs";
@@ -8,14 +8,15 @@ export function mapResolvedExecutionToRunCandidate(input) {
8
8
  const { executed, invocation } = input;
9
9
  if (executed.kind === "admission-policy-failed")
10
10
  return admissionPolicyFailure(invocation);
11
- invocation.progressRendering.final({
12
- counts: outcomeCounts(executed.snapshot),
13
- elapsedMs: elapsedSince(input.executionStartedAt, invocation.clock),
14
- execution: executed.kind
15
- });
16
- if (executed.kind === "cancelled")
11
+ if (executed.kind === "cancelled") {
12
+ invocation.progressRendering.final({
13
+ counts: outcomeCounts(executed.snapshot),
14
+ elapsedMs: elapsedSince(input.executionStartedAt, invocation.clock),
15
+ execution: executed.kind
16
+ });
17
17
  return cancelledExecutionCandidate(invocation, executed);
18
- return completedExecutionCandidate(invocation, input.aggregation, executed);
18
+ }
19
+ return completedExecutionCandidate(invocation, input.aggregation, executed, input.executionStartedAt);
19
20
  }
20
21
  function admissionPolicyFailure(invocation) {
21
22
  return Object.freeze({
@@ -41,14 +42,12 @@ function cancelledExecutionCandidate(invocation, executed) {
41
42
  snapshot: executed.snapshot
42
43
  });
43
44
  }
44
- function completedExecutionCandidate(invocation, aggregation, executed) {
45
- const aggregate = aggregation === undefined
46
- ? null
47
- : aggregateCheckOutcomes(executed.snapshot, aggregation, executed.effectiveCheckIds);
45
+ function completedExecutionCandidate(invocation, aggregation, executed, executionStartedAt) {
46
+ const aggregate = aggregateEffectiveChecks(executed.snapshot, executed.effectiveCheckIds, aggregation);
48
47
  invocation.diagnosticLogging.core.observe({
49
48
  event: "run.aggregation.completed",
50
49
  tags: diagnosticTags("RUN", "AGGREGATION", "COMPLETED"),
51
- details: { aggregate, selection: aggregation ?? null }
50
+ details: { aggregate, aggregation: aggregation === undefined ? "default" : "custom" }
52
51
  });
53
52
  const core = Object.freeze({
54
53
  aggregate,
@@ -56,6 +55,11 @@ function completedExecutionCandidate(invocation, aggregation, executed) {
56
55
  checkMessages: executed.checkMessages,
57
56
  snapshot: executed.snapshot
58
57
  });
58
+ invocation.progressRendering.final({
59
+ counts: outcomeCounts(executed.snapshot),
60
+ elapsedMs: elapsedSince(executionStartedAt, invocation.clock),
61
+ execution: "completed"
62
+ });
59
63
  return completeInvocation(invocation, core);
60
64
  }
61
65
  //# sourceMappingURL=candidate.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"candidate.mjs","sourceRoot":"","sources":["../../../../src/project-run/invocation/candidate.ts"],"names":[],"mappings":"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","sourcesContent":["import { aggregateCheckOutcomes } from \"../aggregation.ts\";\nimport { completeInvocation, type CoreExecution } from \"../completion/completion.ts\";\nimport type { CheckAggregation } from \"../controls/contract.ts\";\nimport { diagnosticTags } from \"../diagnostic-logging/logger.ts\";\nimport type { Invocation } from \"./run.ts\";\nimport { elapsedSince, outcomeCounts } from \"./progress.ts\";\nimport { executionCancellation, type NonConfigurationRunResult } from \"../result.ts\";\nimport type { ResolvedCheckExecution } from \"../check-execution/resolved-execution-result.ts\";\n\nexport type ResolvedExecutionCandidateInput = Readonly<{\n readonly aggregation: CheckAggregation | undefined;\n readonly executed: ResolvedCheckExecution;\n readonly executionStartedAt: number;\n readonly invocation: Invocation;\n}>;\n\n/** Maps a sealed Scheduler result into the Run-owned candidate before terminal output closure. */\nexport function mapResolvedExecutionToRunCandidate(\n input: ResolvedExecutionCandidateInput\n): NonConfigurationRunResult {\n const { executed, invocation } = input;\n if (executed.kind === \"admission-policy-failed\") return admissionPolicyFailure(invocation);\n\n invocation.progressRendering.final({\n counts: outcomeCounts(executed.snapshot),\n elapsedMs: elapsedSince(input.executionStartedAt, invocation.clock),\n execution: executed.kind\n });\n\n if (executed.kind === \"cancelled\") return cancelledExecutionCandidate(invocation, executed);\n return completedExecutionCandidate(invocation, input.aggregation, executed);\n}\n\nfunction admissionPolicyFailure(\n invocation: Invocation\n): Extract<NonConfigurationRunResult, { readonly kind: \"execution\" }> {\n return Object.freeze({\n kind: \"execution\",\n declarativeFingerprint: invocation.declarativeFingerprint,\n definitionWarnings: invocation.definitionWarnings,\n diagnostic: Object.freeze({ code: \"admission-policy-failed\" }),\n outputs: invocation.outputs.value()\n });\n}\n\nfunction cancelledExecutionCandidate(\n invocation: Invocation,\n executed: Extract<ResolvedCheckExecution, { readonly kind: \"cancelled\" }>\n): NonConfigurationRunResult {\n invocation.diagnosticLogging.core.observe({\n event: \"run.execution.cancelled\",\n tags: diagnosticTags(\"RUN\", \"EXECUTION\", \"CANCELLED\"),\n details: { checkCount: executed.snapshot.checks.length }\n });\n return executionCancellation({\n checkDurations: executed.checkDurations,\n checkMessages: executed.checkMessages,\n declarativeFingerprint: invocation.declarativeFingerprint,\n definitionWarnings: invocation.definitionWarnings,\n outputs: invocation.outputs.value(),\n snapshot: executed.snapshot\n });\n}\n\nfunction completedExecutionCandidate(\n invocation: Invocation,\n aggregation: CheckAggregation | undefined,\n executed: Extract<ResolvedCheckExecution, { readonly kind: \"completed\" }>\n): NonConfigurationRunResult {\n const aggregate =\n aggregation === undefined\n ? null\n : aggregateCheckOutcomes(executed.snapshot, aggregation, executed.effectiveCheckIds);\n invocation.diagnosticLogging.core.observe({\n event: \"run.aggregation.completed\",\n tags: diagnosticTags(\"RUN\", \"AGGREGATION\", \"COMPLETED\"),\n details: { aggregate, selection: aggregation ?? null }\n });\n const core: CoreExecution = Object.freeze({\n aggregate,\n checkDurations: executed.checkDurations,\n checkMessages: executed.checkMessages,\n snapshot: executed.snapshot\n });\n return completeInvocation(invocation, core);\n}\n"]}
1
+ {"version":3,"file":"candidate.mjs","sourceRoot":"","sources":["../../../../src/project-run/invocation/candidate.ts"],"names":[],"mappings":"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","sourcesContent":["import { aggregateEffectiveChecks } from \"../aggregation.ts\";\nimport { completeInvocation, type CoreExecution } from \"../completion/completion.ts\";\nimport type { CheckAggregation } from \"../controls/contract.ts\";\nimport { diagnosticTags } from \"../diagnostic-logging/logger.ts\";\nimport type { Invocation } from \"./run.ts\";\nimport { elapsedSince, outcomeCounts } from \"./progress.ts\";\nimport { executionCancellation, type NonConfigurationRunResult } from \"../result.ts\";\nimport type { ResolvedCheckExecution } from \"../check-execution/resolved-execution-result.ts\";\n\nexport type ResolvedExecutionCandidateInput = Readonly<{\n readonly aggregation: CheckAggregation | undefined;\n readonly executed: ResolvedCheckExecution;\n readonly executionStartedAt: number;\n readonly invocation: Invocation;\n}>;\n\n/** Maps a sealed Scheduler result into the Run-owned candidate before terminal output closure. */\nexport function mapResolvedExecutionToRunCandidate(\n input: ResolvedExecutionCandidateInput\n): NonConfigurationRunResult {\n const { executed, invocation } = input;\n if (executed.kind === \"admission-policy-failed\") return admissionPolicyFailure(invocation);\n\n if (executed.kind === \"cancelled\") {\n invocation.progressRendering.final({\n counts: outcomeCounts(executed.snapshot),\n elapsedMs: elapsedSince(input.executionStartedAt, invocation.clock),\n execution: executed.kind\n });\n return cancelledExecutionCandidate(invocation, executed);\n }\n return completedExecutionCandidate(\n invocation,\n input.aggregation,\n executed,\n input.executionStartedAt\n );\n}\n\nfunction admissionPolicyFailure(\n invocation: Invocation\n): Extract<NonConfigurationRunResult, { readonly kind: \"execution\" }> {\n return Object.freeze({\n kind: \"execution\",\n declarativeFingerprint: invocation.declarativeFingerprint,\n definitionWarnings: invocation.definitionWarnings,\n diagnostic: Object.freeze({ code: \"admission-policy-failed\" }),\n outputs: invocation.outputs.value()\n });\n}\n\nfunction cancelledExecutionCandidate(\n invocation: Invocation,\n executed: Extract<ResolvedCheckExecution, { readonly kind: \"cancelled\" }>\n): NonConfigurationRunResult {\n invocation.diagnosticLogging.core.observe({\n event: \"run.execution.cancelled\",\n tags: diagnosticTags(\"RUN\", \"EXECUTION\", \"CANCELLED\"),\n details: { checkCount: executed.snapshot.checks.length }\n });\n return executionCancellation({\n checkDurations: executed.checkDurations,\n checkMessages: executed.checkMessages,\n declarativeFingerprint: invocation.declarativeFingerprint,\n definitionWarnings: invocation.definitionWarnings,\n outputs: invocation.outputs.value(),\n snapshot: executed.snapshot\n });\n}\n\nfunction completedExecutionCandidate(\n invocation: Invocation,\n aggregation: CheckAggregation | undefined,\n executed: Extract<ResolvedCheckExecution, { readonly kind: \"completed\" }>,\n executionStartedAt: number\n): NonConfigurationRunResult {\n const aggregate = aggregateEffectiveChecks(\n executed.snapshot,\n executed.effectiveCheckIds,\n aggregation\n );\n invocation.diagnosticLogging.core.observe({\n event: \"run.aggregation.completed\",\n tags: diagnosticTags(\"RUN\", \"AGGREGATION\", \"COMPLETED\"),\n details: { aggregate, aggregation: aggregation === undefined ? \"default\" : \"custom\" }\n });\n const core: CoreExecution = Object.freeze({\n aggregate,\n checkDurations: executed.checkDurations,\n checkMessages: executed.checkMessages,\n snapshot: executed.snapshot\n });\n invocation.progressRendering.final({\n counts: outcomeCounts(executed.snapshot),\n elapsedMs: elapsedSince(executionStartedAt, invocation.clock),\n execution: \"completed\"\n });\n return completeInvocation(invocation, core);\n}\n"]}
@@ -0,0 +1,26 @@
1
+ import { diagnosticTags } from "../diagnostic-logging/logger.mjs";
2
+ import { planning, preExecutionCancellation } from "../result.mjs";
3
+ /** Records a pre-execution cancellation as the Run-owned candidate result. */
4
+ export function cancelledBeforeExecution(invocation, phase) {
5
+ invocation.diagnosticLogging.core.observe({
6
+ event: "run.cancelled",
7
+ tags: diagnosticTags("RUN", "CANCELLED"),
8
+ details: { phase }
9
+ });
10
+ return preExecutionCancellation(invocation.declarativeFingerprint, invocation.definitionWarnings, invocation.outputs.value(), phase);
11
+ }
12
+ /** Constructs the planning failure candidate after the static graph has been rejected. */
13
+ export function planningResult(invocation, code) {
14
+ return planning(invocation.declarativeFingerprint, invocation.definitionWarnings, invocation.outputs.value(), code);
15
+ }
16
+ /** Constructs a pre-settlement execution failure without revising existing output facts. */
17
+ export function executionResult(invocation, code) {
18
+ return Object.freeze({
19
+ kind: "execution",
20
+ declarativeFingerprint: invocation.declarativeFingerprint,
21
+ definitionWarnings: invocation.definitionWarnings,
22
+ diagnostic: Object.freeze({ code }),
23
+ outputs: invocation.outputs.value()
24
+ });
25
+ }
26
+ //# sourceMappingURL=candidates.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"candidates.mjs","sourceRoot":"","sources":["../../../../src/project-run/invocation/candidates.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AACjE,OAAO,EACL,QAAQ,EACR,wBAAwB,EAGzB,MAAM,cAAc,CAAC;AAGtB,8EAA8E;AAC9E,MAAM,UAAU,wBAAwB,CACtC,UAAsB,EACtB,KAA8B;IAE9B,UAAU,CAAC,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC;QACxC,KAAK,EAAE,eAAe;QACtB,IAAI,EAAE,cAAc,CAAC,KAAK,EAAE,WAAW,CAAC;QACxC,OAAO,EAAE,EAAE,KAAK,EAAE;KACnB,CAAC,CAAC;IACH,OAAO,wBAAwB,CAC7B,UAAU,CAAC,sBAAsB,EACjC,UAAU,CAAC,kBAAkB,EAC7B,UAAU,CAAC,OAAO,CAAC,KAAK,EAAE,EAC1B,KAAK,CACN,CAAC;AACJ,CAAC;AAED,0FAA0F;AAC1F,MAAM,UAAU,cAAc,CAC5B,UAAsB,EACtB,IAA0D;IAE1D,OAAO,QAAQ,CACb,UAAU,CAAC,sBAAsB,EACjC,UAAU,CAAC,kBAAkB,EAC7B,UAAU,CAAC,OAAO,CAAC,KAAK,EAAE,EAC1B,IAAI,CACL,CAAC;AACJ,CAAC;AAED,4FAA4F;AAC5F,MAAM,UAAU,eAAe,CAC7B,UAAsB,EACtB,IAGC;IAED,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,IAAI,EAAE,WAAW;QACjB,sBAAsB,EAAE,UAAU,CAAC,sBAAsB;QACzD,kBAAkB,EAAE,UAAU,CAAC,kBAAkB;QACjD,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC;QACnC,OAAO,EAAE,UAAU,CAAC,OAAO,CAAC,KAAK,EAAE;KACpC,CAAC,CAAC;AACL,CAAC","sourcesContent":["import { diagnosticTags } from \"../diagnostic-logging/logger.ts\";\nimport {\n planning,\n preExecutionCancellation,\n type NonConfigurationRunResult,\n type RunDiagnostic\n} from \"../result.ts\";\nimport type { Invocation } from \"./run.ts\";\n\n/** Records a pre-execution cancellation as the Run-owned candidate result. */\nexport function cancelledBeforeExecution(\n invocation: Invocation,\n phase: \"pre-work\" | \"planning\"\n): NonConfigurationRunResult {\n invocation.diagnosticLogging.core.observe({\n event: \"run.cancelled\",\n tags: diagnosticTags(\"RUN\", \"CANCELLED\"),\n details: { phase }\n });\n return preExecutionCancellation(\n invocation.declarativeFingerprint,\n invocation.definitionWarnings,\n invocation.outputs.value(),\n phase\n );\n}\n\n/** Constructs the planning failure candidate after the static graph has been rejected. */\nexport function planningResult(\n invocation: Invocation,\n code: Extract<RunDiagnostic[\"code\"], \"task-graph-invalid\">\n): NonConfigurationRunResult {\n return planning(\n invocation.declarativeFingerprint,\n invocation.definitionWarnings,\n invocation.outputs.value(),\n code\n );\n}\n\n/** Constructs a pre-settlement execution failure without revising existing output facts. */\nexport function executionResult(\n invocation: Invocation,\n code: Extract<\n RunDiagnostic[\"code\"],\n \"admission-strategy-preparation-failed\" | \"task-engine-failed\"\n >\n): NonConfigurationRunResult {\n return Object.freeze({\n kind: \"execution\",\n declarativeFingerprint: invocation.declarativeFingerprint,\n definitionWarnings: invocation.definitionWarnings,\n diagnostic: Object.freeze({ code }),\n outputs: invocation.outputs.value()\n });\n}\n"]}