adispatchd 0.0.0-stage → 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 +21 -0
- package/README.md +195 -2
- package/dist/api/errors.d.ts +27 -0
- package/dist/api/errors.js +80 -0
- package/dist/api/errors.js.map +1 -0
- package/dist/api/index.d.ts +10 -0
- package/dist/api/index.js +11 -0
- package/dist/api/index.js.map +1 -0
- package/dist/api/logs.d.ts +30 -0
- package/dist/api/logs.js +88 -0
- package/dist/api/logs.js.map +1 -0
- package/dist/api/serialize.d.ts +65 -0
- package/dist/api/serialize.js +135 -0
- package/dist/api/serialize.js.map +1 -0
- package/dist/api/server.d.ts +89 -0
- package/dist/api/server.js +751 -0
- package/dist/api/server.js.map +1 -0
- package/dist/api/sse.d.ts +90 -0
- package/dist/api/sse.js +225 -0
- package/dist/api/sse.js.map +1 -0
- package/dist/app.d.ts +173 -0
- package/dist/app.js +488 -0
- package/dist/app.js.map +1 -0
- package/dist/cli/config-validate.d.ts +6 -0
- package/dist/cli/config-validate.js +39 -0
- package/dist/cli/config-validate.js.map +1 -0
- package/dist/cli/control.d.ts +31 -0
- package/dist/cli/control.js +186 -0
- package/dist/cli/control.js.map +1 -0
- package/dist/cli/http-client.d.ts +57 -0
- package/dist/cli/http-client.js +174 -0
- package/dist/cli/http-client.js.map +1 -0
- package/dist/cli/index.d.ts +14 -0
- package/dist/cli/index.js +14 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/init-templates.d.ts +20 -0
- package/dist/cli/init-templates.js +275 -0
- package/dist/cli/init-templates.js.map +1 -0
- package/dist/cli/init.d.ts +16 -0
- package/dist/cli/init.js +107 -0
- package/dist/cli/init.js.map +1 -0
- package/dist/cli/main.d.ts +2 -0
- package/dist/cli/main.js +25 -0
- package/dist/cli/main.js.map +1 -0
- package/dist/cli/program.d.ts +102 -0
- package/dist/cli/program.js +133 -0
- package/dist/cli/program.js.map +1 -0
- package/dist/cli/service.d.ts +27 -0
- package/dist/cli/service.js +252 -0
- package/dist/cli/service.js.map +1 -0
- package/dist/cli/start.d.ts +22 -0
- package/dist/cli/start.js +133 -0
- package/dist/cli/start.js.map +1 -0
- package/dist/cli/workflow-dry-run.d.ts +13 -0
- package/dist/cli/workflow-dry-run.js +144 -0
- package/dist/cli/workflow-dry-run.js.map +1 -0
- package/dist/config/field-catalog.d.ts +33 -0
- package/dist/config/field-catalog.js +172 -0
- package/dist/config/field-catalog.js.map +1 -0
- package/dist/config/filter-schema.d.ts +15 -0
- package/dist/config/filter-schema.js +110 -0
- package/dist/config/filter-schema.js.map +1 -0
- package/dist/config/index.d.ts +15 -0
- package/dist/config/index.js +16 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/issues.d.ts +27 -0
- package/dist/config/issues.js +37 -0
- package/dist/config/issues.js.map +1 -0
- package/dist/config/loader.d.ts +32 -0
- package/dist/config/loader.js +250 -0
- package/dist/config/loader.js.map +1 -0
- package/dist/config/manager.d.ts +153 -0
- package/dist/config/manager.js +276 -0
- package/dist/config/manager.js.map +1 -0
- package/dist/config/model.d.ts +334 -0
- package/dist/config/model.js +2 -0
- package/dist/config/model.js.map +1 -0
- package/dist/config/normalize.d.ts +20 -0
- package/dist/config/normalize.js +200 -0
- package/dist/config/normalize.js.map +1 -0
- package/dist/config/parameters.d.ts +37 -0
- package/dist/config/parameters.js +71 -0
- package/dist/config/parameters.js.map +1 -0
- package/dist/config/public.d.ts +6 -0
- package/dist/config/public.js +18 -0
- package/dist/config/public.js.map +1 -0
- package/dist/config/schemas.d.ts +538 -0
- package/dist/config/schemas.js +321 -0
- package/dist/config/schemas.js.map +1 -0
- package/dist/config/snapshot.d.ts +38 -0
- package/dist/config/snapshot.js +57 -0
- package/dist/config/snapshot.js.map +1 -0
- package/dist/config/validate.d.ts +33 -0
- package/dist/config/validate.js +346 -0
- package/dist/config/validate.js.map +1 -0
- package/dist/core/clock.d.ts +59 -0
- package/dist/core/clock.js +133 -0
- package/dist/core/clock.js.map +1 -0
- package/dist/core/duration.d.ts +19 -0
- package/dist/core/duration.js +93 -0
- package/dist/core/duration.js.map +1 -0
- package/dist/core/errors.d.ts +62 -0
- package/dist/core/errors.js +72 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/ids.d.ts +57 -0
- package/dist/core/ids.js +88 -0
- package/dist/core/ids.js.map +1 -0
- package/dist/core/index.d.ts +13 -0
- package/dist/core/index.js +14 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/logger.d.ts +100 -0
- package/dist/core/logger.js +207 -0
- package/dist/core/logger.js.map +1 -0
- package/dist/core/paths.d.ts +84 -0
- package/dist/core/paths.js +138 -0
- package/dist/core/paths.js.map +1 -0
- package/dist/core/template.d.ts +136 -0
- package/dist/core/template.js +261 -0
- package/dist/core/template.js.map +1 -0
- package/dist/core/types.d.ts +544 -0
- package/dist/core/types.js +172 -0
- package/dist/core/types.js.map +1 -0
- package/dist/core/worker-protocol.d.ts +102 -0
- package/dist/core/worker-protocol.js +75 -0
- package/dist/core/worker-protocol.js.map +1 -0
- package/dist/executors/classify.d.ts +25 -0
- package/dist/executors/classify.js +54 -0
- package/dist/executors/classify.js.map +1 -0
- package/dist/executors/dispatcher.d.ts +35 -0
- package/dist/executors/dispatcher.js +68 -0
- package/dist/executors/dispatcher.js.map +1 -0
- package/dist/executors/env.d.ts +43 -0
- package/dist/executors/env.js +66 -0
- package/dist/executors/env.js.map +1 -0
- package/dist/executors/event-parser.d.ts +41 -0
- package/dist/executors/event-parser.js +106 -0
- package/dist/executors/event-parser.js.map +1 -0
- package/dist/executors/index.d.ts +12 -0
- package/dist/executors/index.js +13 -0
- package/dist/executors/index.js.map +1 -0
- package/dist/executors/log-capture.d.ts +57 -0
- package/dist/executors/log-capture.js +155 -0
- package/dist/executors/log-capture.js.map +1 -0
- package/dist/executors/process-identity.d.ts +124 -0
- package/dist/executors/process-identity.js +283 -0
- package/dist/executors/process-identity.js.map +1 -0
- package/dist/executors/shell-executor.d.ts +35 -0
- package/dist/executors/shell-executor.js +478 -0
- package/dist/executors/shell-executor.js.map +1 -0
- package/dist/executors/stream-redactor.d.ts +40 -0
- package/dist/executors/stream-redactor.js +89 -0
- package/dist/executors/stream-redactor.js.map +1 -0
- package/dist/executors/workspace.d.ts +10 -0
- package/dist/executors/workspace.js +47 -0
- package/dist/executors/workspace.js.map +1 -0
- package/dist/filters/evaluate.d.ts +77 -0
- package/dist/filters/evaluate.js +187 -0
- package/dist/filters/evaluate.js.map +1 -0
- package/dist/filters/fields.d.ts +35 -0
- package/dist/filters/fields.js +75 -0
- package/dist/filters/fields.js.map +1 -0
- package/dist/filters/index.d.ts +11 -0
- package/dist/filters/index.js +12 -0
- package/dist/filters/index.js.map +1 -0
- package/dist/filters/iso-date.d.ts +10 -0
- package/dist/filters/iso-date.js +42 -0
- package/dist/filters/iso-date.js.map +1 -0
- package/dist/filters/predicate.d.ts +24 -0
- package/dist/filters/predicate.js +178 -0
- package/dist/filters/predicate.js.map +1 -0
- package/dist/filters/priority.d.ts +51 -0
- package/dist/filters/priority.js +91 -0
- package/dist/filters/priority.js.map +1 -0
- package/dist/filters/pushdown.d.ts +12 -0
- package/dist/filters/pushdown.js +52 -0
- package/dist/filters/pushdown.js.map +1 -0
- package/dist/filters/shell-check.d.ts +110 -0
- package/dist/filters/shell-check.js +304 -0
- package/dist/filters/shell-check.js.map +1 -0
- package/dist/identities/github-app.d.ts +55 -0
- package/dist/identities/github-app.js +160 -0
- package/dist/identities/github-app.js.map +1 -0
- package/dist/identities/index.d.ts +6 -0
- package/dist/identities/index.js +7 -0
- package/dist/identities/index.js.map +1 -0
- package/dist/identities/jwt.d.ts +24 -0
- package/dist/identities/jwt.js +56 -0
- package/dist/identities/jwt.js.map +1 -0
- package/dist/lifecycle/context.d.ts +106 -0
- package/dist/lifecycle/context.js +170 -0
- package/dist/lifecycle/context.js.map +1 -0
- package/dist/lifecycle/engine.d.ts +185 -0
- package/dist/lifecycle/engine.js +551 -0
- package/dist/lifecycle/engine.js.map +1 -0
- package/dist/lifecycle/errors.d.ts +48 -0
- package/dist/lifecycle/errors.js +71 -0
- package/dist/lifecycle/errors.js.map +1 -0
- package/dist/lifecycle/index.d.ts +9 -0
- package/dist/lifecycle/index.js +9 -0
- package/dist/lifecycle/index.js.map +1 -0
- package/dist/lifecycle/performers.d.ts +66 -0
- package/dist/lifecycle/performers.js +179 -0
- package/dist/lifecycle/performers.js.map +1 -0
- package/dist/notifications/index.d.ts +6 -0
- package/dist/notifications/index.js +7 -0
- package/dist/notifications/index.js.map +1 -0
- package/dist/notifications/service.d.ts +115 -0
- package/dist/notifications/service.js +364 -0
- package/dist/notifications/service.js.map +1 -0
- package/dist/persistence/actions.d.ts +101 -0
- package/dist/persistence/actions.js +196 -0
- package/dist/persistence/actions.js.map +1 -0
- package/dist/persistence/blocks.d.ts +85 -0
- package/dist/persistence/blocks.js +140 -0
- package/dist/persistence/blocks.js.map +1 -0
- package/dist/persistence/cron-firings.d.ts +55 -0
- package/dist/persistence/cron-firings.js +70 -0
- package/dist/persistence/cron-firings.js.map +1 -0
- package/dist/persistence/database.d.ts +60 -0
- package/dist/persistence/database.js +124 -0
- package/dist/persistence/database.js.map +1 -0
- package/dist/persistence/errors.d.ts +39 -0
- package/dist/persistence/errors.js +67 -0
- package/dist/persistence/errors.js.map +1 -0
- package/dist/persistence/events.d.ts +72 -0
- package/dist/persistence/events.js +83 -0
- package/dist/persistence/events.js.map +1 -0
- package/dist/persistence/index.d.ts +18 -0
- package/dist/persistence/index.js +19 -0
- package/dist/persistence/index.js.map +1 -0
- package/dist/persistence/instance-lock.d.ts +26 -0
- package/dist/persistence/instance-lock.js +117 -0
- package/dist/persistence/instance-lock.js.map +1 -0
- package/dist/persistence/lock-keys.d.ts +16 -0
- package/dist/persistence/lock-keys.js +41 -0
- package/dist/persistence/lock-keys.js.map +1 -0
- package/dist/persistence/notifications.d.ts +113 -0
- package/dist/persistence/notifications.js +213 -0
- package/dist/persistence/notifications.js.map +1 -0
- package/dist/persistence/persistence.d.ts +46 -0
- package/dist/persistence/persistence.js +42 -0
- package/dist/persistence/persistence.js.map +1 -0
- package/dist/persistence/retention.d.ts +46 -0
- package/dist/persistence/retention.js +68 -0
- package/dist/persistence/retention.js.map +1 -0
- package/dist/persistence/runs.d.ts +215 -0
- package/dist/persistence/runs.js +417 -0
- package/dist/persistence/runs.js.map +1 -0
- package/dist/persistence/schema.d.ts +16 -0
- package/dist/persistence/schema.js +183 -0
- package/dist/persistence/schema.js.map +1 -0
- package/dist/persistence/sqlite.d.ts +49 -0
- package/dist/persistence/sqlite.js +131 -0
- package/dist/persistence/sqlite.js.map +1 -0
- package/dist/runs/controller.d.ts +307 -0
- package/dist/runs/controller.js +1078 -0
- package/dist/runs/controller.js.map +1 -0
- package/dist/runs/errors.d.ts +20 -0
- package/dist/runs/errors.js +26 -0
- package/dist/runs/errors.js.map +1 -0
- package/dist/runs/event-bus.d.ts +106 -0
- package/dist/runs/event-bus.js +105 -0
- package/dist/runs/event-bus.js.map +1 -0
- package/dist/runs/execution.d.ts +39 -0
- package/dist/runs/execution.js +146 -0
- package/dist/runs/execution.js.map +1 -0
- package/dist/runs/index.d.ts +12 -0
- package/dist/runs/index.js +13 -0
- package/dist/runs/index.js.map +1 -0
- package/dist/runs/retention.d.ts +64 -0
- package/dist/runs/retention.js +232 -0
- package/dist/runs/retention.js.map +1 -0
- package/dist/runs/workspace.d.ts +20 -0
- package/dist/runs/workspace.js +51 -0
- package/dist/runs/workspace.js.map +1 -0
- package/dist/scheduler/checks.d.ts +41 -0
- package/dist/scheduler/checks.js +111 -0
- package/dist/scheduler/checks.js.map +1 -0
- package/dist/scheduler/cron.d.ts +32 -0
- package/dist/scheduler/cron.js +83 -0
- package/dist/scheduler/cron.js.map +1 -0
- package/dist/scheduler/dry-run.d.ts +42 -0
- package/dist/scheduler/dry-run.js +167 -0
- package/dist/scheduler/dry-run.js.map +1 -0
- package/dist/scheduler/errors.d.ts +22 -0
- package/dist/scheduler/errors.js +22 -0
- package/dist/scheduler/errors.js.map +1 -0
- package/dist/scheduler/format.d.ts +3 -0
- package/dist/scheduler/format.js +73 -0
- package/dist/scheduler/format.js.map +1 -0
- package/dist/scheduler/index.d.ts +13 -0
- package/dist/scheduler/index.js +14 -0
- package/dist/scheduler/index.js.map +1 -0
- package/dist/scheduler/planner.d.ts +88 -0
- package/dist/scheduler/planner.js +255 -0
- package/dist/scheduler/planner.js.map +1 -0
- package/dist/scheduler/scheduler.d.ts +160 -0
- package/dist/scheduler/scheduler.js +680 -0
- package/dist/scheduler/scheduler.js.map +1 -0
- package/dist/scheduler/state.d.ts +26 -0
- package/dist/scheduler/state.js +25 -0
- package/dist/scheduler/state.js.map +1 -0
- package/dist/scheduler/types.d.ts +197 -0
- package/dist/scheduler/types.js +3 -0
- package/dist/scheduler/types.js.map +1 -0
- package/dist/service/index.d.ts +6 -0
- package/dist/service/index.js +7 -0
- package/dist/service/index.js.map +1 -0
- package/dist/service/install.d.ts +93 -0
- package/dist/service/install.js +250 -0
- package/dist/service/install.js.map +1 -0
- package/dist/service/unit.d.ts +50 -0
- package/dist/service/unit.js +171 -0
- package/dist/service/unit.js.map +1 -0
- package/dist/sources/github/adapter.d.ts +99 -0
- package/dist/sources/github/adapter.js +336 -0
- package/dist/sources/github/adapter.js.map +1 -0
- package/dist/sources/github/fields.d.ts +8 -0
- package/dist/sources/github/fields.js +72 -0
- package/dist/sources/github/fields.js.map +1 -0
- package/dist/sources/github/http.d.ts +100 -0
- package/dist/sources/github/http.js +288 -0
- package/dist/sources/github/http.js.map +1 -0
- package/dist/sources/github/index.d.ts +6 -0
- package/dist/sources/github/index.js +7 -0
- package/dist/sources/github/index.js.map +1 -0
- package/dist/sources/github/pushdown.d.ts +14 -0
- package/dist/sources/github/pushdown.js +47 -0
- package/dist/sources/github/pushdown.js.map +1 -0
- package/dist/sources/github/refs.d.ts +17 -0
- package/dist/sources/github/refs.js +61 -0
- package/dist/sources/github/refs.js.map +1 -0
- package/dist/sources/index.d.ts +6 -0
- package/dist/sources/index.js +7 -0
- package/dist/sources/index.js.map +1 -0
- package/dist/ui/index.d.ts +12 -0
- package/dist/ui/index.js +28 -0
- package/dist/ui/index.js.map +1 -0
- package/dist/ui/public/app.css +239 -0
- package/dist/ui/public/favicon.svg +1 -0
- package/dist/ui/public/index.html +27 -0
- package/dist/ui/public/js/client/api.js +68 -0
- package/dist/ui/public/js/client/app.js +146 -0
- package/dist/ui/public/js/client/dom.js +34 -0
- package/dist/ui/public/js/client/page.js +9 -0
- package/dist/ui/public/js/client/pages/actions.js +35 -0
- package/dist/ui/public/js/client/pages/blocked.js +58 -0
- package/dist/ui/public/js/client/pages/config.js +126 -0
- package/dist/ui/public/js/client/pages/dashboard.js +175 -0
- package/dist/ui/public/js/client/pages/run.js +367 -0
- package/dist/ui/public/js/client/pages/runs.js +72 -0
- package/dist/ui/public/js/client/pages/views.js +80 -0
- package/dist/ui/public/js/client/pages/workflows.js +291 -0
- package/dist/ui/public/js/client/types.js +1 -0
- package/dist/ui/public/js/client/ui.js +152 -0
- package/dist/ui/public/js/shared/dom.js +77 -0
- package/dist/ui/public/js/shared/events.js +88 -0
- package/dist/ui/public/js/shared/format.js +213 -0
- package/dist/ui/public/js/shared/logs.js +136 -0
- package/dist/ui/public/js/shared/params.js +90 -0
- package/dist/ui/public/js/shared/route.js +36 -0
- package/dist/ui/public/js/shared/sort.js +70 -0
- package/dist/ui/public/js/shared/sse.js +193 -0
- package/dist/ui/public/js/shared/throttle.js +65 -0
- package/dist/views/index.d.ts +6 -0
- package/dist/views/index.js +7 -0
- package/dist/views/index.js.map +1 -0
- package/dist/views/service.d.ts +131 -0
- package/dist/views/service.js +264 -0
- package/dist/views/service.js.map +1 -0
- package/docs/api.md +239 -0
- package/docs/configuration-reference.md +1785 -0
- package/docs/cron-semantics.md +96 -0
- package/docs/manual-tests/github-fixture/config.yaml +30 -0
- package/docs/manual-tests/github-fixture/helpers.sh +93 -0
- package/docs/manual-tests/github-fixture/identities.yaml +18 -0
- package/docs/manual-tests/github-fixture/scripts/test-worker.sh +100 -0
- package/docs/manual-tests/github-fixture/sources.yaml +13 -0
- package/docs/manual-tests/github-fixture/views/dependencies.yaml +17 -0
- package/docs/manual-tests/github-fixture/views/needs-maintainer.yaml +17 -0
- package/docs/manual-tests/github-fixture/workflows/coder-test.yaml +76 -0
- package/docs/manual-tests/github-fixture/workflows/commenter-test.yaml +63 -0
- package/docs/manual-tests/github-fixture/workflows/reviewer-test.yaml +60 -0
- package/docs/manual-tests/github.md +1308 -0
- package/docs/manual-tests/process-supervision.md +64 -0
- package/docs/manual-tests/systemd.md +68 -0
- package/docs/operations.md +271 -0
- package/docs/worker-protocol.md +145 -0
- package/examples/config/config.yaml +35 -0
- package/examples/config/identities.yaml +18 -0
- package/examples/config/sources.yaml +13 -0
- package/examples/config/views/needs-maintainer.yaml +15 -0
- package/examples/config/workflows/coder-project-a.yaml +86 -0
- package/examples/config/workflows/deploy.yaml +15 -0
- package/examples/config/workflows/nightly-maintenance.yaml +13 -0
- package/package.json +75 -4
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
// ---------------------------------------------------------------------------
|
|
2
|
+
// Run status model (Spec §8.1)
|
|
3
|
+
// ---------------------------------------------------------------------------
|
|
4
|
+
/** All technical run states, including the technical extension `recovery_pending`. */
|
|
5
|
+
export const TECHNICAL_STATUSES = [
|
|
6
|
+
'reserved',
|
|
7
|
+
'starting',
|
|
8
|
+
'running',
|
|
9
|
+
'cancelling',
|
|
10
|
+
'finalizing',
|
|
11
|
+
'completed',
|
|
12
|
+
'crashed',
|
|
13
|
+
'start_error',
|
|
14
|
+
'timed_out',
|
|
15
|
+
'cancelled',
|
|
16
|
+
'recovery_pending',
|
|
17
|
+
];
|
|
18
|
+
/** Final technical states; a run in one of these never changes state again. */
|
|
19
|
+
export const TERMINAL_STATUSES = ['completed', 'crashed', 'start_error', 'timed_out', 'cancelled'];
|
|
20
|
+
/**
|
|
21
|
+
* Non-terminal states. A run in one of these holds its lock and counts
|
|
22
|
+
* towards concurrency. `recovery_pending` keeps the lock to prevent double starts (Spec §14).
|
|
23
|
+
*/
|
|
24
|
+
export const ACTIVE_STATUSES = ['reserved', 'starting', 'running', 'cancelling', 'finalizing', 'recovery_pending'];
|
|
25
|
+
/**
|
|
26
|
+
* Terminal states that count as technical failures for retry blocks
|
|
27
|
+
* (Spec §8.1, §11). `cancelled` and business `failure` do not count.
|
|
28
|
+
*/
|
|
29
|
+
export const TECHNICAL_FAILURE_STATUSES = ['crashed', 'start_error', 'timed_out'];
|
|
30
|
+
/** True if `status` is terminal. */
|
|
31
|
+
export function isTerminalStatus(status) {
|
|
32
|
+
return TERMINAL_STATUSES.includes(status);
|
|
33
|
+
}
|
|
34
|
+
/** True if `status` counts as a technical failure (Spec §11). */
|
|
35
|
+
export function isTechnicalFailure(status) {
|
|
36
|
+
return TECHNICAL_FAILURE_STATUSES.includes(status);
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Reference state machine for run transitions. Persistence (WI-03) enforces
|
|
40
|
+
* it; any transition not listed is invalid.
|
|
41
|
+
*
|
|
42
|
+
* **Every terminal status is reached only via `finalizing` — no exceptions.**
|
|
43
|
+
*
|
|
44
|
+
* Normal path: `reserved → starting → running → finalizing → <terminal>`.
|
|
45
|
+
*
|
|
46
|
+
* Finalization protocol (WI-03/WI-08):
|
|
47
|
+
* 1. `X → finalizing` persists the {@link FinalizationTarget} (columns
|
|
48
|
+
* `runs.final_status`, `runs.business_result`, `runs.final_reason`) and, for
|
|
49
|
+
* technical failures that reach the limit, the retry block — all in ONE
|
|
50
|
+
* transaction (Spec §11 "important order").
|
|
51
|
+
* 2. The completion hook ({@link hookForOutcome}) runs while `finalizing`.
|
|
52
|
+
* After a controller crash, recovery resumes the hook chain of runs still
|
|
53
|
+
* in `finalizing` from the persisted target.
|
|
54
|
+
* 3. `finalizing → target.status` (must equal the persisted target, see
|
|
55
|
+
* {@link canTransition}); the lock is released in the same transaction.
|
|
56
|
+
*
|
|
57
|
+
* Special cases (also via `finalizing`):
|
|
58
|
+
* - Cancel before the worker started (`reserved`/`starting` → `cancelling`
|
|
59
|
+
* or directly → `finalizing` with target `cancelled`): a uniform path keeps
|
|
60
|
+
* the journal and recovery logic simple; WI-08 decides whether `on_cancel`
|
|
61
|
+
* runs when `on_start` never ran.
|
|
62
|
+
* - `on_start` chain failed: `starting → finalizing` with target `start_error`.
|
|
63
|
+
* - Recovery: `recovery_pending → finalizing` with target `crashed` (or
|
|
64
|
+
* `cancelled`) once the process is confirmed gone.
|
|
65
|
+
*
|
|
66
|
+
* `cancelling` is entered on a cancel request; `recovery_pending` marks runs
|
|
67
|
+
* whose process could not be identified or stopped during recovery (keeps the lock).
|
|
68
|
+
*/
|
|
69
|
+
export const RUN_STATUS_TRANSITIONS = {
|
|
70
|
+
reserved: ['starting', 'cancelling', 'finalizing', 'recovery_pending'],
|
|
71
|
+
starting: ['running', 'cancelling', 'finalizing', 'recovery_pending'],
|
|
72
|
+
running: ['cancelling', 'finalizing', 'recovery_pending'],
|
|
73
|
+
cancelling: ['finalizing', 'recovery_pending'],
|
|
74
|
+
finalizing: ['completed', 'crashed', 'start_error', 'timed_out', 'cancelled'],
|
|
75
|
+
recovery_pending: ['finalizing'],
|
|
76
|
+
completed: [],
|
|
77
|
+
crashed: [],
|
|
78
|
+
start_error: [],
|
|
79
|
+
timed_out: [],
|
|
80
|
+
cancelled: [],
|
|
81
|
+
};
|
|
82
|
+
/**
|
|
83
|
+
* True if the reference state machine allows `from → to`. For
|
|
84
|
+
* `finalizing → <terminal>`, pass the persisted `target`; the transition is
|
|
85
|
+
* then only valid if `to === target.status`.
|
|
86
|
+
*/
|
|
87
|
+
export function canTransition(from, to, target) {
|
|
88
|
+
if (!RUN_STATUS_TRANSITIONS[from].includes(to))
|
|
89
|
+
return false;
|
|
90
|
+
if (from === 'finalizing' && target !== undefined)
|
|
91
|
+
return to === target.status;
|
|
92
|
+
return true;
|
|
93
|
+
}
|
|
94
|
+
/** Lifecycle hooks in declaration order (Spec §10). */
|
|
95
|
+
export const HOOK_NAMES = [
|
|
96
|
+
'on_start',
|
|
97
|
+
'on_success',
|
|
98
|
+
'on_failure',
|
|
99
|
+
'on_crash',
|
|
100
|
+
'on_start_error',
|
|
101
|
+
'on_cancel',
|
|
102
|
+
'on_timeout',
|
|
103
|
+
];
|
|
104
|
+
/**
|
|
105
|
+
* The completion hook to run for a final outcome (Spec §8.2 rule 7):
|
|
106
|
+
* `completed`+`success` → `on_success`, `completed`+`failure` → `on_failure`,
|
|
107
|
+
* `crashed` → `on_crash`, `start_error` → `on_start_error`,
|
|
108
|
+
* `timed_out` → `on_timeout`, `cancelled` → `on_cancel`.
|
|
109
|
+
*/
|
|
110
|
+
export function hookForOutcome(status, businessResult) {
|
|
111
|
+
switch (status) {
|
|
112
|
+
case 'completed':
|
|
113
|
+
return businessResult === 'failure' ? 'on_failure' : 'on_success';
|
|
114
|
+
case 'crashed':
|
|
115
|
+
return 'on_crash';
|
|
116
|
+
case 'start_error':
|
|
117
|
+
return 'on_start_error';
|
|
118
|
+
case 'timed_out':
|
|
119
|
+
return 'on_timeout';
|
|
120
|
+
case 'cancelled':
|
|
121
|
+
return 'on_cancel';
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
/** Lifecycle action types available in V1 (Spec §10). */
|
|
125
|
+
export const ACTION_TYPES = ['source.update', 'source.comment', 'shell'];
|
|
126
|
+
/** Orchestrator events that can trigger central notifications (Spec §18). */
|
|
127
|
+
export const NOTIFICATION_EVENT_TYPES = ['retry_block_created', 'lifecycle_action_failed', 'recovery_failed'];
|
|
128
|
+
/** Declarative filter operators (Spec §6). */
|
|
129
|
+
export const FILTER_OPERATORS = ['equals', 'not_equals', 'contains', 'in', 'greater_than', 'less_than'];
|
|
130
|
+
/** Type guard for {@link FilterAll}. */
|
|
131
|
+
export function isFilterAll(node) {
|
|
132
|
+
return 'all' in node;
|
|
133
|
+
}
|
|
134
|
+
/** Type guard for {@link FilterAny}. */
|
|
135
|
+
export function isFilterAny(node) {
|
|
136
|
+
return 'any' in node;
|
|
137
|
+
}
|
|
138
|
+
/** Type guard for {@link FilterNot}. */
|
|
139
|
+
export function isFilterNot(node) {
|
|
140
|
+
return 'not' in node;
|
|
141
|
+
}
|
|
142
|
+
/** Type guard for {@link FilterPredicate}. */
|
|
143
|
+
export function isFilterPredicate(node) {
|
|
144
|
+
return 'field' in node && 'operator' in node;
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Operators that are meaningful per field type; config validation accepts
|
|
148
|
+
* exactly these. (`equals` on lists is not expressible: list values are only
|
|
149
|
+
* allowed for `in`.)
|
|
150
|
+
*/
|
|
151
|
+
export const OPERATORS_BY_TYPE = {
|
|
152
|
+
string: ['equals', 'not_equals', 'contains', 'in'],
|
|
153
|
+
number: ['equals', 'not_equals', 'in', 'greater_than', 'less_than'],
|
|
154
|
+
boolean: ['equals', 'not_equals'],
|
|
155
|
+
date: ['equals', 'not_equals', 'greater_than', 'less_than'],
|
|
156
|
+
'string[]': ['contains', 'in'],
|
|
157
|
+
};
|
|
158
|
+
/**
|
|
159
|
+
* Internal run fields available to views (per global item key, latest run by
|
|
160
|
+
* creation). Not available in workflow filters.
|
|
161
|
+
*/
|
|
162
|
+
export const VIEW_RUN_FIELDS = Object.freeze([
|
|
163
|
+
{ name: 'run.last_id', type: 'string', description: 'ID of the latest run', operators: OPERATORS_BY_TYPE.string },
|
|
164
|
+
{ name: 'run.last_workflow', type: 'string', description: 'Workflow of the latest run', operators: OPERATORS_BY_TYPE.string },
|
|
165
|
+
{ name: 'run.last_status', type: 'string', description: 'Technical status of the latest run', operators: OPERATORS_BY_TYPE.string },
|
|
166
|
+
{ name: 'run.last_result', type: 'string', description: 'Business result (success/failure) of the latest run', operators: OPERATORS_BY_TYPE.string },
|
|
167
|
+
{ name: 'run.last_result.message', type: 'string', description: 'Result message of the latest run', operators: OPERATORS_BY_TYPE.string },
|
|
168
|
+
{ name: 'run.last_status_message', type: 'string', description: 'Last worker status message', operators: OPERATORS_BY_TYPE.string },
|
|
169
|
+
{ name: 'run.last_started_at', type: 'date', description: 'Start of the latest run', operators: OPERATORS_BY_TYPE.date },
|
|
170
|
+
{ name: 'run.last_finished_at', type: 'date', description: 'End of the latest run', operators: OPERATORS_BY_TYPE.date },
|
|
171
|
+
]);
|
|
172
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Worker protocol contract (Spec §9): environment variable names, context
|
|
3
|
+
* file, result file schema and event line format. Shared by the executor
|
|
4
|
+
* (writes context, parses result/events), lifecycle (shell actions), API and UI.
|
|
5
|
+
*/
|
|
6
|
+
import { z } from 'zod';
|
|
7
|
+
import type { TriggerType } from './types.js';
|
|
8
|
+
/** Current `schema_version` of context and result files. */
|
|
9
|
+
export declare const WORKER_PROTOCOL_VERSION = 1;
|
|
10
|
+
/** Environment variables provided to every worker (Spec §9.1). */
|
|
11
|
+
export declare const ADISPATCH_ENV: {
|
|
12
|
+
readonly RUN_ID: 'ADISPATCH_RUN_ID';
|
|
13
|
+
readonly WORKFLOW_ID: 'ADISPATCH_WORKFLOW_ID';
|
|
14
|
+
/** Only for source-bound runs. */
|
|
15
|
+
readonly SOURCE_TYPE: 'ADISPATCH_SOURCE_TYPE';
|
|
16
|
+
/** Only for source-bound runs. */
|
|
17
|
+
readonly SOURCE_ID: 'ADISPATCH_SOURCE_ID';
|
|
18
|
+
/** Only for source-bound runs. */
|
|
19
|
+
readonly SOURCE_ITEM_ID: 'ADISPATCH_SOURCE_ITEM_ID';
|
|
20
|
+
/** Only for source-bound runs. */
|
|
21
|
+
readonly SOURCE_URL: 'ADISPATCH_SOURCE_URL';
|
|
22
|
+
readonly CONTEXT_FILE: 'ADISPATCH_CONTEXT_FILE';
|
|
23
|
+
readonly RESULT_FILE: 'ADISPATCH_RESULT_FILE';
|
|
24
|
+
readonly WORKSPACE: 'ADISPATCH_WORKSPACE';
|
|
25
|
+
};
|
|
26
|
+
/** Content of `context.json` (Spec §9.1). Never contains secrets. */
|
|
27
|
+
export interface WorkerContext {
|
|
28
|
+
schema_version: typeof WORKER_PROTOCOL_VERSION;
|
|
29
|
+
run: {
|
|
30
|
+
id: string;
|
|
31
|
+
trigger: TriggerType;
|
|
32
|
+
/** ISO-8601 */
|
|
33
|
+
started_at: string;
|
|
34
|
+
/** Cron slot (ISO-8601) for schedule-triggered runs. */
|
|
35
|
+
scheduled_for?: string;
|
|
36
|
+
};
|
|
37
|
+
workflow: {
|
|
38
|
+
id: string;
|
|
39
|
+
name?: string;
|
|
40
|
+
};
|
|
41
|
+
/** Absent for schedule/manual workflows without an item. */
|
|
42
|
+
source?: {
|
|
43
|
+
id: string;
|
|
44
|
+
type: string;
|
|
45
|
+
item_id: string;
|
|
46
|
+
item_key: string;
|
|
47
|
+
url: string;
|
|
48
|
+
/** Cheap item fields at start time (e.g. title, labels). */
|
|
49
|
+
attributes: Record<string, unknown>;
|
|
50
|
+
};
|
|
51
|
+
/** Validated manual-start parameters. */
|
|
52
|
+
parameters: Record<string, string | number | boolean>;
|
|
53
|
+
workspace: {
|
|
54
|
+
path: string;
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
/** Maximum accepted size of a result file in bytes. */
|
|
58
|
+
export declare const MAX_RESULT_FILE_BYTES: number;
|
|
59
|
+
/** Artifact reference in a worker result. */
|
|
60
|
+
export declare const workerArtifactSchema: z.ZodObject<{
|
|
61
|
+
type: z.ZodString;
|
|
62
|
+
name: z.ZodOptional<z.ZodString>;
|
|
63
|
+
url: z.ZodOptional<z.ZodString>;
|
|
64
|
+
}, z.core.$loose>;
|
|
65
|
+
/** Schema of the result file `ADISPATCH_RESULT_FILE` (Spec §9.2). */
|
|
66
|
+
export declare const workerResultSchema: z.ZodObject<{
|
|
67
|
+
schema_version: z.ZodLiteral<1>;
|
|
68
|
+
result: z.ZodEnum<{
|
|
69
|
+
failure: "failure";
|
|
70
|
+
success: "success";
|
|
71
|
+
}>;
|
|
72
|
+
message: z.ZodOptional<z.ZodString>;
|
|
73
|
+
details: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
74
|
+
artifacts: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
75
|
+
type: z.ZodString;
|
|
76
|
+
name: z.ZodOptional<z.ZodString>;
|
|
77
|
+
url: z.ZodOptional<z.ZodString>;
|
|
78
|
+
}, z.core.$loose>>>;
|
|
79
|
+
}, z.core.$strip>;
|
|
80
|
+
/** Validated worker result. */
|
|
81
|
+
export type WorkerResult = z.infer<typeof workerResultSchema>;
|
|
82
|
+
/** Artifact entry of a {@link WorkerResult}. */
|
|
83
|
+
export type WorkerArtifact = z.infer<typeof workerArtifactSchema>;
|
|
84
|
+
/**
|
|
85
|
+
* Parse and validate result-file content. Returns a discriminated result
|
|
86
|
+
* instead of throwing; any problem means a technical protocol error (Spec §8.2 rule 4).
|
|
87
|
+
*/
|
|
88
|
+
export declare function parseWorkerResult(content: string): {
|
|
89
|
+
ok: true;
|
|
90
|
+
result: WorkerResult;
|
|
91
|
+
} | {
|
|
92
|
+
ok: false;
|
|
93
|
+
error: string;
|
|
94
|
+
};
|
|
95
|
+
/** Reserved line prefix for structured worker events (Spec §9.3). */
|
|
96
|
+
export declare const ADISPATCH_EVENT_PREFIX = "@@ADISPATCH_EVENT ";
|
|
97
|
+
/** Maximum accepted length of one event line's JSON payload. */
|
|
98
|
+
export declare const MAX_EVENT_LINE_BYTES: number;
|
|
99
|
+
/** Minimal schema of an event payload: an object with a string `type`. */
|
|
100
|
+
export declare const workerEventPayloadSchema: z.ZodObject<{
|
|
101
|
+
type: z.ZodString;
|
|
102
|
+
}, z.core.$loose>;
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Worker protocol contract (Spec §9): environment variable names, context
|
|
3
|
+
* file, result file schema and event line format. Shared by the executor
|
|
4
|
+
* (writes context, parses result/events), lifecycle (shell actions), API and UI.
|
|
5
|
+
*/
|
|
6
|
+
import { z } from 'zod';
|
|
7
|
+
/** Current `schema_version` of context and result files. */
|
|
8
|
+
export const WORKER_PROTOCOL_VERSION = 1;
|
|
9
|
+
/** Environment variables provided to every worker (Spec §9.1). */
|
|
10
|
+
export const ADISPATCH_ENV = {
|
|
11
|
+
RUN_ID: 'ADISPATCH_RUN_ID',
|
|
12
|
+
WORKFLOW_ID: 'ADISPATCH_WORKFLOW_ID',
|
|
13
|
+
/** Only for source-bound runs. */
|
|
14
|
+
SOURCE_TYPE: 'ADISPATCH_SOURCE_TYPE',
|
|
15
|
+
/** Only for source-bound runs. */
|
|
16
|
+
SOURCE_ID: 'ADISPATCH_SOURCE_ID',
|
|
17
|
+
/** Only for source-bound runs. */
|
|
18
|
+
SOURCE_ITEM_ID: 'ADISPATCH_SOURCE_ITEM_ID',
|
|
19
|
+
/** Only for source-bound runs. */
|
|
20
|
+
SOURCE_URL: 'ADISPATCH_SOURCE_URL',
|
|
21
|
+
CONTEXT_FILE: 'ADISPATCH_CONTEXT_FILE',
|
|
22
|
+
RESULT_FILE: 'ADISPATCH_RESULT_FILE',
|
|
23
|
+
WORKSPACE: 'ADISPATCH_WORKSPACE',
|
|
24
|
+
};
|
|
25
|
+
/** Maximum accepted size of a result file in bytes. */
|
|
26
|
+
export const MAX_RESULT_FILE_BYTES = 1024 * 1024;
|
|
27
|
+
/** Artifact reference in a worker result. */
|
|
28
|
+
export const workerArtifactSchema = z
|
|
29
|
+
.object({
|
|
30
|
+
type: z.string().min(1).max(64),
|
|
31
|
+
name: z.string().max(500).optional(),
|
|
32
|
+
url: z.string().max(4096).optional(),
|
|
33
|
+
})
|
|
34
|
+
.loose();
|
|
35
|
+
/** Schema of the result file `ADISPATCH_RESULT_FILE` (Spec §9.2). */
|
|
36
|
+
export const workerResultSchema = z.object({
|
|
37
|
+
schema_version: z.literal(WORKER_PROTOCOL_VERSION),
|
|
38
|
+
result: z.enum(['success', 'failure']),
|
|
39
|
+
message: z.string().max(10_000).optional(),
|
|
40
|
+
details: z.record(z.string(), z.unknown()).optional(),
|
|
41
|
+
artifacts: z.array(workerArtifactSchema).max(100).optional(),
|
|
42
|
+
});
|
|
43
|
+
/**
|
|
44
|
+
* Parse and validate result-file content. Returns a discriminated result
|
|
45
|
+
* instead of throwing; any problem means a technical protocol error (Spec §8.2 rule 4).
|
|
46
|
+
*/
|
|
47
|
+
export function parseWorkerResult(content) {
|
|
48
|
+
if (Buffer.byteLength(content, 'utf8') > MAX_RESULT_FILE_BYTES) {
|
|
49
|
+
return { ok: false, error: `result file exceeds ${MAX_RESULT_FILE_BYTES} bytes` };
|
|
50
|
+
}
|
|
51
|
+
let json;
|
|
52
|
+
try {
|
|
53
|
+
json = JSON.parse(content);
|
|
54
|
+
}
|
|
55
|
+
catch (err) {
|
|
56
|
+
return { ok: false, error: `result file is not valid JSON: ${err.message}` };
|
|
57
|
+
}
|
|
58
|
+
const parsed = workerResultSchema.safeParse(json);
|
|
59
|
+
if (!parsed.success) {
|
|
60
|
+
const issues = parsed.error.issues.map((i) => `${i.path.join('.') || '(root)'}: ${i.message}`).join('; ');
|
|
61
|
+
return { ok: false, error: `result file does not match schema: ${issues}` };
|
|
62
|
+
}
|
|
63
|
+
return { ok: true, result: parsed.data };
|
|
64
|
+
}
|
|
65
|
+
/** Reserved line prefix for structured worker events (Spec §9.3). */
|
|
66
|
+
export const ADISPATCH_EVENT_PREFIX = '@@ADISPATCH_EVENT ';
|
|
67
|
+
/** Maximum accepted length of one event line's JSON payload. */
|
|
68
|
+
export const MAX_EVENT_LINE_BYTES = 64 * 1024;
|
|
69
|
+
/** Minimal schema of an event payload: an object with a string `type`. */
|
|
70
|
+
export const workerEventPayloadSchema = z
|
|
71
|
+
.object({
|
|
72
|
+
type: z.string().min(1).max(64),
|
|
73
|
+
})
|
|
74
|
+
.loose();
|
|
75
|
+
//# sourceMappingURL=worker-protocol.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker-protocol.js","sourceRoot":"","sources":["../../src/core/worker-protocol.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Result classification of a main worker execution (Spec §8.2).
|
|
3
|
+
*
|
|
4
|
+
* Binding rules (docs/conventions.md: §8.2 wins over §24.2):
|
|
5
|
+
* - A non-zero exit code is ALWAYS a technical failure (`crashed`), whatever
|
|
6
|
+
* the result file says.
|
|
7
|
+
* - A business `failure` is only ever derived from a valid result file with
|
|
8
|
+
* `result: "failure"` after exit code 0.
|
|
9
|
+
*/
|
|
10
|
+
import type { ExecutionOutcome, OutcomeClassification } from '../core/index.js';
|
|
11
|
+
/**
|
|
12
|
+
* Classify the raw facts of an execution into the final run outcome,
|
|
13
|
+
* exactly following the table in Spec §8.2. Pure function.
|
|
14
|
+
*
|
|
15
|
+
* Precedence (first match wins):
|
|
16
|
+
* 1. spawn error → `start_error`
|
|
17
|
+
* 2. controlled cancel → `cancelled`
|
|
18
|
+
* 3. timeout → `timed_out`
|
|
19
|
+
* 4. terminated by a signal → `crashed`
|
|
20
|
+
* 5. exit code ≠ 0 → `crashed` (result file ignored)
|
|
21
|
+
* 6. exit code 0 + valid result file → `completed` with its `success`/`failure`
|
|
22
|
+
* 7. exit code 0 + no result file → `completed` / implicit `success`
|
|
23
|
+
* 8. exit code 0 + invalid/unreadable result file → `crashed` (protocol error)
|
|
24
|
+
*/
|
|
25
|
+
export declare function classifyOutcome(outcome: ExecutionOutcome): OutcomeClassification;
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Classify the raw facts of an execution into the final run outcome,
|
|
3
|
+
* exactly following the table in Spec §8.2. Pure function.
|
|
4
|
+
*
|
|
5
|
+
* Precedence (first match wins):
|
|
6
|
+
* 1. spawn error → `start_error`
|
|
7
|
+
* 2. controlled cancel → `cancelled`
|
|
8
|
+
* 3. timeout → `timed_out`
|
|
9
|
+
* 4. terminated by a signal → `crashed`
|
|
10
|
+
* 5. exit code ≠ 0 → `crashed` (result file ignored)
|
|
11
|
+
* 6. exit code 0 + valid result file → `completed` with its `success`/`failure`
|
|
12
|
+
* 7. exit code 0 + no result file → `completed` / implicit `success`
|
|
13
|
+
* 8. exit code 0 + invalid/unreadable result file → `crashed` (protocol error)
|
|
14
|
+
*/
|
|
15
|
+
export function classifyOutcome(outcome) {
|
|
16
|
+
if (outcome.spawnError) {
|
|
17
|
+
const code = outcome.spawnError.code ? ` (${outcome.spawnError.code})` : '';
|
|
18
|
+
return technical('start_error', `worker could not be started${code}: ${outcome.spawnError.message}`);
|
|
19
|
+
}
|
|
20
|
+
if (outcome.cancelled) {
|
|
21
|
+
return technical('cancelled', 'cancelled');
|
|
22
|
+
}
|
|
23
|
+
if (outcome.timedOut !== false) {
|
|
24
|
+
return technical('timed_out', outcome.timedOut === 'idle' ? 'idle timeout exceeded' : 'max duration exceeded');
|
|
25
|
+
}
|
|
26
|
+
if (outcome.signal !== null) {
|
|
27
|
+
return technical('crashed', `terminated by signal ${outcome.signal}`);
|
|
28
|
+
}
|
|
29
|
+
if (outcome.exitCode === null) {
|
|
30
|
+
return technical('crashed', 'process ended without exit code');
|
|
31
|
+
}
|
|
32
|
+
if (outcome.exitCode !== 0) {
|
|
33
|
+
return technical('crashed', `exit code ${outcome.exitCode}`);
|
|
34
|
+
}
|
|
35
|
+
switch (outcome.resultFile.state) {
|
|
36
|
+
case 'valid': {
|
|
37
|
+
const result = outcome.resultFile.result;
|
|
38
|
+
return {
|
|
39
|
+
status: 'completed',
|
|
40
|
+
businessResult: result.result,
|
|
41
|
+
reason: result.result === 'success' ? 'exit code 0, result success' : 'exit code 0, result failure',
|
|
42
|
+
result,
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
case 'missing':
|
|
46
|
+
return { status: 'completed', businessResult: 'success', reason: 'exit code 0, no result file', result: null };
|
|
47
|
+
case 'invalid':
|
|
48
|
+
return technical('crashed', `protocol error: ${outcome.resultFile.error}`);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
function technical(status, reason) {
|
|
52
|
+
return { status, businessResult: null, reason, result: null };
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=classify.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"classify.js","sourceRoot":"","sources":["../../src/executors/classify.ts"],"names":[],"mappings":"AAWA;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,eAAe,CAAC,OAAyB;IACvD,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;QACvB,MAAM,IAAI,GAAG,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,UAAU,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5E,OAAO,SAAS,CAAC,aAAa,EAAE,8BAA8B,IAAI,KAAK,OAAO,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC,CAAC;IACvG,CAAC;IACD,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;QACtB,OAAO,SAAS,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;IAC7C,CAAC;IACD,IAAI,OAAO,CAAC,QAAQ,KAAK,KAAK,EAAE,CAAC;QAC/B,OAAO,SAAS,CAAC,WAAW,EAAE,OAAO,CAAC,QAAQ,KAAK,MAAM,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC;IACjH,CAAC;IACD,IAAI,OAAO,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;QAC5B,OAAO,SAAS,CAAC,SAAS,EAAE,wBAAwB,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACxE,CAAC;IACD,IAAI,OAAO,CAAC,QAAQ,KAAK,IAAI,EAAE,CAAC;QAC9B,OAAO,SAAS,CAAC,SAAS,EAAE,iCAAiC,CAAC,CAAC;IACjE,CAAC;IACD,IAAI,OAAO,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;QAC3B,OAAO,SAAS,CAAC,SAAS,EAAE,aAAa,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC/D,CAAC;IACD,QAAQ,OAAO,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;QACjC,KAAK,OAAO,EAAE,CAAC;YACb,MAAM,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC;YACzC,OAAO;gBACL,MAAM,EAAE,WAAW;gBACnB,cAAc,EAAE,MAAM,CAAC,MAAM;gBAC7B,MAAM,EAAE,MAAM,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,6BAA6B,CAAC,CAAC,CAAC,6BAA6B;gBACnG,MAAM;aACP,CAAC;QACJ,CAAC;QACD,KAAK,SAAS;YACZ,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,EAAE,6BAA6B,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;QACjH,KAAK,SAAS;YACZ,OAAO,SAAS,CAAC,SAAS,EAAE,mBAAmB,OAAO,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC,CAAC;IAC/E,CAAC;AACH,CAAC;AAED,SAAS,SAAS,CAAC,MAA6D,EAAE,MAAc;IAC9F,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;AAChE,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Decoupled, ordered delivery of executor notifications to listeners.
|
|
3
|
+
*
|
|
4
|
+
* Emitting never calls listeners synchronously: items are queued and
|
|
5
|
+
* delivered on a later event-loop turn (`setImmediate`), so slow or throwing
|
|
6
|
+
* consumers (e.g. SSE) cannot block or break log capture. Delivery order
|
|
7
|
+
* equals emit order across all channels. Until {@link open} is called, items
|
|
8
|
+
* are only queued — this lets the caller of `Executor.start()` subscribe
|
|
9
|
+
* before any early output is delivered.
|
|
10
|
+
*/
|
|
11
|
+
import type { Logger, Unsubscribe } from '../core/index.js';
|
|
12
|
+
type Task = () => void;
|
|
13
|
+
export declare class Dispatcher {
|
|
14
|
+
private readonly logger?;
|
|
15
|
+
private readonly queue;
|
|
16
|
+
private scheduled;
|
|
17
|
+
private opened;
|
|
18
|
+
constructor(logger?: Logger | undefined);
|
|
19
|
+
/** Start delivering (on the next turn) everything queued so far and all later items. */
|
|
20
|
+
open(): void;
|
|
21
|
+
/** Queue a task (listener fan-out or completion callback). */
|
|
22
|
+
enqueue(task: Task): void;
|
|
23
|
+
private schedule;
|
|
24
|
+
private drain;
|
|
25
|
+
}
|
|
26
|
+
/** A listener set whose fan-out goes through a {@link Dispatcher}. */
|
|
27
|
+
export declare class Channel<T> {
|
|
28
|
+
private readonly dispatcher;
|
|
29
|
+
private readonly logger?;
|
|
30
|
+
private readonly listeners;
|
|
31
|
+
constructor(dispatcher: Dispatcher, logger?: Logger | undefined);
|
|
32
|
+
subscribe(listener: (value: T) => void): Unsubscribe;
|
|
33
|
+
emit(value: T): void;
|
|
34
|
+
}
|
|
35
|
+
export {};
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
export class Dispatcher {
|
|
2
|
+
logger;
|
|
3
|
+
queue = [];
|
|
4
|
+
scheduled = false;
|
|
5
|
+
opened = false;
|
|
6
|
+
constructor(logger) {
|
|
7
|
+
this.logger = logger;
|
|
8
|
+
}
|
|
9
|
+
/** Start delivering (on the next turn) everything queued so far and all later items. */
|
|
10
|
+
open() {
|
|
11
|
+
this.opened = true;
|
|
12
|
+
this.schedule();
|
|
13
|
+
}
|
|
14
|
+
/** Queue a task (listener fan-out or completion callback). */
|
|
15
|
+
enqueue(task) {
|
|
16
|
+
this.queue.push(task);
|
|
17
|
+
this.schedule();
|
|
18
|
+
}
|
|
19
|
+
schedule() {
|
|
20
|
+
if (!this.opened || this.scheduled || this.queue.length === 0)
|
|
21
|
+
return;
|
|
22
|
+
this.scheduled = true;
|
|
23
|
+
setImmediate(() => this.drain());
|
|
24
|
+
}
|
|
25
|
+
drain() {
|
|
26
|
+
this.scheduled = false;
|
|
27
|
+
// Deliver what is queued now; items queued by listeners go to the next turn.
|
|
28
|
+
const batch = this.queue.splice(0, this.queue.length);
|
|
29
|
+
for (const task of batch) {
|
|
30
|
+
try {
|
|
31
|
+
task();
|
|
32
|
+
}
|
|
33
|
+
catch (err) {
|
|
34
|
+
this.logger?.warn('executor listener threw', { error: err });
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
this.schedule();
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
/** A listener set whose fan-out goes through a {@link Dispatcher}. */
|
|
41
|
+
export class Channel {
|
|
42
|
+
dispatcher;
|
|
43
|
+
logger;
|
|
44
|
+
listeners = new Set();
|
|
45
|
+
constructor(dispatcher, logger) {
|
|
46
|
+
this.dispatcher = dispatcher;
|
|
47
|
+
this.logger = logger;
|
|
48
|
+
}
|
|
49
|
+
subscribe(listener) {
|
|
50
|
+
this.listeners.add(listener);
|
|
51
|
+
return () => {
|
|
52
|
+
this.listeners.delete(listener);
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
emit(value) {
|
|
56
|
+
this.dispatcher.enqueue(() => {
|
|
57
|
+
for (const listener of [...this.listeners]) {
|
|
58
|
+
try {
|
|
59
|
+
listener(value);
|
|
60
|
+
}
|
|
61
|
+
catch (err) {
|
|
62
|
+
this.logger?.warn('executor listener threw', { error: err });
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=dispatcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dispatcher.js","sourceRoot":"","sources":["../../src/executors/dispatcher.ts"],"names":[],"mappings":"AAcA,MAAM,OAAO,UAAU;IAKQ,MAAM;IAJlB,KAAK,GAAW,EAAE,CAAC;IAC5B,SAAS,GAAG,KAAK,CAAC;IAClB,MAAM,GAAG,KAAK,CAAC;IAEvB,YAA6B,MAAe;sBAAf,MAAM;IAAY,CAAC;IAEhD,wFAAwF;IACxF,IAAI;QACF,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACnB,IAAI,CAAC,QAAQ,EAAE,CAAC;IAClB,CAAC;IAED,8DAA8D;IAC9D,OAAO,CAAC,IAAU;QAChB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtB,IAAI,CAAC,QAAQ,EAAE,CAAC;IAClB,CAAC;IAEO,QAAQ;QACd,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QACtE,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACtB,YAAY,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;IACnC,CAAC;IAEO,KAAK;QACX,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;QACvB,6EAA6E;QAC7E,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACtD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,CAAC;gBACH,IAAI,EAAE,CAAC;YACT,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,yBAAyB,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;YAC/D,CAAC;QACH,CAAC;QACD,IAAI,CAAC,QAAQ,EAAE,CAAC;IAClB,CAAC;CACF;AAED,sEAAsE;AACtE,MAAM,OAAO,OAAO;IAIC,UAAU;IACV,MAAM;IAJR,SAAS,GAAG,IAAI,GAAG,EAAsB,CAAC;IAE3D,YACmB,UAAsB,EACtB,MAAe;0BADf,UAAU;sBACV,MAAM;IACtB,CAAC;IAEJ,SAAS,CAAC,QAA4B;QACpC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC7B,OAAO,GAAG,EAAE;YACV,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAClC,CAAC,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,KAAQ;QACX,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,GAAG,EAAE;YAC3B,KAAK,MAAM,QAAQ,IAAI,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC3C,IAAI,CAAC;oBACH,QAAQ,CAAC,KAAK,CAAC,CAAC;gBAClB,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,yBAAyB,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;gBAC/D,CAAC;YACH,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;CACF"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Worker environment (Spec §9.1, §20.3): workers never inherit the controller
|
|
3
|
+
* environment. They get a minimal set of standard variables, the explicitly
|
|
4
|
+
* declared `env`, resolved secrets and the `ADISPATCH_*` protocol variables.
|
|
5
|
+
*/
|
|
6
|
+
import { type WorkerContext } from '../core/index.js';
|
|
7
|
+
/** Variables copied from the controller environment (if set). */
|
|
8
|
+
export declare const MINIMAL_ENV_KEYS: readonly ['PATH', 'HOME', 'LANG', 'TZ', 'USER', 'LOGNAME', 'TMPDIR'];
|
|
9
|
+
/** PATH used when the controller has none. */
|
|
10
|
+
export declare const FALLBACK_PATH = "/usr/local/bin:/usr/bin:/bin";
|
|
11
|
+
/** Pick the minimal standard variables from `base` (default `process.env`). */
|
|
12
|
+
export declare function buildMinimalEnv(base?: NodeJS.ProcessEnv): Record<string, string>;
|
|
13
|
+
/** Source block of a context as used for `ADISPATCH_SOURCE_*` (shape of `WorkerContext.source`). */
|
|
14
|
+
export interface OrchSourceInfo {
|
|
15
|
+
id: string;
|
|
16
|
+
type: string;
|
|
17
|
+
item_id: string;
|
|
18
|
+
url: string;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Extract a `source` block from any context object (main-worker context or a
|
|
22
|
+
* custom shell-action context). Returns `undefined` unless all fields are strings.
|
|
23
|
+
*/
|
|
24
|
+
export declare function contextSource(context: WorkerContext | Readonly<Record<string, unknown>>): OrchSourceInfo | undefined;
|
|
25
|
+
/** `ADISPATCH_*` variables for a worker (Spec §9.1). */
|
|
26
|
+
export declare function buildOrchEnv(input: {
|
|
27
|
+
runId: string;
|
|
28
|
+
workflowId: string;
|
|
29
|
+
context: WorkerContext | Readonly<Record<string, unknown>>;
|
|
30
|
+
contextFile: string;
|
|
31
|
+
resultFile: string;
|
|
32
|
+
workspace: string;
|
|
33
|
+
}): Record<string, string>;
|
|
34
|
+
/**
|
|
35
|
+
* Compose the full worker environment. Precedence (later wins): minimal env
|
|
36
|
+
* < declared `env` < `secrets` < `ADISPATCH_*` (protocol variables cannot be overridden).
|
|
37
|
+
*/
|
|
38
|
+
export declare function buildWorkerEnv(parts: {
|
|
39
|
+
base?: NodeJS.ProcessEnv;
|
|
40
|
+
env?: Readonly<Record<string, string>>;
|
|
41
|
+
secrets?: Readonly<Record<string, string>>;
|
|
42
|
+
orch: Readonly<Record<string, string>>;
|
|
43
|
+
}): Record<string, string>;
|