@opensip-cli/core 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +202 -0
- package/NOTICE +8 -0
- package/README.md +31 -0
- package/dist/__tests__/config-resolution.test.d.ts +2 -0
- package/dist/__tests__/config-resolution.test.d.ts.map +1 -0
- package/dist/__tests__/config-resolution.test.js +94 -0
- package/dist/__tests__/config-resolution.test.js.map +1 -0
- package/dist/__tests__/public-api.test.d.ts +16 -0
- package/dist/__tests__/public-api.test.d.ts.map +1 -0
- package/dist/__tests__/public-api.test.js +209 -0
- package/dist/__tests__/public-api.test.js.map +1 -0
- package/dist/__tests__/signal-batch.test.d.ts +2 -0
- package/dist/__tests__/signal-batch.test.d.ts.map +1 -0
- package/dist/__tests__/signal-batch.test.js +39 -0
- package/dist/__tests__/signal-batch.test.js.map +1 -0
- package/dist/__tests__/signal-sink.test.d.ts +2 -0
- package/dist/__tests__/signal-sink.test.d.ts.map +1 -0
- package/dist/__tests__/signal-sink.test.js +25 -0
- package/dist/__tests__/signal-sink.test.js.map +1 -0
- package/dist/__tests__/strip-utils.test.d.ts +2 -0
- package/dist/__tests__/strip-utils.test.d.ts.map +1 -0
- package/dist/__tests__/strip-utils.test.js +397 -0
- package/dist/__tests__/strip-utils.test.js.map +1 -0
- package/dist/__tests__/text-tree.test.d.ts +2 -0
- package/dist/__tests__/text-tree.test.d.ts.map +1 -0
- package/dist/__tests__/text-tree.test.js +31 -0
- package/dist/__tests__/text-tree.test.js.map +1 -0
- package/dist/baseline/__tests__/fingerprint-strategy.test.d.ts +2 -0
- package/dist/baseline/__tests__/fingerprint-strategy.test.d.ts.map +1 -0
- package/dist/baseline/__tests__/fingerprint-strategy.test.js +69 -0
- package/dist/baseline/__tests__/fingerprint-strategy.test.js.map +1 -0
- package/dist/baseline/fingerprint-strategy.d.ts +70 -0
- package/dist/baseline/fingerprint-strategy.d.ts.map +1 -0
- package/dist/baseline/fingerprint-strategy.js +90 -0
- package/dist/baseline/fingerprint-strategy.js.map +1 -0
- package/dist/config-resolution.d.ts +27 -0
- package/dist/config-resolution.d.ts.map +1 -0
- package/dist/config-resolution.js +92 -0
- package/dist/config-resolution.js.map +1 -0
- package/dist/index.d.ts +81 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +165 -0
- package/dist/index.js.map +1 -0
- package/dist/languages/__tests__/content-filter-dispatch.test.d.ts +2 -0
- package/dist/languages/__tests__/content-filter-dispatch.test.d.ts.map +1 -0
- package/dist/languages/__tests__/content-filter-dispatch.test.js +87 -0
- package/dist/languages/__tests__/content-filter-dispatch.test.js.map +1 -0
- package/dist/languages/__tests__/non-code-formats.test.d.ts +2 -0
- package/dist/languages/__tests__/non-code-formats.test.d.ts.map +1 -0
- package/dist/languages/__tests__/non-code-formats.test.js +31 -0
- package/dist/languages/__tests__/non-code-formats.test.js.map +1 -0
- package/dist/languages/__tests__/parse-cache.test.d.ts +2 -0
- package/dist/languages/__tests__/parse-cache.test.d.ts.map +1 -0
- package/dist/languages/__tests__/parse-cache.test.js +228 -0
- package/dist/languages/__tests__/parse-cache.test.js.map +1 -0
- package/dist/languages/__tests__/registry.test.d.ts +2 -0
- package/dist/languages/__tests__/registry.test.d.ts.map +1 -0
- package/dist/languages/__tests__/registry.test.js +193 -0
- package/dist/languages/__tests__/registry.test.js.map +1 -0
- package/dist/languages/__tests__/workspace-unit-contract.test.d.ts +2 -0
- package/dist/languages/__tests__/workspace-unit-contract.test.d.ts.map +1 -0
- package/dist/languages/__tests__/workspace-unit-contract.test.js +66 -0
- package/dist/languages/__tests__/workspace-unit-contract.test.js.map +1 -0
- package/dist/languages/adapter.d.ts +66 -0
- package/dist/languages/adapter.d.ts.map +1 -0
- package/dist/languages/adapter.js +2 -0
- package/dist/languages/adapter.js.map +1 -0
- package/dist/languages/content-filter-dispatch.d.ts +36 -0
- package/dist/languages/content-filter-dispatch.d.ts.map +1 -0
- package/dist/languages/content-filter-dispatch.js +75 -0
- package/dist/languages/content-filter-dispatch.js.map +1 -0
- package/dist/languages/generic-types.d.ts +22 -0
- package/dist/languages/generic-types.d.ts.map +1 -0
- package/dist/languages/generic-types.js +3 -0
- package/dist/languages/generic-types.js.map +1 -0
- package/dist/languages/index.d.ts +12 -0
- package/dist/languages/index.d.ts.map +1 -0
- package/dist/languages/index.js +7 -0
- package/dist/languages/index.js.map +1 -0
- package/dist/languages/non-code-formats.d.ts +37 -0
- package/dist/languages/non-code-formats.d.ts.map +1 -0
- package/dist/languages/non-code-formats.js +45 -0
- package/dist/languages/non-code-formats.js.map +1 -0
- package/dist/languages/parse-cache-class.d.ts +69 -0
- package/dist/languages/parse-cache-class.d.ts.map +1 -0
- package/dist/languages/parse-cache-class.js +135 -0
- package/dist/languages/parse-cache-class.js.map +1 -0
- package/dist/languages/parse-cache.d.ts +54 -0
- package/dist/languages/parse-cache.d.ts.map +1 -0
- package/dist/languages/parse-cache.js +88 -0
- package/dist/languages/parse-cache.js.map +1 -0
- package/dist/languages/registry.d.ts +35 -0
- package/dist/languages/registry.d.ts.map +1 -0
- package/dist/languages/registry.js +123 -0
- package/dist/languages/registry.js.map +1 -0
- package/dist/languages/strip-scanners.d.ts +170 -0
- package/dist/languages/strip-scanners.d.ts.map +1 -0
- package/dist/languages/strip-scanners.js +233 -0
- package/dist/languages/strip-scanners.js.map +1 -0
- package/dist/languages/strip-utils.d.ts +66 -0
- package/dist/languages/strip-utils.d.ts.map +1 -0
- package/dist/languages/strip-utils.js +88 -0
- package/dist/languages/strip-utils.js.map +1 -0
- package/dist/languages/text-tree.d.ts +44 -0
- package/dist/languages/text-tree.d.ts.map +1 -0
- package/dist/languages/text-tree.js +34 -0
- package/dist/languages/text-tree.js.map +1 -0
- package/dist/languages/workspace-unit.d.ts +18 -0
- package/dist/languages/workspace-unit.d.ts.map +1 -0
- package/dist/languages/workspace-unit.js +2 -0
- package/dist/languages/workspace-unit.js.map +1 -0
- package/dist/lib/__tests__/config-version.test.d.ts +12 -0
- package/dist/lib/__tests__/config-version.test.d.ts.map +1 -0
- package/dist/lib/__tests__/config-version.test.js +92 -0
- package/dist/lib/__tests__/config-version.test.js.map +1 -0
- package/dist/lib/__tests__/diagnostics-bus.test.d.ts +7 -0
- package/dist/lib/__tests__/diagnostics-bus.test.d.ts.map +1 -0
- package/dist/lib/__tests__/diagnostics-bus.test.js +44 -0
- package/dist/lib/__tests__/diagnostics-bus.test.js.map +1 -0
- package/dist/lib/__tests__/env-registry.test.d.ts +7 -0
- package/dist/lib/__tests__/env-registry.test.d.ts.map +1 -0
- package/dist/lib/__tests__/env-registry.test.js +82 -0
- package/dist/lib/__tests__/env-registry.test.js.map +1 -0
- package/dist/lib/__tests__/errors.test.d.ts +2 -0
- package/dist/lib/__tests__/errors.test.d.ts.map +1 -0
- package/dist/lib/__tests__/errors.test.js +218 -0
- package/dist/lib/__tests__/errors.test.js.map +1 -0
- package/dist/lib/__tests__/format.test.d.ts +2 -0
- package/dist/lib/__tests__/format.test.d.ts.map +1 -0
- package/dist/lib/__tests__/format.test.js +23 -0
- package/dist/lib/__tests__/format.test.js.map +1 -0
- package/dist/lib/__tests__/ids.test.d.ts +2 -0
- package/dist/lib/__tests__/ids.test.d.ts.map +1 -0
- package/dist/lib/__tests__/ids.test.js +80 -0
- package/dist/lib/__tests__/ids.test.js.map +1 -0
- package/dist/lib/__tests__/logger.test.d.ts +2 -0
- package/dist/lib/__tests__/logger.test.d.ts.map +1 -0
- package/dist/lib/__tests__/logger.test.js +284 -0
- package/dist/lib/__tests__/logger.test.js.map +1 -0
- package/dist/lib/__tests__/package-version.test.d.ts +2 -0
- package/dist/lib/__tests__/package-version.test.d.ts.map +1 -0
- package/dist/lib/__tests__/package-version.test.js +47 -0
- package/dist/lib/__tests__/package-version.test.js.map +1 -0
- package/dist/lib/__tests__/paths.test.d.ts +5 -0
- package/dist/lib/__tests__/paths.test.d.ts.map +1 -0
- package/dist/lib/__tests__/paths.test.js +59 -0
- package/dist/lib/__tests__/paths.test.js.map +1 -0
- package/dist/lib/__tests__/payload-version.test.d.ts +2 -0
- package/dist/lib/__tests__/payload-version.test.d.ts.map +1 -0
- package/dist/lib/__tests__/payload-version.test.js +35 -0
- package/dist/lib/__tests__/payload-version.test.js.map +1 -0
- package/dist/lib/__tests__/phantom-detect.test.d.ts +10 -0
- package/dist/lib/__tests__/phantom-detect.test.d.ts.map +1 -0
- package/dist/lib/__tests__/phantom-detect.test.js +84 -0
- package/dist/lib/__tests__/phantom-detect.test.js.map +1 -0
- package/dist/lib/__tests__/project-context.test.d.ts +10 -0
- package/dist/lib/__tests__/project-context.test.d.ts.map +1 -0
- package/dist/lib/__tests__/project-context.test.js +240 -0
- package/dist/lib/__tests__/project-context.test.js.map +1 -0
- package/dist/lib/__tests__/registry.test.d.ts +2 -0
- package/dist/lib/__tests__/registry.test.d.ts.map +1 -0
- package/dist/lib/__tests__/registry.test.js +333 -0
- package/dist/lib/__tests__/registry.test.js.map +1 -0
- package/dist/lib/__tests__/retry.test.d.ts +2 -0
- package/dist/lib/__tests__/retry.test.d.ts.map +1 -0
- package/dist/lib/__tests__/retry.test.js +71 -0
- package/dist/lib/__tests__/retry.test.js.map +1 -0
- package/dist/lib/__tests__/run-diagnostics.test.d.ts +9 -0
- package/dist/lib/__tests__/run-diagnostics.test.d.ts.map +1 -0
- package/dist/lib/__tests__/run-diagnostics.test.js +61 -0
- package/dist/lib/__tests__/run-diagnostics.test.js.map +1 -0
- package/dist/lib/__tests__/run-scope.test.d.ts +2 -0
- package/dist/lib/__tests__/run-scope.test.d.ts.map +1 -0
- package/dist/lib/__tests__/run-scope.test.js +202 -0
- package/dist/lib/__tests__/run-scope.test.js.map +1 -0
- package/dist/lib/__tests__/run-timer.test.d.ts +2 -0
- package/dist/lib/__tests__/run-timer.test.d.ts.map +1 -0
- package/dist/lib/__tests__/run-timer.test.js +152 -0
- package/dist/lib/__tests__/run-timer.test.js.map +1 -0
- package/dist/lib/__tests__/severity-policy.test.d.ts +6 -0
- package/dist/lib/__tests__/severity-policy.test.d.ts.map +1 -0
- package/dist/lib/__tests__/severity-policy.test.js +47 -0
- package/dist/lib/__tests__/severity-policy.test.js.map +1 -0
- package/dist/lib/__tests__/telemetry.test.d.ts +2 -0
- package/dist/lib/__tests__/telemetry.test.d.ts.map +1 -0
- package/dist/lib/__tests__/telemetry.test.js +212 -0
- package/dist/lib/__tests__/telemetry.test.js.map +1 -0
- package/dist/lib/__tests__/verdict-policy.test.d.ts +7 -0
- package/dist/lib/__tests__/verdict-policy.test.d.ts.map +1 -0
- package/dist/lib/__tests__/verdict-policy.test.js +91 -0
- package/dist/lib/__tests__/verdict-policy.test.js.map +1 -0
- package/dist/lib/__tests__/yaml.test.d.ts +6 -0
- package/dist/lib/__tests__/yaml.test.d.ts.map +1 -0
- package/dist/lib/__tests__/yaml.test.js +79 -0
- package/dist/lib/__tests__/yaml.test.js.map +1 -0
- package/dist/lib/config-version.d.ts +49 -0
- package/dist/lib/config-version.d.ts.map +1 -0
- package/dist/lib/config-version.js +56 -0
- package/dist/lib/config-version.js.map +1 -0
- package/dist/lib/diagnostics-bus.d.ts +48 -0
- package/dist/lib/diagnostics-bus.d.ts.map +1 -0
- package/dist/lib/diagnostics-bus.js +74 -0
- package/dist/lib/diagnostics-bus.js.map +1 -0
- package/dist/lib/env-registry.d.ts +108 -0
- package/dist/lib/env-registry.d.ts.map +1 -0
- package/dist/lib/env-registry.js +92 -0
- package/dist/lib/env-registry.js.map +1 -0
- package/dist/lib/errors.d.ts +132 -0
- package/dist/lib/errors.d.ts.map +1 -0
- package/dist/lib/errors.js +160 -0
- package/dist/lib/errors.js.map +1 -0
- package/dist/lib/execution/__tests__/execution.test.d.ts +7 -0
- package/dist/lib/execution/__tests__/execution.test.d.ts.map +1 -0
- package/dist/lib/execution/__tests__/execution.test.js +254 -0
- package/dist/lib/execution/__tests__/execution.test.js.map +1 -0
- package/dist/lib/execution/index.d.ts +15 -0
- package/dist/lib/execution/index.d.ts.map +1 -0
- package/dist/lib/execution/index.js +10 -0
- package/dist/lib/execution/index.js.map +1 -0
- package/dist/lib/execution/options.d.ts +32 -0
- package/dist/lib/execution/options.d.ts.map +1 -0
- package/dist/lib/execution/options.js +15 -0
- package/dist/lib/execution/options.js.map +1 -0
- package/dist/lib/execution/pipeline.d.ts +36 -0
- package/dist/lib/execution/pipeline.d.ts.map +1 -0
- package/dist/lib/execution/pipeline.js +38 -0
- package/dist/lib/execution/pipeline.js.map +1 -0
- package/dist/lib/execution/retry.d.ts +38 -0
- package/dist/lib/execution/retry.d.ts.map +1 -0
- package/dist/lib/execution/retry.js +56 -0
- package/dist/lib/execution/retry.js.map +1 -0
- package/dist/lib/execution/run-with-timeout.d.ts +46 -0
- package/dist/lib/execution/run-with-timeout.d.ts.map +1 -0
- package/dist/lib/execution/run-with-timeout.js +86 -0
- package/dist/lib/execution/run-with-timeout.js.map +1 -0
- package/dist/lib/execution/schedule.d.ts +62 -0
- package/dist/lib/execution/schedule.d.ts.map +1 -0
- package/dist/lib/execution/schedule.js +130 -0
- package/dist/lib/execution/schedule.js.map +1 -0
- package/dist/lib/format.d.ts +17 -0
- package/dist/lib/format.d.ts.map +1 -0
- package/dist/lib/format.js +26 -0
- package/dist/lib/format.js.map +1 -0
- package/dist/lib/ids.d.ts +13 -0
- package/dist/lib/ids.d.ts.map +1 -0
- package/dist/lib/ids.js +48 -0
- package/dist/lib/ids.js.map +1 -0
- package/dist/lib/logger.d.ts +166 -0
- package/dist/lib/logger.d.ts.map +1 -0
- package/dist/lib/logger.js +283 -0
- package/dist/lib/logger.js.map +1 -0
- package/dist/lib/package-version.d.ts +17 -0
- package/dist/lib/package-version.d.ts.map +1 -0
- package/dist/lib/package-version.js +52 -0
- package/dist/lib/package-version.js.map +1 -0
- package/dist/lib/paths.d.ts +139 -0
- package/dist/lib/paths.d.ts.map +1 -0
- package/dist/lib/paths.js +105 -0
- package/dist/lib/paths.js.map +1 -0
- package/dist/lib/payload-version.d.ts +15 -0
- package/dist/lib/payload-version.d.ts.map +1 -0
- package/dist/lib/payload-version.js +24 -0
- package/dist/lib/payload-version.js.map +1 -0
- package/dist/lib/phantom-detect.d.ts +21 -0
- package/dist/lib/phantom-detect.d.ts.map +1 -0
- package/dist/lib/phantom-detect.js +76 -0
- package/dist/lib/phantom-detect.js.map +1 -0
- package/dist/lib/project-context.d.ts +66 -0
- package/dist/lib/project-context.d.ts.map +1 -0
- package/dist/lib/project-context.js +112 -0
- package/dist/lib/project-context.js.map +1 -0
- package/dist/lib/recipe-id.d.ts +13 -0
- package/dist/lib/recipe-id.d.ts.map +1 -0
- package/dist/lib/recipe-id.js +15 -0
- package/dist/lib/recipe-id.js.map +1 -0
- package/dist/lib/registry.d.ts +98 -0
- package/dist/lib/registry.d.ts.map +1 -0
- package/dist/lib/registry.js +152 -0
- package/dist/lib/registry.js.map +1 -0
- package/dist/lib/retry.d.ts +26 -0
- package/dist/lib/retry.d.ts.map +1 -0
- package/dist/lib/retry.js +48 -0
- package/dist/lib/retry.js.map +1 -0
- package/dist/lib/run-diagnostics.d.ts +64 -0
- package/dist/lib/run-diagnostics.d.ts.map +1 -0
- package/dist/lib/run-diagnostics.js +25 -0
- package/dist/lib/run-diagnostics.js.map +1 -0
- package/dist/lib/run-scope.d.ts +167 -0
- package/dist/lib/run-scope.d.ts.map +1 -0
- package/dist/lib/run-scope.js +176 -0
- package/dist/lib/run-scope.js.map +1 -0
- package/dist/lib/run-timer.d.ts +82 -0
- package/dist/lib/run-timer.d.ts.map +1 -0
- package/dist/lib/run-timer.js +79 -0
- package/dist/lib/run-timer.js.map +1 -0
- package/dist/lib/scope-types.d.ts +172 -0
- package/dist/lib/scope-types.d.ts.map +1 -0
- package/dist/lib/scope-types.js +27 -0
- package/dist/lib/scope-types.js.map +1 -0
- package/dist/lib/severity-policy.d.ts +38 -0
- package/dist/lib/severity-policy.d.ts.map +1 -0
- package/dist/lib/severity-policy.js +44 -0
- package/dist/lib/severity-policy.js.map +1 -0
- package/dist/lib/telemetry.d.ts +93 -0
- package/dist/lib/telemetry.d.ts.map +1 -0
- package/dist/lib/telemetry.js +144 -0
- package/dist/lib/telemetry.js.map +1 -0
- package/dist/lib/ui-context.d.ts +34 -0
- package/dist/lib/ui-context.d.ts.map +1 -0
- package/dist/lib/ui-context.js +16 -0
- package/dist/lib/ui-context.js.map +1 -0
- package/dist/lib/verdict-policy.d.ts +71 -0
- package/dist/lib/verdict-policy.d.ts.map +1 -0
- package/dist/lib/verdict-policy.js +82 -0
- package/dist/lib/verdict-policy.js.map +1 -0
- package/dist/lib/yaml.d.ts +74 -0
- package/dist/lib/yaml.d.ts.map +1 -0
- package/dist/lib/yaml.js +118 -0
- package/dist/lib/yaml.js.map +1 -0
- package/dist/plugins/__tests__/as-if-external.test.d.ts +18 -0
- package/dist/plugins/__tests__/as-if-external.test.d.ts.map +1 -0
- package/dist/plugins/__tests__/as-if-external.test.js +159 -0
- package/dist/plugins/__tests__/as-if-external.test.js.map +1 -0
- package/dist/plugins/__tests__/authored-tool-discovery.test.d.ts +8 -0
- package/dist/plugins/__tests__/authored-tool-discovery.test.d.ts.map +1 -0
- package/dist/plugins/__tests__/authored-tool-discovery.test.js +97 -0
- package/dist/plugins/__tests__/authored-tool-discovery.test.js.map +1 -0
- package/dist/plugins/__tests__/capability-discovery.test.d.ts +2 -0
- package/dist/plugins/__tests__/capability-discovery.test.d.ts.map +1 -0
- package/dist/plugins/__tests__/capability-discovery.test.js +349 -0
- package/dist/plugins/__tests__/capability-discovery.test.js.map +1 -0
- package/dist/plugins/__tests__/capability-from-manifest.test.d.ts +2 -0
- package/dist/plugins/__tests__/capability-from-manifest.test.d.ts.map +1 -0
- package/dist/plugins/__tests__/capability-from-manifest.test.js +172 -0
- package/dist/plugins/__tests__/capability-from-manifest.test.js.map +1 -0
- package/dist/plugins/__tests__/capability-loader.test.d.ts +2 -0
- package/dist/plugins/__tests__/capability-loader.test.d.ts.map +1 -0
- package/dist/plugins/__tests__/capability-loader.test.js +122 -0
- package/dist/plugins/__tests__/capability-loader.test.js.map +1 -0
- package/dist/plugins/__tests__/capability-registry.test.d.ts +2 -0
- package/dist/plugins/__tests__/capability-registry.test.d.ts.map +1 -0
- package/dist/plugins/__tests__/capability-registry.test.js +185 -0
- package/dist/plugins/__tests__/capability-registry.test.js.map +1 -0
- package/dist/plugins/__tests__/discover.test.d.ts +2 -0
- package/dist/plugins/__tests__/discover.test.d.ts.map +1 -0
- package/dist/plugins/__tests__/discover.test.js +311 -0
- package/dist/plugins/__tests__/discover.test.js.map +1 -0
- package/dist/plugins/__tests__/loader.test.d.ts +2 -0
- package/dist/plugins/__tests__/loader.test.d.ts.map +1 -0
- package/dist/plugins/__tests__/loader.test.js +191 -0
- package/dist/plugins/__tests__/loader.test.js.map +1 -0
- package/dist/plugins/__tests__/manifest-discovery.test.d.ts +2 -0
- package/dist/plugins/__tests__/manifest-discovery.test.d.ts.map +1 -0
- package/dist/plugins/__tests__/manifest-discovery.test.js +132 -0
- package/dist/plugins/__tests__/manifest-discovery.test.js.map +1 -0
- package/dist/plugins/__tests__/manifest-loader.test.d.ts +2 -0
- package/dist/plugins/__tests__/manifest-loader.test.d.ts.map +1 -0
- package/dist/plugins/__tests__/manifest-loader.test.js +434 -0
- package/dist/plugins/__tests__/manifest-loader.test.js.map +1 -0
- package/dist/plugins/__tests__/marker-discovery.test.d.ts +2 -0
- package/dist/plugins/__tests__/marker-discovery.test.d.ts.map +1 -0
- package/dist/plugins/__tests__/marker-discovery.test.js +164 -0
- package/dist/plugins/__tests__/marker-discovery.test.js.map +1 -0
- package/dist/plugins/__tests__/node-modules-walk.test.d.ts +2 -0
- package/dist/plugins/__tests__/node-modules-walk.test.d.ts.map +1 -0
- package/dist/plugins/__tests__/node-modules-walk.test.js +76 -0
- package/dist/plugins/__tests__/node-modules-walk.test.js.map +1 -0
- package/dist/plugins/__tests__/package-entry.test.d.ts +9 -0
- package/dist/plugins/__tests__/package-entry.test.d.ts.map +1 -0
- package/dist/plugins/__tests__/package-entry.test.js +117 -0
- package/dist/plugins/__tests__/package-entry.test.js.map +1 -0
- package/dist/plugins/__tests__/recipe-loader.test.d.ts +2 -0
- package/dist/plugins/__tests__/recipe-loader.test.d.ts.map +1 -0
- package/dist/plugins/__tests__/recipe-loader.test.js +130 -0
- package/dist/plugins/__tests__/recipe-loader.test.js.map +1 -0
- package/dist/plugins/__tests__/scope-validation.test.d.ts +2 -0
- package/dist/plugins/__tests__/scope-validation.test.d.ts.map +1 -0
- package/dist/plugins/__tests__/scope-validation.test.js +68 -0
- package/dist/plugins/__tests__/scope-validation.test.js.map +1 -0
- package/dist/plugins/__tests__/single-core-guard.test.d.ts +10 -0
- package/dist/plugins/__tests__/single-core-guard.test.d.ts.map +1 -0
- package/dist/plugins/__tests__/single-core-guard.test.js +89 -0
- package/dist/plugins/__tests__/single-core-guard.test.js.map +1 -0
- package/dist/plugins/__tests__/tool-package-discovery.test.d.ts +2 -0
- package/dist/plugins/__tests__/tool-package-discovery.test.d.ts.map +1 -0
- package/dist/plugins/__tests__/tool-package-discovery.test.js +215 -0
- package/dist/plugins/__tests__/tool-package-discovery.test.js.map +1 -0
- package/dist/plugins/authored-tool-discovery.d.ts +45 -0
- package/dist/plugins/authored-tool-discovery.d.ts.map +1 -0
- package/dist/plugins/authored-tool-discovery.js +61 -0
- package/dist/plugins/authored-tool-discovery.js.map +1 -0
- package/dist/plugins/capability-discovery.d.ts +80 -0
- package/dist/plugins/capability-discovery.d.ts.map +1 -0
- package/dist/plugins/capability-discovery.js +278 -0
- package/dist/plugins/capability-discovery.js.map +1 -0
- package/dist/plugins/capability-loader.d.ts +50 -0
- package/dist/plugins/capability-loader.d.ts.map +1 -0
- package/dist/plugins/capability-loader.js +85 -0
- package/dist/plugins/capability-loader.js.map +1 -0
- package/dist/plugins/capability-registry.d.ts +169 -0
- package/dist/plugins/capability-registry.d.ts.map +1 -0
- package/dist/plugins/capability-registry.js +319 -0
- package/dist/plugins/capability-registry.js.map +1 -0
- package/dist/plugins/discover.d.ts +64 -0
- package/dist/plugins/discover.d.ts.map +1 -0
- package/dist/plugins/discover.js +303 -0
- package/dist/plugins/discover.js.map +1 -0
- package/dist/plugins/index.d.ts +37 -0
- package/dist/plugins/index.d.ts.map +1 -0
- package/dist/plugins/index.js +40 -0
- package/dist/plugins/index.js.map +1 -0
- package/dist/plugins/json-guards.d.ts +11 -0
- package/dist/plugins/json-guards.d.ts.map +1 -0
- package/dist/plugins/json-guards.js +15 -0
- package/dist/plugins/json-guards.js.map +1 -0
- package/dist/plugins/loader.d.ts +67 -0
- package/dist/plugins/loader.d.ts.map +1 -0
- package/dist/plugins/loader.js +137 -0
- package/dist/plugins/loader.js.map +1 -0
- package/dist/plugins/manifest-discovery.d.ts +28 -0
- package/dist/plugins/manifest-discovery.d.ts.map +1 -0
- package/dist/plugins/manifest-discovery.js +103 -0
- package/dist/plugins/manifest-discovery.js.map +1 -0
- package/dist/plugins/manifest-loader.d.ts +120 -0
- package/dist/plugins/manifest-loader.d.ts.map +1 -0
- package/dist/plugins/manifest-loader.js +410 -0
- package/dist/plugins/manifest-loader.js.map +1 -0
- package/dist/plugins/marker-discovery.d.ts +115 -0
- package/dist/plugins/marker-discovery.d.ts.map +1 -0
- package/dist/plugins/marker-discovery.js +172 -0
- package/dist/plugins/marker-discovery.js.map +1 -0
- package/dist/plugins/node-modules-walk.d.ts +61 -0
- package/dist/plugins/node-modules-walk.d.ts.map +1 -0
- package/dist/plugins/node-modules-walk.js +99 -0
- package/dist/plugins/node-modules-walk.js.map +1 -0
- package/dist/plugins/package-entry.d.ts +38 -0
- package/dist/plugins/package-entry.d.ts.map +1 -0
- package/dist/plugins/package-entry.js +86 -0
- package/dist/plugins/package-entry.js.map +1 -0
- package/dist/plugins/recipe-loader.d.ts +63 -0
- package/dist/plugins/recipe-loader.d.ts.map +1 -0
- package/dist/plugins/recipe-loader.js +67 -0
- package/dist/plugins/recipe-loader.js.map +1 -0
- package/dist/plugins/scope-validation.d.ts +35 -0
- package/dist/plugins/scope-validation.d.ts.map +1 -0
- package/dist/plugins/scope-validation.js +55 -0
- package/dist/plugins/scope-validation.js.map +1 -0
- package/dist/plugins/single-core-guard.d.ts +28 -0
- package/dist/plugins/single-core-guard.d.ts.map +1 -0
- package/dist/plugins/single-core-guard.js +69 -0
- package/dist/plugins/single-core-guard.js.map +1 -0
- package/dist/plugins/tool-package-discovery.d.ts +93 -0
- package/dist/plugins/tool-package-discovery.d.ts.map +1 -0
- package/dist/plugins/tool-package-discovery.js +118 -0
- package/dist/plugins/tool-package-discovery.js.map +1 -0
- package/dist/plugins/types.d.ts +78 -0
- package/dist/plugins/types.d.ts.map +1 -0
- package/dist/plugins/types.js +15 -0
- package/dist/plugins/types.js.map +1 -0
- package/dist/recipes/__tests__/registry.test.d.ts +2 -0
- package/dist/recipes/__tests__/registry.test.d.ts.map +1 -0
- package/dist/recipes/__tests__/registry.test.js +170 -0
- package/dist/recipes/__tests__/registry.test.js.map +1 -0
- package/dist/recipes/__tests__/selector.test.d.ts +20 -0
- package/dist/recipes/__tests__/selector.test.d.ts.map +1 -0
- package/dist/recipes/__tests__/selector.test.js +173 -0
- package/dist/recipes/__tests__/selector.test.js.map +1 -0
- package/dist/recipes/__tests__/unit-config.test.d.ts +7 -0
- package/dist/recipes/__tests__/unit-config.test.d.ts.map +1 -0
- package/dist/recipes/__tests__/unit-config.test.js +52 -0
- package/dist/recipes/__tests__/unit-config.test.js.map +1 -0
- package/dist/recipes/registry.d.ts +105 -0
- package/dist/recipes/registry.d.ts.map +1 -0
- package/dist/recipes/registry.js +141 -0
- package/dist/recipes/registry.js.map +1 -0
- package/dist/recipes/selector.d.ts +112 -0
- package/dist/recipes/selector.d.ts.map +1 -0
- package/dist/recipes/selector.js +134 -0
- package/dist/recipes/selector.js.map +1 -0
- package/dist/recipes/unit-config.d.ts +63 -0
- package/dist/recipes/unit-config.d.ts.map +1 -0
- package/dist/recipes/unit-config.js +68 -0
- package/dist/recipes/unit-config.js.map +1 -0
- package/dist/runtime/__tests__/in-process-transport.test.d.ts +6 -0
- package/dist/runtime/__tests__/in-process-transport.test.d.ts.map +1 -0
- package/dist/runtime/__tests__/in-process-transport.test.js +73 -0
- package/dist/runtime/__tests__/in-process-transport.test.js.map +1 -0
- package/dist/runtime/__tests__/subprocess-transport.test.d.ts +11 -0
- package/dist/runtime/__tests__/subprocess-transport.test.d.ts.map +1 -0
- package/dist/runtime/__tests__/subprocess-transport.test.js +118 -0
- package/dist/runtime/__tests__/subprocess-transport.test.js.map +1 -0
- package/dist/runtime/in-process-transport.d.ts +20 -0
- package/dist/runtime/in-process-transport.d.ts.map +1 -0
- package/dist/runtime/in-process-transport.js +49 -0
- package/dist/runtime/in-process-transport.js.map +1 -0
- package/dist/runtime/progress-transport.d.ts +73 -0
- package/dist/runtime/progress-transport.d.ts.map +1 -0
- package/dist/runtime/progress-transport.js +17 -0
- package/dist/runtime/progress-transport.js.map +1 -0
- package/dist/runtime/subprocess-transport.d.ts +43 -0
- package/dist/runtime/subprocess-transport.d.ts.map +1 -0
- package/dist/runtime/subprocess-transport.js +134 -0
- package/dist/runtime/subprocess-transport.js.map +1 -0
- package/dist/signals/comment-openers.d.ts +29 -0
- package/dist/signals/comment-openers.d.ts.map +1 -0
- package/dist/signals/comment-openers.js +41 -0
- package/dist/signals/comment-openers.js.map +1 -0
- package/dist/signals/comment-openers.test.d.ts +7 -0
- package/dist/signals/comment-openers.test.d.ts.map +1 -0
- package/dist/signals/comment-openers.test.js +41 -0
- package/dist/signals/comment-openers.test.js.map +1 -0
- package/dist/signals/create-signal-from-violation.d.ts +29 -0
- package/dist/signals/create-signal-from-violation.d.ts.map +1 -0
- package/dist/signals/create-signal-from-violation.js +29 -0
- package/dist/signals/create-signal-from-violation.js.map +1 -0
- package/dist/signals/signal-sink.d.ts +49 -0
- package/dist/signals/signal-sink.d.ts.map +1 -0
- package/dist/signals/signal-sink.js +6 -0
- package/dist/signals/signal-sink.js.map +1 -0
- package/dist/signals/suppress.d.ts +102 -0
- package/dist/signals/suppress.d.ts.map +1 -0
- package/dist/signals/suppress.js +325 -0
- package/dist/signals/suppress.js.map +1 -0
- package/dist/signals/suppress.test.d.ts +2 -0
- package/dist/signals/suppress.test.d.ts.map +1 -0
- package/dist/signals/suppress.test.js +213 -0
- package/dist/signals/suppress.test.js.map +1 -0
- package/dist/tools/__tests__/command-spec.test.d.ts +2 -0
- package/dist/tools/__tests__/command-spec.test.d.ts.map +1 -0
- package/dist/tools/__tests__/command-spec.test.js +191 -0
- package/dist/tools/__tests__/command-spec.test.js.map +1 -0
- package/dist/tools/__tests__/compatibility.test.d.ts +5 -0
- package/dist/tools/__tests__/compatibility.test.d.ts.map +1 -0
- package/dist/tools/__tests__/compatibility.test.js +41 -0
- package/dist/tools/__tests__/compatibility.test.js.map +1 -0
- package/dist/tools/__tests__/ids.test.d.ts +5 -0
- package/dist/tools/__tests__/ids.test.d.ts.map +1 -0
- package/dist/tools/__tests__/ids.test.js +56 -0
- package/dist/tools/__tests__/ids.test.js.map +1 -0
- package/dist/tools/__tests__/manifest-assert.test.d.ts +5 -0
- package/dist/tools/__tests__/manifest-assert.test.d.ts.map +1 -0
- package/dist/tools/__tests__/manifest-assert.test.js +66 -0
- package/dist/tools/__tests__/manifest-assert.test.js.map +1 -0
- package/dist/tools/__tests__/registry.test.d.ts +2 -0
- package/dist/tools/__tests__/registry.test.d.ts.map +1 -0
- package/dist/tools/__tests__/registry.test.js +93 -0
- package/dist/tools/__tests__/registry.test.js.map +1 -0
- package/dist/tools/__tests__/types.test.d.ts +2 -0
- package/dist/tools/__tests__/types.test.d.ts.map +1 -0
- package/dist/tools/__tests__/types.test.js +51 -0
- package/dist/tools/__tests__/types.test.js.map +1 -0
- package/dist/tools/capability.d.ts +257 -0
- package/dist/tools/capability.d.ts.map +1 -0
- package/dist/tools/capability.js +46 -0
- package/dist/tools/capability.js.map +1 -0
- package/dist/tools/command-spec.d.ts +211 -0
- package/dist/tools/command-spec.d.ts.map +1 -0
- package/dist/tools/command-spec.js +110 -0
- package/dist/tools/command-spec.js.map +1 -0
- package/dist/tools/compatibility.d.ts +45 -0
- package/dist/tools/compatibility.d.ts.map +1 -0
- package/dist/tools/compatibility.js +49 -0
- package/dist/tools/compatibility.js.map +1 -0
- package/dist/tools/ids.d.ts +61 -0
- package/dist/tools/ids.d.ts.map +1 -0
- package/dist/tools/ids.js +61 -0
- package/dist/tools/ids.js.map +1 -0
- package/dist/tools/index.d.ts +22 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +28 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/manifest-assert.d.ts +35 -0
- package/dist/tools/manifest-assert.d.ts.map +1 -0
- package/dist/tools/manifest-assert.js +67 -0
- package/dist/tools/manifest-assert.js.map +1 -0
- package/dist/tools/manifest.d.ts +178 -0
- package/dist/tools/manifest.d.ts.map +1 -0
- package/dist/tools/manifest.js +35 -0
- package/dist/tools/manifest.js.map +1 -0
- package/dist/tools/registry.d.ts +37 -0
- package/dist/tools/registry.d.ts.map +1 -0
- package/dist/tools/registry.js +49 -0
- package/dist/tools/registry.js.map +1 -0
- package/dist/tools/types.d.ts +1021 -0
- package/dist/tools/types.d.ts.map +1 -0
- package/dist/tools/types.js +77 -0
- package/dist/tools/types.js.map +1 -0
- package/dist/types/__tests__/signal.test.d.ts +2 -0
- package/dist/types/__tests__/signal.test.d.ts.map +1 -0
- package/dist/types/__tests__/signal.test.js +111 -0
- package/dist/types/__tests__/signal.test.js.map +1 -0
- package/dist/types/index.d.ts +5 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +3 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/signal-batch.d.ts +56 -0
- package/dist/types/signal-batch.d.ts.map +1 -0
- package/dist/types/signal-batch.js +54 -0
- package/dist/types/signal-batch.js.map +1 -0
- package/dist/types/signal.d.ts +77 -0
- package/dist/types/signal.d.ts.map +1 -0
- package/dist/types/signal.js +42 -0
- package/dist/types/signal.js.map +1 -0
- package/package.json +57 -0
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Execution substrate — scheduleUnits (loop/concurrency/stop), runWithTimeout
|
|
3
|
+
* (the §4.3 timeout fix), runWithRetry (the fitness-hoisted retry), executePipeline
|
|
4
|
+
* (the combinator), and deriveRecipeId.
|
|
5
|
+
*/
|
|
6
|
+
import { describe, it, expect } from 'vitest';
|
|
7
|
+
import { deriveRecipeId } from '../../recipe-id.js';
|
|
8
|
+
import { executePipeline } from '../pipeline.js';
|
|
9
|
+
import { runWithRetry } from '../retry.js';
|
|
10
|
+
import { runWithTimeout } from '../run-with-timeout.js';
|
|
11
|
+
import { scheduleUnits } from '../schedule.js';
|
|
12
|
+
describe('deriveRecipeId', () => {
|
|
13
|
+
it('derives <prefix>_<name>, preserving existing schemes', () => {
|
|
14
|
+
expect(deriveRecipeId('RCP', 'example')).toBe('RCP_example');
|
|
15
|
+
expect(deriveRecipeId('GRCP', 'default')).toBe('GRCP_default');
|
|
16
|
+
expect(deriveRecipeId('BSCP', 'default')).toBe('BSCP_default');
|
|
17
|
+
});
|
|
18
|
+
});
|
|
19
|
+
describe('runWithTimeout', () => {
|
|
20
|
+
it('classifies a fast run as ok', async () => {
|
|
21
|
+
const out = await runWithTimeout({ run: () => Promise.resolve(42), timeoutMs: 1000 });
|
|
22
|
+
expect(out.status).toBe('ok');
|
|
23
|
+
expect(out.status === 'ok' && out.result).toBe(42);
|
|
24
|
+
});
|
|
25
|
+
it('ABORTS a runaway run and classifies it as timeout (the §4.3 sim fix)', async () => {
|
|
26
|
+
const out = await runWithTimeout({
|
|
27
|
+
// A run that never resolves on its own — only the timeout's abort ends it.
|
|
28
|
+
run: (signal) => new Promise((_resolve, reject) => {
|
|
29
|
+
signal.addEventListener('abort', () => reject(new Error('aborted')));
|
|
30
|
+
}),
|
|
31
|
+
timeoutMs: 20,
|
|
32
|
+
});
|
|
33
|
+
expect(out.status).toBe('timeout');
|
|
34
|
+
});
|
|
35
|
+
it('classifies a thrown domain error as error (not timeout)', async () => {
|
|
36
|
+
const out = await runWithTimeout({
|
|
37
|
+
run: () => Promise.reject(new Error('boom')),
|
|
38
|
+
timeoutMs: 1000,
|
|
39
|
+
});
|
|
40
|
+
expect(out.status).toBe('error');
|
|
41
|
+
expect(out.status === 'error' && out.error.message).toBe('boom');
|
|
42
|
+
});
|
|
43
|
+
describe('with a retry policy (the retry branch)', () => {
|
|
44
|
+
const retry = { enabled: true, maxRetries: 2, backoffMs: [0, 0] };
|
|
45
|
+
it('returns ok with the result when the retried run succeeds', async () => {
|
|
46
|
+
let calls = 0;
|
|
47
|
+
const out = await runWithTimeout({
|
|
48
|
+
run: () => {
|
|
49
|
+
calls++;
|
|
50
|
+
return calls < 2 ? Promise.reject(new Error('flaky')) : Promise.resolve('healed');
|
|
51
|
+
},
|
|
52
|
+
timeoutMs: 1000,
|
|
53
|
+
retry,
|
|
54
|
+
});
|
|
55
|
+
expect(out.status).toBe('ok');
|
|
56
|
+
expect(out.status === 'ok' && out.result).toBe('healed');
|
|
57
|
+
expect(calls).toBe(2);
|
|
58
|
+
});
|
|
59
|
+
it('returns error with lastError when every retried attempt throws', async () => {
|
|
60
|
+
const out = await runWithTimeout({
|
|
61
|
+
run: () => Promise.reject(new Error('always')),
|
|
62
|
+
timeoutMs: 1000,
|
|
63
|
+
retry,
|
|
64
|
+
});
|
|
65
|
+
expect(out.status).toBe('error');
|
|
66
|
+
expect(out.status === 'error' && out.error.message).toBe('always');
|
|
67
|
+
});
|
|
68
|
+
it('classifies a timeout while retrying as timeout (single-source abort)', async () => {
|
|
69
|
+
// The run rejects synchronously on each attempt without ever resolving the
|
|
70
|
+
// domain value, so retry keeps re-invoking it. Meanwhile the short timeout
|
|
71
|
+
// aborts the controller mid-retry; after retry settles, the post-run
|
|
72
|
+
// `signal.aborted` check maps the outcome to timeout, not error.
|
|
73
|
+
const out = await runWithTimeout({
|
|
74
|
+
run: () => new Promise((_resolve, reject) => {
|
|
75
|
+
setTimeout(() => reject(new Error('slow-fail')), 20);
|
|
76
|
+
}),
|
|
77
|
+
timeoutMs: 10,
|
|
78
|
+
retry,
|
|
79
|
+
});
|
|
80
|
+
expect(out.status).toBe('timeout');
|
|
81
|
+
});
|
|
82
|
+
});
|
|
83
|
+
});
|
|
84
|
+
describe('runWithRetry', () => {
|
|
85
|
+
it('returns the result on first success (no retry)', async () => {
|
|
86
|
+
const out = await runWithRetry(() => Promise.resolve('ok'), {
|
|
87
|
+
enabled: true,
|
|
88
|
+
maxRetries: 2,
|
|
89
|
+
backoffMs: [0, 0],
|
|
90
|
+
});
|
|
91
|
+
expect(out).toMatchObject({ result: 'ok', wasRetried: false, retryCount: 0 });
|
|
92
|
+
});
|
|
93
|
+
it('retries on throw up to maxRetries then returns lastError', async () => {
|
|
94
|
+
let calls = 0;
|
|
95
|
+
const out = await runWithRetry(() => {
|
|
96
|
+
calls++;
|
|
97
|
+
return Promise.reject(new Error(`fail ${calls}`));
|
|
98
|
+
}, { enabled: true, maxRetries: 2, backoffMs: [0, 0] });
|
|
99
|
+
expect(calls).toBe(3); // 1 initial + 2 retries
|
|
100
|
+
expect(out.result).toBeUndefined();
|
|
101
|
+
expect(out.wasRetried).toBe(true);
|
|
102
|
+
});
|
|
103
|
+
it('does NOT retry when shouldNotRetry matches (e.g. an abort)', async () => {
|
|
104
|
+
let calls = 0;
|
|
105
|
+
class AbortLike extends Error {
|
|
106
|
+
}
|
|
107
|
+
const out = await runWithRetry(() => {
|
|
108
|
+
calls++;
|
|
109
|
+
return Promise.reject(new AbortLike());
|
|
110
|
+
}, {
|
|
111
|
+
enabled: true,
|
|
112
|
+
maxRetries: 3,
|
|
113
|
+
shouldNotRetry: (e) => e instanceof AbortLike,
|
|
114
|
+
backoffMs: [0, 0],
|
|
115
|
+
});
|
|
116
|
+
expect(calls).toBe(1);
|
|
117
|
+
expect(out.wasRetried).toBe(false);
|
|
118
|
+
});
|
|
119
|
+
it('runs once when disabled', async () => {
|
|
120
|
+
let calls = 0;
|
|
121
|
+
await runWithRetry(() => {
|
|
122
|
+
calls++;
|
|
123
|
+
return Promise.reject(new Error('x'));
|
|
124
|
+
}, { enabled: false, maxRetries: 5 });
|
|
125
|
+
expect(calls).toBe(1);
|
|
126
|
+
});
|
|
127
|
+
});
|
|
128
|
+
describe('scheduleUnits', () => {
|
|
129
|
+
it('runs sequential in order and stops on shouldStop', async () => {
|
|
130
|
+
const seen = [];
|
|
131
|
+
await scheduleUnits({
|
|
132
|
+
units: [1, 2, 3, 4],
|
|
133
|
+
mode: 'sequential',
|
|
134
|
+
runUnit: (u) => {
|
|
135
|
+
seen.push(u);
|
|
136
|
+
return Promise.resolve({ shouldStop: u === 2 });
|
|
137
|
+
},
|
|
138
|
+
});
|
|
139
|
+
expect(seen).toEqual([1, 2]); // stopped after unit 2
|
|
140
|
+
});
|
|
141
|
+
it('respects maxParallel concurrency in parallel mode', async () => {
|
|
142
|
+
let active = 0;
|
|
143
|
+
let maxActive = 0;
|
|
144
|
+
const runUnit = async () => {
|
|
145
|
+
active++;
|
|
146
|
+
maxActive = Math.max(maxActive, active);
|
|
147
|
+
await new Promise((r) => setTimeout(r, 5));
|
|
148
|
+
active--;
|
|
149
|
+
return { shouldStop: false };
|
|
150
|
+
};
|
|
151
|
+
await scheduleUnits({
|
|
152
|
+
units: [1, 2, 3, 4, 5, 6],
|
|
153
|
+
mode: 'parallel',
|
|
154
|
+
maxParallel: 2,
|
|
155
|
+
runUnit,
|
|
156
|
+
});
|
|
157
|
+
expect(maxActive).toBeLessThanOrEqual(2);
|
|
158
|
+
});
|
|
159
|
+
it('honours an external abort (sequential)', async () => {
|
|
160
|
+
const seen = [];
|
|
161
|
+
let aborted = false;
|
|
162
|
+
await scheduleUnits({
|
|
163
|
+
units: [1, 2, 3],
|
|
164
|
+
mode: 'sequential',
|
|
165
|
+
shouldAbort: () => aborted,
|
|
166
|
+
runUnit: (u) => {
|
|
167
|
+
seen.push(u);
|
|
168
|
+
aborted = u === 1;
|
|
169
|
+
return Promise.resolve({ shouldStop: false });
|
|
170
|
+
},
|
|
171
|
+
});
|
|
172
|
+
// Sequential checks the abort flag at the TOP of each iteration: unit 1 runs
|
|
173
|
+
// and flips `aborted`, so unit 2's top-check breaks before it launches.
|
|
174
|
+
expect(seen).toEqual([1]);
|
|
175
|
+
});
|
|
176
|
+
it('yieldBetweenUnits runs every unit in order through the macrotask-yield wrapper (sequential)', async () => {
|
|
177
|
+
// Exercises the yieldToEventLoop boundary path: each unit resolves after a
|
|
178
|
+
// setImmediate turn, so a same-thread live-progress timer could paint between
|
|
179
|
+
// units. Behaviour (order, stop policy) is unchanged from the no-yield path.
|
|
180
|
+
const seen = [];
|
|
181
|
+
await scheduleUnits({
|
|
182
|
+
units: [1, 2, 3],
|
|
183
|
+
mode: 'sequential',
|
|
184
|
+
yieldBetweenUnits: true,
|
|
185
|
+
runUnit: (u) => {
|
|
186
|
+
seen.push(u);
|
|
187
|
+
return Promise.resolve({ shouldStop: false });
|
|
188
|
+
},
|
|
189
|
+
});
|
|
190
|
+
expect(seen).toEqual([1, 2, 3]);
|
|
191
|
+
});
|
|
192
|
+
it('yieldBetweenUnits also applies in parallel mode (all units still run)', async () => {
|
|
193
|
+
const seen = [];
|
|
194
|
+
await scheduleUnits({
|
|
195
|
+
units: [1, 2, 3, 4],
|
|
196
|
+
mode: 'parallel',
|
|
197
|
+
maxParallel: 2,
|
|
198
|
+
yieldBetweenUnits: true,
|
|
199
|
+
runUnit: (u) => {
|
|
200
|
+
seen.push(u);
|
|
201
|
+
return Promise.resolve({ shouldStop: false });
|
|
202
|
+
},
|
|
203
|
+
});
|
|
204
|
+
expect([...seen].sort((a, b) => a - b)).toEqual([1, 2, 3, 4]);
|
|
205
|
+
});
|
|
206
|
+
});
|
|
207
|
+
describe('executePipeline (combinator)', () => {
|
|
208
|
+
it('schedules, times out, and maps outcomes', async () => {
|
|
209
|
+
const statuses = [];
|
|
210
|
+
await executePipeline({
|
|
211
|
+
units: [1, 2, 3],
|
|
212
|
+
options: { mode: 'sequential', timeout: 30 },
|
|
213
|
+
runOne: (u, signal) => u === 2
|
|
214
|
+
? new Promise((_r, reject) => signal.addEventListener('abort', () => reject(new Error('to'))))
|
|
215
|
+
: Promise.resolve(u * 10),
|
|
216
|
+
onResult: (_u, _i, outcome) => {
|
|
217
|
+
statuses.push(outcome.status);
|
|
218
|
+
return { shouldStop: false };
|
|
219
|
+
},
|
|
220
|
+
});
|
|
221
|
+
expect(statuses).toEqual(['ok', 'timeout', 'ok']);
|
|
222
|
+
});
|
|
223
|
+
it('threads maxParallel, shouldAbort, retry, and a per-unit timeoutFor override', async () => {
|
|
224
|
+
const seen = [];
|
|
225
|
+
const timeoutUnits = [];
|
|
226
|
+
let aborted = false;
|
|
227
|
+
await executePipeline({
|
|
228
|
+
units: [1, 2, 3, 4],
|
|
229
|
+
options: {
|
|
230
|
+
mode: 'parallel',
|
|
231
|
+
maxParallel: 2,
|
|
232
|
+
timeout: 1000,
|
|
233
|
+
retry: { enabled: true, maxRetries: 1 },
|
|
234
|
+
},
|
|
235
|
+
timeoutFor: (u) => {
|
|
236
|
+
timeoutUnits.push(u);
|
|
237
|
+
return 50;
|
|
238
|
+
},
|
|
239
|
+
shouldAbort: () => aborted,
|
|
240
|
+
runOne: (u) => Promise.resolve(u),
|
|
241
|
+
onResult: (u, _i, outcome) => {
|
|
242
|
+
seen.push(u);
|
|
243
|
+
if (u === 4)
|
|
244
|
+
aborted = true;
|
|
245
|
+
expect(outcome.status).toBe('ok');
|
|
246
|
+
return { shouldStop: false };
|
|
247
|
+
},
|
|
248
|
+
});
|
|
249
|
+
// Every scheduled unit went through the per-unit timeout override path.
|
|
250
|
+
expect(timeoutUnits.length).toBeGreaterThan(0);
|
|
251
|
+
expect(seen.length).toBeGreaterThan(0);
|
|
252
|
+
});
|
|
253
|
+
});
|
|
254
|
+
//# sourceMappingURL=execution.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"execution.test.js","sourceRoot":"","sources":["../../../../src/lib/execution/__tests__/execution.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Execution substrate (north-star §5.8, launch) — one bounded scheduler +
|
|
3
|
+
* per-unit timeout/retry that fit + sim recipes run on, so `timeout`/`maxParallel`/
|
|
4
|
+
* `stopOnFirstFailure` mean the same thing in every domain.
|
|
5
|
+
*/
|
|
6
|
+
export { scheduleUnits, yieldToEventLoop } from './schedule.js';
|
|
7
|
+
export type { ScheduleUnitsOptions } from './schedule.js';
|
|
8
|
+
export { runWithTimeout } from './run-with-timeout.js';
|
|
9
|
+
export type { UnitRunOutcome, RunWithTimeoutOptions } from './run-with-timeout.js';
|
|
10
|
+
export { runWithRetry } from './retry.js';
|
|
11
|
+
export type { PipelineRetryOptions, PipelineRetryOutcome } from './retry.js';
|
|
12
|
+
export { executePipeline } from './pipeline.js';
|
|
13
|
+
export type { ExecutePipelineOptions } from './pipeline.js';
|
|
14
|
+
export type { WorkflowExecutionOptions, WorkflowRetryOptions } from './options.js';
|
|
15
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/execution/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAChE,YAAY,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAE1D,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,YAAY,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAEnF,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,YAAY,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAE7E,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,YAAY,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;AAE5D,YAAY,EAAE,wBAAwB,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Execution substrate (north-star §5.8, launch) — one bounded scheduler +
|
|
3
|
+
* per-unit timeout/retry that fit + sim recipes run on, so `timeout`/`maxParallel`/
|
|
4
|
+
* `stopOnFirstFailure` mean the same thing in every domain.
|
|
5
|
+
*/
|
|
6
|
+
export { scheduleUnits, yieldToEventLoop } from './schedule.js';
|
|
7
|
+
export { runWithTimeout } from './run-with-timeout.js';
|
|
8
|
+
export { runWithRetry } from './retry.js';
|
|
9
|
+
export { executePipeline } from './pipeline.js';
|
|
10
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/execution/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAGhE,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAGvD,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAG1C,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WorkflowExecutionOptions — the unified execution-config shape every domain's
|
|
3
|
+
* recipe runs on (north-star §5.8, launch).
|
|
4
|
+
*
|
|
5
|
+
* Previously each domain declared its own shape — `FitnessExecutionOptions`
|
|
6
|
+
* (richest: mode/stopOnFirstFailure/timeout/maxParallel/retry×2) and
|
|
7
|
+
* `SimulationExecutionOptions` (mode/timeout/maxParallel/stopOnFirstFailure, with
|
|
8
|
+
* `timeout` silently unenforced). This is the common base they map onto so
|
|
9
|
+
* `timeout`/`maxParallel`/`stopOnFirstFailure` mean the SAME thing in every domain
|
|
10
|
+
* — the "same words, same semantics" guarantee parity promises (§4.3). A domain
|
|
11
|
+
* may carry extra fields (fitness's per-unit config) as an ADR-documented
|
|
12
|
+
* difference (§6.7); the shared base is what the execution substrate consumes.
|
|
13
|
+
*/
|
|
14
|
+
/** Retry policy for a unit run (off by default). */
|
|
15
|
+
export interface WorkflowRetryOptions {
|
|
16
|
+
readonly enabled: boolean;
|
|
17
|
+
readonly maxRetries: number;
|
|
18
|
+
}
|
|
19
|
+
/** The execution config shared by fit + sim recipes; consumed by the substrate. */
|
|
20
|
+
export interface WorkflowExecutionOptions {
|
|
21
|
+
/** Schedule units concurrently (bounded by `maxParallel`) or one at a time. */
|
|
22
|
+
readonly mode: 'parallel' | 'sequential';
|
|
23
|
+
/** Per-unit timeout in ms. A unit that exceeds it is aborted (sim's fix). */
|
|
24
|
+
readonly timeout?: number;
|
|
25
|
+
/** Bound on concurrent units in `parallel` mode. */
|
|
26
|
+
readonly maxParallel?: number;
|
|
27
|
+
/** Stop scheduling further units once one fails. */
|
|
28
|
+
readonly stopOnFirstFailure?: boolean;
|
|
29
|
+
/** Optional retry-on-failure (fitness uses it; sim does not). */
|
|
30
|
+
readonly retry?: WorkflowRetryOptions;
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=options.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../../../src/lib/execution/options.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,oDAAoD;AACpD,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAED,mFAAmF;AACnF,MAAM,WAAW,wBAAwB;IACvC,+EAA+E;IAC/E,QAAQ,CAAC,IAAI,EAAE,UAAU,GAAG,YAAY,CAAC;IACzC,6EAA6E;IAC7E,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,oDAAoD;IACpD,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,oDAAoD;IACpD,QAAQ,CAAC,kBAAkB,CAAC,EAAE,OAAO,CAAC;IACtC,iEAAiE;IACjE,QAAQ,CAAC,KAAK,CAAC,EAAE,oBAAoB,CAAC;CACvC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WorkflowExecutionOptions — the unified execution-config shape every domain's
|
|
3
|
+
* recipe runs on (north-star §5.8, launch).
|
|
4
|
+
*
|
|
5
|
+
* Previously each domain declared its own shape — `FitnessExecutionOptions`
|
|
6
|
+
* (richest: mode/stopOnFirstFailure/timeout/maxParallel/retry×2) and
|
|
7
|
+
* `SimulationExecutionOptions` (mode/timeout/maxParallel/stopOnFirstFailure, with
|
|
8
|
+
* `timeout` silently unenforced). This is the common base they map onto so
|
|
9
|
+
* `timeout`/`maxParallel`/`stopOnFirstFailure` mean the SAME thing in every domain
|
|
10
|
+
* — the "same words, same semantics" guarantee parity promises (§4.3). A domain
|
|
11
|
+
* may carry extra fields (fitness's per-unit config) as an ADR-documented
|
|
12
|
+
* difference (§6.7); the shared base is what the execution substrate consumes.
|
|
13
|
+
*/
|
|
14
|
+
export {};
|
|
15
|
+
//# sourceMappingURL=options.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"options.js","sourceRoot":"","sources":["../../../src/lib/execution/options.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* executePipeline — the `ExecutionPipeline<Unit, Result>` of north-star §5.8: the
|
|
3
|
+
* convenience combinator over {@link scheduleUnits} (the bounded loop) and
|
|
4
|
+
* {@link runWithTimeout} (the per-unit timeout/retry wrapper).
|
|
5
|
+
*
|
|
6
|
+
* A tool supplies only a `runOne` (the domain run) and an `onResult` mapper (turn
|
|
7
|
+
* a classified `UnitRunOutcome` into its domain result + the stop decision); the
|
|
8
|
+
* substrate owns the loop, concurrency, timeout/abort, retry, and stop policy.
|
|
9
|
+
* `WorkflowExecutionOptions` (`timeout`/`maxParallel`/`stopOnFirstFailure`/`retry`)
|
|
10
|
+
* therefore mean the same thing in every domain.
|
|
11
|
+
*
|
|
12
|
+
* Tools with a richer per-unit lifecycle (fitness threads memory profiling +
|
|
13
|
+
* callbacks through its own `runOneCheck`) may compose `scheduleUnits` +
|
|
14
|
+
* `runWithTimeout` directly instead; both routes are "on the substrate".
|
|
15
|
+
*/
|
|
16
|
+
import { type UnitRunOutcome } from './run-with-timeout.js';
|
|
17
|
+
import type { WorkflowExecutionOptions } from './options.js';
|
|
18
|
+
export interface ExecutePipelineOptions<Unit, R> {
|
|
19
|
+
readonly units: readonly Unit[];
|
|
20
|
+
readonly options: WorkflowExecutionOptions;
|
|
21
|
+
/** The domain run for one unit, under the substrate's abort signal. */
|
|
22
|
+
readonly runOne: (unit: Unit, signal: AbortSignal) => Promise<R>;
|
|
23
|
+
/** Map a classified outcome to a domain result + whether to stop scheduling. */
|
|
24
|
+
readonly onResult: (unit: Unit, index: number, outcome: UnitRunOutcome<R>) => {
|
|
25
|
+
readonly shouldStop: boolean;
|
|
26
|
+
} | Promise<{
|
|
27
|
+
readonly shouldStop: boolean;
|
|
28
|
+
}>;
|
|
29
|
+
/** Per-unit timeout override (falls back to `options.timeout`, then 30s). */
|
|
30
|
+
readonly timeoutFor?: (unit: Unit) => number | undefined;
|
|
31
|
+
/** External abort check threaded into the scheduler. */
|
|
32
|
+
readonly shouldAbort?: () => boolean;
|
|
33
|
+
}
|
|
34
|
+
/** Run `units` on the substrate: scheduled, timed out, retried, and stop-policied. */
|
|
35
|
+
export declare function executePipeline<Unit, R>(opts: ExecutePipelineOptions<Unit, R>): Promise<void>;
|
|
36
|
+
//# sourceMappingURL=pipeline.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pipeline.d.ts","sourceRoot":"","sources":["../../../src/lib/execution/pipeline.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAkB,KAAK,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAG5E,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,cAAc,CAAC;AAK7D,MAAM,WAAW,sBAAsB,CAAC,IAAI,EAAE,CAAC;IAC7C,QAAQ,CAAC,KAAK,EAAE,SAAS,IAAI,EAAE,CAAC;IAChC,QAAQ,CAAC,OAAO,EAAE,wBAAwB,CAAC;IAC3C,uEAAuE;IACvE,QAAQ,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC;IACjE,gFAAgF;IAChF,QAAQ,CAAC,QAAQ,EAAE,CACjB,IAAI,EAAE,IAAI,EACV,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC,KACvB;QAAE,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC;QAAE,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IAClF,6EAA6E;IAC7E,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,MAAM,GAAG,SAAS,CAAC;IACzD,wDAAwD;IACxD,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,OAAO,CAAC;CACtC;AAED,sFAAsF;AACtF,wBAAsB,eAAe,CAAC,IAAI,EAAE,CAAC,EAC3C,IAAI,EAAE,sBAAsB,CAAC,IAAI,EAAE,CAAC,CAAC,GACpC,OAAO,CAAC,IAAI,CAAC,CAgBf"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* executePipeline — the `ExecutionPipeline<Unit, Result>` of north-star §5.8: the
|
|
3
|
+
* convenience combinator over {@link scheduleUnits} (the bounded loop) and
|
|
4
|
+
* {@link runWithTimeout} (the per-unit timeout/retry wrapper).
|
|
5
|
+
*
|
|
6
|
+
* A tool supplies only a `runOne` (the domain run) and an `onResult` mapper (turn
|
|
7
|
+
* a classified `UnitRunOutcome` into its domain result + the stop decision); the
|
|
8
|
+
* substrate owns the loop, concurrency, timeout/abort, retry, and stop policy.
|
|
9
|
+
* `WorkflowExecutionOptions` (`timeout`/`maxParallel`/`stopOnFirstFailure`/`retry`)
|
|
10
|
+
* therefore mean the same thing in every domain.
|
|
11
|
+
*
|
|
12
|
+
* Tools with a richer per-unit lifecycle (fitness threads memory profiling +
|
|
13
|
+
* callbacks through its own `runOneCheck`) may compose `scheduleUnits` +
|
|
14
|
+
* `runWithTimeout` directly instead; both routes are "on the substrate".
|
|
15
|
+
*/
|
|
16
|
+
import { runWithTimeout } from './run-with-timeout.js';
|
|
17
|
+
import { scheduleUnits } from './schedule.js';
|
|
18
|
+
/** Default per-unit timeout when a recipe declares none (fitness's historical 30s). */
|
|
19
|
+
const DEFAULT_TIMEOUT_MS = 30_000;
|
|
20
|
+
/** Run `units` on the substrate: scheduled, timed out, retried, and stop-policied. */
|
|
21
|
+
export async function executePipeline(opts) {
|
|
22
|
+
await scheduleUnits({
|
|
23
|
+
units: opts.units,
|
|
24
|
+
mode: opts.options.mode,
|
|
25
|
+
...(opts.options.maxParallel === undefined ? {} : { maxParallel: opts.options.maxParallel }),
|
|
26
|
+
...(opts.shouldAbort ? { shouldAbort: opts.shouldAbort } : {}),
|
|
27
|
+
runUnit: async (unit, index) => {
|
|
28
|
+
const timeoutMs = opts.timeoutFor?.(unit) ?? opts.options.timeout ?? DEFAULT_TIMEOUT_MS;
|
|
29
|
+
const outcome = await runWithTimeout({
|
|
30
|
+
run: (signal) => opts.runOne(unit, signal),
|
|
31
|
+
timeoutMs,
|
|
32
|
+
...(opts.options.retry ? { retry: { ...opts.options.retry } } : {}),
|
|
33
|
+
});
|
|
34
|
+
return opts.onResult(unit, index, outcome);
|
|
35
|
+
},
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=pipeline.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pipeline.js","sourceRoot":"","sources":["../../../src/lib/execution/pipeline.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,cAAc,EAAuB,MAAM,uBAAuB,CAAC;AAC5E,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAI9C,uFAAuF;AACvF,MAAM,kBAAkB,GAAG,MAAM,CAAC;AAmBlC,sFAAsF;AACtF,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,IAAqC;IAErC,MAAM,aAAa,CAAO;QACxB,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI;QACvB,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;QAC5F,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9D,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE;YAC7B,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,IAAI,kBAAkB,CAAC;YACxF,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC;gBACnC,GAAG,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC;gBAC1C,SAAS;gBACT,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACpE,CAAC,CAAC;YACH,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;QAC7C,CAAC;KACF,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* runWithRetry — the generic retry-with-backoff primitive the execution substrate
|
|
3
|
+
* uses (north-star §5.8, launch).
|
|
4
|
+
*
|
|
5
|
+
* Hoisted from fitness's `executeWithRetry` (the proven shape): retry ONLY on a
|
|
6
|
+
* thrown error, never re-throw (return `lastError` instead), and skip retry for a
|
|
7
|
+
* caller-named class of errors (fitness: an abort). The hardcoded
|
|
8
|
+
* `CheckAbortedError` check becomes a `shouldNotRetry` predicate, and the fixed
|
|
9
|
+
* backoff is configurable — so fitness re-points to this with byte-identical
|
|
10
|
+
* behaviour (default backoff `[1000, 2000]`, the same delays it used).
|
|
11
|
+
*
|
|
12
|
+
* Distinct from `withRetry` (`lib/retry.ts`), which is the network-oriented
|
|
13
|
+
* throw-on-exhaustion retry for `--report-to`; this one returns an outcome and is
|
|
14
|
+
* the per-unit execution retry.
|
|
15
|
+
*/
|
|
16
|
+
export interface PipelineRetryOptions {
|
|
17
|
+
/** When false (or `maxRetries <= 0`), the function runs once with no retry. */
|
|
18
|
+
readonly enabled: boolean;
|
|
19
|
+
readonly maxRetries: number;
|
|
20
|
+
/** Errors for which retry is skipped entirely (e.g. an abort). Default: none. */
|
|
21
|
+
readonly shouldNotRetry?: (error: unknown) => boolean;
|
|
22
|
+
/** Per-attempt backoff delays (ms). Default `[1000, 2000]` (last value repeats). */
|
|
23
|
+
readonly backoffMs?: readonly number[];
|
|
24
|
+
}
|
|
25
|
+
/** Outcome of a retry-wrapped run. `result === undefined` ⇔ every attempt threw. */
|
|
26
|
+
export interface PipelineRetryOutcome<T> {
|
|
27
|
+
readonly result: T | undefined;
|
|
28
|
+
readonly lastError: unknown;
|
|
29
|
+
readonly retryCount: number;
|
|
30
|
+
readonly wasRetried: boolean;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Run `fn` with retry. Retries only on a thrown error (up to `maxRetries`), never
|
|
34
|
+
* re-throws, and short-circuits for `shouldNotRetry` errors. Mirrors fitness's
|
|
35
|
+
* former `executeWithRetry` exactly (same default backoff, same return shape).
|
|
36
|
+
*/
|
|
37
|
+
export declare function runWithRetry<T>(fn: () => Promise<T>, options: PipelineRetryOptions): Promise<PipelineRetryOutcome<T>>;
|
|
38
|
+
//# sourceMappingURL=retry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry.d.ts","sourceRoot":"","sources":["../../../src/lib/execution/retry.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;GAcG;AAKH,MAAM,WAAW,oBAAoB;IACnC,+EAA+E;IAC/E,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,iFAAiF;IACjF,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO,CAAC;IACtD,oFAAoF;IACpF,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACxC;AAED,oFAAoF;AACpF,MAAM,WAAW,oBAAoB,CAAC,CAAC;IACrC,QAAQ,CAAC,MAAM,EAAE,CAAC,GAAG,SAAS,CAAC;IAC/B,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;CAC9B;AAOD;;;;GAIG;AACH,wBAAsB,YAAY,CAAC,CAAC,EAClC,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,OAAO,EAAE,oBAAoB,GAC5B,OAAO,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC,CAyBlC"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
// @fitness-ignore-file async-waterfall-detection -- the backoff-then-retry awaits are necessarily sequential (wait, THEN re-attempt); parallelizing them would defeat retry/backoff semantics
|
|
2
|
+
// @fitness-ignore-file performance-anti-patterns -- same: sequential await is the entire point of a retry/backoff loop (same waiver as lib/retry.ts and the fitness retry this hoists)
|
|
3
|
+
/**
|
|
4
|
+
* runWithRetry — the generic retry-with-backoff primitive the execution substrate
|
|
5
|
+
* uses (north-star §5.8, launch).
|
|
6
|
+
*
|
|
7
|
+
* Hoisted from fitness's `executeWithRetry` (the proven shape): retry ONLY on a
|
|
8
|
+
* thrown error, never re-throw (return `lastError` instead), and skip retry for a
|
|
9
|
+
* caller-named class of errors (fitness: an abort). The hardcoded
|
|
10
|
+
* `CheckAbortedError` check becomes a `shouldNotRetry` predicate, and the fixed
|
|
11
|
+
* backoff is configurable — so fitness re-points to this with byte-identical
|
|
12
|
+
* behaviour (default backoff `[1000, 2000]`, the same delays it used).
|
|
13
|
+
*
|
|
14
|
+
* Distinct from `withRetry` (`lib/retry.ts`), which is the network-oriented
|
|
15
|
+
* throw-on-exhaustion retry for `--report-to`; this one returns an outcome and is
|
|
16
|
+
* the per-unit execution retry.
|
|
17
|
+
*/
|
|
18
|
+
/** Default per-attempt backoff delays (ms) — fitness's historical `[1000, 2000]`. */
|
|
19
|
+
const DEFAULT_BACKOFF_MS = [1000, 2000];
|
|
20
|
+
function backoff(attempt, delays) {
|
|
21
|
+
const delay = delays[attempt] ?? delays.at(-1) ?? 2000;
|
|
22
|
+
return new Promise((resolve) => setTimeout(resolve, delay));
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Run `fn` with retry. Retries only on a thrown error (up to `maxRetries`), never
|
|
26
|
+
* re-throws, and short-circuits for `shouldNotRetry` errors. Mirrors fitness's
|
|
27
|
+
* former `executeWithRetry` exactly (same default backoff, same return shape).
|
|
28
|
+
*/
|
|
29
|
+
export async function runWithRetry(fn, options) {
|
|
30
|
+
const delays = options.backoffMs ?? DEFAULT_BACKOFF_MS;
|
|
31
|
+
try {
|
|
32
|
+
const result = await fn();
|
|
33
|
+
return { result, lastError: undefined, retryCount: 0, wasRetried: false };
|
|
34
|
+
}
|
|
35
|
+
catch (firstError) {
|
|
36
|
+
if (options.shouldNotRetry?.(firstError) === true) {
|
|
37
|
+
return { result: undefined, lastError: firstError, retryCount: 0, wasRetried: false };
|
|
38
|
+
}
|
|
39
|
+
if (!options.enabled || options.maxRetries <= 0) {
|
|
40
|
+
return { result: undefined, lastError: firstError, retryCount: 0, wasRetried: false };
|
|
41
|
+
}
|
|
42
|
+
let lastError = firstError;
|
|
43
|
+
for (let attempt = 0; attempt < options.maxRetries; attempt++) {
|
|
44
|
+
await backoff(attempt, delays);
|
|
45
|
+
try {
|
|
46
|
+
const result = await fn();
|
|
47
|
+
return { result, lastError: undefined, retryCount: attempt + 1, wasRetried: true };
|
|
48
|
+
}
|
|
49
|
+
catch (retryError) {
|
|
50
|
+
lastError = retryError;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
return { result: undefined, lastError, retryCount: options.maxRetries, wasRetried: true };
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=retry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry.js","sourceRoot":"","sources":["../../../src/lib/execution/retry.ts"],"names":[],"mappings":"AAAA,8LAA8L;AAC9L,uLAAuL;AACvL;;;;;;;;;;;;;;GAcG;AAEH,qFAAqF;AACrF,MAAM,kBAAkB,GAAG,CAAC,IAAI,EAAE,IAAI,CAAU,CAAC;AAoBjD,SAAS,OAAO,CAAC,OAAe,EAAE,MAAyB;IACzD,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;IACvD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;AAC9D,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,EAAoB,EACpB,OAA6B;IAE7B,MAAM,MAAM,GAAG,OAAO,CAAC,SAAS,IAAI,kBAAkB,CAAC;IACvD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,EAAE,EAAE,CAAC;QAC1B,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;IAC5E,CAAC;IAAC,OAAO,UAAU,EAAE,CAAC;QACpB,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC,UAAU,CAAC,KAAK,IAAI,EAAE,CAAC;YAClD,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,CAAC,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;QACxF,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,UAAU,IAAI,CAAC,EAAE,CAAC;YAChD,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,CAAC,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;QACxF,CAAC;QAED,IAAI,SAAS,GAAY,UAAU,CAAC;QACpC,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,UAAU,EAAE,OAAO,EAAE,EAAE,CAAC;YAC9D,MAAM,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YAC/B,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,EAAE,EAAE,CAAC;gBAC1B,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,OAAO,GAAG,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;YACrF,CAAC;YAAC,OAAO,UAAU,EAAE,CAAC;gBACpB,SAAS,GAAG,UAAU,CAAC;YACzB,CAAC;QACH,CAAC;QACD,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;IAC5F,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* runWithTimeout — the per-unit timeout/abort/retry wrapper of the execution
|
|
3
|
+
* substrate (north-star §5.8, launch).
|
|
4
|
+
*
|
|
5
|
+
* One unit's lifecycle: install an `AbortController` + `setTimeout`, run the
|
|
6
|
+
* domain function under that signal (optionally with retry), and classify the
|
|
7
|
+
* outcome as `ok` / `timeout` / `error`. The single-source abort invariant is
|
|
8
|
+
* preserved from fitness's `runOneCheck`: the controller is aborted ONLY by the
|
|
9
|
+
* timeout, so a post-run `signal.aborted` IS a timeout.
|
|
10
|
+
*
|
|
11
|
+
* This is the shared primitive that makes "a declared `timeout` actually aborts"
|
|
12
|
+
* true in every domain — the §4.3 fix for simulation, whose `runSingle` declared
|
|
13
|
+
* `execution.timeout` but never installed one.
|
|
14
|
+
*/
|
|
15
|
+
import { type PipelineRetryOptions } from './retry.js';
|
|
16
|
+
/** Result of one unit run. `timeout` and `error` are distinct so callers can map each. */
|
|
17
|
+
export type UnitRunOutcome<R> = {
|
|
18
|
+
readonly status: 'ok';
|
|
19
|
+
readonly result: R;
|
|
20
|
+
readonly durationMs: number;
|
|
21
|
+
} | {
|
|
22
|
+
readonly status: 'timeout';
|
|
23
|
+
readonly durationMs: number;
|
|
24
|
+
readonly timeoutMs: number;
|
|
25
|
+
} | {
|
|
26
|
+
readonly status: 'error';
|
|
27
|
+
readonly error: unknown;
|
|
28
|
+
readonly durationMs: number;
|
|
29
|
+
};
|
|
30
|
+
export interface RunWithTimeoutOptions<R> {
|
|
31
|
+
/** The domain run — receives the abort signal the timeout fires on. */
|
|
32
|
+
readonly run: (signal: AbortSignal) => Promise<R>;
|
|
33
|
+
/** Per-unit timeout (ms). A run that exceeds it is aborted → `status:'timeout'`. */
|
|
34
|
+
readonly timeoutMs: number;
|
|
35
|
+
/** Optional retry (fitness); omitted ⇒ the run executes exactly once. */
|
|
36
|
+
readonly retry?: PipelineRetryOptions;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Run one unit under a timeout, returning a classified outcome (never throws for
|
|
40
|
+
* a domain error — it is returned as `status:'error'`). Mirrors the proven
|
|
41
|
+
* timeout-detection of fitness's `runOneCheck` (clear the timer, then a
|
|
42
|
+
* `signal.aborted` check is canonical-timeout because the controller has a single
|
|
43
|
+
* abort source).
|
|
44
|
+
*/
|
|
45
|
+
export declare function runWithTimeout<R>(opts: RunWithTimeoutOptions<R>): Promise<UnitRunOutcome<R>>;
|
|
46
|
+
//# sourceMappingURL=run-with-timeout.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-with-timeout.d.ts","sourceRoot":"","sources":["../../../src/lib/execution/run-with-timeout.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAgB,KAAK,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAErE,0FAA0F;AAC1F,MAAM,MAAM,cAAc,CAAC,CAAC,IACxB;IAAE,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IAAC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GAC1E;IAAE,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GACvF;IAAE,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC;AAEvF,MAAM,WAAW,qBAAqB,CAAC,CAAC;IACtC,uEAAuE;IACvE,QAAQ,CAAC,GAAG,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC;IAClD,oFAAoF;IACpF,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,yEAAyE;IACzE,QAAQ,CAAC,KAAK,CAAC,EAAE,oBAAoB,CAAC;CACvC;AAED;;;;;;GAMG;AACH,wBAAsB,cAAc,CAAC,CAAC,EACpC,IAAI,EAAE,qBAAqB,CAAC,CAAC,CAAC,GAC7B,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAoE5B"}
|