@zxyycom/vibe-check 0.0.1 → 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +47 -74
- package/dist/esm/cache/cache-json-by-key.mjs +189 -0
- package/dist/esm/cache/cache-json-by-key.mjs.map +1 -0
- package/dist/esm/check/check.mjs.map +1 -1
- package/dist/esm/check/finding-presentation.mjs +40 -0
- package/dist/esm/check/finding-presentation.mjs.map +1 -0
- package/dist/esm/check/inherited-collection.mjs +1 -1
- package/dist/esm/check/inherited-collection.mjs.map +1 -1
- package/dist/esm/check-settlement/fact-validation.mjs +17 -23
- package/dist/esm/check-settlement/fact-validation.mjs.map +1 -1
- package/dist/esm/check-settlement/outcome-normalization.mjs +9 -19
- package/dist/esm/check-settlement/outcome-normalization.mjs.map +1 -1
- package/dist/esm/check-settlement/reason-shape.mjs +12 -0
- package/dist/esm/check-settlement/reason-shape.mjs.map +1 -0
- package/dist/esm/check-settlement/record-store.mjs +14 -17
- package/dist/esm/check-settlement/record-store.mjs.map +1 -1
- package/dist/esm/check-settlement/session.mjs +8 -2
- package/dist/esm/check-settlement/session.mjs.map +1 -1
- package/dist/esm/data-boundary/closed-values.mjs +16 -0
- package/dist/esm/data-boundary/closed-values.mjs.map +1 -1
- package/dist/esm/data-boundary/value-shapes.mjs +9 -0
- package/dist/esm/data-boundary/value-shapes.mjs.map +1 -1
- package/dist/esm/index.mjs +9 -2
- package/dist/esm/index.mjs.map +1 -1
- package/dist/esm/learned-critical-path/duration-model/bounded-history.mjs +56 -0
- package/dist/esm/learned-critical-path/duration-model/bounded-history.mjs.map +1 -0
- package/dist/esm/learned-critical-path/duration-model/prediction.mjs +122 -0
- package/dist/esm/learned-critical-path/duration-model/prediction.mjs.map +1 -0
- package/dist/esm/learned-critical-path/duration-model/preparation.mjs +41 -0
- package/dist/esm/learned-critical-path/duration-model/preparation.mjs.map +1 -0
- package/dist/esm/learned-critical-path/duration-model/recording.mjs +109 -0
- package/dist/esm/learned-critical-path/duration-model/recording.mjs.map +1 -0
- package/dist/esm/learned-critical-path/duration-model/storage.mjs +187 -0
- package/dist/esm/learned-critical-path/duration-model/storage.mjs.map +1 -0
- package/dist/esm/learned-critical-path/selection-layers.mjs +28 -0
- package/dist/esm/learned-critical-path/selection-layers.mjs.map +1 -0
- package/dist/esm/learned-critical-path/static-decision.mjs +55 -0
- package/dist/esm/learned-critical-path/static-decision.mjs.map +1 -0
- package/dist/esm/learned-critical-path/strategy.mjs +179 -0
- package/dist/esm/learned-critical-path/strategy.mjs.map +1 -0
- package/dist/esm/machine-output/v4/atomic-publication.mjs +1 -15
- package/dist/esm/machine-output/v4/atomic-publication.mjs.map +1 -1
- package/dist/esm/package-checks/code-quality-findings/finding-waiver-authoring.mjs +40 -0
- package/dist/esm/package-checks/code-quality-findings/finding-waiver-authoring.mjs.map +1 -0
- package/dist/esm/package-checks/code-quality-findings/finding-waiver-evidence.mjs +48 -0
- package/dist/esm/package-checks/code-quality-findings/finding-waiver-evidence.mjs.map +1 -0
- package/dist/esm/package-checks/code-quality-findings/policy.mjs +20 -0
- package/dist/esm/package-checks/code-quality-findings/policy.mjs.map +1 -1
- package/dist/esm/package-checks/duplicate-detection/area-policy.mjs +15 -7
- package/dist/esm/package-checks/duplicate-detection/area-policy.mjs.map +1 -1
- package/dist/esm/package-checks/duplicate-detection/cache/identity.mjs +1 -1
- package/dist/esm/package-checks/duplicate-detection/cache/identity.mjs.map +1 -1
- package/dist/esm/package-checks/duplicate-detection/default-check.mjs +1 -1
- package/dist/esm/package-checks/duplicate-detection/default-check.mjs.map +1 -1
- package/dist/esm/package-checks/duplicate-detection/execution.mjs +44 -18
- package/dist/esm/package-checks/duplicate-detection/execution.mjs.map +1 -1
- package/dist/esm/package-checks/duplicate-detection/finding-messages.mjs +59 -0
- package/dist/esm/package-checks/duplicate-detection/finding-messages.mjs.map +1 -0
- package/dist/esm/package-checks/duplicate-detection/finding-waiver-identity.mjs +55 -0
- package/dist/esm/package-checks/duplicate-detection/finding-waiver-identity.mjs.map +1 -0
- package/dist/esm/package-checks/duplicate-detection/jscpd/availability.mjs +1 -1
- package/dist/esm/package-checks/duplicate-detection/jscpd/availability.mjs.map +1 -1
- package/dist/esm/package-checks/duplicate-detection/jscpd/command-resolution.mjs +1 -1
- package/dist/esm/package-checks/duplicate-detection/jscpd/command-resolution.mjs.map +1 -1
- package/dist/esm/package-checks/duplicate-detection/jscpd/json-report.mjs +15 -5
- package/dist/esm/package-checks/duplicate-detection/jscpd/json-report.mjs.map +1 -1
- package/dist/esm/package-checks/duplicate-detection/jscpd/scanner.mjs +5 -4
- package/dist/esm/package-checks/duplicate-detection/jscpd/scanner.mjs.map +1 -1
- package/dist/esm/package-checks/duplicate-detection/options-resolution.mjs +22 -47
- package/dist/esm/package-checks/duplicate-detection/options-resolution.mjs.map +1 -1
- package/dist/esm/package-checks/duplicate-detection/options-validation.mjs +20 -25
- package/dist/esm/package-checks/duplicate-detection/options-validation.mjs.map +1 -1
- package/dist/esm/package-checks/duplicate-detection/options.mjs.map +1 -1
- package/dist/esm/package-checks/duplicate-detection/records.mjs +27 -6
- package/dist/esm/package-checks/duplicate-detection/records.mjs.map +1 -1
- package/dist/esm/package-checks/file-metrics/execution.mjs +10 -17
- package/dist/esm/package-checks/file-metrics/execution.mjs.map +1 -1
- package/dist/esm/package-checks/file-metrics/finding-messages.mjs +22 -0
- package/dist/esm/package-checks/file-metrics/finding-messages.mjs.map +1 -0
- package/dist/esm/package-checks/file-metrics/options-resolution.mjs +11 -43
- package/dist/esm/package-checks/file-metrics/options-resolution.mjs.map +1 -1
- package/dist/esm/package-checks/file-metrics/options-validation.mjs +15 -25
- package/dist/esm/package-checks/file-metrics/options-validation.mjs.map +1 -1
- package/dist/esm/package-checks/file-metrics/records.mjs +2 -9
- package/dist/esm/package-checks/file-metrics/records.mjs.map +1 -1
- package/dist/esm/package-checks/file-metrics/scc/availability.mjs +1 -1
- package/dist/esm/package-checks/file-metrics/scc/availability.mjs.map +1 -1
- package/dist/esm/package-checks/file-metrics/scc/parser.mjs +4 -4
- package/dist/esm/package-checks/file-metrics/scc/parser.mjs.map +1 -1
- package/dist/esm/package-checks/file-metrics/scc/scanner.mjs +2 -2
- package/dist/esm/package-checks/file-metrics/scc/scanner.mjs.map +1 -1
- package/dist/esm/package-checks/function-metrics/analysis.mjs +56 -15
- package/dist/esm/package-checks/function-metrics/analysis.mjs.map +1 -1
- package/dist/esm/package-checks/function-metrics/analyzer/analysis-context.mjs +550 -0
- package/dist/esm/package-checks/function-metrics/analyzer/analysis-context.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/analyzer/analysis-model.mjs +332 -0
- package/dist/esm/package-checks/function-metrics/analyzer/analysis-model.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/analyzer/contracts.mjs +7 -0
- package/dist/esm/package-checks/function-metrics/analyzer/contracts.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/analyzer/extensions/lizardcomplextags.mjs +24 -0
- package/dist/esm/package-checks/function-metrics/analyzer/extensions/lizardcomplextags.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/analyzer/extensions/lizardnd.mjs +113 -0
- package/dist/esm/package-checks/function-metrics/analyzer/extensions/lizardnd.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/analyzer/extensions/protocol.mjs +180 -0
- package/dist/esm/package-checks/function-metrics/analyzer/extensions/protocol.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/analyzer/extensions/registry.mjs +121 -0
- package/dist/esm/package-checks/function-metrics/analyzer/extensions/registry.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/analyzer/pipeline.mjs +217 -0
- package/dist/esm/package-checks/function-metrics/analyzer/pipeline.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/analyzer/port-facade.mjs +96 -0
- package/dist/esm/package-checks/function-metrics/analyzer/port-facade.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/analyzer/reader-registry.mjs +76 -0
- package/dist/esm/package-checks/function-metrics/analyzer/reader-registry.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/csharp.mjs +88 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/csharp.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/erlang.mjs +466 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/erlang.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/fortran.mjs +289 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/fortran.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/gdscript.mjs +38 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/gdscript.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/go.mjs +44 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/go.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/java-body-states.mjs +113 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/java-body-states.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/java.mjs +247 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/java.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/javascript.mjs +16 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/javascript.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/kotlin.mjs +103 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/kotlin.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/lua.mjs +55 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/lua.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/objc.mjs +100 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/objc.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/perl.mjs +367 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/perl.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/php-states.mjs +260 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/php-states.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/php.mjs +53 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/php.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/plsql.mjs +306 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/plsql.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/python.mjs +402 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/python.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/r.mjs +214 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/r.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/ruby.mjs +75 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/ruby.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/rust.mjs +32 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/rust.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/scala.mjs +47 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/scala.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/solidity.mjs +22 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/solidity.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/st.mjs +142 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/st.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/swift.mjs +94 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/swift.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/tsx.mjs +149 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/tsx.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/ttcn.mjs +79 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/ttcn.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/typescript.mjs +606 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/typescript.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/vue.mjs +31 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/vue.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/zig.mjs +23 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/zig.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/analyzer/shared/clike.mjs +492 -0
- package/dist/esm/package-checks/function-metrics/analyzer/shared/clike.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/analyzer/shared/code-reader.mjs +542 -0
- package/dist/esm/package-checks/function-metrics/analyzer/shared/code-reader.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/analyzer/shared/golike.mjs +141 -0
- package/dist/esm/package-checks/function-metrics/analyzer/shared/golike.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/analyzer/shared/js-style-regex.mjs +62 -0
- package/dist/esm/package-checks/function-metrics/analyzer/shared/js-style-regex.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/analyzer/shared/rubylike.mjs +154 -0
- package/dist/esm/package-checks/function-metrics/analyzer/shared/rubylike.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/analyzer/shared/script-language.mjs +36 -0
- package/dist/esm/package-checks/function-metrics/analyzer/shared/script-language.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/analyzer-adapter.mjs +56 -0
- package/dist/esm/package-checks/function-metrics/analyzer-adapter.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/analyzer-worker-contract.mjs +2 -0
- package/dist/esm/package-checks/function-metrics/analyzer-worker-contract.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/analyzer-worker-port.mjs +108 -0
- package/dist/esm/package-checks/function-metrics/analyzer-worker-port.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/analyzer-worker.mjs +24 -0
- package/dist/esm/package-checks/function-metrics/analyzer-worker.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/constructor.mjs +2 -2
- package/dist/esm/package-checks/function-metrics/constructor.mjs.map +1 -1
- package/dist/esm/package-checks/function-metrics/execution.mjs +51 -33
- package/dist/esm/package-checks/function-metrics/execution.mjs.map +1 -1
- package/dist/esm/package-checks/function-metrics/finding-messages.mjs +75 -0
- package/dist/esm/package-checks/function-metrics/finding-messages.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/finding-waiver-identity.mjs +28 -0
- package/dist/esm/package-checks/function-metrics/finding-waiver-identity.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/measurement-model.mjs.map +1 -1
- package/dist/esm/package-checks/function-metrics/measurement.mjs +161 -26
- package/dist/esm/package-checks/function-metrics/measurement.mjs.map +1 -1
- package/dist/esm/package-checks/function-metrics/options-resolution.mjs +30 -63
- package/dist/esm/package-checks/function-metrics/options-resolution.mjs.map +1 -1
- package/dist/esm/package-checks/function-metrics/options-validation.mjs +27 -32
- package/dist/esm/package-checks/function-metrics/options-validation.mjs.map +1 -1
- package/dist/esm/package-checks/function-metrics/options.mjs.map +1 -1
- package/dist/esm/package-checks/function-metrics/records.mjs +31 -1
- package/dist/esm/package-checks/function-metrics/records.mjs.map +1 -1
- package/dist/esm/package-checks/function-metrics/target-files.mjs +6 -67
- package/dist/esm/package-checks/function-metrics/target-files.mjs.map +1 -1
- package/dist/esm/package-checks/{file-metrics/scc → host-environment}/csv.mjs +1 -0
- package/dist/esm/package-checks/host-environment/csv.mjs.map +1 -0
- package/dist/esm/package-checks/host-environment/git.mjs +1 -1
- package/dist/esm/package-checks/host-environment/git.mjs.map +1 -1
- package/dist/esm/package-checks/host-environment/process.mjs +5 -0
- package/dist/esm/package-checks/host-environment/process.mjs.map +1 -0
- package/dist/esm/package-checks/json-schema-validation/final-data.mjs.map +1 -1
- package/dist/esm/package-checks/json-schema-validation/options-validation.mjs +15 -17
- package/dist/esm/package-checks/json-schema-validation/options-validation.mjs.map +1 -1
- package/dist/esm/package-checks/json-schema-validation/options.mjs.map +1 -1
- package/dist/esm/package-checks/json-validation/final-data.mjs.map +1 -1
- package/dist/esm/package-checks/json-validation/options-validation.mjs +4 -10
- package/dist/esm/package-checks/json-validation/options-validation.mjs.map +1 -1
- package/dist/esm/package-checks/maintenance-reminders/final-data.mjs.map +1 -1
- package/dist/esm/package-checks/markdown-link-validation/default-check.mjs +9 -3
- package/dist/esm/package-checks/markdown-link-validation/default-check.mjs.map +1 -1
- package/dist/esm/package-checks/markdown-link-validation/execution.mjs +27 -24
- package/dist/esm/package-checks/markdown-link-validation/execution.mjs.map +1 -1
- package/dist/esm/package-checks/markdown-link-validation/filesystem-probes.mjs +82 -53
- package/dist/esm/package-checks/markdown-link-validation/filesystem-probes.mjs.map +1 -1
- package/dist/esm/package-checks/markdown-link-validation/final-data.mjs.map +1 -1
- package/dist/esm/package-checks/markdown-link-validation/finding-messages.mjs +36 -0
- package/dist/esm/package-checks/markdown-link-validation/finding-messages.mjs.map +1 -0
- package/dist/esm/package-checks/markdown-link-validation/local-resolution.mjs.map +1 -1
- package/dist/esm/package-checks/markdown-link-validation/local-resolver.mjs +2 -2
- package/dist/esm/package-checks/markdown-link-validation/local-resolver.mjs.map +1 -1
- package/dist/esm/package-checks/markdown-link-validation/options-resolution.mjs +26 -4
- package/dist/esm/package-checks/markdown-link-validation/options-resolution.mjs.map +1 -1
- package/dist/esm/package-checks/markdown-link-validation/options-validation.mjs +24 -11
- package/dist/esm/package-checks/markdown-link-validation/options-validation.mjs.map +1 -1
- package/dist/esm/package-checks/markdown-link-validation/options.mjs.map +1 -1
- package/dist/esm/package-checks/markdown-link-validation/parse-facts-cache-payload.mjs +185 -0
- package/dist/esm/package-checks/markdown-link-validation/parse-facts-cache-payload.mjs.map +1 -0
- package/dist/esm/package-checks/markdown-link-validation/parse-facts-cache.mjs +131 -0
- package/dist/esm/package-checks/markdown-link-validation/parse-facts-cache.mjs.map +1 -0
- package/dist/esm/package-checks/markdown-link-validation/resolver-engine.mjs +58 -57
- package/dist/esm/package-checks/markdown-link-validation/resolver-engine.mjs.map +1 -1
- package/dist/esm/package-checks/markdown-link-validation/source-reader.mjs +54 -0
- package/dist/esm/package-checks/markdown-link-validation/source-reader.mjs.map +1 -0
- package/dist/esm/package-checks/markdown-link-validation/unavailable-reasons.mjs +16 -0
- package/dist/esm/package-checks/markdown-link-validation/unavailable-reasons.mjs.map +1 -0
- package/dist/esm/package-checks/project-files/collection.mjs +1 -1
- package/dist/esm/package-checks/project-files/collection.mjs.map +1 -1
- package/dist/esm/package-checks/project-files/configuration.mjs +2 -10
- package/dist/esm/package-checks/project-files/configuration.mjs.map +1 -1
- package/dist/esm/package-checks/project-files/gitlink-revision.mjs +1 -1
- package/dist/esm/package-checks/project-files/gitlink-revision.mjs.map +1 -1
- package/dist/esm/package-checks/project-files/gitlink-worktree.mjs +1 -1
- package/dist/esm/package-checks/project-files/gitlink-worktree.mjs.map +1 -1
- package/dist/esm/package-checks/project-files/public-collection.mjs +56 -0
- package/dist/esm/package-checks/project-files/public-collection.mjs.map +1 -0
- package/dist/esm/package-checks/project-files/revision-worktree-files.mjs +1 -1
- package/dist/esm/package-checks/project-files/revision-worktree-files.mjs.map +1 -1
- package/dist/esm/package-checks/secret-detection/classification.mjs +15 -0
- package/dist/esm/package-checks/secret-detection/classification.mjs.map +1 -0
- package/dist/esm/package-checks/secret-detection/default-check.mjs +39 -0
- package/dist/esm/package-checks/secret-detection/default-check.mjs.map +1 -0
- package/dist/esm/package-checks/secret-detection/execution.mjs +172 -0
- package/dist/esm/package-checks/secret-detection/execution.mjs.map +1 -0
- package/dist/esm/package-checks/secret-detection/final-data.mjs +33 -0
- package/dist/esm/package-checks/secret-detection/final-data.mjs.map +1 -0
- package/dist/esm/package-checks/secret-detection/finding-waiver-identity.mjs +30 -0
- package/dist/esm/package-checks/secret-detection/finding-waiver-identity.mjs.map +1 -0
- package/dist/esm/package-checks/secret-detection/input-preparation.mjs +153 -0
- package/dist/esm/package-checks/secret-detection/input-preparation.mjs.map +1 -0
- package/dist/esm/package-checks/secret-detection/options-resolution.mjs +40 -0
- package/dist/esm/package-checks/secret-detection/options-resolution.mjs.map +1 -0
- package/dist/esm/package-checks/secret-detection/options-validation.mjs +22 -0
- package/dist/esm/package-checks/secret-detection/options-validation.mjs.map +1 -0
- package/dist/esm/package-checks/secret-detection/options.mjs +2 -0
- package/dist/esm/package-checks/secret-detection/options.mjs.map +1 -0
- package/dist/esm/package-checks/secret-detection/records.mjs +31 -0
- package/dist/esm/package-checks/secret-detection/records.mjs.map +1 -0
- package/dist/esm/package-checks/secret-detection/secretlint/adapter.mjs +85 -0
- package/dist/esm/package-checks/secret-detection/secretlint/adapter.mjs.map +1 -0
- package/dist/esm/project-definition/check-tree/authoring.mjs +12 -172
- package/dist/esm/project-definition/check-tree/authoring.mjs.map +1 -1
- package/dist/esm/project-definition/check-tree/check-fields-authoring.mjs +171 -0
- package/dist/esm/project-definition/check-tree/check-fields-authoring.mjs.map +1 -0
- package/dist/esm/project-definition/check-tree/collection-authoring.mjs +16 -0
- package/dist/esm/project-definition/check-tree/collection-authoring.mjs.map +1 -0
- package/dist/esm/project-definition/check-tree/materialization.mjs +9 -1
- package/dist/esm/project-definition/check-tree/materialization.mjs.map +1 -1
- package/dist/esm/project-definition/check-tree/resolution.mjs +45 -13
- package/dist/esm/project-definition/check-tree/resolution.mjs.map +1 -1
- package/dist/esm/project-definition/check-tree/scheduling-authoring.mjs +73 -0
- package/dist/esm/project-definition/check-tree/scheduling-authoring.mjs.map +1 -0
- package/dist/esm/project-definition/declarative-snapshot.mjs +73 -0
- package/dist/esm/project-definition/declarative-snapshot.mjs.map +1 -0
- package/dist/esm/project-definition/output-defaults.mjs +18 -1
- package/dist/esm/project-definition/output-defaults.mjs.map +1 -1
- package/dist/esm/project-definition/output-validation.mjs +15 -15
- package/dist/esm/project-definition/output-validation.mjs.map +1 -1
- package/dist/esm/project-definition/progress-rendering-output.mjs +52 -0
- package/dist/esm/project-definition/progress-rendering-output.mjs.map +1 -0
- package/dist/esm/project-definition/project-definition-validation.mjs +100 -16
- package/dist/esm/project-definition/project-definition-validation.mjs.map +1 -1
- package/dist/esm/project-definition/project-definition.mjs +52 -47
- package/dist/esm/project-definition/project-definition.mjs.map +1 -1
- package/dist/esm/project-definition/resource-unit-mapping.mjs +21 -0
- package/dist/esm/project-definition/resource-unit-mapping.mjs.map +1 -0
- package/dist/esm/project-definition/scheduler-policy.mjs +2 -0
- package/dist/esm/project-definition/scheduler-policy.mjs.map +1 -0
- package/dist/esm/project-run/admission-strategy-provider/custom-strategy-preparation.mjs +54 -0
- package/dist/esm/project-run/admission-strategy-provider/custom-strategy-preparation.mjs.map +1 -0
- package/dist/esm/project-run/admission-strategy-provider/prepared-admission-strategy.mjs +2 -0
- package/dist/esm/project-run/admission-strategy-provider/prepared-admission-strategy.mjs.map +1 -0
- package/dist/esm/project-run/admission-strategy-provider/provider.mjs +23 -0
- package/dist/esm/project-run/admission-strategy-provider/provider.mjs.map +1 -0
- package/dist/esm/project-run/aggregation.mjs +7 -5
- package/dist/esm/project-run/aggregation.mjs.map +1 -1
- package/dist/esm/project-run/check-execution/callback.mjs +35 -8
- package/dist/esm/project-run/check-execution/callback.mjs.map +1 -1
- package/dist/esm/project-run/check-execution/console-capture.mjs +220 -0
- package/dist/esm/project-run/check-execution/console-capture.mjs.map +1 -0
- package/dist/esm/project-run/check-execution/dependencies.mjs +21 -3
- package/dist/esm/project-run/check-execution/dependencies.mjs.map +1 -1
- package/dist/esm/project-run/check-execution/execution-finalization.mjs +54 -13
- package/dist/esm/project-run/check-execution/execution-finalization.mjs.map +1 -1
- package/dist/esm/project-run/check-execution/execution-settlement.mjs +13 -9
- package/dist/esm/project-run/check-execution/execution-settlement.mjs.map +1 -1
- package/dist/esm/project-run/check-execution/flag-controls.mjs +87 -0
- package/dist/esm/project-run/check-execution/flag-controls.mjs.map +1 -0
- package/dist/esm/project-run/check-execution/lifecycle.mjs +2 -0
- package/dist/esm/project-run/check-execution/lifecycle.mjs.map +1 -0
- package/dist/esm/project-run/check-execution/messages.mjs +5 -0
- package/dist/esm/project-run/check-execution/messages.mjs.map +1 -1
- package/dist/esm/project-run/check-execution/plan.mjs +9 -5
- package/dist/esm/project-run/check-execution/plan.mjs.map +1 -1
- package/dist/esm/project-run/check-execution/preflight.mjs +18 -32
- package/dist/esm/project-run/check-execution/preflight.mjs.map +1 -1
- package/dist/esm/project-run/check-execution/resolved-checks.mjs +100 -58
- package/dist/esm/project-run/check-execution/resolved-checks.mjs.map +1 -1
- package/dist/esm/project-run/check-execution/resolved-execution-result.mjs +2 -0
- package/dist/esm/project-run/check-execution/resolved-execution-result.mjs.map +1 -0
- package/dist/esm/project-run/{completion.mjs → completion/completion.mjs} +16 -38
- package/dist/esm/project-run/completion/completion.mjs.map +1 -0
- package/dist/esm/project-run/{machine-publication.mjs → completion/machine-publication.mjs} +1 -1
- package/dist/esm/project-run/completion/machine-publication.mjs.map +1 -0
- package/dist/esm/project-run/completion/result-resolver.mjs +36 -0
- package/dist/esm/project-run/completion/result-resolver.mjs.map +1 -0
- package/dist/esm/project-run/controls/contract.mjs.map +1 -1
- package/dist/esm/project-run/controls/outputs-override-validation.mjs +67 -47
- package/dist/esm/project-run/controls/outputs-override-validation.mjs.map +1 -1
- package/dist/esm/project-run/controls/validation-result.mjs.map +1 -1
- package/dist/esm/project-run/controls/validation.mjs +75 -11
- package/dist/esm/project-run/controls/validation.mjs.map +1 -1
- package/dist/esm/project-run/diagnostic-logging/logger.mjs +100 -161
- package/dist/esm/project-run/diagnostic-logging/logger.mjs.map +1 -1
- package/dist/esm/project-run/diagnostic-logging/observation-rendering.mjs +159 -0
- package/dist/esm/project-run/diagnostic-logging/observation-rendering.mjs.map +1 -0
- package/dist/esm/project-run/invocation/candidate.mjs +61 -0
- package/dist/esm/project-run/invocation/candidate.mjs.map +1 -0
- package/dist/esm/project-run/invocation/creation.mjs +79 -0
- package/dist/esm/project-run/invocation/creation.mjs.map +1 -0
- package/dist/esm/project-run/invocation/paths.mjs +77 -0
- package/dist/esm/project-run/invocation/paths.mjs.map +1 -0
- package/dist/esm/project-run/invocation/progress.mjs +30 -0
- package/dist/esm/project-run/invocation/progress.mjs.map +1 -0
- package/dist/esm/project-run/{invocation.mjs → invocation/run.mjs} +78 -92
- package/dist/esm/project-run/invocation/run.mjs.map +1 -0
- package/dist/esm/project-run/invocation/scheduler.mjs +57 -0
- package/dist/esm/project-run/invocation/scheduler.mjs.map +1 -0
- package/dist/esm/project-run/{output-configuration.mjs → outputs/configuration.mjs} +3 -2
- package/dist/esm/project-run/outputs/configuration.mjs.map +1 -0
- package/dist/esm/project-run/outputs/status.mjs +105 -0
- package/dist/esm/project-run/outputs/status.mjs.map +1 -0
- package/dist/esm/project-run/progress-rendering/presentation.mjs +112 -18
- package/dist/esm/project-run/progress-rendering/presentation.mjs.map +1 -1
- package/dist/esm/project-run/progress-rendering/renderer-formatting.mjs +108 -19
- package/dist/esm/project-run/progress-rendering/renderer-formatting.mjs.map +1 -1
- package/dist/esm/project-run/progress-rendering/renderer-lifecycle.mjs +30 -4
- package/dist/esm/project-run/progress-rendering/renderer-lifecycle.mjs.map +1 -1
- package/dist/esm/project-run/progress-rendering/renderer.mjs +5 -2
- package/dist/esm/project-run/progress-rendering/renderer.mjs.map +1 -1
- package/dist/esm/project-run/project-context.mjs +1 -1
- package/dist/esm/project-run/project-context.mjs.map +1 -1
- package/dist/esm/project-run/result.mjs +2 -0
- package/dist/esm/project-run/result.mjs.map +1 -1
- package/dist/esm/project-run/run.mjs +1 -1
- package/dist/esm/project-run/run.mjs.map +1 -1
- package/dist/esm/project-run/task-scheduler/admission-core/compiled-graph.mjs +166 -0
- package/dist/esm/project-run/task-scheduler/admission-core/compiled-graph.mjs.map +1 -0
- package/dist/esm/project-run/task-scheduler/admission-core/core.mjs +163 -0
- package/dist/esm/project-run/task-scheduler/admission-core/core.mjs.map +1 -0
- package/dist/esm/project-run/task-scheduler/admission-core/input.mjs +119 -0
- package/dist/esm/project-run/task-scheduler/admission-core/input.mjs.map +1 -0
- package/dist/esm/project-run/task-scheduler/admission-core/projection.mjs +124 -0
- package/dist/esm/project-run/task-scheduler/admission-core/projection.mjs.map +1 -0
- package/dist/esm/project-run/task-scheduler/admission-core/selection-index.mjs +99 -0
- package/dist/esm/project-run/task-scheduler/admission-core/selection-index.mjs.map +1 -0
- package/dist/esm/project-run/task-scheduler/admission-core/selection-query.mjs +198 -0
- package/dist/esm/project-run/task-scheduler/admission-core/selection-query.mjs.map +1 -0
- package/dist/esm/project-run/task-scheduler/admission-core/selection-seed.mjs +151 -0
- package/dist/esm/project-run/task-scheduler/admission-core/selection-seed.mjs.map +1 -0
- package/dist/esm/project-run/task-scheduler/admission-core/selection-transition.mjs +121 -0
- package/dist/esm/project-run/task-scheduler/admission-core/selection-transition.mjs.map +1 -0
- package/dist/esm/project-run/task-scheduler/admission-core/selection.mjs +65 -0
- package/dist/esm/project-run/task-scheduler/admission-core/selection.mjs.map +1 -0
- package/dist/esm/project-run/task-scheduler/admission-scope-layers.mjs +25 -0
- package/dist/esm/project-run/task-scheduler/admission-scope-layers.mjs.map +1 -0
- package/dist/esm/project-run/task-scheduler/admission-selection-policy.mjs +55 -0
- package/dist/esm/project-run/task-scheduler/admission-selection-policy.mjs.map +1 -0
- package/dist/esm/project-run/task-scheduler/critical-path-ranking.mjs +46 -0
- package/dist/esm/project-run/task-scheduler/critical-path-ranking.mjs.map +1 -0
- package/dist/esm/project-run/task-scheduler/custom-admission-policy.mjs +110 -0
- package/dist/esm/project-run/task-scheduler/custom-admission-policy.mjs.map +1 -0
- package/dist/esm/project-run/task-scheduler/execution-state.mjs +34 -5
- package/dist/esm/project-run/task-scheduler/execution-state.mjs.map +1 -1
- package/dist/esm/project-run/task-scheduler/forced-block-effect-replay.mjs +46 -0
- package/dist/esm/project-run/task-scheduler/forced-block-effect-replay.mjs.map +1 -0
- package/dist/esm/project-run/task-scheduler/graph-validation.mjs +54 -26
- package/dist/esm/project-run/task-scheduler/graph-validation.mjs.map +1 -1
- package/dist/esm/project-run/task-scheduler/graph.mjs +79 -3
- package/dist/esm/project-run/task-scheduler/graph.mjs.map +1 -1
- package/dist/esm/project-run/task-scheduler/measurement/diagnostics.mjs +207 -0
- package/dist/esm/project-run/task-scheduler/measurement/diagnostics.mjs.map +1 -0
- package/dist/esm/project-run/task-scheduler/measurement/integrals.mjs +116 -0
- package/dist/esm/project-run/task-scheduler/measurement/integrals.mjs.map +1 -0
- package/dist/esm/project-run/task-scheduler/measurement/policy.mjs +67 -0
- package/dist/esm/project-run/task-scheduler/measurement/policy.mjs.map +1 -0
- package/dist/esm/project-run/task-scheduler/measurement/summary.mjs +123 -0
- package/dist/esm/project-run/task-scheduler/measurement/summary.mjs.map +1 -0
- package/dist/esm/project-run/task-scheduler/measurement/timing.mjs +158 -0
- package/dist/esm/project-run/task-scheduler/measurement/timing.mjs.map +1 -0
- package/dist/esm/project-run/task-scheduler/scheduler-admission-decision.mjs +90 -62
- package/dist/esm/project-run/task-scheduler/scheduler-admission-decision.mjs.map +1 -1
- package/dist/esm/project-run/task-scheduler/scheduler-blocker-summary.mjs +20 -6
- package/dist/esm/project-run/task-scheduler/scheduler-blocker-summary.mjs.map +1 -1
- package/dist/esm/project-run/task-scheduler/scheduler-decision-inspection.mjs +5 -105
- package/dist/esm/project-run/task-scheduler/scheduler-decision-inspection.mjs.map +1 -1
- package/dist/esm/project-run/task-scheduler/scheduler-decision-model.mjs +0 -9
- package/dist/esm/project-run/task-scheduler/scheduler-decision-model.mjs.map +1 -1
- package/dist/esm/project-run/task-scheduler/scheduler-decision.mjs +48 -28
- package/dist/esm/project-run/task-scheduler/scheduler-decision.mjs.map +1 -1
- package/dist/esm/project-run/task-scheduler/scheduler-observation.mjs +89 -0
- package/dist/esm/project-run/task-scheduler/scheduler-observation.mjs.map +1 -0
- package/dist/esm/project-run/task-scheduler/scheduler-task-lifecycle.mjs +94 -0
- package/dist/esm/project-run/task-scheduler/scheduler-task-lifecycle.mjs.map +1 -0
- package/dist/esm/project-run/task-scheduler/scheduler-terminal-measurement.mjs +66 -0
- package/dist/esm/project-run/task-scheduler/scheduler-terminal-measurement.mjs.map +1 -0
- package/dist/esm/project-run/task-scheduler/scheduler.mjs +171 -114
- package/dist/esm/project-run/task-scheduler/scheduler.mjs.map +1 -1
- package/docs/api-mechanics.md +64 -137
- package/docs/changelog.md +157 -0
- package/docs/checks/duplicate-detection.md +111 -59
- package/docs/checks/file-metrics.md +46 -43
- package/docs/checks/function-metrics.md +100 -163
- package/docs/checks/json-schema-validation.md +43 -36
- package/docs/checks/json-validation.md +38 -25
- package/docs/checks/maintenance-reminders.md +41 -29
- package/docs/checks/markdown-link-validation.md +82 -54
- package/docs/checks/secret-detection.md +129 -0
- package/docs/examples/artifacts/mixed-outcomes/definition.ts +5 -5
- package/docs/guides/cache-results.md +63 -0
- package/docs/guides/callbacks.md +34 -0
- package/docs/guides/check-dependencies.md +121 -0
- package/docs/guides/collecting-project-files.md +59 -0
- package/docs/guides/extending-check-lifecycle.md +112 -0
- package/docs/guides/finding-waivers.md +45 -0
- package/docs/guides/learned-scheduling.md +83 -0
- package/docs/guides/presenting-findings.md +54 -0
- package/docs/guides/run-outputs.md +145 -0
- package/docs/guides/scheduling.md +208 -0
- package/docs/guides/simulating-admission.md +55 -0
- package/docs/output.md +11 -20
- package/licenses/Lizard-1.24.0-MIT.txt +30 -0
- package/{third-party-licenses/momoa-3.3.12-LICENSE → licenses/Lizard-1.24.0-lizard.py-Apache-2.0.txt} +1 -0
- package/licenses/Pygments-2.18.0-BSD-2-Clause.txt +25 -0
- package/licenses/analyzer-translations-NOTICE.md +24 -0
- package/licenses/lizard-1.24.0-provenance.json +957 -0
- package/package.json +18 -6
- package/src/cache/cache-json-by-key.ts +304 -0
- package/src/check/check.ts +67 -17
- package/src/check/finding-presentation.ts +67 -0
- package/src/check/inherited-collection.ts +1 -1
- package/src/check-settlement/fact-validation.ts +29 -39
- package/src/check-settlement/outcome-normalization.ts +17 -35
- package/src/check-settlement/reason-shape.ts +20 -0
- package/src/check-settlement/record-store.ts +18 -15
- package/src/check-settlement/session.ts +12 -3
- package/src/data-boundary/closed-values.ts +29 -0
- package/src/data-boundary/value-shapes.ts +12 -0
- package/src/index.ts +70 -2
- package/src/learned-critical-path/duration-model/bounded-history.ts +108 -0
- package/src/learned-critical-path/duration-model/prediction.ts +181 -0
- package/src/learned-critical-path/duration-model/preparation.ts +77 -0
- package/src/learned-critical-path/duration-model/recording.ts +208 -0
- package/src/learned-critical-path/duration-model/storage.ts +252 -0
- package/src/learned-critical-path/selection-layers.ts +72 -0
- package/src/learned-critical-path/static-decision.ts +105 -0
- package/src/learned-critical-path/strategy.ts +299 -0
- package/src/machine-output/v4/atomic-publication.ts +1 -16
- package/src/package-checks/code-quality-findings/finding-waiver-authoring.ts +46 -0
- package/src/package-checks/code-quality-findings/finding-waiver-evidence.ts +95 -0
- package/src/package-checks/code-quality-findings/policy.ts +23 -0
- package/src/package-checks/duplicate-detection/area-policy.ts +24 -13
- package/src/package-checks/duplicate-detection/cache/identity.ts +1 -1
- package/src/package-checks/duplicate-detection/default-check.ts +1 -1
- package/src/package-checks/duplicate-detection/execution.ts +82 -22
- package/src/package-checks/duplicate-detection/finding-messages.ts +75 -0
- package/src/package-checks/duplicate-detection/finding-waiver-identity.ts +68 -0
- package/src/package-checks/duplicate-detection/jscpd/availability.ts +1 -1
- package/src/package-checks/duplicate-detection/jscpd/command-resolution.ts +1 -1
- package/src/package-checks/duplicate-detection/jscpd/json-report.ts +24 -5
- package/src/package-checks/duplicate-detection/jscpd/scanner.ts +6 -7
- package/src/package-checks/duplicate-detection/options-resolution.ts +32 -57
- package/src/package-checks/duplicate-detection/options-validation.ts +23 -31
- package/src/package-checks/duplicate-detection/options.ts +21 -1
- package/src/package-checks/duplicate-detection/records.ts +65 -12
- package/src/package-checks/file-metrics/execution.ts +16 -17
- package/src/package-checks/file-metrics/finding-messages.ts +29 -0
- package/src/package-checks/file-metrics/options-resolution.ts +19 -52
- package/src/package-checks/file-metrics/options-validation.ts +23 -32
- package/src/package-checks/file-metrics/records.ts +11 -23
- package/src/package-checks/file-metrics/scc/availability.ts +1 -1
- package/src/package-checks/file-metrics/scc/parser.ts +4 -4
- package/src/package-checks/file-metrics/scc/scanner.ts +2 -2
- package/src/package-checks/function-metrics/analysis.ts +76 -21
- package/src/package-checks/function-metrics/analyzer/analysis-context.ts +749 -0
- package/src/package-checks/function-metrics/analyzer/analysis-model.ts +421 -0
- package/src/package-checks/function-metrics/analyzer/contracts.ts +54 -0
- package/src/package-checks/function-metrics/analyzer/extension-output.ts +261 -0
- package/src/package-checks/function-metrics/analyzer/extensions/extension-base.ts +33 -0
- package/src/package-checks/function-metrics/analyzer/extensions/lizardcomplextags.ts +27 -0
- package/src/package-checks/function-metrics/analyzer/extensions/lizardnd.ts +144 -0
- package/src/package-checks/function-metrics/analyzer/extensions/protocol.ts +345 -0
- package/src/package-checks/function-metrics/analyzer/extensions/registry.ts +157 -0
- package/src/package-checks/function-metrics/analyzer/pipeline.ts +311 -0
- package/src/package-checks/function-metrics/analyzer/port-facade.ts +142 -0
- package/src/package-checks/function-metrics/analyzer/reader-registry.ts +84 -0
- package/src/package-checks/function-metrics/analyzer/readers/csharp.ts +110 -0
- package/src/package-checks/function-metrics/analyzer/readers/erlang.ts +501 -0
- package/src/package-checks/function-metrics/analyzer/readers/fortran.ts +294 -0
- package/src/package-checks/function-metrics/analyzer/readers/gdscript.ts +42 -0
- package/src/package-checks/function-metrics/analyzer/readers/go.ts +53 -0
- package/src/package-checks/function-metrics/analyzer/readers/java-body-states.ts +141 -0
- package/src/package-checks/function-metrics/analyzer/readers/java.ts +270 -0
- package/src/package-checks/function-metrics/analyzer/readers/javascript.ts +19 -0
- package/src/package-checks/function-metrics/analyzer/readers/kotlin.ts +120 -0
- package/src/package-checks/function-metrics/analyzer/readers/lua.ts +68 -0
- package/src/package-checks/function-metrics/analyzer/readers/objc.ts +107 -0
- package/src/package-checks/function-metrics/analyzer/readers/perl.ts +340 -0
- package/src/package-checks/function-metrics/analyzer/readers/php-states.ts +246 -0
- package/src/package-checks/function-metrics/analyzer/readers/php.ts +63 -0
- package/src/package-checks/function-metrics/analyzer/readers/plsql.ts +306 -0
- package/src/package-checks/function-metrics/analyzer/readers/python.ts +431 -0
- package/src/package-checks/function-metrics/analyzer/readers/r.ts +234 -0
- package/src/package-checks/function-metrics/analyzer/readers/ruby.ts +88 -0
- package/src/package-checks/function-metrics/analyzer/readers/rust.ts +47 -0
- package/src/package-checks/function-metrics/analyzer/readers/scala.ts +60 -0
- package/src/package-checks/function-metrics/analyzer/readers/solidity.ts +32 -0
- package/src/package-checks/function-metrics/analyzer/readers/st.ts +161 -0
- package/src/package-checks/function-metrics/analyzer/readers/swift.ts +116 -0
- package/src/package-checks/function-metrics/analyzer/readers/tsx.ts +165 -0
- package/src/package-checks/function-metrics/analyzer/readers/ttcn.ts +90 -0
- package/src/package-checks/function-metrics/analyzer/readers/typescript.ts +593 -0
- package/src/package-checks/function-metrics/analyzer/readers/vue.ts +43 -0
- package/src/package-checks/function-metrics/analyzer/readers/zig.ts +35 -0
- package/src/package-checks/function-metrics/analyzer/shared/clike.ts +541 -0
- package/src/package-checks/function-metrics/analyzer/shared/code-reader.ts +682 -0
- package/src/package-checks/function-metrics/analyzer/shared/golike.ts +143 -0
- package/src/package-checks/function-metrics/analyzer/shared/js-style-regex.ts +75 -0
- package/src/package-checks/function-metrics/analyzer/shared/rubylike.ts +161 -0
- package/src/package-checks/function-metrics/analyzer/shared/script-language.ts +50 -0
- package/src/package-checks/function-metrics/analyzer-adapter.ts +84 -0
- package/src/package-checks/function-metrics/analyzer-worker-contract.ts +10 -0
- package/src/package-checks/function-metrics/analyzer-worker-port.ts +150 -0
- package/src/package-checks/function-metrics/analyzer-worker.ts +31 -0
- package/src/package-checks/function-metrics/constructor.ts +2 -2
- package/src/package-checks/function-metrics/execution.ts +94 -39
- package/src/package-checks/function-metrics/finding-messages.ts +95 -0
- package/src/package-checks/function-metrics/finding-waiver-identity.ts +36 -0
- package/src/package-checks/function-metrics/measurement-model.ts +15 -1
- package/src/package-checks/function-metrics/measurement.ts +221 -36
- package/src/package-checks/function-metrics/options-resolution.ts +39 -75
- package/src/package-checks/function-metrics/options-validation.ts +30 -39
- package/src/package-checks/function-metrics/options.ts +27 -11
- package/src/package-checks/function-metrics/records.ts +73 -7
- package/src/package-checks/function-metrics/target-files.ts +10 -70
- package/src/package-checks/{file-metrics/scc → host-environment}/csv.ts +1 -2
- package/src/package-checks/host-environment/git.ts +2 -2
- package/src/package-checks/host-environment/process.ts +10 -0
- package/src/package-checks/json-schema-validation/final-data.ts +8 -0
- package/src/package-checks/json-schema-validation/options-validation.ts +16 -23
- package/src/package-checks/json-schema-validation/options.ts +23 -0
- package/src/package-checks/json-validation/final-data.ts +5 -0
- package/src/package-checks/json-validation/options-validation.ts +4 -18
- package/src/package-checks/maintenance-reminders/final-data.ts +18 -0
- package/src/package-checks/markdown-link-validation/default-check.ts +9 -3
- package/src/package-checks/markdown-link-validation/execution.ts +51 -57
- package/src/package-checks/markdown-link-validation/filesystem-probes.ts +108 -51
- package/src/package-checks/markdown-link-validation/final-data.ts +5 -0
- package/src/package-checks/markdown-link-validation/finding-messages.ts +48 -0
- package/src/package-checks/markdown-link-validation/local-resolution.ts +17 -9
- package/src/package-checks/markdown-link-validation/local-resolver.ts +5 -2
- package/src/package-checks/markdown-link-validation/options-resolution.ts +31 -3
- package/src/package-checks/markdown-link-validation/options-validation.ts +27 -19
- package/src/package-checks/markdown-link-validation/options.ts +15 -0
- package/src/package-checks/markdown-link-validation/parse-facts-cache-payload.ts +246 -0
- package/src/package-checks/markdown-link-validation/parse-facts-cache.ts +154 -0
- package/src/package-checks/markdown-link-validation/resolver-engine.ts +75 -65
- package/src/package-checks/markdown-link-validation/source-reader.ts +86 -0
- package/src/package-checks/markdown-link-validation/unavailable-reasons.ts +42 -0
- package/src/package-checks/project-files/collection.ts +1 -1
- package/src/package-checks/project-files/configuration.ts +3 -14
- package/src/package-checks/project-files/gitlink-revision.ts +1 -1
- package/src/package-checks/project-files/gitlink-worktree.ts +1 -1
- package/src/package-checks/project-files/public-collection.ts +92 -0
- package/src/package-checks/project-files/revision-worktree-files.ts +1 -1
- package/src/package-checks/secret-detection/classification.ts +30 -0
- package/src/package-checks/secret-detection/default-check.ts +50 -0
- package/src/package-checks/secret-detection/execution.ts +247 -0
- package/src/package-checks/secret-detection/final-data.ts +57 -0
- package/src/package-checks/secret-detection/finding-waiver-identity.ts +37 -0
- package/src/package-checks/secret-detection/input-preparation.ts +233 -0
- package/src/package-checks/secret-detection/options-resolution.ts +65 -0
- package/src/package-checks/secret-detection/options-validation.ts +27 -0
- package/src/package-checks/secret-detection/options.ts +36 -0
- package/src/package-checks/secret-detection/records.ts +77 -0
- package/src/package-checks/secret-detection/secretlint/adapter.ts +123 -0
- package/src/project-definition/check-tree/authoring.ts +29 -230
- package/src/project-definition/check-tree/check-fields-authoring.ts +227 -0
- package/src/project-definition/check-tree/collection-authoring.ts +13 -0
- package/src/project-definition/check-tree/materialization.ts +9 -1
- package/src/project-definition/check-tree/resolution.ts +80 -22
- package/src/project-definition/check-tree/scheduling-authoring.ts +114 -0
- package/src/project-definition/declarative-snapshot.ts +87 -0
- package/src/project-definition/output-defaults.ts +32 -1
- package/src/project-definition/output-validation.ts +15 -15
- package/src/project-definition/progress-rendering-output.ts +121 -0
- package/src/project-definition/project-definition-validation.ts +117 -18
- package/src/project-definition/project-definition.ts +198 -61
- package/src/project-definition/resource-unit-mapping.ts +25 -0
- package/src/project-definition/scheduler-policy.ts +553 -0
- package/src/project-run/admission-strategy-provider/custom-strategy-preparation.ts +80 -0
- package/src/project-run/admission-strategy-provider/prepared-admission-strategy.ts +27 -0
- package/src/project-run/admission-strategy-provider/provider.ts +45 -0
- package/src/project-run/aggregation.ts +10 -5
- package/src/project-run/check-execution/callback.ts +50 -8
- package/src/project-run/check-execution/console-capture.ts +262 -0
- package/src/project-run/check-execution/dependencies.ts +43 -6
- package/src/project-run/check-execution/execution-finalization.ts +99 -25
- package/src/project-run/check-execution/execution-settlement.ts +19 -11
- package/src/project-run/check-execution/flag-controls.ts +132 -0
- package/src/project-run/check-execution/lifecycle.ts +21 -0
- package/src/project-run/check-execution/messages.ts +8 -0
- package/src/project-run/check-execution/plan.ts +12 -8
- package/src/project-run/check-execution/preflight.ts +23 -43
- package/src/project-run/check-execution/resolved-checks.ts +165 -126
- package/src/project-run/check-execution/resolved-execution-result.ts +22 -0
- package/src/project-run/{completion.ts → completion/completion.ts} +17 -57
- package/src/project-run/{machine-publication.ts → completion/machine-publication.ts} +4 -4
- package/src/project-run/completion/result-resolver.ts +60 -0
- package/src/project-run/controls/contract.ts +25 -2
- package/src/project-run/controls/outputs-override-validation.ts +83 -60
- package/src/project-run/controls/validation-result.ts +17 -6
- package/src/project-run/controls/validation.ts +107 -12
- package/src/project-run/diagnostic-logging/logger.ts +132 -207
- package/src/project-run/diagnostic-logging/observation-rendering.ts +203 -0
- package/src/project-run/invocation/candidate.ts +86 -0
- package/src/project-run/invocation/creation.ts +116 -0
- package/src/project-run/invocation/paths.ts +154 -0
- package/src/project-run/invocation/progress.ts +38 -0
- package/src/project-run/{invocation.ts → invocation/run.ts} +125 -120
- package/src/project-run/invocation/scheduler.ts +75 -0
- package/src/project-run/{output-configuration.ts → outputs/configuration.ts} +6 -5
- package/src/project-run/outputs/status.ts +161 -0
- package/src/project-run/progress-rendering/presentation.ts +118 -26
- package/src/project-run/progress-rendering/renderer-formatting.ts +166 -19
- package/src/project-run/progress-rendering/renderer-lifecycle.ts +38 -3
- package/src/project-run/progress-rendering/renderer.ts +13 -2
- package/src/project-run/project-context.ts +3 -2
- package/src/project-run/result.ts +49 -3
- package/src/project-run/run.ts +7 -6
- package/src/project-run/task-scheduler/admission-core/compiled-graph.ts +316 -0
- package/src/project-run/task-scheduler/admission-core/core.ts +278 -0
- package/src/project-run/task-scheduler/admission-core/input.ts +138 -0
- package/src/project-run/task-scheduler/admission-core/projection.ts +164 -0
- package/src/project-run/task-scheduler/admission-core/selection-index.ts +165 -0
- package/src/project-run/task-scheduler/admission-core/selection-query.ts +295 -0
- package/src/project-run/task-scheduler/admission-core/selection-seed.ts +252 -0
- package/src/project-run/task-scheduler/admission-core/selection-transition.ts +236 -0
- package/src/project-run/task-scheduler/admission-core/selection.ts +140 -0
- package/src/project-run/task-scheduler/admission-core/trace.ts +177 -0
- package/src/project-run/task-scheduler/admission-scope-layers.ts +44 -0
- package/src/project-run/task-scheduler/admission-selection-policy.ts +116 -0
- package/src/project-run/task-scheduler/critical-path-ranking.ts +76 -0
- package/src/project-run/task-scheduler/custom-admission-policy.ts +128 -0
- package/src/project-run/task-scheduler/execution-state.ts +97 -6
- package/src/project-run/task-scheduler/forced-block-effect-replay.ts +68 -0
- package/src/project-run/task-scheduler/graph-validation.ts +77 -31
- package/src/project-run/task-scheduler/graph.ts +111 -3
- package/src/project-run/task-scheduler/measurement/diagnostics.ts +261 -0
- package/src/project-run/task-scheduler/measurement/integrals.ts +177 -0
- package/src/project-run/task-scheduler/measurement/policy.ts +105 -0
- package/src/project-run/task-scheduler/measurement/summary.ts +175 -0
- package/src/project-run/task-scheduler/measurement/timing.ts +190 -0
- package/src/project-run/task-scheduler/scheduler-admission-decision.ts +143 -134
- package/src/project-run/task-scheduler/scheduler-blocker-summary.ts +34 -9
- package/src/project-run/task-scheduler/scheduler-decision-inspection.ts +28 -170
- package/src/project-run/task-scheduler/scheduler-decision-model.ts +36 -40
- package/src/project-run/task-scheduler/scheduler-decision.ts +68 -36
- package/src/project-run/task-scheduler/scheduler-observation.ts +124 -0
- package/src/project-run/task-scheduler/scheduler-task-lifecycle.ts +150 -0
- package/src/project-run/task-scheduler/scheduler-terminal-measurement.ts +95 -0
- package/src/project-run/task-scheduler/scheduler.ts +216 -171
- package/types/cache/cache-json-by-key.d.ts +53 -0
- package/types/check/check.d.ts +62 -17
- package/types/check/finding-presentation.d.ts +25 -0
- package/types/check/inherited-collection.d.ts +1 -1
- package/types/check-settlement/reason-shape.d.ts +5 -0
- package/types/check-settlement/record-store.d.ts +2 -2
- package/types/check-settlement/session.d.ts +3 -1
- package/types/data-boundary/closed-values.d.ts +8 -0
- package/types/data-boundary/value-shapes.d.ts +3 -0
- package/types/index.d.ts +22 -7
- package/types/learned-critical-path/duration-model/bounded-history.d.ts +34 -0
- package/types/learned-critical-path/duration-model/prediction.d.ts +32 -0
- package/types/learned-critical-path/duration-model/preparation.d.ts +28 -0
- package/types/learned-critical-path/duration-model/recording.d.ts +28 -0
- package/types/learned-critical-path/duration-model/storage.d.ts +12 -0
- package/types/learned-critical-path/selection-layers.d.ts +14 -0
- package/types/learned-critical-path/static-decision.d.ts +3 -0
- package/types/learned-critical-path/strategy.d.ts +35 -0
- package/types/package-checks/code-quality-findings/finding-waiver-authoring.d.ts +7 -0
- package/types/package-checks/code-quality-findings/finding-waiver-evidence.d.ts +34 -0
- package/types/package-checks/code-quality-findings/policy.d.ts +4 -0
- package/types/package-checks/duplicate-detection/area-policy.d.ts +1 -1
- package/types/package-checks/duplicate-detection/finding-messages.d.ts +7 -0
- package/types/package-checks/duplicate-detection/finding-waiver-identity.d.ts +3 -0
- package/types/package-checks/duplicate-detection/jscpd/command-resolution.d.ts +1 -1
- package/types/package-checks/duplicate-detection/options.d.ts +18 -1
- package/types/package-checks/duplicate-detection/records.d.ts +20 -3
- package/types/package-checks/file-metrics/finding-messages.d.ts +4 -0
- package/types/package-checks/file-metrics/records.d.ts +5 -10
- package/types/package-checks/file-metrics/scc/parser.d.ts +4 -4
- package/types/package-checks/function-metrics/analysis.d.ts +1 -1
- package/types/package-checks/function-metrics/analyzer/analysis-context.d.ts +174 -0
- package/types/package-checks/function-metrics/analyzer/analysis-model.d.ts +135 -0
- package/types/package-checks/function-metrics/analyzer/contracts.d.ts +48 -0
- package/types/package-checks/function-metrics/analyzer/extensions/lizardcomplextags.d.ts +13 -0
- package/types/package-checks/function-metrics/analyzer/extensions/lizardnd.d.ts +28 -0
- package/types/package-checks/function-metrics/analyzer/extensions/protocol.d.ts +99 -0
- package/types/package-checks/function-metrics/analyzer/extensions/registry.d.ts +34 -0
- package/types/package-checks/function-metrics/analyzer/pipeline.d.ts +67 -0
- package/types/package-checks/function-metrics/analyzer/port-facade.d.ts +38 -0
- package/types/package-checks/function-metrics/analyzer/reader-registry.d.ts +18 -0
- package/types/package-checks/function-metrics/analyzer/readers/csharp.d.ts +22 -0
- package/types/package-checks/function-metrics/analyzer/readers/erlang.d.ts +22 -0
- package/types/package-checks/function-metrics/analyzer/readers/fortran.d.ts +29 -0
- package/types/package-checks/function-metrics/analyzer/readers/gdscript.d.ts +18 -0
- package/types/package-checks/function-metrics/analyzer/readers/go.d.ts +18 -0
- package/types/package-checks/function-metrics/analyzer/readers/java-body-states.d.ts +18 -0
- package/types/package-checks/function-metrics/analyzer/readers/java.d.ts +44 -0
- package/types/package-checks/function-metrics/analyzer/readers/javascript.d.ts +14 -0
- package/types/package-checks/function-metrics/analyzer/readers/kotlin.d.ts +23 -0
- package/types/package-checks/function-metrics/analyzer/readers/lua.d.ts +16 -0
- package/types/package-checks/function-metrics/analyzer/readers/objc.d.ts +18 -0
- package/types/package-checks/function-metrics/analyzer/readers/perl.d.ts +28 -0
- package/types/package-checks/function-metrics/analyzer/readers/php-states.d.ts +41 -0
- package/types/package-checks/function-metrics/analyzer/readers/php.d.ts +22 -0
- package/types/package-checks/function-metrics/analyzer/readers/plsql.d.ts +24 -0
- package/types/package-checks/function-metrics/analyzer/readers/python.d.ts +50 -0
- package/types/package-checks/function-metrics/analyzer/readers/r.d.ts +22 -0
- package/types/package-checks/function-metrics/analyzer/readers/ruby.d.ts +16 -0
- package/types/package-checks/function-metrics/analyzer/readers/rust.d.ts +20 -0
- package/types/package-checks/function-metrics/analyzer/readers/scala.d.ts +20 -0
- package/types/package-checks/function-metrics/analyzer/readers/solidity.d.ts +19 -0
- package/types/package-checks/function-metrics/analyzer/readers/st.d.ts +37 -0
- package/types/package-checks/function-metrics/analyzer/readers/swift.d.ts +30 -0
- package/types/package-checks/function-metrics/analyzer/readers/tsx.d.ts +15 -0
- package/types/package-checks/function-metrics/analyzer/readers/ttcn.d.ts +22 -0
- package/types/package-checks/function-metrics/analyzer/readers/typescript.d.ts +35 -0
- package/types/package-checks/function-metrics/analyzer/readers/vue.d.ts +18 -0
- package/types/package-checks/function-metrics/analyzer/readers/zig.d.ts +19 -0
- package/types/package-checks/function-metrics/analyzer/shared/clike.d.ts +101 -0
- package/types/package-checks/function-metrics/analyzer/shared/code-reader.d.ts +176 -0
- package/types/package-checks/function-metrics/analyzer/shared/golike.d.ts +39 -0
- package/types/package-checks/function-metrics/analyzer/shared/js-style-regex.d.ts +16 -0
- package/types/package-checks/function-metrics/analyzer/shared/rubylike.d.ts +40 -0
- package/types/package-checks/function-metrics/analyzer/shared/script-language.d.ts +17 -0
- package/types/package-checks/function-metrics/analyzer-adapter.d.ts +26 -0
- package/types/package-checks/function-metrics/analyzer-worker-contract.d.ts +5 -0
- package/types/package-checks/function-metrics/analyzer-worker-port.d.ts +24 -0
- package/types/package-checks/function-metrics/analyzer-worker.d.ts +1 -0
- package/types/package-checks/function-metrics/constructor.d.ts +1 -1
- package/types/package-checks/function-metrics/execution.d.ts +5 -2
- package/types/package-checks/function-metrics/finding-messages.d.ts +9 -0
- package/types/package-checks/function-metrics/finding-waiver-identity.d.ts +2 -0
- package/types/package-checks/function-metrics/measurement-model.d.ts +13 -1
- package/types/package-checks/function-metrics/measurement.d.ts +22 -7
- package/types/package-checks/function-metrics/options.d.ts +23 -10
- package/types/package-checks/function-metrics/records.d.ts +24 -5
- package/types/package-checks/function-metrics/target-files.d.ts +4 -3
- package/types/package-checks/host-environment/csv.d.ts +2 -0
- package/types/package-checks/host-environment/git.d.ts +1 -1
- package/types/package-checks/host-environment/process.d.ts +5 -0
- package/types/package-checks/json-schema-validation/final-data.d.ts +8 -0
- package/types/package-checks/json-schema-validation/options.d.ts +31 -3
- package/types/package-checks/json-validation/final-data.d.ts +5 -0
- package/types/package-checks/maintenance-reminders/final-data.d.ts +18 -0
- package/types/package-checks/markdown-link-validation/default-check.d.ts +9 -3
- package/types/package-checks/markdown-link-validation/execution.d.ts +1 -3
- package/types/package-checks/markdown-link-validation/final-data.d.ts +5 -0
- package/types/package-checks/markdown-link-validation/finding-messages.d.ts +4 -0
- package/types/package-checks/markdown-link-validation/local-resolution.d.ts +12 -6
- package/types/package-checks/markdown-link-validation/local-resolver.d.ts +2 -1
- package/types/package-checks/markdown-link-validation/options.d.ts +15 -0
- package/types/package-checks/markdown-link-validation/parse-facts-cache-payload.d.ts +24 -0
- package/types/package-checks/markdown-link-validation/parse-facts-cache.d.ts +13 -0
- package/types/package-checks/markdown-link-validation/resolver-engine.d.ts +6 -4
- package/types/package-checks/markdown-link-validation/source-reader.d.ts +11 -0
- package/types/package-checks/markdown-link-validation/unavailable-reasons.d.ts +4 -0
- package/types/package-checks/project-files/public-collection.d.ts +16 -0
- package/types/package-checks/secret-detection/classification.d.ts +12 -0
- package/types/package-checks/secret-detection/default-check.d.ts +11 -0
- package/types/package-checks/secret-detection/execution.d.ts +14 -0
- package/types/package-checks/secret-detection/final-data.d.ts +15 -0
- package/types/package-checks/secret-detection/finding-waiver-identity.d.ts +5 -0
- package/types/package-checks/secret-detection/input-preparation.d.ts +24 -0
- package/types/package-checks/secret-detection/options-resolution.d.ts +6 -0
- package/types/package-checks/secret-detection/options-validation.d.ts +3 -0
- package/types/package-checks/secret-detection/options.d.ts +32 -0
- package/types/package-checks/secret-detection/records.d.ts +35 -0
- package/types/package-checks/secret-detection/secretlint/adapter.d.ts +28 -0
- package/types/project-definition/check-tree/authoring.d.ts +11 -14
- package/types/project-definition/check-tree/check-fields-authoring.d.ts +25 -0
- package/types/project-definition/check-tree/collection-authoring.d.ts +2 -0
- package/types/project-definition/check-tree/resolution.d.ts +8 -3
- package/types/project-definition/check-tree/scheduling-authoring.d.ts +19 -0
- package/types/project-definition/declarative-snapshot.d.ts +7 -0
- package/types/project-definition/output-defaults.d.ts +7 -0
- package/types/project-definition/output-validation.d.ts +2 -1
- package/types/project-definition/progress-rendering-output.d.ts +41 -0
- package/types/project-definition/project-definition.d.ts +61 -16
- package/types/project-definition/resource-unit-mapping.d.ts +4 -0
- package/types/project-definition/scheduler-policy.d.ts +497 -0
- package/types/project-run/admission-strategy-provider/custom-strategy-preparation.d.ts +9 -0
- package/types/project-run/admission-strategy-provider/prepared-admission-strategy.d.ts +23 -0
- package/types/project-run/admission-strategy-provider/provider.d.ts +13 -0
- package/types/project-run/aggregation.d.ts +1 -1
- package/types/project-run/check-execution/callback.d.ts +5 -1
- package/types/project-run/check-execution/console-capture.d.ts +18 -0
- package/types/project-run/check-execution/dependencies.d.ts +1 -1
- package/types/project-run/check-execution/execution-finalization.d.ts +17 -7
- package/types/project-run/check-execution/execution-settlement.d.ts +5 -2
- package/types/project-run/check-execution/flag-controls.d.ts +27 -0
- package/types/project-run/check-execution/lifecycle.d.ts +20 -0
- package/types/project-run/check-execution/messages.d.ts +2 -0
- package/types/project-run/check-execution/plan.d.ts +2 -3
- package/types/project-run/check-execution/preflight.d.ts +6 -5
- package/types/project-run/check-execution/resolved-checks.d.ts +32 -38
- package/types/project-run/check-execution/resolved-execution-result.d.ts +21 -0
- package/types/project-run/{completion.d.ts → completion/completion.d.ts} +4 -4
- package/types/project-run/{machine-publication.d.ts → completion/machine-publication.d.ts} +3 -3
- package/types/project-run/completion/result-resolver.d.ts +4 -0
- package/types/project-run/controls/contract.d.ts +25 -2
- package/types/project-run/controls/outputs-override-validation.d.ts +2 -1
- package/types/project-run/controls/validation-result.d.ts +12 -4
- package/types/project-run/diagnostic-logging/logger.d.ts +34 -4
- package/types/project-run/diagnostic-logging/observation-rendering.d.ts +7 -0
- package/types/project-run/invocation/candidate.d.ts +12 -0
- package/types/project-run/{invocation-creation.d.ts → invocation/creation.d.ts} +3 -3
- package/types/project-run/invocation/paths.d.ts +40 -0
- package/types/project-run/invocation/progress.d.ts +11 -0
- package/types/project-run/invocation/run.d.ts +43 -0
- package/types/project-run/invocation/scheduler.d.ts +16 -0
- package/types/project-run/outputs/configuration.d.ts +3 -0
- package/types/project-run/outputs/status.d.ts +48 -0
- package/types/project-run/progress-rendering/presentation.d.ts +9 -5
- package/types/project-run/progress-rendering/renderer-formatting.d.ts +8 -0
- package/types/project-run/progress-rendering/renderer-lifecycle.d.ts +6 -1
- package/types/project-run/progress-rendering/renderer.d.ts +7 -1
- package/types/project-run/project-context.d.ts +2 -1
- package/types/project-run/result.d.ts +37 -3
- package/types/project-run/run.d.ts +6 -5
- package/types/project-run/task-scheduler/admission-core/compiled-graph.d.ts +31 -0
- package/types/project-run/task-scheduler/admission-core/core.d.ts +57 -0
- package/types/project-run/task-scheduler/admission-core/input.d.ts +4 -0
- package/types/project-run/task-scheduler/admission-core/projection.d.ts +22 -0
- package/types/project-run/task-scheduler/admission-core/selection-index.d.ts +61 -0
- package/types/project-run/task-scheduler/admission-core/selection-query.d.ts +28 -0
- package/types/project-run/task-scheduler/admission-core/selection-seed.d.ts +9 -0
- package/types/project-run/task-scheduler/admission-core/selection-transition.d.ts +4 -0
- package/types/project-run/task-scheduler/admission-core/selection.d.ts +20 -0
- package/types/project-run/task-scheduler/admission-scope-layers.d.ts +8 -0
- package/types/project-run/task-scheduler/admission-selection-policy.d.ts +31 -0
- package/types/project-run/task-scheduler/critical-path-ranking.d.ts +19 -0
- package/types/project-run/task-scheduler/custom-admission-policy.d.ts +6 -0
- package/types/project-run/task-scheduler/execution-state.d.ts +43 -1
- package/types/project-run/task-scheduler/forced-block-effect-replay.d.ts +9 -0
- package/types/project-run/task-scheduler/graph-validation.d.ts +3 -2
- package/types/project-run/task-scheduler/graph.d.ts +15 -0
- package/types/project-run/task-scheduler/measurement/diagnostics.d.ts +47 -0
- package/types/project-run/task-scheduler/measurement/integrals.d.ts +27 -0
- package/types/project-run/task-scheduler/measurement/policy.d.ts +10 -0
- package/types/project-run/task-scheduler/measurement/summary.d.ts +3 -0
- package/types/project-run/task-scheduler/measurement/timing.d.ts +33 -0
- package/types/project-run/task-scheduler/scheduler-admission-decision.d.ts +13 -1
- package/types/project-run/task-scheduler/scheduler-decision-inspection.d.ts +20 -19
- package/types/project-run/task-scheduler/scheduler-decision-model.d.ts +38 -22
- package/types/project-run/task-scheduler/scheduler-decision.d.ts +4 -1
- package/types/project-run/task-scheduler/scheduler-observation.d.ts +14 -0
- package/types/project-run/task-scheduler/scheduler-task-lifecycle.d.ts +18 -0
- package/types/project-run/task-scheduler/scheduler-terminal-measurement.d.ts +9 -0
- package/dist/esm/package-checks/file-metrics/scc/csv.mjs.map +0 -1
- package/dist/esm/package-checks/function-metrics/lizard/availability.mjs +0 -64
- package/dist/esm/package-checks/function-metrics/lizard/availability.mjs.map +0 -1
- package/dist/esm/package-checks/function-metrics/lizard/csv.mjs +0 -17
- package/dist/esm/package-checks/function-metrics/lizard/csv.mjs.map +0 -1
- package/dist/esm/package-checks/function-metrics/lizard/parser.mjs +0 -138
- package/dist/esm/package-checks/function-metrics/lizard/parser.mjs.map +0 -1
- package/dist/esm/package-checks/function-metrics/lizard/scanner.mjs +0 -35
- package/dist/esm/package-checks/function-metrics/lizard/scanner.mjs.map +0 -1
- package/dist/esm/package-checks/host-environment/process/command.mjs +0 -13
- package/dist/esm/package-checks/host-environment/process/command.mjs.map +0 -1
- package/dist/esm/project-run/completion.mjs.map +0 -1
- package/dist/esm/project-run/invocation-creation.mjs +0 -111
- package/dist/esm/project-run/invocation-creation.mjs.map +0 -1
- package/dist/esm/project-run/invocation.mjs.map +0 -1
- package/dist/esm/project-run/machine-publication.mjs.map +0 -1
- package/dist/esm/project-run/output-configuration.mjs.map +0 -1
- package/dist/esm/project-run/output-status.mjs +0 -43
- package/dist/esm/project-run/output-status.mjs.map +0 -1
- package/src/package-checks/function-metrics/lizard/availability.ts +0 -90
- package/src/package-checks/function-metrics/lizard/csv.ts +0 -20
- package/src/package-checks/function-metrics/lizard/parser.ts +0 -179
- package/src/package-checks/function-metrics/lizard/scanner.ts +0 -62
- package/src/package-checks/host-environment/process/command.ts +0 -21
- package/src/project-run/invocation-creation.ts +0 -160
- package/src/project-run/output-status.ts +0 -69
- package/types/package-checks/file-metrics/scc/csv.d.ts +0 -1
- package/types/package-checks/function-metrics/lizard/availability.d.ts +0 -11
- package/types/package-checks/function-metrics/lizard/csv.d.ts +0 -1
- package/types/package-checks/function-metrics/lizard/parser.d.ts +0 -17
- package/types/package-checks/function-metrics/lizard/scanner.d.ts +0 -15
- package/types/package-checks/host-environment/process/command.d.ts +0 -7
- package/types/project-run/invocation.d.ts +0 -34
- package/types/project-run/output-configuration.d.ts +0 -3
- package/types/project-run/output-status.d.ts +0 -21
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"graph-validation.mjs","sourceRoot":"","sources":["../../../../src/project-run/task-scheduler/graph-validation.ts"],"names":[],"mappings":"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","sourcesContent":["import type { PlannedTask, PlannedTaskScope } from \"./graph.ts\";\n\ninterface PreparedTaskGraphValidationInput {\n readonly rootMaxParallel: number | undefined;\n readonly scopeById: ReadonlyMap<string, PlannedTaskScope>;\n readonly scopes: readonly PlannedTaskScope[];\n readonly taskById: ReadonlyMap<string, PlannedTask>;\n readonly tasks: readonly PlannedTask[];\n}\n\ninterface DependencyPathQuery {\n readonly requiredDependencyId: string;\n readonly taskById: ReadonlyMap<string, PlannedTask>;\n readonly taskId: string;\n}\n\ninterface DependencyTraversal {\n readonly pending: string[];\n readonly query: DependencyPathQuery;\n readonly visited: Set<string>;\n}\n\n/** Validates dependency and scope relations after graph-shaped input is normalized. */\nexport function validatePreparedTaskGraph(input: PreparedTaskGraphValidationInput): void {\n validateDependencies(input.tasks, input.taskById);\n validateDependencyCycles(input.tasks, input.taskById);\n validateScopes(input);\n}\n\nfunction validateDependencies(\n tasks: readonly PlannedTask[],\n taskById: ReadonlyMap<string, PlannedTask>\n): void {\n for (const task of tasks) {\n for (const dependency of task.dependsOn) {\n if (!taskById.has(dependency)) {\n throw new Error(`task ${task.id} depends on unknown task ${dependency}`);\n }\n }\n }\n}\n\nfunction validateDependencyCycles(\n tasks: readonly PlannedTask[],\n taskById: ReadonlyMap<string, PlannedTask>\n): void {\n const visiting = new Set<string>();\n const visited = new Set<string>();\n\n const visit = (task: PlannedTask): void => {\n if (visiting.has(task.id)) {\n throw new Error(`task dependency cycle includes ${task.id}`);\n }\n if (visited.has(task.id)) return;\n\n visiting.add(task.id);\n for (const dependency of task.dependsOn) {\n const dependencyTask = taskById.get(dependency);\n if (dependencyTask === undefined) {\n throw new Error(`task ${task.id} depends on unknown task ${dependency}`);\n }\n visit(dependencyTask);\n }\n visiting.delete(task.id);\n visited.add(task.id);\n };\n\n for (const task of tasks) {\n visit(task);\n }\n}\n\nfunction validateScopes(input: PreparedTaskGraphValidationInput): void {\n validateRootMaxParallel(input.rootMaxParallel);\n validateTaskScopeMembership(input.tasks, input.scopeById);\n for (const scope of input.scopes) {\n validateScopeCap(scope, input.rootMaxParallel);\n validateScopeTerminal(scope, input.taskById);\n validateScopeActivation(scope, input.taskById);\n validateScopeTerminalReachability(scope, input.tasks, input.taskById);\n }\n}\n\nfunction validateRootMaxParallel(rootMaxParallel: number | undefined): void {\n if (\n rootMaxParallel !== undefined &&\n (!Number.isSafeInteger(rootMaxParallel) || rootMaxParallel <= 0)\n ) {\n throw new TypeError(\"task engine maxParallel must be a positive safe integer\");\n }\n}\n\nfunction validateTaskScopeMembership(\n tasks: readonly PlannedTask[],\n scopeById: ReadonlyMap<string, PlannedTaskScope>\n): void {\n for (const task of tasks) {\n if (task.scopeId !== undefined && !scopeById.has(task.scopeId)) {\n throw new Error(`task ${task.id} references unknown scope ${task.scopeId}`);\n }\n }\n}\n\nfunction validateScopeCap(scope: PlannedTaskScope, rootMaxParallel: number | undefined): void {\n if (rootMaxParallel !== undefined && scope.maxParallel > rootMaxParallel) {\n throw new Error(`task scope ${scope.id} maxParallel exceeds task engine maxParallel`);\n }\n}\n\nfunction validateScopeTerminal(\n scope: PlannedTaskScope,\n taskById: ReadonlyMap<string, PlannedTask>\n): void {\n const terminal = taskById.get(scope.terminalTaskId);\n if (terminal?.scopeId !== scope.id) {\n throw new Error(`task scope ${scope.id} terminal task must belong to the scope`);\n }\n}\n\nfunction validateScopeActivation(\n scope: PlannedTaskScope,\n taskById: ReadonlyMap<string, PlannedTask>\n): void {\n const activationIds = new Set<string>();\n for (const taskId of scope.activationTaskIds) {\n if (activationIds.has(taskId)) {\n throw new Error(`task scope ${scope.id} repeats activation task ${taskId}`);\n }\n activationIds.add(taskId);\n const task = taskById.get(taskId);\n if (task?.scopeId !== scope.id) {\n throw new Error(`task scope ${scope.id} activation task must belong to the scope: ${taskId}`);\n }\n }\n}\n\nfunction validateScopeTerminalReachability(\n scope: PlannedTaskScope,\n tasks: readonly PlannedTask[],\n taskById: ReadonlyMap<string, PlannedTask>\n): void {\n for (const task of tasks) {\n if (task.scopeId !== scope.id || task.id === scope.terminalTaskId) continue;\n if (!dependsOnTask({ requiredDependencyId: task.id, taskById, taskId: scope.terminalTaskId })) {\n throw new Error(`task scope ${scope.id} terminal task must depend on scoped task ${task.id}`);\n }\n }\n}\n\nfunction dependsOnTask(query: DependencyPathQuery): boolean {\n return traverseDependencies({\n pending: [...taskDependencies(query.taskById, query.taskId)],\n query,\n visited: new Set()\n });\n}\n\nfunction traverseDependencies(traversal: DependencyTraversal): boolean {\n while (traversal.pending.length > 0) {\n const dependencyId = traversal.pending.pop();\n if (dependencyId === undefined || traversal.visited.has(dependencyId)) continue;\n if (dependencyId === traversal.query.requiredDependencyId) return true;\n\n traversal.visited.add(dependencyId);\n traversal.pending.push(...taskDependencies(traversal.query.taskById, dependencyId));\n }\n return false;\n}\n\nfunction taskDependencies(\n taskById: ReadonlyMap<string, PlannedTask>,\n taskId: string\n): readonly string[] {\n const task = taskById.get(taskId);\n return task === undefined ? [] : task.dependsOn;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"graph-validation.mjs","sourceRoot":"","sources":["../../../../src/project-run/task-scheduler/graph-validation.ts"],"names":[],"mappings":"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","sourcesContent":["import type { NamedResourceUnits, PlannedTask, PlannedTaskScope } from \"./graph.ts\";\n\ninterface PreparedTaskGraphValidationInput {\n readonly resourceCapacities: readonly NamedResourceUnits[];\n readonly rootMaxParallel: number | undefined;\n readonly scopeById: ReadonlyMap<string, PlannedTaskScope>;\n readonly scopes: readonly PlannedTaskScope[];\n readonly taskById: ReadonlyMap<string, PlannedTask>;\n readonly tasks: readonly PlannedTask[];\n}\n\ntype TaskRelationField = \"dependsOn\" | \"observes\";\n\ninterface TaskRelationPathQuery {\n readonly requiredRelatedTaskId: string;\n readonly taskById: ReadonlyMap<string, PlannedTask>;\n readonly taskId: string;\n}\n\ninterface TaskRelationTraversal {\n readonly pending: string[];\n readonly query: TaskRelationPathQuery;\n readonly visited: Set<string>;\n}\n\n/** Validates direct relations and scope structure after graph-shaped input is normalized. */\nexport function validatePreparedTaskGraph(input: PreparedTaskGraphValidationInput): void {\n validateResourceClaims(input.resourceCapacities, input.tasks);\n validateTaskRelations(input.tasks, input.taskById);\n validateTaskRelationCycles(input.tasks, input.taskById);\n validateScopes(input);\n}\n\nfunction validateResourceClaims(\n capacities: readonly NamedResourceUnits[],\n tasks: readonly PlannedTask[]\n): void {\n const capacityByResourceId = new Map(\n capacities.map(({ resourceId, units }) => [resourceId, units] as const)\n );\n for (const task of tasks) {\n for (const claim of task.resourceClaims) {\n const capacity = capacityByResourceId.get(claim.resourceId);\n if (capacity === undefined) {\n throw new Error(`task ${task.id} claims unknown resource ${claim.resourceId}`);\n }\n if (claim.units > capacity) {\n throw new Error(`task ${task.id} claim exceeds resource capacity: ${claim.resourceId}`);\n }\n }\n }\n}\n\nfunction validateTaskRelations(\n tasks: readonly PlannedTask[],\n taskById: ReadonlyMap<string, PlannedTask>\n): void {\n for (const task of tasks) {\n validateRelatedTaskIds(task, \"dependsOn\", task.dependsOn, taskById);\n validateRelatedTaskIds(task, \"observes\", task.observes, taskById);\n for (const dependencyId of task.dependsOn) {\n if (task.observes.includes(dependencyId)) {\n throw new Error(`task ${task.id} cannot both depend on and observe task ${dependencyId}`);\n }\n }\n }\n}\n\nfunction validateRelatedTaskIds(\n task: PlannedTask,\n relation: TaskRelationField,\n relationTargetIds: readonly string[],\n taskById: ReadonlyMap<string, PlannedTask>\n): void {\n const action = relation === \"dependsOn\" ? \"depends on\" : \"observes\";\n for (const relatedTaskId of relationTargetIds) {\n if (!taskById.has(relatedTaskId)) {\n throw new Error(`task ${task.id} ${action} unknown task ${relatedTaskId}`);\n }\n }\n}\n\nfunction validateTaskRelationCycles(\n tasks: readonly PlannedTask[],\n taskById: ReadonlyMap<string, PlannedTask>\n): void {\n const visiting = new Set<string>();\n const visited = new Set<string>();\n\n const visit = (task: PlannedTask): void => {\n if (visiting.has(task.id)) {\n throw new Error(`task dependency cycle includes ${task.id}`);\n }\n if (visited.has(task.id)) return;\n\n visiting.add(task.id);\n for (const relatedTaskId of relatedTaskIds(task)) {\n const relatedTask = taskById.get(relatedTaskId);\n if (relatedTask === undefined) {\n throw new Error(`task ${task.id} relates to unknown task ${relatedTaskId}`);\n }\n visit(relatedTask);\n }\n visiting.delete(task.id);\n visited.add(task.id);\n };\n\n for (const task of tasks) {\n visit(task);\n }\n}\n\nfunction validateScopes(input: PreparedTaskGraphValidationInput): void {\n validateRootMaxParallel(input.rootMaxParallel);\n validateTaskScopeMembership(input.tasks, input.scopeById);\n for (const scope of input.scopes) {\n validateScopeCap(scope, input.rootMaxParallel);\n validateScopeTerminal(scope, input.taskById);\n validateScopeActivation(scope, input.taskById);\n validateScopeTerminalReachability(scope, input.tasks, input.taskById);\n }\n}\n\nfunction validateRootMaxParallel(rootMaxParallel: number | undefined): void {\n if (\n rootMaxParallel !== undefined &&\n (!Number.isSafeInteger(rootMaxParallel) || rootMaxParallel <= 0)\n ) {\n throw new TypeError(\"task engine maxParallel must be a positive safe integer\");\n }\n}\n\nfunction validateTaskScopeMembership(\n tasks: readonly PlannedTask[],\n scopeById: ReadonlyMap<string, PlannedTaskScope>\n): void {\n for (const task of tasks) {\n if (task.scopeId !== undefined && !scopeById.has(task.scopeId)) {\n throw new Error(`task ${task.id} references unknown scope ${task.scopeId}`);\n }\n }\n}\n\nfunction validateScopeCap(scope: PlannedTaskScope, rootMaxParallel: number | undefined): void {\n if (rootMaxParallel !== undefined && scope.maxParallel > rootMaxParallel) {\n throw new Error(`task scope ${scope.id} maxParallel exceeds task engine maxParallel`);\n }\n}\n\nfunction validateScopeTerminal(\n scope: PlannedTaskScope,\n taskById: ReadonlyMap<string, PlannedTask>\n): void {\n const terminal = taskById.get(scope.terminalTaskId);\n if (terminal?.scopeId !== scope.id) {\n throw new Error(`task scope ${scope.id} terminal task must belong to the scope`);\n }\n}\n\nfunction validateScopeActivation(\n scope: PlannedTaskScope,\n taskById: ReadonlyMap<string, PlannedTask>\n): void {\n const activationIds = new Set<string>();\n for (const taskId of scope.activationTaskIds) {\n if (activationIds.has(taskId)) {\n throw new Error(`task scope ${scope.id} repeats activation task ${taskId}`);\n }\n activationIds.add(taskId);\n const task = taskById.get(taskId);\n if (task?.scopeId !== scope.id) {\n throw new Error(`task scope ${scope.id} activation task must belong to the scope: ${taskId}`);\n }\n }\n}\n\nfunction validateScopeTerminalReachability(\n scope: PlannedTaskScope,\n tasks: readonly PlannedTask[],\n taskById: ReadonlyMap<string, PlannedTask>\n): void {\n for (const task of tasks) {\n if (task.scopeId !== scope.id || task.id === scope.terminalTaskId) continue;\n if (\n !isRelatedToTask({ requiredRelatedTaskId: task.id, taskById, taskId: scope.terminalTaskId })\n ) {\n throw new Error(`task scope ${scope.id} terminal task must relate to scoped task ${task.id}`);\n }\n }\n}\n\nfunction isRelatedToTask(query: TaskRelationPathQuery): boolean {\n return traverseTaskRelations({\n pending: [...relatedTaskIdsFor(query.taskById, query.taskId)],\n query,\n visited: new Set()\n });\n}\n\nfunction traverseTaskRelations(traversal: TaskRelationTraversal): boolean {\n while (traversal.pending.length > 0) {\n const relatedTaskId = traversal.pending.pop();\n if (relatedTaskId === undefined || traversal.visited.has(relatedTaskId)) continue;\n if (relatedTaskId === traversal.query.requiredRelatedTaskId) return true;\n\n traversal.visited.add(relatedTaskId);\n traversal.pending.push(...relatedTaskIdsFor(traversal.query.taskById, relatedTaskId));\n }\n return false;\n}\n\nfunction relatedTaskIdsFor(\n taskById: ReadonlyMap<string, PlannedTask>,\n taskId: string\n): readonly string[] {\n const task = taskById.get(taskId);\n return task === undefined ? [] : relatedTaskIds(task);\n}\n\nfunction relatedTaskIds(task: PlannedTask): readonly string[] {\n return [...task.dependsOn, ...task.observes];\n}\n"]}
|
|
@@ -1,6 +1,15 @@
|
|
|
1
1
|
import { validatePreparedTaskGraph } from "./graph-validation.mjs";
|
|
2
|
-
|
|
3
|
-
const
|
|
2
|
+
import { snapshotClosedRecord } from "../../data-boundary/closed-values.mjs";
|
|
3
|
+
const TASK_GRAPH_KEYS = ["resourceCapacities", "tasks", "scopes"];
|
|
4
|
+
const TASK_NODE_KEYS = [
|
|
5
|
+
"admissionPriority",
|
|
6
|
+
"id",
|
|
7
|
+
"dependsOn",
|
|
8
|
+
"mutex",
|
|
9
|
+
"observes",
|
|
10
|
+
"resourceClaims",
|
|
11
|
+
"scopeId"
|
|
12
|
+
];
|
|
4
13
|
const TASK_SCOPE_KEYS = ["id", "maxParallel", "activationTaskIds", "terminalTaskId"];
|
|
5
14
|
/** Validates untrusted graph-shaped input without admitting it to scheduler execution. */
|
|
6
15
|
export function validateTaskGraph(graph) {
|
|
@@ -8,16 +17,46 @@ export function validateTaskGraph(graph) {
|
|
|
8
17
|
}
|
|
9
18
|
export function prepareTaskGraph(graph, rootMaxParallel) {
|
|
10
19
|
const data = record(graph, "task graph", TASK_GRAPH_KEYS);
|
|
20
|
+
const resourceCapacities = resourceMapping(data.resourceCapacities, "task graph resourceCapacities");
|
|
11
21
|
const tasks = normalizeTasks(data.tasks);
|
|
12
22
|
const scopes = normalizeScopes(data.scopes);
|
|
13
23
|
const taskById = new Map(tasks.map((task) => [task.id, task]));
|
|
14
24
|
const scopeById = new Map(scopes.map((scope) => [scope.id, scope]));
|
|
15
|
-
validatePreparedTaskGraph({
|
|
25
|
+
validatePreparedTaskGraph({
|
|
26
|
+
resourceCapacities,
|
|
27
|
+
rootMaxParallel,
|
|
28
|
+
scopeById,
|
|
29
|
+
scopes,
|
|
30
|
+
taskById,
|
|
31
|
+
tasks
|
|
32
|
+
});
|
|
16
33
|
return Object.freeze({
|
|
34
|
+
resourceCapacities,
|
|
35
|
+
schedulerGraphSnapshot: schedulerGraphSnapshot(tasks, scopes, resourceCapacities),
|
|
17
36
|
tasks: Object.freeze(tasks),
|
|
18
37
|
scopes: Object.freeze(scopes)
|
|
19
38
|
});
|
|
20
39
|
}
|
|
40
|
+
function schedulerGraphSnapshot(tasks, scopes, resourceCapacities) {
|
|
41
|
+
return Object.freeze({
|
|
42
|
+
resourceCapacities,
|
|
43
|
+
scopes: Object.freeze(scopes.map((scope) => Object.freeze({
|
|
44
|
+
activationTaskIds: Object.freeze([...scope.activationTaskIds]),
|
|
45
|
+
id: scope.id,
|
|
46
|
+
maxParallel: scope.maxParallel,
|
|
47
|
+
terminalTaskId: scope.terminalTaskId
|
|
48
|
+
}))),
|
|
49
|
+
tasks: Object.freeze(tasks.map((task) => Object.freeze({
|
|
50
|
+
admissionPriority: task.admissionPriority,
|
|
51
|
+
dependsOn: Object.freeze([...task.dependsOn]),
|
|
52
|
+
mutex: Object.freeze([...task.mutex]),
|
|
53
|
+
observes: Object.freeze([...task.observes]),
|
|
54
|
+
resourceClaims: task.resourceClaims,
|
|
55
|
+
scopeId: task.scopeId ?? null,
|
|
56
|
+
taskId: task.id
|
|
57
|
+
})))
|
|
58
|
+
});
|
|
59
|
+
}
|
|
21
60
|
function normalizeTasks(value) {
|
|
22
61
|
if (!Array.isArray(value)) {
|
|
23
62
|
throw new TypeError("task graph tasks must be an array");
|
|
@@ -31,11 +70,15 @@ function normalizeTasks(value) {
|
|
|
31
70
|
throw new TypeError(`duplicate task id: ${id}`);
|
|
32
71
|
}
|
|
33
72
|
ids.add(id);
|
|
73
|
+
const admissionPriority = admissionPriorityOrDefault(data.admissionPriority, id);
|
|
34
74
|
const scopeId = optionalNonEmptyString(data.scopeId, `task ${id}.scopeId`);
|
|
35
75
|
tasks.push(Object.freeze({
|
|
76
|
+
admissionPriority,
|
|
36
77
|
id,
|
|
37
78
|
dependsOn: Object.freeze(stringList(data.dependsOn, `task ${id}.dependsOn`)),
|
|
38
79
|
mutex: Object.freeze(stringList(data.mutex, `task ${id}.mutex`)),
|
|
80
|
+
observes: Object.freeze(stringList(data.observes, `task ${id}.observes`)),
|
|
81
|
+
resourceClaims: resourceMapping(data.resourceClaims, `task ${id}.resourceClaims`),
|
|
39
82
|
scopeId
|
|
40
83
|
}));
|
|
41
84
|
}
|
|
@@ -107,10 +150,43 @@ function requiredStringList(value, fieldName) {
|
|
|
107
150
|
}
|
|
108
151
|
return stringList(value, fieldName);
|
|
109
152
|
}
|
|
153
|
+
function resourceMapping(value, fieldName) {
|
|
154
|
+
if (value === undefined)
|
|
155
|
+
return Object.freeze([]);
|
|
156
|
+
const data = snapshotClosedRecord(value);
|
|
157
|
+
if (data === undefined)
|
|
158
|
+
throw new TypeError(`${fieldName} must be a closed object`);
|
|
159
|
+
const entries = [];
|
|
160
|
+
for (const resourceId of Object.keys(data).sort(compareText)) {
|
|
161
|
+
if (resourceId.trim().length === 0) {
|
|
162
|
+
throw new TypeError(`${fieldName} resource ids must be non-empty strings`);
|
|
163
|
+
}
|
|
164
|
+
entries.push(Object.freeze({
|
|
165
|
+
resourceId,
|
|
166
|
+
units: positiveSafeInteger(data[resourceId], `${fieldName}.${resourceId}`)
|
|
167
|
+
}));
|
|
168
|
+
}
|
|
169
|
+
return Object.freeze(entries);
|
|
170
|
+
}
|
|
110
171
|
function positiveSafeInteger(value, fieldName) {
|
|
111
172
|
if (typeof value !== "number" || !Number.isSafeInteger(value) || value <= 0) {
|
|
112
173
|
throw new TypeError(`${fieldName} must be a positive safe integer`);
|
|
113
174
|
}
|
|
114
175
|
return value;
|
|
115
176
|
}
|
|
177
|
+
function admissionPriorityOrDefault(value, taskId) {
|
|
178
|
+
if (value === undefined)
|
|
179
|
+
return 0;
|
|
180
|
+
if (typeof value !== "number" || !Number.isSafeInteger(value)) {
|
|
181
|
+
throw new TypeError(`task ${taskId}.admissionPriority must be a safe integer`);
|
|
182
|
+
}
|
|
183
|
+
return value;
|
|
184
|
+
}
|
|
185
|
+
function compareText(left, right) {
|
|
186
|
+
if (left < right)
|
|
187
|
+
return -1;
|
|
188
|
+
if (left > right)
|
|
189
|
+
return 1;
|
|
190
|
+
return 0;
|
|
191
|
+
}
|
|
116
192
|
//# sourceMappingURL=graph.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"graph.mjs","sourceRoot":"","sources":["../../../../src/project-run/task-scheduler/graph.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,MAAM,uBAAuB,CAAC;AA6ClE,MAAM,eAAe,GAAG,CAAC,OAAO,EAAE,QAAQ,CAAU,CAAC;AACrD,MAAM,cAAc,GAAG,CAAC,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,SAAS,CAAU,CAAC;AACxE,MAAM,eAAe,GAAG,CAAC,IAAI,EAAE,aAAa,EAAE,mBAAmB,EAAE,gBAAgB,CAAU,CAAC;AAE9F,0FAA0F;AAC1F,MAAM,UAAU,iBAAiB,CAAC,KAAc;IAC9C,gBAAgB,CAAC,KAAK,CAAC,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,KAAc,EAAE,eAAwB;IACvE,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,EAAE,YAAY,EAAE,eAAe,CAAC,CAAC;IAC1D,MAAM,KAAK,GAAG,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACzC,MAAM,MAAM,GAAG,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC5C,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAU,CAAC,CAAC,CAAC;IACxE,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAU,CAAC,CAAC,CAAC;IAE7E,yBAAyB,CAAC,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;IAEnF,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC;QAC3B,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC;KAC9B,CAAC,CAAC;AACL,CAAC;AAED,SAAS,cAAc,CAAC,KAAc;IACpC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,SAAS,CAAC,mCAAmC,CAAC,CAAC;IAC3D,CAAC;IAED,MAAM,GAAG,GAAG,IAAI,GAAG,EAAU,CAAC;IAC9B,MAAM,KAAK,GAAkB,EAAE,CAAC;IAChC,KAAK,MAAM,CAAC,KAAK,EAAE,SAAS,CAAC,IAAI,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC;QACjD,MAAM,IAAI,GAAG,MAAM,CAAC,SAAS,EAAE,oBAAoB,KAAK,GAAG,EAAE,cAAc,CAAC,CAAC;QAC7E,MAAM,EAAE,GAAG,cAAc,CAAC,IAAI,CAAC,EAAE,EAAE,oBAAoB,KAAK,MAAM,CAAC,CAAC;QACpE,IAAI,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;YAChB,MAAM,IAAI,SAAS,CAAC,sBAAsB,EAAE,EAAE,CAAC,CAAC;QAClD,CAAC;QACD,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACZ,MAAM,OAAO,GAAG,sBAAsB,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;QAC3E,KAAK,CAAC,IAAI,CACR,MAAM,CAAC,MAAM,CAAC;YACZ,EAAE;YACF,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC;YAC5E,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;YAChE,OAAO;SACR,CAAC,CACH,CAAC;IACJ,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,eAAe,CAAC,KAAc;IACrC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,SAAS,CAAC,oCAAoC,CAAC,CAAC;IAC5D,CAAC;IAED,MAAM,GAAG,GAAG,IAAI,GAAG,EAAU,CAAC;IAC9B,MAAM,MAAM,GAAuB,EAAE,CAAC;IACtC,KAAK,MAAM,CAAC,KAAK,EAAE,SAAS,CAAC,IAAI,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC;QACjD,MAAM,IAAI,GAAG,MAAM,CAAC,SAAS,EAAE,qBAAqB,KAAK,GAAG,EAAE,eAAe,CAAC,CAAC;QAC/E,MAAM,EAAE,GAAG,cAAc,CAAC,IAAI,CAAC,EAAE,EAAE,qBAAqB,KAAK,MAAM,CAAC,CAAC;QACrE,IAAI,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;YAChB,MAAM,IAAI,SAAS,CAAC,4BAA4B,EAAE,EAAE,CAAC,CAAC;QACxD,CAAC;QACD,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACZ,MAAM,WAAW,GAAG,mBAAmB,CAAC,IAAI,CAAC,WAAW,EAAE,cAAc,EAAE,cAAc,CAAC,CAAC;QAC1F,MAAM,iBAAiB,GAAG,kBAAkB,CAC1C,IAAI,CAAC,iBAAiB,EACtB,cAAc,EAAE,oBAAoB,CACrC,CAAC;QACF,MAAM,cAAc,GAAG,cAAc,CAAC,IAAI,CAAC,cAAc,EAAE,cAAc,EAAE,iBAAiB,CAAC,CAAC;QAC9F,MAAM,CAAC,IAAI,CACT,MAAM,CAAC,MAAM,CAAC;YACZ,EAAE;YACF,WAAW;YACX,iBAAiB,EAAE,MAAM,CAAC,MAAM,CAAC,iBAAiB,CAAC;YACnD,cAAc;SACf,CAAC,CACH,CAAC;IACJ,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,MAAM,CACb,KAAc,EACd,SAAiB,EACjB,WAA8B;IAE9B,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,EAAE,CAAC;QAC9B,MAAM,IAAI,SAAS,CAAC,GAAG,SAAS,oBAAoB,CAAC,CAAC;IACxD,CAAC;IACD,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACrC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YAC/B,MAAM,IAAI,SAAS,CAAC,GAAG,SAAS,0BAA0B,GAAG,EAAE,CAAC,CAAC;QACnE,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAc;IACvC,OAAO,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC;AAED,SAAS,cAAc,CAAC,KAAc,EAAE,SAAiB;IACvD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3D,MAAM,IAAI,SAAS,CAAC,GAAG,SAAS,6BAA6B,CAAC,CAAC;IACjE,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,sBAAsB,CAAC,KAAc,EAAE,SAAiB;IAC/D,OAAO,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,cAAc,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;AAC5E,CAAC;AAED,SAAS,UAAU,CAAC,KAAc,EAAE,SAAiB;IACnD,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,SAAS,CAAC,GAAG,SAAS,wCAAwC,CAAC,CAAC;IAC5E,CAAC;IACD,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,cAAc,CAAC,IAAI,EAAE,GAAG,SAAS,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC;AACpF,CAAC;AAED,SAAS,kBAAkB,CAAC,KAAc,EAAE,SAAiB;IAC3D,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,MAAM,IAAI,SAAS,CAAC,GAAG,SAAS,wCAAwC,CAAC,CAAC;IAC5E,CAAC;IACD,OAAO,UAAU,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;AACtC,CAAC;AAED,SAAS,mBAAmB,CAAC,KAAc,EAAE,SAAiB;IAC5D,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;QAC5E,MAAM,IAAI,SAAS,CAAC,GAAG,SAAS,kCAAkC,CAAC,CAAC;IACtE,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC","sourcesContent":["import { validatePreparedTaskGraph } from \"./graph-validation.ts\";\n\nexport interface TaskNode {\n readonly id: string;\n readonly dependsOn?: readonly string[];\n readonly mutex?: readonly string[];\n readonly scopeId?: string;\n}\n\n/**\n * A scheduling scope is intentionally product-agnostic. Product adapters may\n * use its opaque id to bind local Check semantics, but the engine only uses\n * membership, a cap, activation candidates, and the terminal relation.\n */\nexport interface TaskScope {\n readonly id: string;\n readonly maxParallel: number;\n readonly activationTaskIds: readonly string[];\n readonly terminalTaskId: string;\n}\n\nexport interface TaskGraph {\n readonly tasks: readonly TaskNode[];\n readonly scopes?: readonly TaskScope[];\n}\n\nexport interface PlannedTask {\n readonly id: string;\n readonly dependsOn: readonly string[];\n readonly mutex: readonly string[];\n readonly scopeId: string | undefined;\n}\n\nexport interface PlannedTaskScope {\n readonly id: string;\n readonly maxParallel: number;\n readonly activationTaskIds: readonly string[];\n readonly terminalTaskId: string;\n}\n\nexport interface PlannedTaskGraph {\n readonly tasks: readonly PlannedTask[];\n readonly scopes: readonly PlannedTaskScope[];\n}\n\nconst TASK_GRAPH_KEYS = [\"tasks\", \"scopes\"] as const;\nconst TASK_NODE_KEYS = [\"id\", \"dependsOn\", \"mutex\", \"scopeId\"] as const;\nconst TASK_SCOPE_KEYS = [\"id\", \"maxParallel\", \"activationTaskIds\", \"terminalTaskId\"] as const;\n\n/** Validates untrusted graph-shaped input without admitting it to scheduler execution. */\nexport function validateTaskGraph(graph: unknown): void {\n prepareTaskGraph(graph);\n}\n\nexport function prepareTaskGraph(graph: unknown, rootMaxParallel?: number): PlannedTaskGraph {\n const data = record(graph, \"task graph\", TASK_GRAPH_KEYS);\n const tasks = normalizeTasks(data.tasks);\n const scopes = normalizeScopes(data.scopes);\n const taskById = new Map(tasks.map((task) => [task.id, task] as const));\n const scopeById = new Map(scopes.map((scope) => [scope.id, scope] as const));\n\n validatePreparedTaskGraph({ rootMaxParallel, scopeById, scopes, taskById, tasks });\n\n return Object.freeze({\n tasks: Object.freeze(tasks),\n scopes: Object.freeze(scopes)\n });\n}\n\nfunction normalizeTasks(value: unknown): PlannedTask[] {\n if (!Array.isArray(value)) {\n throw new TypeError(\"task graph tasks must be an array\");\n }\n\n const ids = new Set<string>();\n const tasks: PlannedTask[] = [];\n for (const [index, candidate] of value.entries()) {\n const data = record(candidate, `task graph tasks[${index}]`, TASK_NODE_KEYS);\n const id = nonEmptyString(data.id, `task graph tasks[${index}].id`);\n if (ids.has(id)) {\n throw new TypeError(`duplicate task id: ${id}`);\n }\n ids.add(id);\n const scopeId = optionalNonEmptyString(data.scopeId, `task ${id}.scopeId`);\n tasks.push(\n Object.freeze({\n id,\n dependsOn: Object.freeze(stringList(data.dependsOn, `task ${id}.dependsOn`)),\n mutex: Object.freeze(stringList(data.mutex, `task ${id}.mutex`)),\n scopeId\n })\n );\n }\n return tasks;\n}\n\nfunction normalizeScopes(value: unknown): PlannedTaskScope[] {\n if (value === undefined) {\n return [];\n }\n if (!Array.isArray(value)) {\n throw new TypeError(\"task graph scopes must be an array\");\n }\n\n const ids = new Set<string>();\n const scopes: PlannedTaskScope[] = [];\n for (const [index, candidate] of value.entries()) {\n const data = record(candidate, `task graph scopes[${index}]`, TASK_SCOPE_KEYS);\n const id = nonEmptyString(data.id, `task graph scopes[${index}].id`);\n if (ids.has(id)) {\n throw new TypeError(`duplicate task scope id: ${id}`);\n }\n ids.add(id);\n const maxParallel = positiveSafeInteger(data.maxParallel, `task scope ${id}.maxParallel`);\n const activationTaskIds = requiredStringList(\n data.activationTaskIds,\n `task scope ${id}.activationTaskIds`\n );\n const terminalTaskId = nonEmptyString(data.terminalTaskId, `task scope ${id}.terminalTaskId`);\n scopes.push(\n Object.freeze({\n id,\n maxParallel,\n activationTaskIds: Object.freeze(activationTaskIds),\n terminalTaskId\n })\n );\n }\n return scopes;\n}\n\nfunction record(\n value: unknown,\n fieldName: string,\n allowedKeys: readonly string[]\n): Readonly<Record<string, unknown>> {\n if (!isTaskGraphRecord(value)) {\n throw new TypeError(`${fieldName} must be an object`);\n }\n for (const key of Object.keys(value)) {\n if (!allowedKeys.includes(key)) {\n throw new TypeError(`${fieldName} has unknown property: ${key}`);\n }\n }\n return value;\n}\n\nfunction isTaskGraphRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction nonEmptyString(value: unknown, fieldName: string): string {\n if (typeof value !== \"string\" || value.trim().length === 0) {\n throw new TypeError(`${fieldName} must be a non-empty string`);\n }\n return value;\n}\n\nfunction optionalNonEmptyString(value: unknown, fieldName: string): string | undefined {\n return value === undefined ? undefined : nonEmptyString(value, fieldName);\n}\n\nfunction stringList(value: unknown, fieldName: string): string[] {\n if (value === undefined) {\n return [];\n }\n if (!Array.isArray(value)) {\n throw new TypeError(`${fieldName} must be an array of non-empty strings`);\n }\n return value.map((item, index) => nonEmptyString(item, `${fieldName}[${index}]`));\n}\n\nfunction requiredStringList(value: unknown, fieldName: string): string[] {\n if (value === undefined) {\n throw new TypeError(`${fieldName} must be an array of non-empty strings`);\n }\n return stringList(value, fieldName);\n}\n\nfunction positiveSafeInteger(value: unknown, fieldName: string): number {\n if (typeof value !== \"number\" || !Number.isSafeInteger(value) || value <= 0) {\n throw new TypeError(`${fieldName} must be a positive safe integer`);\n }\n return value;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"graph.mjs","sourceRoot":"","sources":["../../../../src/project-run/task-scheduler/graph.ts"],"names":[],"mappings":"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","sourcesContent":["import { validatePreparedTaskGraph } from \"./graph-validation.ts\";\nimport type { SchedulerGraphSnapshot } from \"../../project-definition/project-definition.ts\";\nimport { snapshotClosedRecord } from \"../../data-boundary/closed-values.ts\";\n\nexport interface NamedResourceUnits {\n readonly resourceId: string;\n readonly units: number;\n}\n\nexport interface TaskNode {\n readonly admissionPriority?: number;\n readonly id: string;\n readonly dependsOn?: readonly string[];\n readonly mutex?: readonly string[];\n readonly observes?: readonly string[];\n readonly resourceClaims?: Readonly<Record<string, number>>;\n readonly scopeId?: string;\n}\n\n/**\n * A scheduling scope is intentionally product-agnostic. Product adapters may\n * use its opaque id to bind local Check semantics, but the engine only uses\n * membership, a cap, activation candidates, and the terminal relation.\n */\nexport interface TaskScope {\n readonly id: string;\n readonly maxParallel: number;\n readonly activationTaskIds: readonly string[];\n readonly terminalTaskId: string;\n}\n\nexport interface TaskGraph {\n readonly resourceCapacities?: Readonly<Record<string, number>>;\n readonly tasks: readonly TaskNode[];\n readonly scopes?: readonly TaskScope[];\n}\n\nexport interface PlannedTask {\n readonly admissionPriority: number;\n readonly id: string;\n readonly dependsOn: readonly string[];\n readonly mutex: readonly string[];\n readonly observes: readonly string[];\n readonly resourceClaims: readonly NamedResourceUnits[];\n readonly scopeId: string | undefined;\n}\n\nexport interface PlannedTaskScope {\n readonly id: string;\n readonly maxParallel: number;\n readonly activationTaskIds: readonly string[];\n readonly terminalTaskId: string;\n}\n\nexport interface PlannedTaskGraph {\n readonly resourceCapacities: readonly NamedResourceUnits[];\n /** Immutable public projection shared by every decision and terminal measurement in one run. */\n readonly schedulerGraphSnapshot: SchedulerGraphSnapshot;\n readonly tasks: readonly PlannedTask[];\n readonly scopes: readonly PlannedTaskScope[];\n}\n\nconst TASK_GRAPH_KEYS = [\"resourceCapacities\", \"tasks\", \"scopes\"] as const;\nconst TASK_NODE_KEYS = [\n \"admissionPriority\",\n \"id\",\n \"dependsOn\",\n \"mutex\",\n \"observes\",\n \"resourceClaims\",\n \"scopeId\"\n] as const;\nconst TASK_SCOPE_KEYS = [\"id\", \"maxParallel\", \"activationTaskIds\", \"terminalTaskId\"] as const;\n\n/** Validates untrusted graph-shaped input without admitting it to scheduler execution. */\nexport function validateTaskGraph(graph: unknown): void {\n prepareTaskGraph(graph);\n}\n\nexport function prepareTaskGraph(graph: unknown, rootMaxParallel?: number): PlannedTaskGraph {\n const data = record(graph, \"task graph\", TASK_GRAPH_KEYS);\n const resourceCapacities = resourceMapping(\n data.resourceCapacities,\n \"task graph resourceCapacities\"\n );\n const tasks = normalizeTasks(data.tasks);\n const scopes = normalizeScopes(data.scopes);\n const taskById = new Map(tasks.map((task) => [task.id, task] as const));\n const scopeById = new Map(scopes.map((scope) => [scope.id, scope] as const));\n\n validatePreparedTaskGraph({\n resourceCapacities,\n rootMaxParallel,\n scopeById,\n scopes,\n taskById,\n tasks\n });\n\n return Object.freeze({\n resourceCapacities,\n schedulerGraphSnapshot: schedulerGraphSnapshot(tasks, scopes, resourceCapacities),\n tasks: Object.freeze(tasks),\n scopes: Object.freeze(scopes)\n });\n}\n\nfunction schedulerGraphSnapshot(\n tasks: readonly PlannedTask[],\n scopes: readonly PlannedTaskScope[],\n resourceCapacities: readonly NamedResourceUnits[]\n): SchedulerGraphSnapshot {\n return Object.freeze({\n resourceCapacities,\n scopes: Object.freeze(\n scopes.map((scope) =>\n Object.freeze({\n activationTaskIds: Object.freeze([...scope.activationTaskIds]),\n id: scope.id,\n maxParallel: scope.maxParallel,\n terminalTaskId: scope.terminalTaskId\n })\n )\n ),\n tasks: Object.freeze(\n tasks.map((task) =>\n Object.freeze({\n admissionPriority: task.admissionPriority,\n dependsOn: Object.freeze([...task.dependsOn]),\n mutex: Object.freeze([...task.mutex]),\n observes: Object.freeze([...task.observes]),\n resourceClaims: task.resourceClaims,\n scopeId: task.scopeId ?? null,\n taskId: task.id\n })\n )\n )\n });\n}\n\nfunction normalizeTasks(value: unknown): PlannedTask[] {\n if (!Array.isArray(value)) {\n throw new TypeError(\"task graph tasks must be an array\");\n }\n\n const ids = new Set<string>();\n const tasks: PlannedTask[] = [];\n for (const [index, candidate] of value.entries()) {\n const data = record(candidate, `task graph tasks[${index}]`, TASK_NODE_KEYS);\n const id = nonEmptyString(data.id, `task graph tasks[${index}].id`);\n if (ids.has(id)) {\n throw new TypeError(`duplicate task id: ${id}`);\n }\n ids.add(id);\n const admissionPriority = admissionPriorityOrDefault(data.admissionPriority, id);\n const scopeId = optionalNonEmptyString(data.scopeId, `task ${id}.scopeId`);\n tasks.push(\n Object.freeze({\n admissionPriority,\n id,\n dependsOn: Object.freeze(stringList(data.dependsOn, `task ${id}.dependsOn`)),\n mutex: Object.freeze(stringList(data.mutex, `task ${id}.mutex`)),\n observes: Object.freeze(stringList(data.observes, `task ${id}.observes`)),\n resourceClaims: resourceMapping(data.resourceClaims, `task ${id}.resourceClaims`),\n scopeId\n })\n );\n }\n return tasks;\n}\n\nfunction normalizeScopes(value: unknown): PlannedTaskScope[] {\n if (value === undefined) {\n return [];\n }\n if (!Array.isArray(value)) {\n throw new TypeError(\"task graph scopes must be an array\");\n }\n\n const ids = new Set<string>();\n const scopes: PlannedTaskScope[] = [];\n for (const [index, candidate] of value.entries()) {\n const data = record(candidate, `task graph scopes[${index}]`, TASK_SCOPE_KEYS);\n const id = nonEmptyString(data.id, `task graph scopes[${index}].id`);\n if (ids.has(id)) {\n throw new TypeError(`duplicate task scope id: ${id}`);\n }\n ids.add(id);\n const maxParallel = positiveSafeInteger(data.maxParallel, `task scope ${id}.maxParallel`);\n const activationTaskIds = requiredStringList(\n data.activationTaskIds,\n `task scope ${id}.activationTaskIds`\n );\n const terminalTaskId = nonEmptyString(data.terminalTaskId, `task scope ${id}.terminalTaskId`);\n scopes.push(\n Object.freeze({\n id,\n maxParallel,\n activationTaskIds: Object.freeze(activationTaskIds),\n terminalTaskId\n })\n );\n }\n return scopes;\n}\n\nfunction record(\n value: unknown,\n fieldName: string,\n allowedKeys: readonly string[]\n): Readonly<Record<string, unknown>> {\n if (!isTaskGraphRecord(value)) {\n throw new TypeError(`${fieldName} must be an object`);\n }\n for (const key of Object.keys(value)) {\n if (!allowedKeys.includes(key)) {\n throw new TypeError(`${fieldName} has unknown property: ${key}`);\n }\n }\n return value;\n}\n\nfunction isTaskGraphRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction nonEmptyString(value: unknown, fieldName: string): string {\n if (typeof value !== \"string\" || value.trim().length === 0) {\n throw new TypeError(`${fieldName} must be a non-empty string`);\n }\n return value;\n}\n\nfunction optionalNonEmptyString(value: unknown, fieldName: string): string | undefined {\n return value === undefined ? undefined : nonEmptyString(value, fieldName);\n}\n\nfunction stringList(value: unknown, fieldName: string): string[] {\n if (value === undefined) {\n return [];\n }\n if (!Array.isArray(value)) {\n throw new TypeError(`${fieldName} must be an array of non-empty strings`);\n }\n return value.map((item, index) => nonEmptyString(item, `${fieldName}[${index}]`));\n}\n\nfunction requiredStringList(value: unknown, fieldName: string): string[] {\n if (value === undefined) {\n throw new TypeError(`${fieldName} must be an array of non-empty strings`);\n }\n return stringList(value, fieldName);\n}\n\nfunction resourceMapping(value: unknown, fieldName: string): readonly NamedResourceUnits[] {\n if (value === undefined) return Object.freeze([]);\n const data = snapshotClosedRecord(value);\n if (data === undefined) throw new TypeError(`${fieldName} must be a closed object`);\n const entries: NamedResourceUnits[] = [];\n for (const resourceId of Object.keys(data).sort(compareText)) {\n if (resourceId.trim().length === 0) {\n throw new TypeError(`${fieldName} resource ids must be non-empty strings`);\n }\n entries.push(\n Object.freeze({\n resourceId,\n units: positiveSafeInteger(data[resourceId], `${fieldName}.${resourceId}`)\n })\n );\n }\n return Object.freeze(entries);\n}\n\nfunction positiveSafeInteger(value: unknown, fieldName: string): number {\n if (typeof value !== \"number\" || !Number.isSafeInteger(value) || value <= 0) {\n throw new TypeError(`${fieldName} must be a positive safe integer`);\n }\n return value;\n}\n\nfunction admissionPriorityOrDefault(value: unknown, taskId: string): number {\n if (value === undefined) return 0;\n if (typeof value !== \"number\" || !Number.isSafeInteger(value)) {\n throw new TypeError(`task ${taskId}.admissionPriority must be a safe integer`);\n }\n return value;\n}\n\nfunction compareText(left: string, right: string): number {\n if (left < right) return -1;\n if (left > right) return 1;\n return 0;\n}\n"]}
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
import { diagnosticTags } from "../../diagnostic-logging/logger.mjs";
|
|
2
|
+
import { summaryFromSchedulerMeasurement } from "./summary.mjs";
|
|
3
|
+
import { SchedulerPerformanceTiming } from "./timing.mjs";
|
|
4
|
+
import { SchedulerPolicyMeasurement } from "./policy.mjs";
|
|
5
|
+
/**
|
|
6
|
+
* Scheduler-owned, invocation-local lifecycle projection. Clock boundaries and
|
|
7
|
+
* numeric interval accumulation remain private collaborators of this owner.
|
|
8
|
+
*/
|
|
9
|
+
export class SchedulerPerformanceDiagnostics {
|
|
10
|
+
#declarativeFingerprint;
|
|
11
|
+
#logger;
|
|
12
|
+
#timing;
|
|
13
|
+
#lastSettledTaskId;
|
|
14
|
+
#completionTailActiveTaskIds = Object.freeze([]);
|
|
15
|
+
#admittedTaskIds = new Set();
|
|
16
|
+
#chronologyByTaskId = new Map();
|
|
17
|
+
#policyMeasurement = new SchedulerPolicyMeasurement();
|
|
18
|
+
constructor(input, initial) {
|
|
19
|
+
this.#declarativeFingerprint = input.declarativeFingerprint;
|
|
20
|
+
this.#logger = input.logger;
|
|
21
|
+
this.#timing = new SchedulerPerformanceTiming(input.clock, initial);
|
|
22
|
+
}
|
|
23
|
+
measureControlPath(operation) {
|
|
24
|
+
return this.#timing.measureControlPath(operation);
|
|
25
|
+
}
|
|
26
|
+
observeDecision(observation) {
|
|
27
|
+
this.#timing.observeDecision(observation);
|
|
28
|
+
}
|
|
29
|
+
/** Flushes the old state before admission changes the real Scheduler state. */
|
|
30
|
+
beforeAdmission(taskId, runningTaskIds) {
|
|
31
|
+
this.#admittedTaskIds.add(taskId);
|
|
32
|
+
this.#completionTailActiveTaskIds = Object.freeze([...runningTaskIds, taskId]);
|
|
33
|
+
const boundary = this.#timing.boundary();
|
|
34
|
+
if (boundary === undefined)
|
|
35
|
+
return;
|
|
36
|
+
const admissionDelay = this.#timing.takeAdmissionDelay(taskId);
|
|
37
|
+
if (admissionDelay === undefined)
|
|
38
|
+
return this.#timing.invalidate("integral-invalid");
|
|
39
|
+
this.#chronologyByTaskId.set(taskId, {
|
|
40
|
+
admissionDelay,
|
|
41
|
+
admittedAt: boundary,
|
|
42
|
+
settledAt: undefined
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
/** Flushes the old state before blocked/cancelled changes the real Scheduler state. */
|
|
46
|
+
beforePendingSettlement(taskIds = []) {
|
|
47
|
+
const lastTaskId = taskIds.at(-1);
|
|
48
|
+
if (lastTaskId !== undefined)
|
|
49
|
+
this.#lastSettledTaskId = lastTaskId;
|
|
50
|
+
this.#timing.boundary();
|
|
51
|
+
}
|
|
52
|
+
/** Flushes the old running interval before removing the actual running Task. */
|
|
53
|
+
beforeRunningSettlement(taskId) {
|
|
54
|
+
this.#lastSettledTaskId = taskId;
|
|
55
|
+
const boundary = this.#timing.boundary();
|
|
56
|
+
if (boundary === undefined)
|
|
57
|
+
return;
|
|
58
|
+
this.#timing.closeAcceptedWait(boundary);
|
|
59
|
+
const chronology = this.#chronologyByTaskId.get(taskId);
|
|
60
|
+
if (chronology === undefined)
|
|
61
|
+
return this.#timing.invalidate("integral-invalid");
|
|
62
|
+
chronology.settledAt = boundary;
|
|
63
|
+
}
|
|
64
|
+
beforeAcceptedWait() {
|
|
65
|
+
this.#timing.beginAcceptedWait();
|
|
66
|
+
}
|
|
67
|
+
captureState(state) {
|
|
68
|
+
this.#timing.captureState(state);
|
|
69
|
+
}
|
|
70
|
+
rawMeasurement() {
|
|
71
|
+
return this.#measurement(true);
|
|
72
|
+
}
|
|
73
|
+
beginSelectedPolicyAction(taskId) {
|
|
74
|
+
this.#policyMeasurement.beginSelected(taskId, this.#timing.snapshot().totals);
|
|
75
|
+
}
|
|
76
|
+
beginWaitPolicyAction() {
|
|
77
|
+
this.#policyMeasurement.beginWait(this.#timing.snapshot().totals);
|
|
78
|
+
}
|
|
79
|
+
recordEffect(effect) {
|
|
80
|
+
this.#policyMeasurement.recordEffect(effect);
|
|
81
|
+
}
|
|
82
|
+
policyMeasurement() {
|
|
83
|
+
this.#timing.boundary();
|
|
84
|
+
this.#completePolicyAction();
|
|
85
|
+
return this.#policyMeasurement.snapshot(this.#cumulativeMeasurement());
|
|
86
|
+
}
|
|
87
|
+
completePendingActionObservation() {
|
|
88
|
+
this.#timing.boundary();
|
|
89
|
+
this.#completePolicyAction();
|
|
90
|
+
}
|
|
91
|
+
admittedTaskIds() {
|
|
92
|
+
return Object.freeze([...this.#admittedTaskIds]);
|
|
93
|
+
}
|
|
94
|
+
/** Internal default terminal hook; it contains writer failure without runner special-casing. */
|
|
95
|
+
defaultSummaryHook() {
|
|
96
|
+
if (this.#logger === undefined)
|
|
97
|
+
return undefined;
|
|
98
|
+
const logger = this.#logger;
|
|
99
|
+
return (context) => {
|
|
100
|
+
try {
|
|
101
|
+
logger.observe({
|
|
102
|
+
event: "scheduler.summary",
|
|
103
|
+
tags: diagnosticTags("SUMMARY"),
|
|
104
|
+
details: summaryFromSchedulerMeasurement(context.rawMeasurement)
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
catch {
|
|
108
|
+
// Summary writer failure is contained by this hook, not the shared runner.
|
|
109
|
+
}
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
#completePolicyAction() {
|
|
113
|
+
const timing = this.#timing.snapshot();
|
|
114
|
+
this.#policyMeasurement.complete(timing.totals, timing.timing);
|
|
115
|
+
}
|
|
116
|
+
#cumulativeMeasurement() {
|
|
117
|
+
const snapshot = this.#timing.snapshot();
|
|
118
|
+
const facts = Object.freeze({
|
|
119
|
+
declarativeFingerprint: this.#declarativeFingerprint,
|
|
120
|
+
discrete: Object.freeze({
|
|
121
|
+
acceptedWaitCount: snapshot.acceptedWaitCount,
|
|
122
|
+
admittedCount: this.#admittedTaskIds.size,
|
|
123
|
+
maxRunning: snapshot.maxRunning
|
|
124
|
+
}),
|
|
125
|
+
peaks: snapshot.peaks
|
|
126
|
+
});
|
|
127
|
+
if (snapshot.timing.availability === "unavailable") {
|
|
128
|
+
return Object.freeze({ ...facts, timing: snapshot.timing });
|
|
129
|
+
}
|
|
130
|
+
return Object.freeze({
|
|
131
|
+
...facts,
|
|
132
|
+
timing: snapshot.timing,
|
|
133
|
+
timingFacts: Object.freeze({
|
|
134
|
+
acceptedWaitMs: snapshot.acceptedWaitMs,
|
|
135
|
+
effectiveCapacitySlotMs: snapshot.totals.effectiveCapacitySlotMs,
|
|
136
|
+
rootCapacitySlotMs: snapshot.totals.rootCapacitySlotMs,
|
|
137
|
+
taskSlotMs: snapshot.totals.taskSlotMs
|
|
138
|
+
})
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
#measurement(terminal) {
|
|
142
|
+
const endedAt = this.#timing.boundary();
|
|
143
|
+
if (terminal && endedAt !== undefined)
|
|
144
|
+
this.#timing.closeAcceptedWait(endedAt);
|
|
145
|
+
const snapshot = this.#timing.snapshot();
|
|
146
|
+
const facts = Object.freeze({
|
|
147
|
+
declarativeFingerprint: this.#declarativeFingerprint,
|
|
148
|
+
discrete: Object.freeze({
|
|
149
|
+
acceptedWaitCount: snapshot.acceptedWaitCount,
|
|
150
|
+
admittedCount: this.#admittedTaskIds.size,
|
|
151
|
+
completionTailActiveTaskIds: Object.freeze([...this.#completionTailActiveTaskIds]),
|
|
152
|
+
lastSettledTaskId: this.#lastSettledTaskId ?? null,
|
|
153
|
+
maxRunning: snapshot.maxRunning
|
|
154
|
+
}),
|
|
155
|
+
peaks: snapshot.peaks
|
|
156
|
+
});
|
|
157
|
+
if (snapshot.timing.availability === "unavailable") {
|
|
158
|
+
return Object.freeze({ ...facts, timing: snapshot.timing });
|
|
159
|
+
}
|
|
160
|
+
if (endedAt === undefined)
|
|
161
|
+
throw new Error("available Scheduler timing has no terminal boundary");
|
|
162
|
+
return Object.freeze({
|
|
163
|
+
...facts,
|
|
164
|
+
timing: snapshot.timing,
|
|
165
|
+
timingFacts: Object.freeze({
|
|
166
|
+
acceptedWaitMs: snapshot.acceptedWaitMs,
|
|
167
|
+
admissions: Object.freeze(this.#admissionMeasurements()),
|
|
168
|
+
effectiveCapacitySlotMs: snapshot.totals.effectiveCapacitySlotMs,
|
|
169
|
+
endedAtMonotonicMs: endedAt,
|
|
170
|
+
rootCapacitySlotMs: snapshot.totals.rootCapacitySlotMs,
|
|
171
|
+
schedulerControlPathMs: snapshot.schedulerControlPathMs,
|
|
172
|
+
schedulerDecisionObservationMs: snapshot.decisionObservationMs,
|
|
173
|
+
startedAtMonotonicMs: snapshot.startedAtMonotonicMs ?? endedAt,
|
|
174
|
+
taskSlotMs: snapshot.totals.taskSlotMs
|
|
175
|
+
})
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
#admissionMeasurements() {
|
|
179
|
+
const pendingByTaskId = new Map(this.#timing
|
|
180
|
+
.pendingAdmissionDelays()
|
|
181
|
+
.map(({ admissionDelay, taskId }) => [taskId, admissionDelay]));
|
|
182
|
+
const taskIds = new Set([...pendingByTaskId.keys(), ...this.#chronologyByTaskId.keys()]);
|
|
183
|
+
return [...taskIds]
|
|
184
|
+
.map((taskId) => this.#admissionMeasurement(taskId, pendingByTaskId))
|
|
185
|
+
.sort((left, right) => compareText(left.taskId, right.taskId));
|
|
186
|
+
}
|
|
187
|
+
#admissionMeasurement(taskId, pendingByTaskId) {
|
|
188
|
+
const chronology = this.#chronologyByTaskId.get(taskId);
|
|
189
|
+
const admissionDelay = chronology?.admissionDelay ?? pendingByTaskId.get(taskId);
|
|
190
|
+
if (admissionDelay === undefined)
|
|
191
|
+
throw new Error(`missing admission measurement for ${taskId}`);
|
|
192
|
+
return Object.freeze({
|
|
193
|
+
admissionDelay,
|
|
194
|
+
admittedAtMonotonicMs: chronology?.admittedAt ?? null,
|
|
195
|
+
settledAtMonotonicMs: chronology?.settledAt ?? null,
|
|
196
|
+
taskId
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
function compareText(left, right) {
|
|
201
|
+
if (left < right)
|
|
202
|
+
return -1;
|
|
203
|
+
if (left > right)
|
|
204
|
+
return 1;
|
|
205
|
+
return 0;
|
|
206
|
+
}
|
|
207
|
+
//# sourceMappingURL=diagnostics.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diagnostics.mjs","sourceRoot":"","sources":["../../../../../src/project-run/task-scheduler/measurement/diagnostics.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n AdmissionPolicyMeasurement,\n SchedulerDecisionMeasurementCumulative,\n SchedulerMeasurementAdmission,\n SchedulerMeasurementEffect,\n SchedulerMeasurementHook,\n SchedulerRawMeasurement\n} from \"../../../project-definition/project-definition.ts\";\nimport { diagnosticTags, type DiagnosticLogger } from \"../../diagnostic-logging/logger.ts\";\nimport type { AdmissionDelayBreakdown } from \"./integrals.ts\";\nimport { summaryFromSchedulerMeasurement } from \"./summary.ts\";\nimport { SchedulerPerformanceTiming } from \"./timing.ts\";\nimport { SchedulerPolicyMeasurement } from \"./policy.ts\";\n\n/** Explicit, enabled-only private handoff; the Scheduler never infers this from logger behavior. */\nexport type SchedulerPerformanceDiagnosticsInput = Readonly<{\n readonly clock: Readonly<{ now(): number }>;\n readonly declarativeFingerprint: string;\n readonly logger?: DiagnosticLogger;\n}>;\n\ntype AdmissionChronology = {\n readonly admissionDelay: AdmissionDelayBreakdown;\n readonly admittedAt: number;\n settledAt: number | undefined;\n};\n\nexport type AdmissionViablePendingTask = Readonly<{\n readonly kind: \"admissible-pending\" | \"capacity-blocked\" | \"mutex-blocked\";\n readonly taskId: string;\n}>;\n\nexport type SchedulerPerformanceState = Readonly<{\n readonly admissionViablePendingTasks: readonly AdmissionViablePendingTask[];\n readonly effectiveMaxParallel: number;\n readonly rootMaxParallel: number;\n readonly running: number;\n}>;\n\n/**\n * Scheduler-owned, invocation-local lifecycle projection. Clock boundaries and\n * numeric interval accumulation remain private collaborators of this owner.\n */\nexport class SchedulerPerformanceDiagnostics {\n readonly #declarativeFingerprint: string;\n readonly #logger: DiagnosticLogger | undefined;\n readonly #timing: SchedulerPerformanceTiming;\n #lastSettledTaskId: string | undefined;\n #completionTailActiveTaskIds: readonly string[] = Object.freeze([]);\n readonly #admittedTaskIds = new Set<string>();\n readonly #chronologyByTaskId = new Map<string, AdmissionChronology>();\n readonly #policyMeasurement = new SchedulerPolicyMeasurement();\n\n public constructor(\n input: SchedulerPerformanceDiagnosticsInput,\n initial: SchedulerPerformanceState\n ) {\n this.#declarativeFingerprint = input.declarativeFingerprint;\n this.#logger = input.logger;\n this.#timing = new SchedulerPerformanceTiming(input.clock, initial);\n }\n\n public measureControlPath<T>(operation: () => T): T {\n return this.#timing.measureControlPath(operation);\n }\n\n public observeDecision(observation: () => void): void {\n this.#timing.observeDecision(observation);\n }\n\n /** Flushes the old state before admission changes the real Scheduler state. */\n public beforeAdmission(taskId: string, runningTaskIds: readonly string[]): void {\n this.#admittedTaskIds.add(taskId);\n this.#completionTailActiveTaskIds = Object.freeze([...runningTaskIds, taskId]);\n const boundary = this.#timing.boundary();\n if (boundary === undefined) return;\n const admissionDelay = this.#timing.takeAdmissionDelay(taskId);\n if (admissionDelay === undefined) return this.#timing.invalidate(\"integral-invalid\");\n this.#chronologyByTaskId.set(taskId, {\n admissionDelay,\n admittedAt: boundary,\n settledAt: undefined\n });\n }\n\n /** Flushes the old state before blocked/cancelled changes the real Scheduler state. */\n public beforePendingSettlement(taskIds: readonly string[] = []): void {\n const lastTaskId = taskIds.at(-1);\n if (lastTaskId !== undefined) this.#lastSettledTaskId = lastTaskId;\n this.#timing.boundary();\n }\n\n /** Flushes the old running interval before removing the actual running Task. */\n public beforeRunningSettlement(taskId: string): void {\n this.#lastSettledTaskId = taskId;\n const boundary = this.#timing.boundary();\n if (boundary === undefined) return;\n this.#timing.closeAcceptedWait(boundary);\n const chronology = this.#chronologyByTaskId.get(taskId);\n if (chronology === undefined) return this.#timing.invalidate(\"integral-invalid\");\n chronology.settledAt = boundary;\n }\n\n public beforeAcceptedWait(): void {\n this.#timing.beginAcceptedWait();\n }\n\n public captureState(state: SchedulerPerformanceState): void {\n this.#timing.captureState(state);\n }\n\n public rawMeasurement(): SchedulerRawMeasurement {\n return this.#measurement(true);\n }\n\n public beginSelectedPolicyAction(taskId: string): void {\n this.#policyMeasurement.beginSelected(taskId, this.#timing.snapshot().totals);\n }\n\n public beginWaitPolicyAction(): void {\n this.#policyMeasurement.beginWait(this.#timing.snapshot().totals);\n }\n\n public recordEffect(effect: SchedulerMeasurementEffect): void {\n this.#policyMeasurement.recordEffect(effect);\n }\n\n public policyMeasurement(): AdmissionPolicyMeasurement {\n this.#timing.boundary();\n this.#completePolicyAction();\n return this.#policyMeasurement.snapshot(this.#cumulativeMeasurement());\n }\n\n public completePendingActionObservation(): void {\n this.#timing.boundary();\n this.#completePolicyAction();\n }\n\n public admittedTaskIds(): readonly string[] {\n return Object.freeze([...this.#admittedTaskIds]);\n }\n\n /** Internal default terminal hook; it contains writer failure without runner special-casing. */\n public defaultSummaryHook(): SchedulerMeasurementHook | undefined {\n if (this.#logger === undefined) return undefined;\n const logger = this.#logger;\n return (context) => {\n try {\n logger.observe({\n event: \"scheduler.summary\",\n tags: diagnosticTags(\"SUMMARY\"),\n details: summaryFromSchedulerMeasurement(context.rawMeasurement)\n });\n } catch {\n // Summary writer failure is contained by this hook, not the shared runner.\n }\n };\n }\n\n #completePolicyAction(): void {\n const timing = this.#timing.snapshot();\n this.#policyMeasurement.complete(timing.totals, timing.timing);\n }\n\n #cumulativeMeasurement(): SchedulerDecisionMeasurementCumulative {\n const snapshot = this.#timing.snapshot();\n const facts = Object.freeze({\n declarativeFingerprint: this.#declarativeFingerprint,\n discrete: Object.freeze({\n acceptedWaitCount: snapshot.acceptedWaitCount,\n admittedCount: this.#admittedTaskIds.size,\n maxRunning: snapshot.maxRunning\n }),\n peaks: snapshot.peaks\n });\n if (snapshot.timing.availability === \"unavailable\") {\n return Object.freeze({ ...facts, timing: snapshot.timing });\n }\n return Object.freeze({\n ...facts,\n timing: snapshot.timing,\n timingFacts: Object.freeze({\n acceptedWaitMs: snapshot.acceptedWaitMs,\n effectiveCapacitySlotMs: snapshot.totals.effectiveCapacitySlotMs,\n rootCapacitySlotMs: snapshot.totals.rootCapacitySlotMs,\n taskSlotMs: snapshot.totals.taskSlotMs\n })\n });\n }\n\n #measurement(terminal: boolean): SchedulerRawMeasurement {\n const endedAt = this.#timing.boundary();\n if (terminal && endedAt !== undefined) this.#timing.closeAcceptedWait(endedAt);\n const snapshot = this.#timing.snapshot();\n const facts = Object.freeze({\n declarativeFingerprint: this.#declarativeFingerprint,\n discrete: Object.freeze({\n acceptedWaitCount: snapshot.acceptedWaitCount,\n admittedCount: this.#admittedTaskIds.size,\n completionTailActiveTaskIds: Object.freeze([...this.#completionTailActiveTaskIds]),\n lastSettledTaskId: this.#lastSettledTaskId ?? null,\n maxRunning: snapshot.maxRunning\n }),\n peaks: snapshot.peaks\n });\n if (snapshot.timing.availability === \"unavailable\") {\n return Object.freeze({ ...facts, timing: snapshot.timing });\n }\n if (endedAt === undefined)\n throw new Error(\"available Scheduler timing has no terminal boundary\");\n return Object.freeze({\n ...facts,\n timing: snapshot.timing,\n timingFacts: Object.freeze({\n acceptedWaitMs: snapshot.acceptedWaitMs,\n admissions: Object.freeze(this.#admissionMeasurements()),\n effectiveCapacitySlotMs: snapshot.totals.effectiveCapacitySlotMs,\n endedAtMonotonicMs: endedAt,\n rootCapacitySlotMs: snapshot.totals.rootCapacitySlotMs,\n schedulerControlPathMs: snapshot.schedulerControlPathMs,\n schedulerDecisionObservationMs: snapshot.decisionObservationMs,\n startedAtMonotonicMs: snapshot.startedAtMonotonicMs ?? endedAt,\n taskSlotMs: snapshot.totals.taskSlotMs\n })\n });\n }\n\n #admissionMeasurements(): SchedulerMeasurementAdmission[] {\n const pendingByTaskId = new Map(\n this.#timing\n .pendingAdmissionDelays()\n .map(({ admissionDelay, taskId }) => [taskId, admissionDelay])\n );\n const taskIds = new Set([...pendingByTaskId.keys(), ...this.#chronologyByTaskId.keys()]);\n return [...taskIds]\n .map((taskId) => this.#admissionMeasurement(taskId, pendingByTaskId))\n .sort((left, right) => compareText(left.taskId, right.taskId));\n }\n\n #admissionMeasurement(\n taskId: string,\n pendingByTaskId: ReadonlyMap<string, AdmissionDelayBreakdown>\n ): SchedulerMeasurementAdmission {\n const chronology = this.#chronologyByTaskId.get(taskId);\n const admissionDelay = chronology?.admissionDelay ?? pendingByTaskId.get(taskId);\n if (admissionDelay === undefined)\n throw new Error(`missing admission measurement for ${taskId}`);\n return Object.freeze({\n admissionDelay,\n admittedAtMonotonicMs: chronology?.admittedAt ?? null,\n settledAtMonotonicMs: chronology?.settledAt ?? null,\n taskId\n });\n }\n}\n\nfunction compareText(left: string, right: string): number {\n if (left < right) return -1;\n if (left > right) return 1;\n return 0;\n}\n"]}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
/** Accumulates interval-weighted capacity and admission-delay measurements. */
|
|
2
|
+
export class SchedulerPerformanceIntegrals {
|
|
3
|
+
#taskSlotMs = 0;
|
|
4
|
+
#rootCapacitySlotMs = 0;
|
|
5
|
+
#effectiveCapacitySlotMs = 0;
|
|
6
|
+
#mutexBlockedTaskMs = 0;
|
|
7
|
+
#capacityBlockedTaskMs = 0;
|
|
8
|
+
#admissiblePendingTaskMs = 0;
|
|
9
|
+
#peakAdmissionViablePendingTaskCount = 0;
|
|
10
|
+
#peakMutexBlockedTaskCount = 0;
|
|
11
|
+
#peakCapacityBlockedTaskCount = 0;
|
|
12
|
+
#peakAdmissiblePendingTaskCount = 0;
|
|
13
|
+
#admissionDelayByTaskId = new Map();
|
|
14
|
+
installPendingProjection(pendingTasks, timingAvailable) {
|
|
15
|
+
this.#peakAdmissionViablePendingTaskCount = Math.max(this.#peakAdmissionViablePendingTaskCount, pendingTasks.length);
|
|
16
|
+
this.#peakMutexBlockedTaskCount = Math.max(this.#peakMutexBlockedTaskCount, pendingCount(pendingTasks, "mutex-blocked"));
|
|
17
|
+
this.#peakCapacityBlockedTaskCount = Math.max(this.#peakCapacityBlockedTaskCount, pendingCount(pendingTasks, "capacity-blocked"));
|
|
18
|
+
this.#peakAdmissiblePendingTaskCount = Math.max(this.#peakAdmissiblePendingTaskCount, pendingCount(pendingTasks, "admissible-pending"));
|
|
19
|
+
if (!timingAvailable)
|
|
20
|
+
return;
|
|
21
|
+
for (const pendingTask of pendingTasks) {
|
|
22
|
+
if (this.#admissionDelayByTaskId.has(pendingTask.taskId))
|
|
23
|
+
continue;
|
|
24
|
+
this.#admissionDelayByTaskId.set(pendingTask.taskId, {
|
|
25
|
+
admissiblePendingMs: 0,
|
|
26
|
+
capacityBlockedMs: 0,
|
|
27
|
+
mutexBlockedMs: 0
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
/** Returns false when an interval cannot be represented as finite non-negative totals. */
|
|
32
|
+
addInterval(elapsedMs, state) {
|
|
33
|
+
const contribution = intervalContribution(elapsedMs, state);
|
|
34
|
+
if (contribution === undefined)
|
|
35
|
+
return false;
|
|
36
|
+
this.#taskSlotMs += contribution.taskSlotMs;
|
|
37
|
+
this.#rootCapacitySlotMs += contribution.rootCapacitySlotMs;
|
|
38
|
+
this.#effectiveCapacitySlotMs += contribution.effectiveCapacitySlotMs;
|
|
39
|
+
this.#mutexBlockedTaskMs += contribution.mutexBlockedTaskMs;
|
|
40
|
+
this.#capacityBlockedTaskMs += contribution.capacityBlockedTaskMs;
|
|
41
|
+
this.#admissiblePendingTaskMs += contribution.admissiblePendingTaskMs;
|
|
42
|
+
if (!finiteContribution(this.totals()))
|
|
43
|
+
return false;
|
|
44
|
+
return this.#addAdmissionDelay(elapsedMs, state.admissionViablePendingTasks);
|
|
45
|
+
}
|
|
46
|
+
takeAdmissionDelay(taskId) {
|
|
47
|
+
const delay = this.#admissionDelayByTaskId.get(taskId);
|
|
48
|
+
if (delay === undefined)
|
|
49
|
+
return undefined;
|
|
50
|
+
this.#admissionDelayByTaskId.delete(taskId);
|
|
51
|
+
return Object.freeze({ ...delay });
|
|
52
|
+
}
|
|
53
|
+
pendingAdmissionDelays() {
|
|
54
|
+
return Object.freeze([...this.#admissionDelayByTaskId].map(([taskId, admissionDelay]) => Object.freeze({ admissionDelay: Object.freeze({ ...admissionDelay }), taskId })));
|
|
55
|
+
}
|
|
56
|
+
peaks() {
|
|
57
|
+
return Object.freeze({
|
|
58
|
+
admissionViablePendingTaskCount: this.#peakAdmissionViablePendingTaskCount,
|
|
59
|
+
admissiblePendingTaskCount: this.#peakAdmissiblePendingTaskCount,
|
|
60
|
+
capacityBlockedTaskCount: this.#peakCapacityBlockedTaskCount,
|
|
61
|
+
mutexBlockedTaskCount: this.#peakMutexBlockedTaskCount
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
totals() {
|
|
65
|
+
return Object.freeze({
|
|
66
|
+
admissiblePendingTaskMs: this.#admissiblePendingTaskMs,
|
|
67
|
+
acceptedWaitMs: 0,
|
|
68
|
+
capacityBlockedTaskMs: this.#capacityBlockedTaskMs,
|
|
69
|
+
effectiveCapacitySlotMs: this.#effectiveCapacitySlotMs,
|
|
70
|
+
mutexBlockedTaskMs: this.#mutexBlockedTaskMs,
|
|
71
|
+
rootCapacitySlotMs: this.#rootCapacitySlotMs,
|
|
72
|
+
taskSlotMs: this.#taskSlotMs
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
#addAdmissionDelay(elapsedMs, pendingTasks) {
|
|
76
|
+
for (const pendingTask of pendingTasks) {
|
|
77
|
+
const delay = this.#admissionDelayByTaskId.get(pendingTask.taskId);
|
|
78
|
+
if (delay === undefined)
|
|
79
|
+
continue;
|
|
80
|
+
addDelay(delay, pendingTask.kind, elapsedMs);
|
|
81
|
+
if (!finiteAdmissionDelay(delay))
|
|
82
|
+
return false;
|
|
83
|
+
}
|
|
84
|
+
return true;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
function intervalContribution(elapsedMs, state) {
|
|
88
|
+
const contribution = Object.freeze({
|
|
89
|
+
admissiblePendingTaskMs: elapsedMs * pendingCount(state.admissionViablePendingTasks, "admissible-pending"),
|
|
90
|
+
acceptedWaitMs: 0,
|
|
91
|
+
capacityBlockedTaskMs: elapsedMs * pendingCount(state.admissionViablePendingTasks, "capacity-blocked"),
|
|
92
|
+
effectiveCapacitySlotMs: elapsedMs * state.effectiveMaxParallel,
|
|
93
|
+
mutexBlockedTaskMs: elapsedMs * pendingCount(state.admissionViablePendingTasks, "mutex-blocked"),
|
|
94
|
+
rootCapacitySlotMs: elapsedMs * state.rootMaxParallel,
|
|
95
|
+
taskSlotMs: elapsedMs * state.running
|
|
96
|
+
});
|
|
97
|
+
return finiteContribution(contribution) ? contribution : undefined;
|
|
98
|
+
}
|
|
99
|
+
function finiteContribution(contribution) {
|
|
100
|
+
return Object.values(contribution).every((value) => Number.isFinite(value) && value >= 0);
|
|
101
|
+
}
|
|
102
|
+
function addDelay(delay, kind, elapsedMs) {
|
|
103
|
+
if (kind === "mutex-blocked")
|
|
104
|
+
delay.mutexBlockedMs += elapsedMs;
|
|
105
|
+
if (kind === "capacity-blocked")
|
|
106
|
+
delay.capacityBlockedMs += elapsedMs;
|
|
107
|
+
if (kind === "admissible-pending")
|
|
108
|
+
delay.admissiblePendingMs += elapsedMs;
|
|
109
|
+
}
|
|
110
|
+
function finiteAdmissionDelay(delay) {
|
|
111
|
+
return Object.values(delay).every((value) => Number.isFinite(value) && value >= 0);
|
|
112
|
+
}
|
|
113
|
+
function pendingCount(pendingTasks, kind) {
|
|
114
|
+
return pendingTasks.filter((task) => task.kind === kind).length;
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=integrals.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"integrals.mjs","sourceRoot":"","sources":["../../../../../src/project-run/task-scheduler/measurement/integrals.ts"],"names":[],"mappings":"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","sourcesContent":["import type { SchedulerMeasurementIntervalContribution } from \"../../../project-definition/project-definition.ts\";\nimport type { AdmissionViablePendingTask, SchedulerPerformanceState } from \"./diagnostics.ts\";\n\nexport type AdmissionDelayBreakdown = Readonly<{\n readonly admissiblePendingMs: number;\n readonly capacityBlockedMs: number;\n readonly mutexBlockedMs: number;\n}>;\n\ntype MutableAdmissionDelayBreakdown = {\n admissiblePendingMs: number;\n capacityBlockedMs: number;\n mutexBlockedMs: number;\n};\n\nexport type SchedulerPerformancePeaks = Readonly<{\n readonly admissionViablePendingTaskCount: number;\n readonly admissiblePendingTaskCount: number;\n readonly capacityBlockedTaskCount: number;\n readonly mutexBlockedTaskCount: number;\n}>;\n\n/** Accumulates interval-weighted capacity and admission-delay measurements. */\nexport class SchedulerPerformanceIntegrals {\n #taskSlotMs = 0;\n #rootCapacitySlotMs = 0;\n #effectiveCapacitySlotMs = 0;\n #mutexBlockedTaskMs = 0;\n #capacityBlockedTaskMs = 0;\n #admissiblePendingTaskMs = 0;\n #peakAdmissionViablePendingTaskCount = 0;\n #peakMutexBlockedTaskCount = 0;\n #peakCapacityBlockedTaskCount = 0;\n #peakAdmissiblePendingTaskCount = 0;\n readonly #admissionDelayByTaskId = new Map<string, MutableAdmissionDelayBreakdown>();\n\n public installPendingProjection(\n pendingTasks: readonly AdmissionViablePendingTask[],\n timingAvailable: boolean\n ): void {\n this.#peakAdmissionViablePendingTaskCount = Math.max(\n this.#peakAdmissionViablePendingTaskCount,\n pendingTasks.length\n );\n this.#peakMutexBlockedTaskCount = Math.max(\n this.#peakMutexBlockedTaskCount,\n pendingCount(pendingTasks, \"mutex-blocked\")\n );\n this.#peakCapacityBlockedTaskCount = Math.max(\n this.#peakCapacityBlockedTaskCount,\n pendingCount(pendingTasks, \"capacity-blocked\")\n );\n this.#peakAdmissiblePendingTaskCount = Math.max(\n this.#peakAdmissiblePendingTaskCount,\n pendingCount(pendingTasks, \"admissible-pending\")\n );\n if (!timingAvailable) return;\n for (const pendingTask of pendingTasks) {\n if (this.#admissionDelayByTaskId.has(pendingTask.taskId)) continue;\n this.#admissionDelayByTaskId.set(pendingTask.taskId, {\n admissiblePendingMs: 0,\n capacityBlockedMs: 0,\n mutexBlockedMs: 0\n });\n }\n }\n\n /** Returns false when an interval cannot be represented as finite non-negative totals. */\n public addInterval(elapsedMs: number, state: SchedulerPerformanceState): boolean {\n const contribution = intervalContribution(elapsedMs, state);\n if (contribution === undefined) return false;\n this.#taskSlotMs += contribution.taskSlotMs;\n this.#rootCapacitySlotMs += contribution.rootCapacitySlotMs;\n this.#effectiveCapacitySlotMs += contribution.effectiveCapacitySlotMs;\n this.#mutexBlockedTaskMs += contribution.mutexBlockedTaskMs;\n this.#capacityBlockedTaskMs += contribution.capacityBlockedTaskMs;\n this.#admissiblePendingTaskMs += contribution.admissiblePendingTaskMs;\n if (!finiteContribution(this.totals())) return false;\n return this.#addAdmissionDelay(elapsedMs, state.admissionViablePendingTasks);\n }\n\n public takeAdmissionDelay(taskId: string): AdmissionDelayBreakdown | undefined {\n const delay = this.#admissionDelayByTaskId.get(taskId);\n if (delay === undefined) return undefined;\n this.#admissionDelayByTaskId.delete(taskId);\n return Object.freeze({ ...delay });\n }\n\n public pendingAdmissionDelays(): readonly Readonly<{\n readonly admissionDelay: AdmissionDelayBreakdown;\n readonly taskId: string;\n }>[] {\n return Object.freeze(\n [...this.#admissionDelayByTaskId].map(([taskId, admissionDelay]) =>\n Object.freeze({ admissionDelay: Object.freeze({ ...admissionDelay }), taskId })\n )\n );\n }\n\n public peaks(): SchedulerPerformancePeaks {\n return Object.freeze({\n admissionViablePendingTaskCount: this.#peakAdmissionViablePendingTaskCount,\n admissiblePendingTaskCount: this.#peakAdmissiblePendingTaskCount,\n capacityBlockedTaskCount: this.#peakCapacityBlockedTaskCount,\n mutexBlockedTaskCount: this.#peakMutexBlockedTaskCount\n });\n }\n\n public totals(): SchedulerMeasurementIntervalContribution {\n return Object.freeze({\n admissiblePendingTaskMs: this.#admissiblePendingTaskMs,\n acceptedWaitMs: 0,\n capacityBlockedTaskMs: this.#capacityBlockedTaskMs,\n effectiveCapacitySlotMs: this.#effectiveCapacitySlotMs,\n mutexBlockedTaskMs: this.#mutexBlockedTaskMs,\n rootCapacitySlotMs: this.#rootCapacitySlotMs,\n taskSlotMs: this.#taskSlotMs\n });\n }\n\n #addAdmissionDelay(\n elapsedMs: number,\n pendingTasks: readonly AdmissionViablePendingTask[]\n ): boolean {\n for (const pendingTask of pendingTasks) {\n const delay = this.#admissionDelayByTaskId.get(pendingTask.taskId);\n if (delay === undefined) continue;\n addDelay(delay, pendingTask.kind, elapsedMs);\n if (!finiteAdmissionDelay(delay)) return false;\n }\n return true;\n }\n}\n\nfunction intervalContribution(\n elapsedMs: number,\n state: SchedulerPerformanceState\n): SchedulerMeasurementIntervalContribution | undefined {\n const contribution = Object.freeze({\n admissiblePendingTaskMs:\n elapsedMs * pendingCount(state.admissionViablePendingTasks, \"admissible-pending\"),\n acceptedWaitMs: 0,\n capacityBlockedTaskMs:\n elapsedMs * pendingCount(state.admissionViablePendingTasks, \"capacity-blocked\"),\n effectiveCapacitySlotMs: elapsedMs * state.effectiveMaxParallel,\n mutexBlockedTaskMs:\n elapsedMs * pendingCount(state.admissionViablePendingTasks, \"mutex-blocked\"),\n rootCapacitySlotMs: elapsedMs * state.rootMaxParallel,\n taskSlotMs: elapsedMs * state.running\n });\n return finiteContribution(contribution) ? contribution : undefined;\n}\n\nfunction finiteContribution(contribution: SchedulerMeasurementIntervalContribution): boolean {\n return Object.values(contribution).every((value) => Number.isFinite(value) && value >= 0);\n}\n\nfunction addDelay(\n delay: MutableAdmissionDelayBreakdown,\n kind: AdmissionViablePendingTask[\"kind\"],\n elapsedMs: number\n): void {\n if (kind === \"mutex-blocked\") delay.mutexBlockedMs += elapsedMs;\n if (kind === \"capacity-blocked\") delay.capacityBlockedMs += elapsedMs;\n if (kind === \"admissible-pending\") delay.admissiblePendingMs += elapsedMs;\n}\n\nfunction finiteAdmissionDelay(delay: MutableAdmissionDelayBreakdown): boolean {\n return Object.values(delay).every((value) => Number.isFinite(value) && value >= 0);\n}\n\nfunction pendingCount(\n pendingTasks: readonly AdmissionViablePendingTask[],\n kind: AdmissionViablePendingTask[\"kind\"]\n): number {\n return pendingTasks.filter((task) => task.kind === kind).length;\n}\n"]}
|