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,186 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Control commands against a running instance over HTTP (Spec §14, §19):
|
|
3
|
+
* `status`, `pause`, `resume`, `drain`, `cancel-all`, `config reload`.
|
|
4
|
+
*
|
|
5
|
+
* Exit codes: 0 = ok, 1 = API error (e.g. reload rejected), 2 = usage error,
|
|
6
|
+
* 3 = instance not reachable, 4 = `--wait` timed out.
|
|
7
|
+
*/
|
|
8
|
+
import { errorMessage, parseDuration } from '../core/index.js';
|
|
9
|
+
import { formatConfigIssue } from '../config/index.js';
|
|
10
|
+
import { ApiClient, ApiResponseError, ApiUnreachableError, EXIT_UNREACHABLE, resolveBaseUrl } from './http-client.js';
|
|
11
|
+
/** Exit code when `--wait` timed out. */
|
|
12
|
+
export const EXIT_WAIT_TIMEOUT = 4;
|
|
13
|
+
async function client(opts, io, deps) {
|
|
14
|
+
try {
|
|
15
|
+
const { url, note } = await resolveBaseUrl(opts);
|
|
16
|
+
if (note)
|
|
17
|
+
io.stderr(`note: ${note}\n`);
|
|
18
|
+
return new ApiClient(url, deps.fetch ? { fetch: deps.fetch } : {});
|
|
19
|
+
}
|
|
20
|
+
catch (err) {
|
|
21
|
+
io.stderr(`${errorMessage(err)}\n`);
|
|
22
|
+
return 2;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
function reportError(name, err, io) {
|
|
26
|
+
if (err instanceof ApiUnreachableError) {
|
|
27
|
+
io.stderr(`${name}: ${err.message}\n`);
|
|
28
|
+
return EXIT_UNREACHABLE;
|
|
29
|
+
}
|
|
30
|
+
if (err instanceof ApiResponseError) {
|
|
31
|
+
io.stderr(`${name}: ${err.message} (HTTP ${err.status}, ${err.code})\n`);
|
|
32
|
+
return 1;
|
|
33
|
+
}
|
|
34
|
+
io.stderr(`${name}: ${errorMessage(err)}\n`);
|
|
35
|
+
return 1;
|
|
36
|
+
}
|
|
37
|
+
/** Text summary of `GET /api/v1/status`. */
|
|
38
|
+
export function formatStatus(s) {
|
|
39
|
+
const lines = [];
|
|
40
|
+
const sched = s?.scheduler ?? {};
|
|
41
|
+
const usage = s?.usage ?? {};
|
|
42
|
+
const limits = s?.limits ?? {};
|
|
43
|
+
lines.push(`adispatchd ${s?.version ?? '?'} – started ${s?.startedAt ?? '?'}`);
|
|
44
|
+
lines.push(`ready: ${s?.readiness?.ready ? 'yes' : 'no'}`);
|
|
45
|
+
lines.push(`scheduler: ${sched.state ?? '?'}${sched.pollingIntervalMs ? ` (polling every ${Math.round(sched.pollingIntervalMs / 1000)}s)` : ''}`);
|
|
46
|
+
lines.push(`runs: ${usage.activeRuns ?? 0} active / limit ${limits.maxConcurrent ?? '?'}` +
|
|
47
|
+
(limits.override !== null && limits.override !== undefined ? ` (override, configured ${limits.configuredMaxConcurrent})` : '') +
|
|
48
|
+
(usage.recoveryPending ? `, ${usage.recoveryPending} recovery pending` : ''));
|
|
49
|
+
const byWf = Object.entries((usage.byWorkflow ?? {})).filter(([, v]) => v.active > 0);
|
|
50
|
+
for (const [id, v] of byWf)
|
|
51
|
+
lines.push(` ${id}: ${v.active}/${v.max}`);
|
|
52
|
+
const counts = s?.counts ?? {};
|
|
53
|
+
const n = counts.notifications ?? {};
|
|
54
|
+
lines.push(`blocks: ${counts.activeBlocks ?? 0} active · failed actions: ${counts.failedActions ?? 0} · notifications failed: ${n.failed ?? 0}, pending: ${n.pending ?? 0}`);
|
|
55
|
+
if (s?.config)
|
|
56
|
+
lines.push(`config: version ${s.config.version}, hash ${String(s.config.hash ?? '').slice(0, 12)}, ${s.config.configDir}`);
|
|
57
|
+
if (s?.server)
|
|
58
|
+
lines.push(`server: ${s.server.host}:${s.server.port}${s.server.loopback ? '' : ' (NOT loopback – must be behind an authenticating proxy)'}`);
|
|
59
|
+
return `${lines.join('\n')}\n`;
|
|
60
|
+
}
|
|
61
|
+
/** `status`. */
|
|
62
|
+
export function createStatusHandler(io, deps = {}) {
|
|
63
|
+
return async (opts) => {
|
|
64
|
+
const api = await client(opts, io, deps);
|
|
65
|
+
if (typeof api === 'number')
|
|
66
|
+
return api;
|
|
67
|
+
try {
|
|
68
|
+
const { body } = await api.get('/api/v1/status');
|
|
69
|
+
io.stdout(opts.json ? `${JSON.stringify(body, null, 2)}\n` : formatStatus(body));
|
|
70
|
+
return 0;
|
|
71
|
+
}
|
|
72
|
+
catch (err) {
|
|
73
|
+
return reportError('status', err, io);
|
|
74
|
+
}
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
/** `pause` / `resume`. */
|
|
78
|
+
export function createSchedulerHandler(action, io, deps = {}) {
|
|
79
|
+
return async (opts) => {
|
|
80
|
+
const api = await client(opts, io, deps);
|
|
81
|
+
if (typeof api === 'number')
|
|
82
|
+
return api;
|
|
83
|
+
try {
|
|
84
|
+
const { body } = await api.post(`/api/v1/scheduler/${action}`);
|
|
85
|
+
io.stdout(opts.json
|
|
86
|
+
? `${JSON.stringify(body, null, 2)}\n`
|
|
87
|
+
: `${action === 'pause' ? 'automatic starts paused' : 'automatic starts resumed'} (scheduler: ${body?.scheduler?.state ?? '?'})\n`);
|
|
88
|
+
return 0;
|
|
89
|
+
}
|
|
90
|
+
catch (err) {
|
|
91
|
+
return reportError(action, err, io);
|
|
92
|
+
}
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
/** Wait until `/health` is no longer reachable. */
|
|
96
|
+
async function waitForStop(api, opts, io, deps) {
|
|
97
|
+
const sleep = deps.sleep ?? ((ms) => new Promise((r) => setTimeout(r, ms)));
|
|
98
|
+
const now = deps.now ?? Date.now;
|
|
99
|
+
let deadline = Number.POSITIVE_INFINITY;
|
|
100
|
+
if (opts.timeout) {
|
|
101
|
+
try {
|
|
102
|
+
deadline = now() + parseDuration(opts.timeout);
|
|
103
|
+
}
|
|
104
|
+
catch (err) {
|
|
105
|
+
io.stderr(`invalid --timeout: ${errorMessage(err)}\n`);
|
|
106
|
+
return 2;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
io.stdout('waiting for the instance to stop...\n');
|
|
110
|
+
while (await api.reachable()) {
|
|
111
|
+
if (now() >= deadline) {
|
|
112
|
+
io.stderr(`instance still running after ${opts.timeout} (runs are still active; it keeps stopping in the background)\n`);
|
|
113
|
+
return EXIT_WAIT_TIMEOUT;
|
|
114
|
+
}
|
|
115
|
+
await sleep(deps.pollIntervalMs ?? 500);
|
|
116
|
+
}
|
|
117
|
+
io.stdout('instance stopped\n');
|
|
118
|
+
return 0;
|
|
119
|
+
}
|
|
120
|
+
/** `drain` / `cancel-all`. */
|
|
121
|
+
export function createShutdownHandler(mode, io, deps = {}) {
|
|
122
|
+
return async (opts) => {
|
|
123
|
+
if (opts.timeout && !opts.wait) {
|
|
124
|
+
io.stderr('--timeout requires --wait\n');
|
|
125
|
+
return 2;
|
|
126
|
+
}
|
|
127
|
+
const api = await client(opts, io, deps);
|
|
128
|
+
if (typeof api === 'number')
|
|
129
|
+
return api;
|
|
130
|
+
try {
|
|
131
|
+
const { body } = await api.post(`/api/v1/shutdown/${mode}`, mode === 'cancel-all' && opts.reason ? { reason: opts.reason } : undefined);
|
|
132
|
+
if (opts.json)
|
|
133
|
+
io.stdout(`${JSON.stringify(body, null, 2)}\n`);
|
|
134
|
+
else {
|
|
135
|
+
const active = Array.isArray(body?.activeRuns) ? body.activeRuns : [];
|
|
136
|
+
io.stdout(mode === 'drain'
|
|
137
|
+
? `drain started: no new runs; waiting for ${active.length} active run(s), then the instance stops\n`
|
|
138
|
+
: `cancel-all started: cancelling ${active.length} active run(s) (on_cancel runs), then the instance stops\n`);
|
|
139
|
+
for (const id of active)
|
|
140
|
+
io.stdout(` ${id}\n`);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
catch (err) {
|
|
144
|
+
return reportError(mode, err, io);
|
|
145
|
+
}
|
|
146
|
+
return opts.wait ? waitForStop(api, opts, io, deps) : 0;
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
function issueList(issues) {
|
|
150
|
+
return (issues ?? []).map((i) => ` ${formatConfigIssue(i)}\n`).join('');
|
|
151
|
+
}
|
|
152
|
+
/** `config reload`. */
|
|
153
|
+
export function createConfigReloadHandler(io, deps = {}) {
|
|
154
|
+
return async (opts) => {
|
|
155
|
+
const api = await client(opts, io, deps);
|
|
156
|
+
if (typeof api === 'number')
|
|
157
|
+
return api;
|
|
158
|
+
try {
|
|
159
|
+
const { body } = await api.post('/api/v1/config/reload');
|
|
160
|
+
if (opts.json) {
|
|
161
|
+
io.stdout(`${JSON.stringify(body, null, 2)}\n`);
|
|
162
|
+
return 0;
|
|
163
|
+
}
|
|
164
|
+
if (Array.isArray(body?.warnings) && body.warnings.length > 0) {
|
|
165
|
+
io.stderr(`${body.warnings.length} warning(s):\n${issueList(body.warnings)}`);
|
|
166
|
+
}
|
|
167
|
+
io.stdout(body?.changed
|
|
168
|
+
? `configuration reloaded: version ${body.version}, hash ${String(body.hash).slice(0, 12)}` +
|
|
169
|
+
(Array.isArray(body.resetOverrides) && body.resetOverrides.length > 0 ? `, overrides reset: ${body.resetOverrides.join(', ')}` : '') +
|
|
170
|
+
'\n'
|
|
171
|
+
: `configuration unchanged (version ${body?.version}, hash ${String(body?.hash ?? '').slice(0, 12)})\n`);
|
|
172
|
+
return 0;
|
|
173
|
+
}
|
|
174
|
+
catch (err) {
|
|
175
|
+
if (err instanceof ApiResponseError && err.code === 'config_invalid') {
|
|
176
|
+
const details = (err.details ?? {});
|
|
177
|
+
if (opts.json)
|
|
178
|
+
io.stdout(`${JSON.stringify({ error: { code: err.code, message: err.message, details: err.details } }, null, 2)}\n`);
|
|
179
|
+
io.stderr(`config reload rejected – the active configuration was kept:\n${issueList(details.errors)}`);
|
|
180
|
+
return 1;
|
|
181
|
+
}
|
|
182
|
+
return reportError('config reload', err, io);
|
|
183
|
+
}
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
//# sourceMappingURL=control.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"control.js","sourceRoot":"","sources":["../../src/cli/control.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { type FetchLike } from '../core/index.js';
|
|
2
|
+
/** Default base URL (Spec §5.1 defaults). */
|
|
3
|
+
export declare const DEFAULT_API_URL = "http://127.0.0.1:8787";
|
|
4
|
+
/** CSRF header required by the API for mutating requests. */
|
|
5
|
+
export declare const CSRF_HEADER_NAME = "x-adispatch-request";
|
|
6
|
+
/** Exit code when no instance is reachable. */
|
|
7
|
+
export declare const EXIT_UNREACHABLE = 3;
|
|
8
|
+
/** The instance could not be reached (connection refused, DNS, timeout). */
|
|
9
|
+
export declare class ApiUnreachableError extends Error {
|
|
10
|
+
readonly baseUrl: string;
|
|
11
|
+
constructor(baseUrl: string, cause: unknown);
|
|
12
|
+
}
|
|
13
|
+
/** An API error response (`{error: {code, message, details}}`). */
|
|
14
|
+
export declare class ApiResponseError extends Error {
|
|
15
|
+
readonly status: number;
|
|
16
|
+
readonly code: string;
|
|
17
|
+
readonly details: unknown;
|
|
18
|
+
constructor(status: number, code: string, message: string, details: unknown);
|
|
19
|
+
}
|
|
20
|
+
/** Build a URL for a bind host/port, mapping wildcard binds to loopback. */
|
|
21
|
+
export declare function urlForBind(host: string, port: number): string;
|
|
22
|
+
/**
|
|
23
|
+
* Resolve the base URL: explicit `--url` → `config.yaml` of `--config-dir`
|
|
24
|
+
* (host/port are read even if other files are invalid is not guaranteed; on a
|
|
25
|
+
* load error the default is used and a note returned) → default.
|
|
26
|
+
*/
|
|
27
|
+
export declare function resolveBaseUrl(opts: {
|
|
28
|
+
url?: string;
|
|
29
|
+
configDir?: string;
|
|
30
|
+
dataDir?: string;
|
|
31
|
+
}): Promise<{
|
|
32
|
+
url: string;
|
|
33
|
+
note?: string;
|
|
34
|
+
}>;
|
|
35
|
+
/** JSON response of the API. */
|
|
36
|
+
export interface ApiResponse<T = any> {
|
|
37
|
+
status: number;
|
|
38
|
+
body: T;
|
|
39
|
+
}
|
|
40
|
+
/** Small API client. */
|
|
41
|
+
export declare class ApiClient {
|
|
42
|
+
readonly baseUrl: string;
|
|
43
|
+
private readonly fetchFn;
|
|
44
|
+
constructor(baseUrl: string, options?: {
|
|
45
|
+
fetch?: FetchLike;
|
|
46
|
+
timeoutMs?: number;
|
|
47
|
+
});
|
|
48
|
+
private readonly timeoutMs;
|
|
49
|
+
/** GET a JSON resource; non-2xx → {@link ApiResponseError}. */
|
|
50
|
+
get<T = any>(p: string): Promise<ApiResponse<T>>;
|
|
51
|
+
/** POST JSON (CSRF header set); non-2xx → {@link ApiResponseError}. */
|
|
52
|
+
post<T = any>(p: string, body?: unknown): Promise<ApiResponse<T>>;
|
|
53
|
+
/** True if `/health` answers (any HTTP status), false if unreachable. */
|
|
54
|
+
reachable(): Promise<boolean>;
|
|
55
|
+
request<T>(method: string, p: string, body?: unknown): Promise<ApiResponse<T>>;
|
|
56
|
+
private raw;
|
|
57
|
+
}
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Minimal HTTP client for the CLI control commands (`status`, `pause`,
|
|
3
|
+
* `resume`, `drain`, `cancel-all`, `config reload`, `workflow dry-run`)
|
|
4
|
+
* against a running instance (docs/api.md).
|
|
5
|
+
*
|
|
6
|
+
* - Base URL: `--url`, else `server.host`/`server.port` from `config.yaml` of
|
|
7
|
+
* `--config-dir`, else `http://127.0.0.1:8787`. Wildcard binds
|
|
8
|
+
* (`0.0.0.0`, `::`) are reached via loopback so the `Host` header is on the
|
|
9
|
+
* server's allowlist.
|
|
10
|
+
* - Mutating requests carry the CSRF header `X-Adispatch-Request: 1` and a
|
|
11
|
+
* JSON body (never form data); no `Origin` is sent.
|
|
12
|
+
*/
|
|
13
|
+
import { accessSync, constants } from 'node:fs';
|
|
14
|
+
import path from 'node:path';
|
|
15
|
+
import { errorMessage } from '../core/index.js';
|
|
16
|
+
import { loadConfig } from '../config/index.js';
|
|
17
|
+
/** Default base URL (Spec §5.1 defaults). */
|
|
18
|
+
export const DEFAULT_API_URL = 'http://127.0.0.1:8787';
|
|
19
|
+
/** CSRF header required by the API for mutating requests. */
|
|
20
|
+
export const CSRF_HEADER_NAME = 'x-adispatch-request';
|
|
21
|
+
/** Exit code when no instance is reachable. */
|
|
22
|
+
export const EXIT_UNREACHABLE = 3;
|
|
23
|
+
/** The instance could not be reached (connection refused, DNS, timeout). */
|
|
24
|
+
export class ApiUnreachableError extends Error {
|
|
25
|
+
baseUrl;
|
|
26
|
+
constructor(baseUrl, cause) {
|
|
27
|
+
super(`cannot reach the orchestrator at ${baseUrl} (${errorMessage(cause)}) – is it running? Use --url or --config-dir`);
|
|
28
|
+
this.baseUrl = baseUrl;
|
|
29
|
+
this.name = 'ApiUnreachableError';
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
/** An API error response (`{error: {code, message, details}}`). */
|
|
33
|
+
export class ApiResponseError extends Error {
|
|
34
|
+
status;
|
|
35
|
+
code;
|
|
36
|
+
details;
|
|
37
|
+
constructor(status, code, message, details) {
|
|
38
|
+
super(message);
|
|
39
|
+
this.status = status;
|
|
40
|
+
this.code = code;
|
|
41
|
+
this.details = details;
|
|
42
|
+
this.name = 'ApiResponseError';
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
/** Build a URL for a bind host/port, mapping wildcard binds to loopback. */
|
|
46
|
+
export function urlForBind(host, port) {
|
|
47
|
+
let h = host.replace(/^\[|\]$/g, '');
|
|
48
|
+
if (h === '0.0.0.0' || h === '')
|
|
49
|
+
h = '127.0.0.1';
|
|
50
|
+
else if (h === '::' || h === '::0')
|
|
51
|
+
h = '::1';
|
|
52
|
+
return `http://${h.includes(':') ? `[${h}]` : h}:${port}`;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Resolve the base URL: explicit `--url` → `config.yaml` of `--config-dir`
|
|
56
|
+
* (host/port are read even if other files are invalid is not guaranteed; on a
|
|
57
|
+
* load error the default is used and a note returned) → default.
|
|
58
|
+
*/
|
|
59
|
+
export async function resolveBaseUrl(opts) {
|
|
60
|
+
if (opts.url) {
|
|
61
|
+
let parsed;
|
|
62
|
+
try {
|
|
63
|
+
parsed = new URL(opts.url);
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
// The raw value may contain credentials – never echo it.
|
|
67
|
+
throw new Error('invalid --url (expected http(s)://host:port)');
|
|
68
|
+
}
|
|
69
|
+
if (parsed.username || parsed.password) {
|
|
70
|
+
throw new Error('invalid --url: credentials in the URL (user:password@) are not supported – proxy authentication is not implemented; ' +
|
|
71
|
+
'use the local URL (e.g. http://127.0.0.1:8787) on the host itself');
|
|
72
|
+
}
|
|
73
|
+
if (parsed.protocol !== 'http:' && parsed.protocol !== 'https:')
|
|
74
|
+
throw new Error(`invalid --url "${parsed.origin}" (http/https only)`);
|
|
75
|
+
return { url: opts.url.replace(/\/+$/, '') };
|
|
76
|
+
}
|
|
77
|
+
if (opts.configDir) {
|
|
78
|
+
const configDir = path.resolve(opts.configDir);
|
|
79
|
+
const configFile = path.join(configDir, 'config.yaml');
|
|
80
|
+
try {
|
|
81
|
+
accessSync(configFile, constants.R_OK);
|
|
82
|
+
}
|
|
83
|
+
catch (err) {
|
|
84
|
+
const code = err.code;
|
|
85
|
+
if (code === 'EACCES' || code === 'EPERM') {
|
|
86
|
+
return { url: DEFAULT_API_URL, note: `${configFile} is not readable (permission denied); using ${DEFAULT_API_URL} – pass --url instead of --config-dir` };
|
|
87
|
+
}
|
|
88
|
+
// Missing config.yaml: defaults apply (server 127.0.0.1:8787) – fall through to the loader.
|
|
89
|
+
}
|
|
90
|
+
const loaded = await loadConfig(configDir, { dataDir: path.resolve(opts.dataDir ?? 'data') });
|
|
91
|
+
if (loaded.ok) {
|
|
92
|
+
const { host, port } = loaded.config.global.server;
|
|
93
|
+
return { url: urlForBind(host, port) };
|
|
94
|
+
}
|
|
95
|
+
const unreadable = loaded.errors.some((e) => /EACCES|EPERM|permission denied/i.test(e.message));
|
|
96
|
+
return {
|
|
97
|
+
url: DEFAULT_API_URL,
|
|
98
|
+
note: unreadable
|
|
99
|
+
? `configuration in ${configDir} is not readable (permission denied); using ${DEFAULT_API_URL} – pass --url instead of --config-dir`
|
|
100
|
+
: `configuration in ${configDir} is invalid; using ${DEFAULT_API_URL}`,
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
return { url: DEFAULT_API_URL };
|
|
104
|
+
}
|
|
105
|
+
/** Small API client. */
|
|
106
|
+
export class ApiClient {
|
|
107
|
+
baseUrl;
|
|
108
|
+
fetchFn;
|
|
109
|
+
constructor(baseUrl, options = {}) {
|
|
110
|
+
this.baseUrl = baseUrl;
|
|
111
|
+
this.fetchFn = options.fetch ?? ((input, init) => fetch(input, init));
|
|
112
|
+
this.timeoutMs = options.timeoutMs ?? 30_000;
|
|
113
|
+
}
|
|
114
|
+
timeoutMs;
|
|
115
|
+
/** GET a JSON resource; non-2xx → {@link ApiResponseError}. */
|
|
116
|
+
get(p) {
|
|
117
|
+
return this.request('GET', p);
|
|
118
|
+
}
|
|
119
|
+
/** POST JSON (CSRF header set); non-2xx → {@link ApiResponseError}. */
|
|
120
|
+
post(p, body) {
|
|
121
|
+
return this.request('POST', p, body);
|
|
122
|
+
}
|
|
123
|
+
/** True if `/health` answers (any HTTP status), false if unreachable. */
|
|
124
|
+
async reachable() {
|
|
125
|
+
try {
|
|
126
|
+
await this.raw('GET', '/health');
|
|
127
|
+
return true;
|
|
128
|
+
}
|
|
129
|
+
catch (err) {
|
|
130
|
+
if (err instanceof ApiUnreachableError)
|
|
131
|
+
return false;
|
|
132
|
+
throw err;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
async request(method, p, body) {
|
|
136
|
+
const res = await this.raw(method, p, body);
|
|
137
|
+
const text = await res.text();
|
|
138
|
+
let json = null;
|
|
139
|
+
if (text.length > 0) {
|
|
140
|
+
try {
|
|
141
|
+
json = JSON.parse(text);
|
|
142
|
+
}
|
|
143
|
+
catch {
|
|
144
|
+
throw new ApiResponseError(res.status, 'invalid_response', `unexpected non-JSON response (HTTP ${res.status}) from ${this.baseUrl}${p}`, null);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
if (res.status < 200 || res.status >= 300) {
|
|
148
|
+
const e = json?.error;
|
|
149
|
+
throw new ApiResponseError(res.status, typeof e?.code === 'string' ? e.code : `http_${res.status}`, typeof e?.message === 'string' ? e.message : `HTTP ${res.status}`, e?.details ?? null);
|
|
150
|
+
}
|
|
151
|
+
return { status: res.status, body: json };
|
|
152
|
+
}
|
|
153
|
+
async raw(method, p, body) {
|
|
154
|
+
const headers = { accept: 'application/json' };
|
|
155
|
+
const mutating = method !== 'GET' && method !== 'HEAD';
|
|
156
|
+
if (mutating)
|
|
157
|
+
headers[CSRF_HEADER_NAME] = '1';
|
|
158
|
+
if (body !== undefined)
|
|
159
|
+
headers['content-type'] = 'application/json';
|
|
160
|
+
const signal = AbortSignal.timeout(this.timeoutMs);
|
|
161
|
+
try {
|
|
162
|
+
return await this.fetchFn(`${this.baseUrl}${p}`, {
|
|
163
|
+
method,
|
|
164
|
+
headers,
|
|
165
|
+
...(body !== undefined ? { body: JSON.stringify(body) } : {}),
|
|
166
|
+
signal,
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
catch (err) {
|
|
170
|
+
throw new ApiUnreachableError(this.baseUrl, err.cause ?? err);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
//# sourceMappingURL=http-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http-client.js","sourceRoot":"","sources":["../../src/cli/http-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Component `cli` – public API (commands of the `adispatch` binary).
|
|
3
|
+
*/
|
|
4
|
+
export { createProgram, EXIT_NOT_IMPLEMENTED } from './program.js';
|
|
5
|
+
export type { CliHandlers, CliIo, ControlCliOptions, DryRunCliOptions, GlobalOptions, InitCliOptions, ServiceCliOptions, ShutdownCliOptions, StartCliOptions, } from './program.js';
|
|
6
|
+
export { processIo } from './program.js';
|
|
7
|
+
export { createConfigValidateHandler, EXIT_CONFIG_INVALID, EXIT_CONFIG_VALID } from './config-validate.js';
|
|
8
|
+
export { createWorkflowDryRunHandler, type WorkflowDryRunDeps } from './workflow-dry-run.js';
|
|
9
|
+
export { createStartHandler, parseStartFlags, type StartDeps } from './start.js';
|
|
10
|
+
export { createInitHandler, initDirectories, type InitResult } from './init.js';
|
|
11
|
+
export { initTemplates, DATA_DIR_LAYOUT, type TemplateFile } from './init-templates.js';
|
|
12
|
+
export { createConfigReloadHandler, createSchedulerHandler, createShutdownHandler, createStatusHandler, formatStatus, EXIT_WAIT_TIMEOUT, type ControlDeps, } from './control.js';
|
|
13
|
+
export { ApiClient, ApiResponseError, ApiUnreachableError, DEFAULT_API_URL, EXIT_UNREACHABLE, resolveBaseUrl, urlForBind, } from './http-client.js';
|
|
14
|
+
export { createServiceInstallHandler, createServiceStatusHandler, createServiceUninstallHandler, defaultEntryPath, unitOptionsFromCli, type ServiceDeps, } from './service.js';
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Component `cli` – public API (commands of the `adispatch` binary).
|
|
3
|
+
*/
|
|
4
|
+
export { createProgram, EXIT_NOT_IMPLEMENTED } from './program.js';
|
|
5
|
+
export { processIo } from './program.js';
|
|
6
|
+
export { createConfigValidateHandler, EXIT_CONFIG_INVALID, EXIT_CONFIG_VALID } from './config-validate.js';
|
|
7
|
+
export { createWorkflowDryRunHandler } from './workflow-dry-run.js';
|
|
8
|
+
export { createStartHandler, parseStartFlags } from './start.js';
|
|
9
|
+
export { createInitHandler, initDirectories } from './init.js';
|
|
10
|
+
export { initTemplates, DATA_DIR_LAYOUT } from './init-templates.js';
|
|
11
|
+
export { createConfigReloadHandler, createSchedulerHandler, createShutdownHandler, createStatusHandler, formatStatus, EXIT_WAIT_TIMEOUT, } from './control.js';
|
|
12
|
+
export { ApiClient, ApiResponseError, ApiUnreachableError, DEFAULT_API_URL, EXIT_UNREACHABLE, resolveBaseUrl, urlForBind, } from './http-client.js';
|
|
13
|
+
export { createServiceInstallHandler, createServiceStatusHandler, createServiceUninstallHandler, defaultEntryPath, unitOptionsFromCli, } from './service.js';
|
|
14
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAYnE,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,2BAA2B,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAC3G,OAAO,EAAE,2BAA2B,EAA2B,MAAM,uBAAuB,CAAC;AAC7F,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAkB,MAAM,YAAY,CAAC;AACjF,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAmB,MAAM,WAAW,CAAC;AAChF,OAAO,EAAE,aAAa,EAAE,eAAe,EAAqB,MAAM,qBAAqB,CAAC;AACxF,OAAO,EACL,yBAAyB,EACzB,sBAAsB,EACtB,qBAAqB,EACrB,mBAAmB,EACnB,YAAY,EACZ,iBAAiB,GAElB,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,SAAS,EACT,gBAAgB,EAChB,mBAAmB,EACnB,eAAe,EACf,gBAAgB,EAChB,cAAc,EACd,UAAU,GACX,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,2BAA2B,EAC3B,0BAA0B,EAC1B,6BAA6B,EAC7B,gBAAgB,EAChB,kBAAkB,GAEnB,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Files created by `init` (Spec §4): a commented, valid example configuration
|
|
3
|
+
* that starts without any GitHub credentials. Only the manual `hello`
|
|
4
|
+
* workflow is enabled; the GitHub coder workflow and the nightly schedule are
|
|
5
|
+
* disabled examples to copy from. Kept as code (not as package files) so the
|
|
6
|
+
* installed package needs no asset lookup.
|
|
7
|
+
*/
|
|
8
|
+
/** A file to create, relative to config-dir. */
|
|
9
|
+
export interface TemplateFile {
|
|
10
|
+
path: string;
|
|
11
|
+
content: string;
|
|
12
|
+
/** File mode (scripts are executable). */
|
|
13
|
+
mode: number;
|
|
14
|
+
}
|
|
15
|
+
/** All files created by `init`, relative to config-dir. */
|
|
16
|
+
export declare function initTemplates(options?: {
|
|
17
|
+
port?: number;
|
|
18
|
+
}): TemplateFile[];
|
|
19
|
+
/** Directories created in data-dir (Spec §4); the app creates missing ones itself as well. */
|
|
20
|
+
export declare const DATA_DIR_LAYOUT: readonly ['logs', 'runs', 'workspaces', 'backups'];
|