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,283 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Process start identity (Spec §13): PID alone is not enough, PID reuse must
|
|
3
|
+
* never lead to signalling a foreign process.
|
|
4
|
+
*
|
|
5
|
+
* Platform-specific parts are encapsulated in {@link ProcessInspector}:
|
|
6
|
+
* - Linux: `/proc/<pid>/stat` field 22 (`starttime`, clock ticks since boot)
|
|
7
|
+
* plus the boot ID (`/proc/sys/kernel/random/boot_id`); token
|
|
8
|
+
* `linux:<boot-id>:<starttime>`.
|
|
9
|
+
* - macOS: `ps -o pgid=,lstart= -p <pid>` with `LC_ALL=C` and `TZ=UTC` for a
|
|
10
|
+
* stable format; token `darwin:<lstart>` (second resolution).
|
|
11
|
+
*
|
|
12
|
+
* Rule: whenever the identity cannot be verified, nothing is signalled.
|
|
13
|
+
*/
|
|
14
|
+
import { execFile } from 'node:child_process';
|
|
15
|
+
import { readdir, readFile } from 'node:fs/promises';
|
|
16
|
+
import { systemTimers } from '../core/index.js';
|
|
17
|
+
/**
|
|
18
|
+
* Parse the content of `/proc/<pid>/stat`. The command name (field 2) may
|
|
19
|
+
* contain spaces and parentheses, so fields are counted after the last `)`.
|
|
20
|
+
* Returns process group (field 5) and start time (field 22).
|
|
21
|
+
*/
|
|
22
|
+
export function parseProcStat(content) {
|
|
23
|
+
const close = content.lastIndexOf(')');
|
|
24
|
+
if (close === -1)
|
|
25
|
+
throw new Error('malformed /proc stat: missing ")"');
|
|
26
|
+
// Fields after comm start with field 3 (state).
|
|
27
|
+
const fields = content.slice(close + 1).trim().split(/\s+/);
|
|
28
|
+
const state = fields[0];
|
|
29
|
+
const pgrp = Number(fields[2]); // field 5
|
|
30
|
+
const starttime = fields[19]; // field 22
|
|
31
|
+
if (!state || !Number.isInteger(pgrp) || !starttime || !/^\d+$/.test(starttime)) {
|
|
32
|
+
throw new Error('malformed /proc stat: unexpected field layout');
|
|
33
|
+
}
|
|
34
|
+
return { state, pgrp, starttime };
|
|
35
|
+
}
|
|
36
|
+
/** Linux implementation based on procfs. */
|
|
37
|
+
export function createLinuxInspector(read = (p) => readFile(p, 'utf8'), list = (p) => readdir(p)) {
|
|
38
|
+
let bootId;
|
|
39
|
+
return {
|
|
40
|
+
platform: 'linux',
|
|
41
|
+
// Zombies (e.g. orphans while PID 1 in a container does not reap) do not count.
|
|
42
|
+
async groupHasLiveMembers(pgid) {
|
|
43
|
+
for (const entry of await list('/proc')) {
|
|
44
|
+
if (!/^\d+$/.test(entry))
|
|
45
|
+
continue;
|
|
46
|
+
try {
|
|
47
|
+
const { state, pgrp } = parseProcStat(await read(`/proc/${entry}/stat`));
|
|
48
|
+
if (pgrp === pgid && state !== 'Z' && state !== 'X')
|
|
49
|
+
return true;
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
// Process vanished between listing and reading.
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
return false;
|
|
56
|
+
},
|
|
57
|
+
async probe(pid) {
|
|
58
|
+
let stat;
|
|
59
|
+
try {
|
|
60
|
+
stat = await read(`/proc/${pid}/stat`);
|
|
61
|
+
}
|
|
62
|
+
catch (err) {
|
|
63
|
+
if (err.code === 'ENOENT' || err.code === 'ESRCH')
|
|
64
|
+
return null;
|
|
65
|
+
throw err;
|
|
66
|
+
}
|
|
67
|
+
const { pgrp, starttime } = parseProcStat(stat);
|
|
68
|
+
bootId ??= (await read('/proc/sys/kernel/random/boot_id')).trim();
|
|
69
|
+
if (!bootId)
|
|
70
|
+
throw new Error('empty boot id');
|
|
71
|
+
return { pgid: pgrp, token: `linux:${bootId}:${starttime}` };
|
|
72
|
+
},
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
/** Parse the output of `ps -o pgid=,lstart= -p <pid>`. */
|
|
76
|
+
export function parsePsOutput(output) {
|
|
77
|
+
const line = output.split('\n').find((l) => l.trim() !== '');
|
|
78
|
+
if (!line)
|
|
79
|
+
return null;
|
|
80
|
+
const m = /^\s*(\d+)\s+(.+?)\s*$/.exec(line);
|
|
81
|
+
if (!m?.[1] || !m[2])
|
|
82
|
+
throw new Error(`unexpected ps output: ${line}`);
|
|
83
|
+
return { pgid: Number(m[1]), token: `darwin:${m[2].replace(/\s+/g, ' ')}` };
|
|
84
|
+
}
|
|
85
|
+
const defaultRunner = (file, args) => new Promise((resolve, reject) => {
|
|
86
|
+
execFile(file, args, { env: { PATH: '/bin:/usr/bin', LC_ALL: 'C', TZ: 'UTC' }, timeout: 5000 }, (err, stdout) => {
|
|
87
|
+
if (err && typeof err.code !== 'number') {
|
|
88
|
+
reject(err);
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
resolve({ code: err ? Number(err.code) : 0, stdout: String(stdout) });
|
|
92
|
+
});
|
|
93
|
+
});
|
|
94
|
+
/** macOS implementation based on `ps` (lstart = process start time). */
|
|
95
|
+
export function createDarwinInspector(run = defaultRunner) {
|
|
96
|
+
return {
|
|
97
|
+
platform: 'darwin',
|
|
98
|
+
async probe(pid) {
|
|
99
|
+
const { code, stdout } = await run('/bin/ps', ['-o', 'pgid=,lstart=', '-p', String(pid)]);
|
|
100
|
+
const probe = parsePsOutput(stdout);
|
|
101
|
+
if (code !== 0 || probe === null) {
|
|
102
|
+
// ps exits 1 with empty output when the PID does not exist.
|
|
103
|
+
if (stdout.trim() === '')
|
|
104
|
+
return null;
|
|
105
|
+
throw new Error(`ps exited with code ${code}`);
|
|
106
|
+
}
|
|
107
|
+
return probe;
|
|
108
|
+
},
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
/** Inspector for the current platform; probing fails on unsupported platforms. */
|
|
112
|
+
export function defaultProcessInspector(platform = process.platform) {
|
|
113
|
+
if (platform === 'linux')
|
|
114
|
+
return createLinuxInspector();
|
|
115
|
+
if (platform === 'darwin')
|
|
116
|
+
return createDarwinInspector();
|
|
117
|
+
return {
|
|
118
|
+
platform,
|
|
119
|
+
probe: () => Promise.reject(new Error(`process identity not supported on ${platform}`)),
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Capture the start identity of `pid`. Returns `undefined` if the process
|
|
124
|
+
* does not exist (anymore) or the identity cannot be determined.
|
|
125
|
+
*/
|
|
126
|
+
export async function getStartIdentity(pid, inspector = defaultProcessInspector()) {
|
|
127
|
+
if (!isValidPid(pid))
|
|
128
|
+
return undefined;
|
|
129
|
+
try {
|
|
130
|
+
const probe = await inspector.probe(pid);
|
|
131
|
+
return probe ? { pid, pgid: probe.pgid, token: probe.token } : undefined;
|
|
132
|
+
}
|
|
133
|
+
catch {
|
|
134
|
+
return undefined;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
/** Compare the live process `identity.pid` with the persisted identity. */
|
|
138
|
+
export async function checkProcessIdentity(identity, inspector = defaultProcessInspector()) {
|
|
139
|
+
if (!isValidPid(identity.pid) || !isValidPid(identity.pgid) || !identity.token)
|
|
140
|
+
return 'unknown';
|
|
141
|
+
let probe;
|
|
142
|
+
try {
|
|
143
|
+
probe = await inspector.probe(identity.pid);
|
|
144
|
+
}
|
|
145
|
+
catch {
|
|
146
|
+
return 'unknown';
|
|
147
|
+
}
|
|
148
|
+
if (probe === null)
|
|
149
|
+
return 'gone';
|
|
150
|
+
if (probe.token !== identity.token)
|
|
151
|
+
return 'different';
|
|
152
|
+
// Same process but it moved to another group: group target is uncertain.
|
|
153
|
+
if (probe.pgid !== identity.pgid)
|
|
154
|
+
return 'unknown';
|
|
155
|
+
return 'same';
|
|
156
|
+
}
|
|
157
|
+
/** True only if `pid` is verifiably the process described by `identity`. */
|
|
158
|
+
export async function isSameProcess(pid, identity, inspector = defaultProcessInspector()) {
|
|
159
|
+
if (pid !== identity.pid)
|
|
160
|
+
return false;
|
|
161
|
+
return (await checkProcessIdentity(identity, inspector)) === 'same';
|
|
162
|
+
}
|
|
163
|
+
const defaultKill = (pid, signal) => {
|
|
164
|
+
process.kill(pid, signal);
|
|
165
|
+
};
|
|
166
|
+
/**
|
|
167
|
+
* Send `signal` to process group `pgid`, but only if its leader
|
|
168
|
+
* (`identity.pid`) is verifiably the same process as recorded in `identity`
|
|
169
|
+
* (Spec §13). Never signals on doubt.
|
|
170
|
+
*
|
|
171
|
+
* Note: if the leader is gone while other group members still run, the group
|
|
172
|
+
* cannot be verified and is not signalled (reason `gone`); use
|
|
173
|
+
* {@link processGroupExists} to detect that case and report it.
|
|
174
|
+
*/
|
|
175
|
+
export async function killProcessGroupIfSame(pgid, identity, signal, deps = {}) {
|
|
176
|
+
if (!isValidPid(pgid) || pgid !== identity.pgid)
|
|
177
|
+
return { signalled: false, reason: 'pgid_mismatch' };
|
|
178
|
+
const check = await checkProcessIdentity(identity, deps.inspector ?? defaultProcessInspector());
|
|
179
|
+
if (check !== 'same')
|
|
180
|
+
return { signalled: false, reason: check };
|
|
181
|
+
try {
|
|
182
|
+
(deps.kill ?? defaultKill)(-pgid, signal);
|
|
183
|
+
return { signalled: true };
|
|
184
|
+
}
|
|
185
|
+
catch (err) {
|
|
186
|
+
const code = err.code;
|
|
187
|
+
if (code === 'ESRCH')
|
|
188
|
+
return { signalled: false, reason: 'gone' };
|
|
189
|
+
return { signalled: false, reason: 'signal_failed', error: err.message };
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
/** True if at least one process is in group `pgid` (signal 0 probe; EPERM counts as existing). */
|
|
193
|
+
export function processGroupExists(pgid) {
|
|
194
|
+
if (!isValidPid(pgid))
|
|
195
|
+
return false;
|
|
196
|
+
try {
|
|
197
|
+
process.kill(-pgid, 0);
|
|
198
|
+
return true;
|
|
199
|
+
}
|
|
200
|
+
catch (err) {
|
|
201
|
+
return err.code === 'EPERM';
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* True if group `pgid` still has live (non-zombie) members. Falls back to the
|
|
206
|
+
* signal-0 probe if the platform has no precise check or it fails.
|
|
207
|
+
*/
|
|
208
|
+
export async function processGroupAlive(pgid, inspector = defaultProcessInspector()) {
|
|
209
|
+
if (!processGroupExists(pgid))
|
|
210
|
+
return false;
|
|
211
|
+
if (!inspector.groupHasLiveMembers)
|
|
212
|
+
return true;
|
|
213
|
+
try {
|
|
214
|
+
return await inspector.groupHasLiveMembers(pgid);
|
|
215
|
+
}
|
|
216
|
+
catch {
|
|
217
|
+
return true;
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* Recovery helper (Spec §13, §14 variant A): verify the start identity of the
|
|
222
|
+
* group leader, then SIGTERM the group, SIGKILL after `graceMs` and confirm
|
|
223
|
+
* that no live member remains. Never signals on doubt.
|
|
224
|
+
*/
|
|
225
|
+
export async function terminateProcessGroupIfSame(identity, graceMs, options = {}) {
|
|
226
|
+
const inspector = options.inspector ?? defaultProcessInspector();
|
|
227
|
+
const kill = options.kill ?? defaultKill;
|
|
228
|
+
const timers = options.timers ?? systemTimers;
|
|
229
|
+
const pgid = identity.pgid;
|
|
230
|
+
if (!isValidPid(pgid) || !isValidPid(identity.pid))
|
|
231
|
+
return 'unknown';
|
|
232
|
+
const check = await checkProcessIdentity(identity, inspector);
|
|
233
|
+
switch (check) {
|
|
234
|
+
case 'different':
|
|
235
|
+
return 'not_same';
|
|
236
|
+
case 'unknown':
|
|
237
|
+
return 'unknown';
|
|
238
|
+
case 'gone':
|
|
239
|
+
return (await processGroupAlive(pgid, inspector)) ? 'group_alive_unverifiable' : 'gone';
|
|
240
|
+
case 'same':
|
|
241
|
+
break;
|
|
242
|
+
}
|
|
243
|
+
const send = (signal) => {
|
|
244
|
+
try {
|
|
245
|
+
kill(-pgid, signal);
|
|
246
|
+
}
|
|
247
|
+
catch (err) {
|
|
248
|
+
if (err.code !== 'ESRCH')
|
|
249
|
+
throw err;
|
|
250
|
+
}
|
|
251
|
+
};
|
|
252
|
+
const waitGone = async (ms) => {
|
|
253
|
+
const step = Math.max(1, options.pollIntervalMs ?? 25);
|
|
254
|
+
for (let waited = 0;; waited += step) {
|
|
255
|
+
if (!(await processGroupAlive(pgid, inspector)))
|
|
256
|
+
return true;
|
|
257
|
+
if (waited >= ms)
|
|
258
|
+
return false;
|
|
259
|
+
await new Promise((resolve) => timers.setTimeout(resolve, Math.min(step, ms - waited)));
|
|
260
|
+
}
|
|
261
|
+
};
|
|
262
|
+
try {
|
|
263
|
+
send('SIGTERM');
|
|
264
|
+
}
|
|
265
|
+
catch {
|
|
266
|
+
return 'kill_failed';
|
|
267
|
+
}
|
|
268
|
+
if (await waitGone(graceMs))
|
|
269
|
+
return 'terminated';
|
|
270
|
+
// The group existed continuously since verification, so its PGID cannot have been reused.
|
|
271
|
+
try {
|
|
272
|
+
send('SIGKILL');
|
|
273
|
+
}
|
|
274
|
+
catch {
|
|
275
|
+
return 'kill_failed';
|
|
276
|
+
}
|
|
277
|
+
return (await waitGone(options.killConfirmMs ?? 5000)) ? 'terminated' : 'kill_failed';
|
|
278
|
+
}
|
|
279
|
+
function isValidPid(pid) {
|
|
280
|
+
// pid 0/1 and negative values would address the own group, init or all processes.
|
|
281
|
+
return Number.isInteger(pid) && pid > 1;
|
|
282
|
+
}
|
|
283
|
+
//# sourceMappingURL=process-identity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"process-identity.js","sourceRoot":"","sources":["../../src/executors/process-identity.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { type Clock, type ExecutionSpec, type Executor, type Logger, type RunningProcess, type Timers } from '../core/index.js';
|
|
2
|
+
import { type KillFn, type ProcessInspector } from './process-identity.js';
|
|
3
|
+
/** Dependencies and tuning of the {@link ShellExecutor}. */
|
|
4
|
+
export interface ShellExecutorOptions {
|
|
5
|
+
clock?: Clock;
|
|
6
|
+
/** Timers for timeouts and polling (default: real timers). */
|
|
7
|
+
timers?: Timers;
|
|
8
|
+
logger?: Logger;
|
|
9
|
+
/** Environment the minimal worker env is picked from (default `process.env`). */
|
|
10
|
+
baseEnv?: NodeJS.ProcessEnv;
|
|
11
|
+
/** Platform adapter for start identities (default: current platform). */
|
|
12
|
+
inspector?: ProcessInspector;
|
|
13
|
+
/** Signal sender for process groups (default `process.kill`; injectable for tests). */
|
|
14
|
+
kill?: KillFn;
|
|
15
|
+
/** How long to wait for the group to vanish after SIGKILL before reporting `kill_failed`. Default 5 s. */
|
|
16
|
+
killConfirmMs?: number;
|
|
17
|
+
/** After the leader exited: max wait for stdout/stderr to close before they are destroyed. Default 2 s. */
|
|
18
|
+
stdioDrainMs?: number;
|
|
19
|
+
/** Poll interval while waiting for a process group to vanish. Default 25 ms. */
|
|
20
|
+
pollIntervalMs?: number;
|
|
21
|
+
/**
|
|
22
|
+
* `workspace.base_dir`: if set, the working directory must lie strictly
|
|
23
|
+
* below it (never the base itself); it is created segment by segment with a
|
|
24
|
+
* real-path check per segment (see `ensureWorkspaceWithin`), so symlinks
|
|
25
|
+
* cannot redirect creation outside. Violations end the run with `start_error`.
|
|
26
|
+
*/
|
|
27
|
+
workspaceBaseDir?: string;
|
|
28
|
+
}
|
|
29
|
+
/** Executor for local shell workers (V1). */
|
|
30
|
+
export declare class ShellExecutor implements Executor {
|
|
31
|
+
readonly type = "shell";
|
|
32
|
+
private readonly deps;
|
|
33
|
+
constructor(options?: ShellExecutorOptions);
|
|
34
|
+
start(spec: ExecutionSpec): Promise<RunningProcess>;
|
|
35
|
+
}
|