@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
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
import { compileAdmissionGraphInput } from "./input.mjs";
|
|
2
|
+
import { catalogForCore, inspectionForCore, schedulerInspectionForCore } from "./projection.mjs";
|
|
3
|
+
import { admitTaskForCore, createAdmissionCoreFromSchedulerSnapshot, createInitialAdmissionCoreState, nextForcedTaskForCore, settleForcedTaskForCore, settleTaskForCore } from "./selection.mjs";
|
|
4
|
+
import { admissionCandidatesForCore, isCoreComplete, requiredTaskForCore, requiredTaskSlotForCore, scopeToActivateForCore, selectionRejectionForPendingTask, statusForCore } from "./selection-query.mjs";
|
|
5
|
+
export { compilePreparedAdmissionGraph } from "./compiled-graph.mjs";
|
|
6
|
+
export { admissionCandidatesForCore, createAdmissionCoreFromSchedulerSnapshot, createInitialAdmissionCoreState, schedulerInspectionForCore, scopeToActivateForCore };
|
|
7
|
+
/** 在 exact boundary validation 和一次 static compile 后创建 standalone public factory。 */
|
|
8
|
+
export function createAdmissionGraph(input) {
|
|
9
|
+
const compiled = compileAdmissionGraphInput(input);
|
|
10
|
+
return Object.freeze({
|
|
11
|
+
initialState: Object.freeze(function initialState() {
|
|
12
|
+
return admissionStateForCore(createInitialAdmissionCoreState(compiled));
|
|
13
|
+
})
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
/** The canonical select action used by both the public opaque handle and the real shell. */
|
|
17
|
+
export function selectAdmissionCore(state, taskId) {
|
|
18
|
+
const validation = validateAdmissionCoreSelection(state, taskId);
|
|
19
|
+
if (!validation.accepted)
|
|
20
|
+
return Object.freeze({ accepted: false, reason: validation.reason });
|
|
21
|
+
const next = admitTaskForCore(state, requiredTaskSlotForCore(state, taskId));
|
|
22
|
+
return Object.freeze({
|
|
23
|
+
accepted: true,
|
|
24
|
+
transition: freezeTransition(next, [Object.freeze({ kind: "admitted", taskId })], [next])
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
/** The public binary settlement action. Runtime outcome validation intentionally precedes ID checks. */
|
|
28
|
+
export function settleAdmissionCore(state, taskId, outcome) {
|
|
29
|
+
if (outcome !== "satisfied" && outcome !== "unsatisfied") {
|
|
30
|
+
return Object.freeze({
|
|
31
|
+
accepted: false,
|
|
32
|
+
reason: Object.freeze({ kind: "invalid-settlement-outcome" })
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
return settleRunningAdmissionCore(state, taskId, outcome === "satisfied" ? "completed" : "prerequisite-unsatisfied");
|
|
36
|
+
}
|
|
37
|
+
/** Applies a real running Task settlement through the same reducer, retaining private exact kinds. */
|
|
38
|
+
export function settleRunningAdmissionCore(state, taskId, settlementKind) {
|
|
39
|
+
if (isCoreComplete(state)) {
|
|
40
|
+
return Object.freeze({ accepted: false, reason: Object.freeze({ kind: "state-complete" }) });
|
|
41
|
+
}
|
|
42
|
+
const taskSlot = state.compiled.taskSlotsById.get(taskId);
|
|
43
|
+
if (taskSlot === undefined) {
|
|
44
|
+
return Object.freeze({ accepted: false, reason: Object.freeze({ kind: "unknown-task" }) });
|
|
45
|
+
}
|
|
46
|
+
const status = statusForCore(state, taskSlot);
|
|
47
|
+
if (status.kind !== "running") {
|
|
48
|
+
return Object.freeze({
|
|
49
|
+
accepted: false,
|
|
50
|
+
reason: Object.freeze({
|
|
51
|
+
kind: "not-running",
|
|
52
|
+
status: status.kind === "pending" ? "pending" : "settled"
|
|
53
|
+
})
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
const settled = settleTaskForCore(state, taskSlot, settlementKind);
|
|
57
|
+
const directEffect = Object.freeze({ kind: "settled", settlementKind, taskId });
|
|
58
|
+
return Object.freeze({
|
|
59
|
+
accepted: true,
|
|
60
|
+
transition: reconcileForcedBlocks(settled, [directEffect], [settled])
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
/** Private cancellation stays in the reducer/effect owner but has no public AdmissionState action. */
|
|
64
|
+
export function cancelPendingAdmissionCore(state) {
|
|
65
|
+
let next = state;
|
|
66
|
+
const effects = [];
|
|
67
|
+
const effectStates = [];
|
|
68
|
+
for (const [slot, task] of state.compiled.graph.tasks.entries()) {
|
|
69
|
+
if (statusForCore(next, slot).kind !== "pending")
|
|
70
|
+
continue;
|
|
71
|
+
next = settleTaskForCore(next, slot, "cancelled-before-start");
|
|
72
|
+
effects.push(Object.freeze({ kind: "settled", settlementKind: "cancelled-before-start", taskId: task.id }));
|
|
73
|
+
effectStates.push(next);
|
|
74
|
+
}
|
|
75
|
+
return freezeTransition(next, effects, effectStates);
|
|
76
|
+
}
|
|
77
|
+
/** Reconciles forced dependency blocks before the real shell publishes its next decision boundary. */
|
|
78
|
+
export function reconcileAdmissionCore(state) {
|
|
79
|
+
return reconcileForcedBlocks(state, [], []);
|
|
80
|
+
}
|
|
81
|
+
export function validateAdmissionCoreSelection(state, taskId) {
|
|
82
|
+
if (isCoreComplete(state))
|
|
83
|
+
return rejectedValidation(Object.freeze({ kind: "state-complete" }));
|
|
84
|
+
const taskSlot = state.compiled.taskSlotsById.get(taskId);
|
|
85
|
+
if (taskSlot === undefined)
|
|
86
|
+
return rejectedValidation(Object.freeze({ kind: "unknown-task" }));
|
|
87
|
+
const status = statusForCore(state, taskSlot);
|
|
88
|
+
if (status.kind !== "pending") {
|
|
89
|
+
return rejectedValidation(Object.freeze({
|
|
90
|
+
kind: "not-pending",
|
|
91
|
+
status: status.kind === "running" ? "running" : "settled"
|
|
92
|
+
}));
|
|
93
|
+
}
|
|
94
|
+
const reason = selectionRejectionForPendingTask(state, taskSlot);
|
|
95
|
+
return reason === undefined ? ACCEPTED_SELECTION : rejectedValidation(reason);
|
|
96
|
+
}
|
|
97
|
+
/** Constructs the frozen opaque public wrapper. Projection work remains lazy until its getter is read. */
|
|
98
|
+
export function admissionStateForCore(core) {
|
|
99
|
+
const select = Object.freeze(function select(taskId) {
|
|
100
|
+
const selection = selectAdmissionCore(core, taskId);
|
|
101
|
+
return selection.accepted
|
|
102
|
+
? Object.freeze({ accepted: true, state: admissionStateForCore(selection.transition.state) })
|
|
103
|
+
: Object.freeze({ accepted: false, reason: selection.reason });
|
|
104
|
+
});
|
|
105
|
+
const settle = Object.freeze(function settle(taskId, outcome) {
|
|
106
|
+
const settlement = settleAdmissionCore(core, taskId, outcome);
|
|
107
|
+
return settlement.accepted
|
|
108
|
+
? Object.freeze({ accepted: true, state: admissionStateForCore(settlement.transition.state) })
|
|
109
|
+
: Object.freeze({ accepted: false, reason: settlement.reason });
|
|
110
|
+
});
|
|
111
|
+
const validateSelection = Object.freeze(function validateSelection(taskId) {
|
|
112
|
+
return validateAdmissionCoreSelection(core, taskId);
|
|
113
|
+
});
|
|
114
|
+
return Object.freeze({
|
|
115
|
+
get catalog() {
|
|
116
|
+
return catalogForCore(core);
|
|
117
|
+
},
|
|
118
|
+
get inspection() {
|
|
119
|
+
return inspectionForCore(core);
|
|
120
|
+
},
|
|
121
|
+
select,
|
|
122
|
+
settle,
|
|
123
|
+
validateSelection
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
const ACCEPTED_SELECTION = Object.freeze({ accepted: true });
|
|
127
|
+
function reconcileForcedBlocks(state, initialEffects, initialEffectStates) {
|
|
128
|
+
let next = state;
|
|
129
|
+
const effects = [...initialEffects];
|
|
130
|
+
const effectStates = [...initialEffectStates];
|
|
131
|
+
while (true) {
|
|
132
|
+
const forcedTaskSlot = nextForcedTaskForCore(next);
|
|
133
|
+
if (forcedTaskSlot === undefined)
|
|
134
|
+
return freezeTransition(next, effects, effectStates);
|
|
135
|
+
const task = requiredTaskForCore(next, forcedTaskSlot);
|
|
136
|
+
const dependencyIds = task.dependsOn.filter((taskId) => {
|
|
137
|
+
const status = statusForCore(next, requiredTaskSlotForCore(next, taskId));
|
|
138
|
+
return status.kind === "settled" && status.settlementKind !== "completed";
|
|
139
|
+
});
|
|
140
|
+
next = settleForcedTaskForCore(next, forcedTaskSlot);
|
|
141
|
+
effects.push(Object.freeze({
|
|
142
|
+
dependencyIds: Object.freeze(dependencyIds),
|
|
143
|
+
kind: "settled",
|
|
144
|
+
settlementKind: "blocked",
|
|
145
|
+
taskId: task.id
|
|
146
|
+
}));
|
|
147
|
+
effectStates.push(next);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
function freezeTransition(state, effects, effectStates) {
|
|
151
|
+
if (effects.length !== effectStates.length) {
|
|
152
|
+
throw new Error("admission core transition effects must have matching immutable post-states");
|
|
153
|
+
}
|
|
154
|
+
return Object.freeze({
|
|
155
|
+
effectStates: Object.freeze([...effectStates]),
|
|
156
|
+
effects: Object.freeze([...effects]),
|
|
157
|
+
state
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
function rejectedValidation(reason) {
|
|
161
|
+
return Object.freeze({ accepted: false, reason });
|
|
162
|
+
}
|
|
163
|
+
//# sourceMappingURL=core.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"core.mjs","sourceRoot":"","sources":["../../../../../src/project-run/task-scheduler/admission-core/core.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n AdmissionGraph,\n AdmissionGraphInput,\n AdmissionRejectionReason,\n AdmissionSelectionValidation,\n AdmissionSelectionValidationRejectionReason,\n AdmissionSettlementOutcome,\n AdmissionState,\n AdmissionTransitionResult\n} from \"../../../project-definition/scheduler-policy.ts\";\nimport { compileAdmissionGraphInput } from \"./input.ts\";\nimport { catalogForCore, inspectionForCore, schedulerInspectionForCore } from \"./projection.ts\";\nimport {\n admitTaskForCore,\n createAdmissionCoreFromSchedulerSnapshot,\n createInitialAdmissionCoreState,\n nextForcedTaskForCore,\n settleForcedTaskForCore,\n settleTaskForCore,\n type AdmissionCoreState\n} from \"./selection.ts\";\nimport {\n admissionCandidatesForCore,\n isCoreComplete,\n requiredTaskForCore,\n requiredTaskSlotForCore,\n scopeToActivateForCore,\n selectionRejectionForPendingTask,\n statusForCore,\n type AdmissionCoreSelection\n} from \"./selection-query.ts\";\nimport type { SchedulerSettlementKind } from \"../scheduler-decision-model.ts\";\n\nexport { compilePreparedAdmissionGraph } from \"./compiled-graph.ts\";\nexport type { CompiledAdmissionGraph } from \"./compiled-graph.ts\";\nexport {\n admissionCandidatesForCore,\n createAdmissionCoreFromSchedulerSnapshot,\n createInitialAdmissionCoreState,\n schedulerInspectionForCore,\n scopeToActivateForCore\n};\nexport type { AdmissionCoreSelection, AdmissionCoreState };\n\nexport type AdmissionCoreEffect =\n | Readonly<{ readonly kind: \"admitted\"; readonly taskId: string }>\n | Readonly<{\n readonly dependencyIds?: readonly string[];\n readonly kind: \"settled\";\n readonly settlementKind: SchedulerSettlementKind;\n readonly taskId: string;\n }>;\n\nexport interface AdmissionCoreTransition {\n /** The immutable post-state for each corresponding canonical effect. */\n readonly effectStates: readonly AdmissionCoreState[];\n readonly effects: readonly AdmissionCoreEffect[];\n readonly state: AdmissionCoreState;\n}\n\n/** 在 exact boundary validation 和一次 static compile 后创建 standalone public factory。 */\nexport function createAdmissionGraph(input: AdmissionGraphInput): AdmissionGraph {\n const compiled = compileAdmissionGraphInput(input);\n return Object.freeze({\n initialState: Object.freeze(function initialState(this: void): AdmissionState {\n return admissionStateForCore(createInitialAdmissionCoreState(compiled));\n })\n });\n}\n\n/** The canonical select action used by both the public opaque handle and the real shell. */\nexport function selectAdmissionCore(\n state: AdmissionCoreState,\n taskId: string\n): Readonly<\n | { readonly accepted: true; readonly transition: AdmissionCoreTransition }\n | { readonly accepted: false; readonly reason: AdmissionSelectionValidationRejectionReason }\n> {\n const validation = validateAdmissionCoreSelection(state, taskId);\n if (!validation.accepted) return Object.freeze({ accepted: false, reason: validation.reason });\n const next = admitTaskForCore(state, requiredTaskSlotForCore(state, taskId));\n return Object.freeze({\n accepted: true,\n transition: freezeTransition(next, [Object.freeze({ kind: \"admitted\", taskId })], [next])\n });\n}\n\n/** The public binary settlement action. Runtime outcome validation intentionally precedes ID checks. */\nexport function settleAdmissionCore(\n state: AdmissionCoreState,\n taskId: string,\n outcome: unknown\n): Readonly<\n | { readonly accepted: true; readonly transition: AdmissionCoreTransition }\n | { readonly accepted: false; readonly reason: AdmissionRejectionReason }\n> {\n if (outcome !== \"satisfied\" && outcome !== \"unsatisfied\") {\n return Object.freeze({\n accepted: false,\n reason: Object.freeze({ kind: \"invalid-settlement-outcome\" })\n });\n }\n return settleRunningAdmissionCore(\n state,\n taskId,\n outcome === \"satisfied\" ? \"completed\" : \"prerequisite-unsatisfied\"\n );\n}\n\n/** Applies a real running Task settlement through the same reducer, retaining private exact kinds. */\nexport function settleRunningAdmissionCore(\n state: AdmissionCoreState,\n taskId: string,\n settlementKind: Extract<\n SchedulerSettlementKind,\n \"completed\" | \"prerequisite-unsatisfied\" | \"failed\"\n >\n): Readonly<\n | { readonly accepted: true; readonly transition: AdmissionCoreTransition }\n | { readonly accepted: false; readonly reason: AdmissionRejectionReason }\n> {\n if (isCoreComplete(state)) {\n return Object.freeze({ accepted: false, reason: Object.freeze({ kind: \"state-complete\" }) });\n }\n const taskSlot = state.compiled.taskSlotsById.get(taskId);\n if (taskSlot === undefined) {\n return Object.freeze({ accepted: false, reason: Object.freeze({ kind: \"unknown-task\" }) });\n }\n const status = statusForCore(state, taskSlot);\n if (status.kind !== \"running\") {\n return Object.freeze({\n accepted: false,\n reason: Object.freeze({\n kind: \"not-running\",\n status: status.kind === \"pending\" ? \"pending\" : \"settled\"\n })\n });\n }\n const settled = settleTaskForCore(state, taskSlot, settlementKind);\n const directEffect = Object.freeze({ kind: \"settled\" as const, settlementKind, taskId });\n return Object.freeze({\n accepted: true,\n transition: reconcileForcedBlocks(settled, [directEffect], [settled])\n });\n}\n\n/** Private cancellation stays in the reducer/effect owner but has no public AdmissionState action. */\nexport function cancelPendingAdmissionCore(state: AdmissionCoreState): AdmissionCoreTransition {\n let next = state;\n const effects: AdmissionCoreEffect[] = [];\n const effectStates: AdmissionCoreState[] = [];\n for (const [slot, task] of state.compiled.graph.tasks.entries()) {\n if (statusForCore(next, slot).kind !== \"pending\") continue;\n next = settleTaskForCore(next, slot, \"cancelled-before-start\");\n effects.push(\n Object.freeze({ kind: \"settled\", settlementKind: \"cancelled-before-start\", taskId: task.id })\n );\n effectStates.push(next);\n }\n return freezeTransition(next, effects, effectStates);\n}\n\n/** Reconciles forced dependency blocks before the real shell publishes its next decision boundary. */\nexport function reconcileAdmissionCore(state: AdmissionCoreState): AdmissionCoreTransition {\n return reconcileForcedBlocks(state, [], []);\n}\n\nexport function validateAdmissionCoreSelection(\n state: AdmissionCoreState,\n taskId: string\n): AdmissionSelectionValidation {\n if (isCoreComplete(state)) return rejectedValidation(Object.freeze({ kind: \"state-complete\" }));\n const taskSlot = state.compiled.taskSlotsById.get(taskId);\n if (taskSlot === undefined) return rejectedValidation(Object.freeze({ kind: \"unknown-task\" }));\n const status = statusForCore(state, taskSlot);\n if (status.kind !== \"pending\") {\n return rejectedValidation(\n Object.freeze({\n kind: \"not-pending\",\n status: status.kind === \"running\" ? \"running\" : \"settled\"\n })\n );\n }\n const reason = selectionRejectionForPendingTask(state, taskSlot);\n return reason === undefined ? ACCEPTED_SELECTION : rejectedValidation(reason);\n}\n\n/** Constructs the frozen opaque public wrapper. Projection work remains lazy until its getter is read. */\nexport function admissionStateForCore(core: AdmissionCoreState): AdmissionState {\n const select = Object.freeze(function select(\n this: void,\n taskId: string\n ): AdmissionTransitionResult {\n const selection = selectAdmissionCore(core, taskId);\n return selection.accepted\n ? Object.freeze({ accepted: true, state: admissionStateForCore(selection.transition.state) })\n : Object.freeze({ accepted: false, reason: selection.reason });\n });\n const settle = Object.freeze(function settle(\n this: void,\n taskId: string,\n outcome: AdmissionSettlementOutcome\n ): AdmissionTransitionResult {\n const settlement = settleAdmissionCore(core, taskId, outcome);\n return settlement.accepted\n ? Object.freeze({ accepted: true, state: admissionStateForCore(settlement.transition.state) })\n : Object.freeze({ accepted: false, reason: settlement.reason });\n });\n const validateSelection = Object.freeze(function validateSelection(\n this: void,\n taskId: string\n ): AdmissionSelectionValidation {\n return validateAdmissionCoreSelection(core, taskId);\n });\n return Object.freeze({\n get catalog() {\n return catalogForCore(core);\n },\n get inspection() {\n return inspectionForCore(core);\n },\n select,\n settle,\n validateSelection\n } satisfies AdmissionState);\n}\n\nconst ACCEPTED_SELECTION: AdmissionSelectionValidation = Object.freeze({ accepted: true });\n\nfunction reconcileForcedBlocks(\n state: AdmissionCoreState,\n initialEffects: readonly AdmissionCoreEffect[],\n initialEffectStates: readonly AdmissionCoreState[]\n): AdmissionCoreTransition {\n let next = state;\n const effects = [...initialEffects];\n const effectStates = [...initialEffectStates];\n while (true) {\n const forcedTaskSlot = nextForcedTaskForCore(next);\n if (forcedTaskSlot === undefined) return freezeTransition(next, effects, effectStates);\n const task = requiredTaskForCore(next, forcedTaskSlot);\n const dependencyIds = task.dependsOn.filter((taskId) => {\n const status = statusForCore(next, requiredTaskSlotForCore(next, taskId));\n return status.kind === \"settled\" && status.settlementKind !== \"completed\";\n });\n next = settleForcedTaskForCore(next, forcedTaskSlot);\n effects.push(\n Object.freeze({\n dependencyIds: Object.freeze(dependencyIds),\n kind: \"settled\",\n settlementKind: \"blocked\",\n taskId: task.id\n })\n );\n effectStates.push(next);\n }\n}\n\nfunction freezeTransition(\n state: AdmissionCoreState,\n effects: readonly AdmissionCoreEffect[],\n effectStates: readonly AdmissionCoreState[]\n): AdmissionCoreTransition {\n if (effects.length !== effectStates.length) {\n throw new Error(\"admission core transition effects must have matching immutable post-states\");\n }\n return Object.freeze({\n effectStates: Object.freeze([...effectStates]),\n effects: Object.freeze([...effects]),\n state\n });\n}\n\nfunction rejectedValidation(\n reason: AdmissionSelectionValidationRejectionReason\n): AdmissionSelectionValidation {\n return Object.freeze({ accepted: false, reason });\n}\n"]}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import { prepareTaskGraph } from "../graph.mjs";
|
|
2
|
+
import { compilePreparedAdmissionGraph } from "./compiled-graph.mjs";
|
|
3
|
+
/** Validates the exact standalone boundary before compiling the Scheduler-owned graph. */
|
|
4
|
+
export function compileAdmissionGraphInput(input) {
|
|
5
|
+
const data = exactRecord(input, "admission graph input", ["graph", "maxParallel"]);
|
|
6
|
+
const maxParallel = data.maxParallel;
|
|
7
|
+
if (typeof maxParallel !== "number" || !Number.isSafeInteger(maxParallel) || maxParallel <= 0) {
|
|
8
|
+
throw new TypeError("admission graph maxParallel must be a positive safe integer");
|
|
9
|
+
}
|
|
10
|
+
return compilePreparedAdmissionGraph(prepareTaskGraph(taskGraphFromSchedulerSnapshot(data.graph), maxParallel), maxParallel);
|
|
11
|
+
}
|
|
12
|
+
function taskGraphFromSchedulerSnapshot(value) {
|
|
13
|
+
const graph = exactRecord(value, "admission graph", ["resourceCapacities", "scopes", "tasks"]);
|
|
14
|
+
const rawTasks = requiredArray(graph.tasks, "admission graph tasks");
|
|
15
|
+
const rawScopes = requiredArray(graph.scopes, "admission graph scopes");
|
|
16
|
+
const tasks = rawTasks.map(taskFromInput);
|
|
17
|
+
const scopes = rawScopes.map(scopeFromInput);
|
|
18
|
+
return Object.freeze({
|
|
19
|
+
resourceCapacities: resourceMappingFromInput(graph.resourceCapacities, "admission graph resourceCapacities"),
|
|
20
|
+
scopes: Object.freeze(scopes),
|
|
21
|
+
tasks: Object.freeze(tasks)
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
function taskFromInput(candidate, index) {
|
|
25
|
+
const label = `admission graph tasks[${index}]`;
|
|
26
|
+
const task = exactRecord(candidate, label, [
|
|
27
|
+
"admissionPriority",
|
|
28
|
+
"dependsOn",
|
|
29
|
+
"mutex",
|
|
30
|
+
"observes",
|
|
31
|
+
"resourceClaims",
|
|
32
|
+
"scopeId",
|
|
33
|
+
"taskId"
|
|
34
|
+
]);
|
|
35
|
+
if (task.scopeId !== null && typeof task.scopeId !== "string") {
|
|
36
|
+
throw new TypeError(`${label}.scopeId must be a string or null`);
|
|
37
|
+
}
|
|
38
|
+
return Object.freeze({
|
|
39
|
+
admissionPriority: requiredNumber(task.admissionPriority, `${label}.admissionPriority`),
|
|
40
|
+
dependsOn: stringArray(task.dependsOn, `${label}.dependsOn`),
|
|
41
|
+
id: requiredString(task.taskId, `${label}.taskId`),
|
|
42
|
+
mutex: stringArray(task.mutex, `${label}.mutex`),
|
|
43
|
+
observes: stringArray(task.observes, `${label}.observes`),
|
|
44
|
+
resourceClaims: resourceMappingFromInput(task.resourceClaims, `${label}.resourceClaims`),
|
|
45
|
+
...(task.scopeId === null ? {} : { scopeId: requiredString(task.scopeId, `${label}.scopeId`) })
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
function resourceMappingFromInput(value, label) {
|
|
49
|
+
const items = requiredArray(value, label);
|
|
50
|
+
const entries = [];
|
|
51
|
+
const ids = new Set();
|
|
52
|
+
for (const [index, candidate] of items.entries()) {
|
|
53
|
+
const itemLabel = `${label}[${index}]`;
|
|
54
|
+
const item = exactRecord(candidate, itemLabel, ["resourceId", "units"]);
|
|
55
|
+
const resourceId = requiredString(item.resourceId, `${itemLabel}.resourceId`);
|
|
56
|
+
if (ids.has(resourceId))
|
|
57
|
+
throw new TypeError(`${label} repeats resource ${resourceId}`);
|
|
58
|
+
ids.add(resourceId);
|
|
59
|
+
entries.push([resourceId, requiredNumber(item.units, `${itemLabel}.units`)]);
|
|
60
|
+
}
|
|
61
|
+
return Object.freeze(Object.fromEntries(entries));
|
|
62
|
+
}
|
|
63
|
+
function scopeFromInput(candidate, index) {
|
|
64
|
+
const label = `admission graph scopes[${index}]`;
|
|
65
|
+
const scope = exactRecord(candidate, label, [
|
|
66
|
+
"activationTaskIds",
|
|
67
|
+
"id",
|
|
68
|
+
"maxParallel",
|
|
69
|
+
"terminalTaskId"
|
|
70
|
+
]);
|
|
71
|
+
return Object.freeze({
|
|
72
|
+
activationTaskIds: stringArray(scope.activationTaskIds, `${label}.activationTaskIds`),
|
|
73
|
+
id: requiredString(scope.id, `${label}.id`),
|
|
74
|
+
maxParallel: requiredNumber(scope.maxParallel, `${label}.maxParallel`),
|
|
75
|
+
terminalTaskId: requiredString(scope.terminalTaskId, `${label}.terminalTaskId`)
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
function exactRecord(value, label, expectedKeys) {
|
|
79
|
+
if (!isPlainRecord(value))
|
|
80
|
+
throw new TypeError(`${label} must be a plain object`);
|
|
81
|
+
if (Reflect.getPrototypeOf(value) !== Object.prototype &&
|
|
82
|
+
Reflect.getPrototypeOf(value) !== null) {
|
|
83
|
+
throw new TypeError(`${label} must be a plain object`);
|
|
84
|
+
}
|
|
85
|
+
const keys = Reflect.ownKeys(value);
|
|
86
|
+
if (keys.length !== expectedKeys.length ||
|
|
87
|
+
keys.some((key) => typeof key !== "string" || !expectedKeys.includes(key))) {
|
|
88
|
+
throw new TypeError(`${label} must have exactly: ${expectedKeys.join(", ")}`);
|
|
89
|
+
}
|
|
90
|
+
return value;
|
|
91
|
+
}
|
|
92
|
+
function isPlainRecord(value) {
|
|
93
|
+
return value !== null && typeof value === "object" && !Array.isArray(value);
|
|
94
|
+
}
|
|
95
|
+
function requiredArray(value, label) {
|
|
96
|
+
if (!Array.isArray(value))
|
|
97
|
+
throw new TypeError(`${label} must be an array`);
|
|
98
|
+
return value;
|
|
99
|
+
}
|
|
100
|
+
function requiredNumber(value, label) {
|
|
101
|
+
if (typeof value !== "number")
|
|
102
|
+
throw new TypeError(`${label} must be a number`);
|
|
103
|
+
return value;
|
|
104
|
+
}
|
|
105
|
+
function requiredString(value, label) {
|
|
106
|
+
if (typeof value !== "string")
|
|
107
|
+
throw new TypeError(`${label} must be a string`);
|
|
108
|
+
return value;
|
|
109
|
+
}
|
|
110
|
+
function stringArray(value, label) {
|
|
111
|
+
const strings = [];
|
|
112
|
+
for (const item of requiredArray(value, label)) {
|
|
113
|
+
if (typeof item !== "string")
|
|
114
|
+
throw new TypeError(`${label} must contain only strings`);
|
|
115
|
+
strings.push(item);
|
|
116
|
+
}
|
|
117
|
+
return Object.freeze(strings);
|
|
118
|
+
}
|
|
119
|
+
//# sourceMappingURL=input.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"input.mjs","sourceRoot":"","sources":["../../../../../src/project-run/task-scheduler/admission-core/input.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AdmissionGraphInput } from \"../../../project-definition/scheduler-policy.ts\";\nimport { prepareTaskGraph, type TaskGraph, type TaskScope } from \"../graph.ts\";\nimport { compilePreparedAdmissionGraph, type CompiledAdmissionGraph } from \"./compiled-graph.ts\";\n\n/** Validates the exact standalone boundary before compiling the Scheduler-owned graph. */\nexport function compileAdmissionGraphInput(input: AdmissionGraphInput): CompiledAdmissionGraph {\n const data = exactRecord(input, \"admission graph input\", [\"graph\", \"maxParallel\"]);\n const maxParallel = data.maxParallel;\n if (typeof maxParallel !== \"number\" || !Number.isSafeInteger(maxParallel) || maxParallel <= 0) {\n throw new TypeError(\"admission graph maxParallel must be a positive safe integer\");\n }\n return compilePreparedAdmissionGraph(\n prepareTaskGraph(taskGraphFromSchedulerSnapshot(data.graph), maxParallel),\n maxParallel\n );\n}\n\nfunction taskGraphFromSchedulerSnapshot(value: unknown): TaskGraph {\n const graph = exactRecord(value, \"admission graph\", [\"resourceCapacities\", \"scopes\", \"tasks\"]);\n const rawTasks = requiredArray(graph.tasks, \"admission graph tasks\");\n const rawScopes = requiredArray(graph.scopes, \"admission graph scopes\");\n const tasks = rawTasks.map(taskFromInput);\n const scopes = rawScopes.map(scopeFromInput);\n return Object.freeze({\n resourceCapacities: resourceMappingFromInput(\n graph.resourceCapacities,\n \"admission graph resourceCapacities\"\n ),\n scopes: Object.freeze(scopes),\n tasks: Object.freeze(tasks)\n });\n}\n\nfunction taskFromInput(candidate: unknown, index: number): TaskGraph[\"tasks\"][number] {\n const label = `admission graph tasks[${index}]`;\n const task = exactRecord(candidate, label, [\n \"admissionPriority\",\n \"dependsOn\",\n \"mutex\",\n \"observes\",\n \"resourceClaims\",\n \"scopeId\",\n \"taskId\"\n ]);\n if (task.scopeId !== null && typeof task.scopeId !== \"string\") {\n throw new TypeError(`${label}.scopeId must be a string or null`);\n }\n return Object.freeze({\n admissionPriority: requiredNumber(task.admissionPriority, `${label}.admissionPriority`),\n dependsOn: stringArray(task.dependsOn, `${label}.dependsOn`),\n id: requiredString(task.taskId, `${label}.taskId`),\n mutex: stringArray(task.mutex, `${label}.mutex`),\n observes: stringArray(task.observes, `${label}.observes`),\n resourceClaims: resourceMappingFromInput(task.resourceClaims, `${label}.resourceClaims`),\n ...(task.scopeId === null ? {} : { scopeId: requiredString(task.scopeId, `${label}.scopeId`) })\n });\n}\n\nfunction resourceMappingFromInput(value: unknown, label: string): Readonly<Record<string, number>> {\n const items = requiredArray(value, label);\n const entries: [string, number][] = [];\n const ids = new Set<string>();\n for (const [index, candidate] of items.entries()) {\n const itemLabel = `${label}[${index}]`;\n const item = exactRecord(candidate, itemLabel, [\"resourceId\", \"units\"]);\n const resourceId = requiredString(item.resourceId, `${itemLabel}.resourceId`);\n if (ids.has(resourceId)) throw new TypeError(`${label} repeats resource ${resourceId}`);\n ids.add(resourceId);\n entries.push([resourceId, requiredNumber(item.units, `${itemLabel}.units`)]);\n }\n return Object.freeze(Object.fromEntries(entries));\n}\n\nfunction scopeFromInput(candidate: unknown, index: number): TaskScope {\n const label = `admission graph scopes[${index}]`;\n const scope = exactRecord(candidate, label, [\n \"activationTaskIds\",\n \"id\",\n \"maxParallel\",\n \"terminalTaskId\"\n ]);\n return Object.freeze({\n activationTaskIds: stringArray(scope.activationTaskIds, `${label}.activationTaskIds`),\n id: requiredString(scope.id, `${label}.id`),\n maxParallel: requiredNumber(scope.maxParallel, `${label}.maxParallel`),\n terminalTaskId: requiredString(scope.terminalTaskId, `${label}.terminalTaskId`)\n });\n}\n\nfunction exactRecord(\n value: unknown,\n label: string,\n expectedKeys: readonly string[]\n): Readonly<Record<string, unknown>> {\n if (!isPlainRecord(value)) throw new TypeError(`${label} must be a plain object`);\n if (\n Reflect.getPrototypeOf(value) !== Object.prototype &&\n Reflect.getPrototypeOf(value) !== null\n ) {\n throw new TypeError(`${label} must be a plain object`);\n }\n const keys = Reflect.ownKeys(value);\n if (\n keys.length !== expectedKeys.length ||\n keys.some((key) => typeof key !== \"string\" || !expectedKeys.includes(key))\n ) {\n throw new TypeError(`${label} must have exactly: ${expectedKeys.join(\", \")}`);\n }\n return value;\n}\n\nfunction isPlainRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction requiredArray(value: unknown, label: string): readonly unknown[] {\n if (!Array.isArray(value)) throw new TypeError(`${label} must be an array`);\n return value;\n}\n\nfunction requiredNumber(value: unknown, label: string): number {\n if (typeof value !== \"number\") throw new TypeError(`${label} must be a number`);\n return value;\n}\n\nfunction requiredString(value: unknown, label: string): string {\n if (typeof value !== \"string\") throw new TypeError(`${label} must be a string`);\n return value;\n}\n\nfunction stringArray(value: unknown, label: string): readonly string[] {\n const strings: string[] = [];\n for (const item of requiredArray(value, label)) {\n if (typeof item !== \"string\") throw new TypeError(`${label} must contain only strings`);\n strings.push(item);\n }\n return Object.freeze(strings);\n}\n"]}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import { activeScopesForCore, effectiveMaxParallelForCore, isAdmissionEligibleForPendingTask, requiredScopeSlotForCore, requiredTaskForCore, scopeLifecycleForCore, selectionRejectionForPendingTask, statusForCore } from "./selection-query.mjs";
|
|
2
|
+
import { numberFor } from "./selection-index.mjs";
|
|
3
|
+
/** Materializes the public catalog only when the public getter reads it. */
|
|
4
|
+
export function catalogForCore(state) {
|
|
5
|
+
const selectableTaskIds = [];
|
|
6
|
+
const nonSelectableTasks = [];
|
|
7
|
+
for (const taskSlot of state.compiled.taskSlotsInPublicOrder) {
|
|
8
|
+
if (statusForCore(state, taskSlot).kind !== "pending")
|
|
9
|
+
continue;
|
|
10
|
+
const reason = selectionRejectionForPendingTask(state, taskSlot);
|
|
11
|
+
const taskId = requiredTaskForCore(state, taskSlot).id;
|
|
12
|
+
if (reason === undefined)
|
|
13
|
+
selectableTaskIds.push(taskId);
|
|
14
|
+
else
|
|
15
|
+
nonSelectableTasks.push(Object.freeze({ reason, taskId }));
|
|
16
|
+
}
|
|
17
|
+
return Object.freeze({
|
|
18
|
+
nonSelectableTasks: Object.freeze(nonSelectableTasks),
|
|
19
|
+
selectableTaskIds: Object.freeze(selectableTaskIds)
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
export function inspectionForCore(state) {
|
|
23
|
+
const runningTaskIds = [];
|
|
24
|
+
const settledTasks = [];
|
|
25
|
+
for (const taskSlot of state.compiled.taskSlotsInPublicOrder) {
|
|
26
|
+
const task = requiredTaskForCore(state, taskSlot);
|
|
27
|
+
const status = statusForCore(state, taskSlot);
|
|
28
|
+
if (status.kind === "running")
|
|
29
|
+
runningTaskIds.push(task.id);
|
|
30
|
+
if (status.kind === "settled") {
|
|
31
|
+
const outcome = publicOutcomeForSettlement(status.settlementKind);
|
|
32
|
+
if (outcome !== undefined)
|
|
33
|
+
settledTasks.push(Object.freeze({ outcome, taskId: task.id }));
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
const hasSelectablePending = state.compiled.graph.tasks.some((_, taskSlot) => statusForCore(state, taskSlot).kind === "pending" &&
|
|
37
|
+
isAdmissionEligibleForPendingTask(state, taskSlot));
|
|
38
|
+
return Object.freeze({
|
|
39
|
+
capacity: Object.freeze({
|
|
40
|
+
effectiveMaxParallel: effectiveMaxParallelForCore(state),
|
|
41
|
+
maxParallel: state.compiled.maxParallel,
|
|
42
|
+
running: state.selection.runningTotal
|
|
43
|
+
}),
|
|
44
|
+
nextBoundary: nextBoundaryFor(hasSelectablePending, state.selection.runningTotal),
|
|
45
|
+
resources: resourceOccupancyForCore(state),
|
|
46
|
+
runningTaskIds: Object.freeze(runningTaskIds),
|
|
47
|
+
scopes: Object.freeze([...state.compiled.graph.scopes]
|
|
48
|
+
.sort((left, right) => compareText(left.id, right.id))
|
|
49
|
+
.map((scope) => Object.freeze({
|
|
50
|
+
lifecycle: scopeLifecycleForCore(state, requiredScopeSlotForCore(state, scope.id)),
|
|
51
|
+
scopeId: scope.id
|
|
52
|
+
}))),
|
|
53
|
+
settledTasks: Object.freeze(settledTasks)
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
/** Scheduler-only projection retained for policy choice and diagnostics, not a second transition model. */
|
|
57
|
+
export function schedulerInspectionForCore(state) {
|
|
58
|
+
const pendingTasks = [];
|
|
59
|
+
const runningTaskIds = [];
|
|
60
|
+
const runningMutexes = new Set();
|
|
61
|
+
const settledTasks = [];
|
|
62
|
+
for (const [taskSlot, task] of state.compiled.graph.tasks.entries()) {
|
|
63
|
+
const status = statusForCore(state, taskSlot);
|
|
64
|
+
if (status.kind === "pending")
|
|
65
|
+
pendingTasks.push(task);
|
|
66
|
+
if (status.kind === "running") {
|
|
67
|
+
runningTaskIds.push(task.id);
|
|
68
|
+
for (const mutexId of task.mutex)
|
|
69
|
+
runningMutexes.add(mutexId);
|
|
70
|
+
}
|
|
71
|
+
if (status.kind === "settled") {
|
|
72
|
+
settledTasks.push({ kind: status.settlementKind, taskId: task.id });
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
return Object.freeze({
|
|
76
|
+
activeScopeIds: Object.freeze(activeScopesForCore(state).map((scope) => scope.id)),
|
|
77
|
+
effectiveMaxParallel: effectiveMaxParallelForCore(state),
|
|
78
|
+
graph: state.compiled.graph,
|
|
79
|
+
maxParallel: state.compiled.maxParallel,
|
|
80
|
+
pendingTasks: Object.freeze(pendingTasks),
|
|
81
|
+
resources: resourceOccupancyForCore(state),
|
|
82
|
+
runningMutexes: Object.freeze([...runningMutexes]),
|
|
83
|
+
runningTaskIds: Object.freeze(runningTaskIds),
|
|
84
|
+
settledTasks: Object.freeze(settledTasks.map((task) => Object.freeze(task)))
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
function resourceOccupancyForCore(state) {
|
|
88
|
+
return Object.freeze(state.compiled.graph.resourceCapacities.map(({ resourceId, units }, resourceSlot) => {
|
|
89
|
+
const inUse = numberFor(state.selection.resourceInUse, resourceSlot);
|
|
90
|
+
return Object.freeze({
|
|
91
|
+
available: units - inUse,
|
|
92
|
+
capacity: units,
|
|
93
|
+
inUse,
|
|
94
|
+
resourceId
|
|
95
|
+
});
|
|
96
|
+
}));
|
|
97
|
+
}
|
|
98
|
+
function nextBoundaryFor(hasSelectablePending, runningTaskCount) {
|
|
99
|
+
if (hasSelectablePending)
|
|
100
|
+
return "select";
|
|
101
|
+
if (runningTaskCount > 0)
|
|
102
|
+
return "wait";
|
|
103
|
+
return "complete";
|
|
104
|
+
}
|
|
105
|
+
function publicOutcomeForSettlement(settlementKind) {
|
|
106
|
+
switch (settlementKind) {
|
|
107
|
+
case "completed":
|
|
108
|
+
return "satisfied";
|
|
109
|
+
case "prerequisite-unsatisfied":
|
|
110
|
+
case "failed":
|
|
111
|
+
return "unsatisfied";
|
|
112
|
+
case "blocked":
|
|
113
|
+
case "cancelled-before-start":
|
|
114
|
+
return undefined;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
function compareText(left, right) {
|
|
118
|
+
if (left < right)
|
|
119
|
+
return -1;
|
|
120
|
+
if (left > right)
|
|
121
|
+
return 1;
|
|
122
|
+
return 0;
|
|
123
|
+
}
|
|
124
|
+
//# sourceMappingURL=projection.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"projection.mjs","sourceRoot":"","sources":["../../../../../src/project-run/task-scheduler/admission-core/projection.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n AdmissionCatalog,\n AdmissionInspection,\n AdmissionSelectionRejectionReason,\n AdmissionSettlementOutcome\n} from \"../../../project-definition/scheduler-policy.ts\";\nimport type { PlannedTask, PlannedTaskGraph } from \"../graph.ts\";\nimport {\n activeScopesForCore,\n effectiveMaxParallelForCore,\n isAdmissionEligibleForPendingTask,\n requiredScopeSlotForCore,\n requiredTaskForCore,\n scopeLifecycleForCore,\n selectionRejectionForPendingTask,\n statusForCore\n} from \"./selection-query.ts\";\nimport { numberFor } from \"./selection-index.ts\";\nimport type { AdmissionCoreState } from \"./selection.ts\";\nimport type { SchedulerSettlementKind } from \"../scheduler-decision-model.ts\";\n\n/** Materializes the public catalog only when the public getter reads it. */\nexport function catalogForCore(state: AdmissionCoreState): AdmissionCatalog {\n const selectableTaskIds: string[] = [];\n const nonSelectableTasks: { reason: AdmissionSelectionRejectionReason; taskId: string }[] = [];\n for (const taskSlot of state.compiled.taskSlotsInPublicOrder) {\n if (statusForCore(state, taskSlot).kind !== \"pending\") continue;\n const reason = selectionRejectionForPendingTask(state, taskSlot);\n const taskId = requiredTaskForCore(state, taskSlot).id;\n if (reason === undefined) selectableTaskIds.push(taskId);\n else nonSelectableTasks.push(Object.freeze({ reason, taskId }));\n }\n return Object.freeze({\n nonSelectableTasks: Object.freeze(nonSelectableTasks),\n selectableTaskIds: Object.freeze(selectableTaskIds)\n });\n}\n\nexport function inspectionForCore(state: AdmissionCoreState): AdmissionInspection {\n const runningTaskIds: string[] = [];\n const settledTasks: { outcome: AdmissionSettlementOutcome; taskId: string }[] = [];\n for (const taskSlot of state.compiled.taskSlotsInPublicOrder) {\n const task = requiredTaskForCore(state, taskSlot);\n const status = statusForCore(state, taskSlot);\n if (status.kind === \"running\") runningTaskIds.push(task.id);\n if (status.kind === \"settled\") {\n const outcome = publicOutcomeForSettlement(status.settlementKind);\n if (outcome !== undefined) settledTasks.push(Object.freeze({ outcome, taskId: task.id }));\n }\n }\n const hasSelectablePending = state.compiled.graph.tasks.some(\n (_, taskSlot) =>\n statusForCore(state, taskSlot).kind === \"pending\" &&\n isAdmissionEligibleForPendingTask(state, taskSlot)\n );\n return Object.freeze({\n capacity: Object.freeze({\n effectiveMaxParallel: effectiveMaxParallelForCore(state),\n maxParallel: state.compiled.maxParallel,\n running: state.selection.runningTotal\n }),\n nextBoundary: nextBoundaryFor(hasSelectablePending, state.selection.runningTotal),\n resources: resourceOccupancyForCore(state),\n runningTaskIds: Object.freeze(runningTaskIds),\n scopes: Object.freeze(\n [...state.compiled.graph.scopes]\n .sort((left, right) => compareText(left.id, right.id))\n .map((scope) =>\n Object.freeze({\n lifecycle: scopeLifecycleForCore(state, requiredScopeSlotForCore(state, scope.id)),\n scopeId: scope.id\n })\n )\n ),\n settledTasks: Object.freeze(settledTasks)\n });\n}\n\n/** Scheduler-only projection retained for policy choice and diagnostics, not a second transition model. */\nexport function schedulerInspectionForCore(state: AdmissionCoreState): Readonly<{\n readonly activeScopeIds: readonly string[];\n readonly effectiveMaxParallel: number;\n readonly graph: PlannedTaskGraph;\n readonly maxParallel: number;\n readonly pendingTasks: readonly PlannedTask[];\n readonly runningMutexes: readonly string[];\n readonly resources: AdmissionInspection[\"resources\"];\n readonly runningTaskIds: readonly string[];\n readonly settledTasks: readonly Readonly<{\n readonly kind: SchedulerSettlementKind;\n readonly taskId: string;\n }>[];\n}> {\n const pendingTasks: PlannedTask[] = [];\n const runningTaskIds: string[] = [];\n const runningMutexes = new Set<string>();\n const settledTasks: { kind: SchedulerSettlementKind; taskId: string }[] = [];\n for (const [taskSlot, task] of state.compiled.graph.tasks.entries()) {\n const status = statusForCore(state, taskSlot);\n if (status.kind === \"pending\") pendingTasks.push(task);\n if (status.kind === \"running\") {\n runningTaskIds.push(task.id);\n for (const mutexId of task.mutex) runningMutexes.add(mutexId);\n }\n if (status.kind === \"settled\") {\n settledTasks.push({ kind: status.settlementKind, taskId: task.id });\n }\n }\n return Object.freeze({\n activeScopeIds: Object.freeze(activeScopesForCore(state).map((scope) => scope.id)),\n effectiveMaxParallel: effectiveMaxParallelForCore(state),\n graph: state.compiled.graph,\n maxParallel: state.compiled.maxParallel,\n pendingTasks: Object.freeze(pendingTasks),\n resources: resourceOccupancyForCore(state),\n runningMutexes: Object.freeze([...runningMutexes]),\n runningTaskIds: Object.freeze(runningTaskIds),\n settledTasks: Object.freeze(settledTasks.map((task) => Object.freeze(task)))\n });\n}\n\nfunction resourceOccupancyForCore(state: AdmissionCoreState): AdmissionInspection[\"resources\"] {\n return Object.freeze(\n state.compiled.graph.resourceCapacities.map(({ resourceId, units }, resourceSlot) => {\n const inUse = numberFor(state.selection.resourceInUse, resourceSlot);\n return Object.freeze({\n available: units - inUse,\n capacity: units,\n inUse,\n resourceId\n });\n })\n );\n}\n\nfunction nextBoundaryFor(\n hasSelectablePending: boolean,\n runningTaskCount: number\n): \"select\" | \"wait\" | \"complete\" {\n if (hasSelectablePending) return \"select\";\n if (runningTaskCount > 0) return \"wait\";\n return \"complete\";\n}\n\nfunction publicOutcomeForSettlement(\n settlementKind: SchedulerSettlementKind\n): AdmissionSettlementOutcome | undefined {\n switch (settlementKind) {\n case \"completed\":\n return \"satisfied\";\n case \"prerequisite-unsatisfied\":\n case \"failed\":\n return \"unsatisfied\";\n case \"blocked\":\n case \"cancelled-before-start\":\n return undefined;\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,99 @@
|
|
|
1
|
+
import { List } from "immutable";
|
|
2
|
+
export const PENDING = Object.freeze({ kind: "pending" });
|
|
3
|
+
export const ABSENT = Object.freeze({ kind: "absent" });
|
|
4
|
+
export function persistentStatuses(values) {
|
|
5
|
+
return Object.freeze({ values: List(values) });
|
|
6
|
+
}
|
|
7
|
+
export function persistentNumbersFor(values) {
|
|
8
|
+
return Object.freeze({ values: List(values) });
|
|
9
|
+
}
|
|
10
|
+
export function statusForSelection(selection, taskSlot) {
|
|
11
|
+
return statusForStore(selection.statuses, taskSlot);
|
|
12
|
+
}
|
|
13
|
+
export function statusForStore(store, taskSlot) {
|
|
14
|
+
const value = store.values.get(taskSlot);
|
|
15
|
+
if (value === undefined)
|
|
16
|
+
throw new Error(`admission core task slot is unknown: ${taskSlot}`);
|
|
17
|
+
return value;
|
|
18
|
+
}
|
|
19
|
+
export function withStatusAt(store, taskSlot, value) {
|
|
20
|
+
if (taskSlot < 0 || taskSlot >= store.values.size)
|
|
21
|
+
throw new Error(`admission core task slot is unknown: ${taskSlot}`);
|
|
22
|
+
return Object.freeze({ values: store.values.set(taskSlot, value) });
|
|
23
|
+
}
|
|
24
|
+
export function numberFor(store, slot) {
|
|
25
|
+
const value = store.values.get(slot);
|
|
26
|
+
if (value === undefined)
|
|
27
|
+
throw new Error(`admission core index slot is unknown: ${slot}`);
|
|
28
|
+
return value;
|
|
29
|
+
}
|
|
30
|
+
/** Applies all occurrence deltas through one new persistent List value. */
|
|
31
|
+
export function withNumberDeltas(store, deltas) {
|
|
32
|
+
if (deltas.length === 0)
|
|
33
|
+
return store;
|
|
34
|
+
const aggregated = new Map();
|
|
35
|
+
for (const [slot, delta] of deltas)
|
|
36
|
+
aggregated.set(slot, (aggregated.get(slot) ?? 0) + delta);
|
|
37
|
+
let values = store.values;
|
|
38
|
+
for (const [slot, delta] of aggregated) {
|
|
39
|
+
const current = values.get(slot);
|
|
40
|
+
if (current === undefined)
|
|
41
|
+
throw new Error(`admission core index slot is unknown: ${slot}`);
|
|
42
|
+
values = values.set(slot, current + delta);
|
|
43
|
+
}
|
|
44
|
+
return Object.freeze({ values });
|
|
45
|
+
}
|
|
46
|
+
export function forcedTaskSlotFor(selection) {
|
|
47
|
+
return selection.forcedQueue?.taskSlot;
|
|
48
|
+
}
|
|
49
|
+
/** Removes just the persistent heap root; all retained branches remain shared. */
|
|
50
|
+
export function withoutForcedTask(selection) {
|
|
51
|
+
const root = selection.forcedQueue;
|
|
52
|
+
if (root === undefined)
|
|
53
|
+
return selection;
|
|
54
|
+
return freezeSelectionIndex({
|
|
55
|
+
...selection,
|
|
56
|
+
forcedQueue: mergeForcedTaskQueues(root.left, root.right)
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
export function forcedQueueFromTaskSlots(taskSlots) {
|
|
60
|
+
let queue;
|
|
61
|
+
for (const taskSlot of taskSlots)
|
|
62
|
+
queue = forcedQueueWithTask(queue, taskSlot);
|
|
63
|
+
return queue;
|
|
64
|
+
}
|
|
65
|
+
/** Additions are newly-ready reverse dependents, so no extant frontier is copied or sorted. */
|
|
66
|
+
export function enqueueForcedTaskSlots(existing, additions) {
|
|
67
|
+
let queue = existing;
|
|
68
|
+
for (const taskSlot of additions)
|
|
69
|
+
queue = forcedQueueWithTask(queue, taskSlot);
|
|
70
|
+
return queue;
|
|
71
|
+
}
|
|
72
|
+
export function freezeSelectionIndex(selection) {
|
|
73
|
+
return Object.freeze(selection);
|
|
74
|
+
}
|
|
75
|
+
function forcedQueueRank(queue) {
|
|
76
|
+
return queue?.rank ?? 0;
|
|
77
|
+
}
|
|
78
|
+
/** Merges by task slot; only the right spine is copied and retained branches stay shared. */
|
|
79
|
+
function mergeForcedTaskQueues(left, right) {
|
|
80
|
+
if (left === undefined)
|
|
81
|
+
return right;
|
|
82
|
+
if (right === undefined)
|
|
83
|
+
return left;
|
|
84
|
+
if (left.taskSlot < right.taskSlot)
|
|
85
|
+
return mergeForcedTaskQueues(right, left);
|
|
86
|
+
const mergedRight = mergeForcedTaskQueues(left.right, right);
|
|
87
|
+
const nextLeft = forcedQueueRank(left.left) >= forcedQueueRank(mergedRight) ? left.left : mergedRight;
|
|
88
|
+
const nextRight = nextLeft === left.left ? mergedRight : left.left;
|
|
89
|
+
return Object.freeze({
|
|
90
|
+
left: nextLeft,
|
|
91
|
+
rank: forcedQueueRank(nextRight) + 1,
|
|
92
|
+
right: nextRight,
|
|
93
|
+
taskSlot: left.taskSlot
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
function forcedQueueWithTask(queue, taskSlot) {
|
|
97
|
+
return mergeForcedTaskQueues(queue, Object.freeze({ left: undefined, rank: 1, right: undefined, taskSlot }));
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=selection-index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"selection-index.mjs","sourceRoot":"","sources":["../../../../../src/project-run/task-scheduler/admission-core/selection-index.ts"],"names":[],"mappings":"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","sourcesContent":["import { List } from \"immutable\";\n\nimport type { SchedulerSettlementKind } from \"../scheduler-decision-model.ts\";\n\nexport type CoreTaskStatus =\n | Readonly<{ readonly kind: \"pending\" }>\n /** Only used while adapting private partial SchedulerSnapshot test inputs. */\n | Readonly<{ readonly kind: \"absent\" }>\n | Readonly<{ readonly kind: \"running\" }>\n | Readonly<{ readonly kind: \"settled\"; readonly settlementKind: SchedulerSettlementKind }>;\n\nexport const PENDING: CoreTaskStatus = Object.freeze({ kind: \"pending\" });\nexport const ABSENT: CoreTaskStatus = Object.freeze({ kind: \"absent\" });\n\n/** Immutable.List is the persistent indexed backing for every dense selection counter. */\nexport type PersistentIndexedStore<T> = Readonly<{\n readonly values: List<T>;\n}>;\n\nexport type NumberStore = PersistentIndexedStore<number>;\nexport type StatusStore = PersistentIndexedStore<CoreTaskStatus>;\n\n/** Persistent leftist max-heap: task slots are the canonical forced-effect priority. */\nexport type ForcedTaskQueue =\n | undefined\n | Readonly<{\n readonly left: ForcedTaskQueue;\n readonly rank: number;\n readonly right: ForcedTaskQueue;\n readonly taskSlot: number;\n }>;\n\n/** Private dynamic index shared by the seed, delta reducer and read-only query owners. */\nexport interface AdmissionSelectionIndex {\n readonly activeScopeSlots: readonly number[];\n readonly activeScopes: NumberStore;\n readonly forcedQueue: ForcedTaskQueue;\n readonly legacyRunningMutexes: readonly string[] | undefined;\n readonly mutexHolders: NumberStore;\n /** Per-task reverse-mutex occurrence count; candidate sieving never builds mutex payloads. */\n readonly heldMutexBlockers: NumberStore;\n readonly nonCompletedDependencies: NumberStore;\n readonly pendingObservations: NumberStore;\n readonly pendingDependencies: NumberStore;\n readonly remainingTaskCount: number;\n readonly resourceInUse: NumberStore;\n readonly runningTotal: number;\n readonly statuses: StatusStore;\n}\n\nexport function persistentStatuses(values: readonly CoreTaskStatus[]): StatusStore {\n return Object.freeze({ values: List(values) });\n}\n\nexport function persistentNumbersFor(values: readonly number[]): NumberStore {\n return Object.freeze({ values: List(values) });\n}\n\nexport function statusForSelection(\n selection: AdmissionSelectionIndex,\n taskSlot: number\n): CoreTaskStatus {\n return statusForStore(selection.statuses, taskSlot);\n}\n\nexport function statusForStore(store: StatusStore, taskSlot: number): CoreTaskStatus {\n const value = store.values.get(taskSlot);\n if (value === undefined) throw new Error(`admission core task slot is unknown: ${taskSlot}`);\n return value;\n}\n\nexport function withStatusAt(\n store: StatusStore,\n taskSlot: number,\n value: CoreTaskStatus\n): StatusStore {\n if (taskSlot < 0 || taskSlot >= store.values.size)\n throw new Error(`admission core task slot is unknown: ${taskSlot}`);\n return Object.freeze({ values: store.values.set(taskSlot, value) });\n}\n\nexport function numberFor(store: NumberStore, slot: number): number {\n const value = store.values.get(slot);\n if (value === undefined) throw new Error(`admission core index slot is unknown: ${slot}`);\n return value;\n}\n\n/** Applies all occurrence deltas through one new persistent List value. */\nexport function withNumberDeltas(\n store: NumberStore,\n deltas: readonly (readonly [number, number])[]\n): NumberStore {\n if (deltas.length === 0) return store;\n const aggregated = new Map<number, number>();\n for (const [slot, delta] of deltas) aggregated.set(slot, (aggregated.get(slot) ?? 0) + delta);\n let values = store.values;\n for (const [slot, delta] of aggregated) {\n const current = values.get(slot);\n if (current === undefined) throw new Error(`admission core index slot is unknown: ${slot}`);\n values = values.set(slot, current + delta);\n }\n return Object.freeze({ values });\n}\n\nexport function forcedTaskSlotFor(selection: AdmissionSelectionIndex): number | undefined {\n return selection.forcedQueue?.taskSlot;\n}\n\n/** Removes just the persistent heap root; all retained branches remain shared. */\nexport function withoutForcedTask(selection: AdmissionSelectionIndex): AdmissionSelectionIndex {\n const root = selection.forcedQueue;\n if (root === undefined) return selection;\n return freezeSelectionIndex({\n ...selection,\n forcedQueue: mergeForcedTaskQueues(root.left, root.right)\n });\n}\n\nexport function forcedQueueFromTaskSlots(taskSlots: readonly number[]): ForcedTaskQueue {\n let queue: ForcedTaskQueue;\n for (const taskSlot of taskSlots) queue = forcedQueueWithTask(queue, taskSlot);\n return queue;\n}\n\n/** Additions are newly-ready reverse dependents, so no extant frontier is copied or sorted. */\nexport function enqueueForcedTaskSlots(\n existing: ForcedTaskQueue,\n additions: ReadonlySet<number>\n): ForcedTaskQueue {\n let queue = existing;\n for (const taskSlot of additions) queue = forcedQueueWithTask(queue, taskSlot);\n return queue;\n}\n\nexport function freezeSelectionIndex(selection: AdmissionSelectionIndex): AdmissionSelectionIndex {\n return Object.freeze(selection);\n}\n\nfunction forcedQueueRank(queue: ForcedTaskQueue): number {\n return queue?.rank ?? 0;\n}\n\n/** Merges by task slot; only the right spine is copied and retained branches stay shared. */\nfunction mergeForcedTaskQueues(left: ForcedTaskQueue, right: ForcedTaskQueue): ForcedTaskQueue {\n if (left === undefined) return right;\n if (right === undefined) return left;\n if (left.taskSlot < right.taskSlot) return mergeForcedTaskQueues(right, left);\n const mergedRight = mergeForcedTaskQueues(left.right, right);\n const nextLeft =\n forcedQueueRank(left.left) >= forcedQueueRank(mergedRight) ? left.left : mergedRight;\n const nextRight = nextLeft === left.left ? mergedRight : left.left;\n return Object.freeze({\n left: nextLeft,\n rank: forcedQueueRank(nextRight) + 1,\n right: nextRight,\n taskSlot: left.taskSlot\n });\n}\n\nfunction forcedQueueWithTask(queue: ForcedTaskQueue, taskSlot: number): ForcedTaskQueue {\n return mergeForcedTaskQueues(\n queue,\n Object.freeze({ left: undefined, rank: 1, right: undefined, taskSlot })\n );\n}\n"]}
|