@usine/server 0.2.1 → 0.4.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 +661 -21
- package/README.md +54 -20
- package/dist/backend.d.ts +26 -5
- package/dist/backend.d.ts.map +1 -1
- package/dist/backend.js +41 -16
- package/dist/backend.js.map +1 -1
- package/dist/backup.d.ts +6 -3
- package/dist/backup.d.ts.map +1 -1
- package/dist/backup.js +26 -8
- package/dist/backup.js.map +1 -1
- package/dist/cli.d.ts +77 -11
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +280 -31
- package/dist/cli.js.map +1 -1
- package/dist/command.d.ts +22 -0
- package/dist/command.d.ts.map +1 -0
- package/dist/command.js +51 -0
- package/dist/command.js.map +1 -0
- package/dist/detach.d.ts +83 -0
- package/dist/detach.d.ts.map +1 -0
- package/dist/detach.js +320 -0
- package/dist/detach.js.map +1 -0
- package/dist/export-run.d.ts +1 -1
- package/dist/export-run.d.ts.map +1 -1
- package/dist/export-run.js +3 -3
- package/dist/export-run.js.map +1 -1
- package/dist/failure-message.d.ts +19 -0
- package/dist/failure-message.d.ts.map +1 -0
- package/dist/failure-message.js +127 -0
- package/dist/failure-message.js.map +1 -0
- package/dist/http.d.ts +14 -5
- package/dist/http.d.ts.map +1 -1
- package/dist/http.js +86 -33
- package/dist/http.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/instance/environment.d.ts +17 -0
- package/dist/instance/environment.d.ts.map +1 -0
- package/dist/instance/environment.js +51 -0
- package/dist/instance/environment.js.map +1 -0
- package/dist/instance/id.d.ts +17 -0
- package/dist/instance/id.d.ts.map +1 -0
- package/dist/instance/id.js +35 -0
- package/dist/instance/id.js.map +1 -0
- package/dist/instance/lock.d.ts +27 -0
- package/dist/instance/lock.d.ts.map +1 -0
- package/dist/instance/lock.js +127 -0
- package/dist/instance/lock.js.map +1 -0
- package/dist/instance/manifest.d.ts +52 -0
- package/dist/instance/manifest.d.ts.map +1 -0
- package/dist/instance/manifest.js +131 -0
- package/dist/instance/manifest.js.map +1 -0
- package/dist/instance/operator-api.d.ts +30 -0
- package/dist/instance/operator-api.d.ts.map +1 -0
- package/dist/instance/operator-api.js +47 -0
- package/dist/instance/operator-api.js.map +1 -0
- package/dist/instance/ports.d.ts +23 -0
- package/dist/instance/ports.d.ts.map +1 -0
- package/dist/instance/ports.js +81 -0
- package/dist/instance/ports.js.map +1 -0
- package/dist/instance/record.d.ts +82 -0
- package/dist/instance/record.d.ts.map +1 -0
- package/dist/instance/record.js +116 -0
- package/dist/instance/record.js.map +1 -0
- package/dist/instance/state.d.ts +45 -0
- package/dist/instance/state.d.ts.map +1 -0
- package/dist/instance/state.js +79 -0
- package/dist/instance/state.js.map +1 -0
- package/dist/instance/systemd.d.ts +36 -0
- package/dist/instance/systemd.d.ts.map +1 -0
- package/dist/instance/systemd.js +61 -0
- package/dist/instance/systemd.js.map +1 -0
- package/dist/logger.d.ts +3 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +27 -0
- package/dist/logger.js.map +1 -0
- package/dist/main.js +38 -18
- package/dist/main.js.map +1 -1
- package/dist/registry.d.ts +20 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +37 -0
- package/dist/registry.js.map +1 -0
- package/dist/reload-signal.d.ts +8 -0
- package/dist/reload-signal.d.ts.map +1 -0
- package/dist/reload-signal.js +21 -0
- package/dist/reload-signal.js.map +1 -0
- package/dist/restart.d.ts +19 -0
- package/dist/restart.d.ts.map +1 -0
- package/dist/restart.js +105 -0
- package/dist/restart.js.map +1 -0
- package/dist/shutdown.d.ts +5 -2
- package/dist/shutdown.d.ts.map +1 -1
- package/dist/shutdown.js +11 -5
- package/dist/shutdown.js.map +1 -1
- package/dist/status.d.ts +12 -0
- package/dist/status.d.ts.map +1 -0
- package/dist/status.js +99 -0
- package/dist/status.js.map +1 -0
- package/dist/stop.d.ts +81 -0
- package/dist/stop.d.ts.map +1 -0
- package/dist/stop.js +195 -0
- package/dist/stop.js.map +1 -0
- package/dist/system-sleep.d.ts +9 -0
- package/dist/system-sleep.d.ts.map +1 -0
- package/dist/system-sleep.js +42 -0
- package/dist/system-sleep.js.map +1 -0
- package/dist/tracing.d.ts +22 -0
- package/dist/tracing.d.ts.map +1 -0
- package/dist/tracing.js +61 -0
- package/dist/tracing.js.map +1 -0
- package/dist/up.d.ts +2 -2
- package/dist/up.d.ts.map +1 -1
- package/dist/up.js +62 -24
- package/dist/up.js.map +1 -1
- package/dist/upgrade.d.ts +58 -0
- package/dist/upgrade.d.ts.map +1 -0
- package/dist/upgrade.js +237 -0
- package/dist/upgrade.js.map +1 -0
- package/dist/web/assets/CompositeItem-DU6IyNMY.js +1 -0
- package/dist/web/assets/ToolbarRootContext-Cytu6o2e.js +1 -0
- package/dist/web/assets/X.es-B7iqdxa_.js +1 -0
- package/dist/web/assets/_agent-BVKD5odk.js +1 -0
- package/dist/web/assets/_loop-BFLzamuo.js +1 -0
- package/dist/web/assets/_name-Bh4AQ9sR.js +6 -0
- package/dist/web/assets/_name-CMVsmWzq.js +1 -0
- package/dist/web/assets/_name-DCkgEma_.js +1 -0
- package/dist/web/assets/_name-Ds_pWi15.js +1 -0
- package/dist/web/assets/_number-B9aYwvcQ.js +1 -0
- package/dist/web/assets/_run-BZWt47QS.js +8 -0
- package/dist/web/assets/_worker-Dgfufm5p.js +1 -0
- package/dist/web/assets/action-rCd1FeAz.js +1 -0
- package/dist/web/assets/agents-Drbg6qpH.js +1 -0
- package/dist/web/assets/agents-_6-dEjrY.js +1 -0
- package/dist/web/assets/button-DVWXde__.js +1 -0
- package/dist/web/assets/collapsible-IOhZV1qg.js +1 -0
- package/dist/web/assets/core-wi-Hu_JV.js +12 -0
- package/dist/web/assets/drawer-BiqnR_8i.js +1 -0
- package/dist/web/assets/dropdown-menu-C9D1kRkO.js +1 -0
- package/dist/web/assets/edit-and-retry-BgOR6mvP.js +1 -0
- package/dist/web/assets/engine-javascript-D-6se_EF.js +141 -0
- package/dist/web/assets/error-alert-9tKpTE3v.js +1 -0
- package/dist/web/assets/file-error-SjG2jLJ9.js +1 -0
- package/dist/web/assets/fill-cell-ClM88KFD.js +1 -0
- package/dist/web/assets/heading-lX1a1LNN.js +1 -0
- package/dist/web/assets/index-BymNZU1Q.js +10 -0
- package/dist/web/assets/index-Dyjfp3ET.css +2 -0
- package/dist/web/assets/inter-cyrillic-ext-opsz-normal-CfYZpDVp.woff2 +0 -0
- package/dist/web/assets/inter-cyrillic-opsz-normal-BFQXbQ-f.woff2 +0 -0
- package/dist/web/assets/inter-greek-ext-opsz-normal-BmPQvyvo.woff2 +0 -0
- package/dist/web/assets/inter-greek-opsz-normal-BM0NlUE_.woff2 +0 -0
- package/dist/web/assets/inter-latin-ext-opsz-normal-DpK-iCPk.woff2 +0 -0
- package/dist/web/assets/inter-latin-opsz-normal-BwkfbSeq.woff2 +0 -0
- package/dist/web/assets/inter-vietnamese-opsz-normal-Ci9T9ieq.woff2 +0 -0
- package/dist/web/assets/jetbrains-mono-cyrillic-wght-normal-D73BlboJ.woff2 +0 -0
- package/dist/web/assets/jetbrains-mono-greek-wght-normal-Bw9x6K1M.woff2 +0 -0
- package/dist/web/assets/jetbrains-mono-latin-ext-wght-normal-DBQx-q_a.woff2 +0 -0
- package/dist/web/assets/jetbrains-mono-latin-wght-normal-B9CIFXIH.woff2 +0 -0
- package/dist/web/assets/jetbrains-mono-vietnamese-wght-normal-Bt-aOZkq.woff2 +0 -0
- package/dist/web/assets/label-badge-aIGT1Bry.js +1 -0
- package/dist/web/assets/list-v8WJp2Eq.js +1 -0
- package/dist/web/assets/loops-BFoFf_og.js +1 -0
- package/dist/web/assets/mark-CC3RwMy_.js +1 -0
- package/dist/web/assets/markdown-BnyfnuCL.js +29 -0
- package/dist/web/assets/matchContext-BquevSJS.js +2 -0
- package/dist/web/assets/model-BerBT6R0.js +1 -0
- package/dist/web/assets/moves-Dg9sshX5.js +1 -0
- package/dist/web/assets/overview-C_tFKGZ8.js +1 -0
- package/dist/web/assets/page-DWnGi6wA.js +301 -0
- package/dist/web/assets/project-not-found-CodaBVdu.js +1 -0
- package/dist/web/assets/pull-request-marks-DE00nqGW.js +1 -0
- package/dist/web/assets/queries-B1SHA_r4.js +1 -0
- package/dist/web/assets/reload-Dsl0zjJ7.js +1 -0
- package/dist/web/assets/repositories-BdxmD192.js +1 -0
- package/dist/web/assets/repositories-D4wYJfa_.js +1 -0
- package/dist/web/assets/route-B_gphTYG.js +1 -0
- package/dist/web/assets/route-Cc7dKnn5.js +1 -0
- package/dist/web/assets/routes-BLy5TGH_.js +65 -0
- package/dist/web/assets/run-again-BTKagSXR.js +1 -0
- package/dist/web/assets/section-B3pWIIBa.js +1 -0
- package/dist/web/assets/section-CD-MB5r3.js +1 -0
- package/dist/web/assets/section-Id99HktI.js +1 -0
- package/dist/web/assets/settings-YrDysQXW.js +1 -0
- package/dist/web/assets/slots-BraHmbNr.js +1 -0
- package/dist/web/assets/status-badge-DnvNo1tG.js +1 -0
- package/dist/web/assets/strings-CW2XaR5f.js +1 -0
- package/dist/web/assets/table-BjyI4fVI.js +1 -0
- package/dist/web/assets/tasks-DCL8kLmD.js +1 -0
- package/dist/web/assets/transcript-sxRJzx6t.js +5 -0
- package/dist/web/assets/usage-CLQJdX9-.js +1 -0
- package/dist/web/assets/use-now-0P8TUXeg.js +1 -0
- package/dist/web/assets/useAnchoredPopupScrollLock-CQ83Wy-r.js +1 -0
- package/dist/web/assets/useNavigate-BW1WdocJ.js +1 -0
- package/dist/web/assets/usePositioner-rNCxnHO-.js +1 -0
- package/dist/web/assets/useTimeout-_TcdZXP6.js +1 -0
- package/dist/web/assets/with-selector-DoElmmtd.js +1 -0
- package/dist/web/assets/workers-BH5CBOR3.js +1 -0
- package/dist/web/index.html +16 -10
- package/package.json +17 -12
- package/dist/web/assets/_name-DdyMEUN6.js +0 -6
- package/dist/web/assets/_name-eoobiMh0.js +0 -1
- package/dist/web/assets/_name-pUxlKZt5.js +0 -1
- package/dist/web/assets/badge-t7m0Vk1K.js +0 -146
- package/dist/web/assets/button-BoOukj77.js +0 -1
- package/dist/web/assets/core-CLXRiB63.js +0 -12
- package/dist/web/assets/empty-DbVYU7bi.js +0 -1
- package/dist/web/assets/engine-javascript-h-x4hGa4.js +0 -141
- package/dist/web/assets/geist-cyrillic-ext-wght-normal-DjL33-gN.woff2 +0 -0
- package/dist/web/assets/geist-cyrillic-wght-normal-BEAKL7Jp.woff2 +0 -0
- package/dist/web/assets/geist-latin-ext-wght-normal-DC-KSUi6.woff2 +0 -0
- package/dist/web/assets/geist-latin-wght-normal-BgDaEnEv.woff2 +0 -0
- package/dist/web/assets/geist-mono-cyrillic-ext-wght-normal-X_5orZeX.woff2 +0 -0
- package/dist/web/assets/geist-mono-cyrillic-wght-normal-DiZS0aHC.woff2 +0 -0
- package/dist/web/assets/geist-mono-latin-ext-wght-normal-Bwz-egvJ.woff2 +0 -0
- package/dist/web/assets/geist-mono-latin-wght-normal-XN7g48iV.woff2 +0 -0
- package/dist/web/assets/geist-mono-symbols2-wght-normal-CO5SzqOn.woff2 +0 -0
- package/dist/web/assets/geist-mono-vietnamese-wght-normal-DadHysG0.woff2 +0 -0
- package/dist/web/assets/geist-vietnamese-wght-normal-6IgcOCM7.woff2 +0 -0
- package/dist/web/assets/index-CVBBoW6r.css +0 -2
- package/dist/web/assets/index-CsW8KcJW.js +0 -10
- package/dist/web/assets/loops-DghpuoiG.js +0 -1
- package/dist/web/assets/operator-copy-DIsVXn17.js +0 -1
- package/dist/web/assets/overview-DmCIVPwN.js +0 -1
- package/dist/web/assets/rolldown-runtime-hePW80VL.js +0 -1
- package/dist/web/assets/routes-BDyP7vCr.js +0 -1
- package/dist/web/assets/run-drawer-B-xhTXe4.js +0 -157
- package/dist/web/assets/status-badge-yblcElE0.js +0 -1
- package/dist/web/assets/table-B8cLYNvq.js +0 -1
- package/dist/web/assets/useCompositeItem-HmBmWxUW.js +0 -1
- package/dist/web/assets/with-selector-N6m4X0X_.js +0 -1
package/dist/detach.d.ts
ADDED
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { Duration, Effect, FileSystem, Option, Schema } from "effect";
|
|
2
|
+
import { type UpCommand } from "./cli.ts";
|
|
3
|
+
import { InstanceInUseError } from "./instance/lock.ts";
|
|
4
|
+
import { type InstanceLaunch } from "./instance/record.ts";
|
|
5
|
+
import { type SystemctlError } from "./instance/systemd.ts";
|
|
6
|
+
declare const DetachedStartError_base: Schema.Class<DetachedStartError, Schema.TaggedStruct<"DetachedStartError", {
|
|
7
|
+
/**
|
|
8
|
+
* `exited` if the process ended. `silent` if it still runs, but neither listened nor wrote to
|
|
9
|
+
* its log for `timeout`.
|
|
10
|
+
*/
|
|
11
|
+
readonly outcome: Schema.Literals<readonly ["exited", "silent"]>;
|
|
12
|
+
readonly pid: Schema.Option<Schema.brand<Schema.Int, "ProcessId">>;
|
|
13
|
+
/** How the process ended, such as `status 1` or `SIGKILL`. */
|
|
14
|
+
readonly exit: Schema.Option<Schema.String>;
|
|
15
|
+
readonly timeout: Schema.Duration;
|
|
16
|
+
readonly port: Schema.brand<Schema.Int, "ServerPort">;
|
|
17
|
+
readonly log: Schema.String;
|
|
18
|
+
/** The last lines that the process wrote to the log after it started. */
|
|
19
|
+
readonly tail: Schema.String;
|
|
20
|
+
}>, import("effect/Cause").YieldableError>;
|
|
21
|
+
/**
|
|
22
|
+
* A `usine up` started in the background exited before it listened, or stopped writing to its log
|
|
23
|
+
* without listening.
|
|
24
|
+
*/
|
|
25
|
+
export declare class DetachedStartError extends DetachedStartError_base {
|
|
26
|
+
}
|
|
27
|
+
declare const DetachedSpawnError_base: Schema.Class<DetachedSpawnError, Schema.TaggedStruct<"DetachedSpawnError", {
|
|
28
|
+
readonly command: Schema.String;
|
|
29
|
+
readonly reason: Schema.String;
|
|
30
|
+
}>, import("effect/Cause").YieldableError>;
|
|
31
|
+
/** The log file couldn't be opened, or the process couldn't be spawned. */
|
|
32
|
+
export declare class DetachedSpawnError extends DetachedSpawnError_base {
|
|
33
|
+
}
|
|
34
|
+
declare const StartedInstance_base: Schema.Class<StartedInstance, Schema.Struct<{
|
|
35
|
+
readonly pid: Schema.brand<Schema.Int, "ProcessId">;
|
|
36
|
+
readonly port: Schema.brand<Schema.Int, "ServerPort">;
|
|
37
|
+
/** The systemd service that started the process, whose journal has its output. */
|
|
38
|
+
readonly unit: Schema.withConstructorDefault<Schema.Option<Schema.brand<Schema.String, "SystemdUnit">>>;
|
|
39
|
+
}>, {}>;
|
|
40
|
+
/** A `usine up` that `startDetached` started and that answers on its port. */
|
|
41
|
+
export declare class StartedInstance extends StartedInstance_base {
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Starts `usine up` in the background with `launch`, in its own session and with its output
|
|
45
|
+
* appended to `.usine/usine.log`. Waits until the new process holds the instance and answers HTTP
|
|
46
|
+
* requests. A usine version that writes only `.usine/instance.pid` also counts. Fails with
|
|
47
|
+
* `DetachedStartError` if the process exits first, or if it neither answers nor writes to the log
|
|
48
|
+
* for `timeout`.
|
|
49
|
+
*/
|
|
50
|
+
export declare const startDetached: (directory: string & import("effect/Brand").Brand<"InstanceDirectory">, launch: InstanceLaunch, timeout: Duration.Duration) => Effect.Effect<StartedInstance, DetachedSpawnError | DetachedStartError | import("./instance/lock.ts").InstanceLockError, FileSystem.FileSystem | import("effect/http/HttpClient").HttpClient>;
|
|
51
|
+
/** Returns the line that names a started instance's address, PID, and output. */
|
|
52
|
+
export declare const startedMessage: ({ pid, port, unit }: StartedInstance) => string;
|
|
53
|
+
declare const SystemdStartError_base: Schema.Class<SystemdStartError, Schema.TaggedStruct<"SystemdStartError", {
|
|
54
|
+
readonly unit: Schema.brand<Schema.String, "SystemdUnit">;
|
|
55
|
+
/** `failed` if the service stopped or waits to restart, `silent` if it runs but didn't answer. */
|
|
56
|
+
readonly outcome: Schema.Literals<readonly ["failed", "silent"]>;
|
|
57
|
+
/** The service's `ActiveState` and `SubState`, such as `activating (auto-restart)`. */
|
|
58
|
+
readonly state: Schema.String;
|
|
59
|
+
readonly timeout: Schema.Duration;
|
|
60
|
+
}>, import("effect/Cause").YieldableError>;
|
|
61
|
+
/**
|
|
62
|
+
* The systemd service that `systemctl start` started failed before its `usine up` answered, or its
|
|
63
|
+
* `usine up` didn't answer within the timeout.
|
|
64
|
+
*/
|
|
65
|
+
export declare class SystemdStartError extends SystemdStartError_base {
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Starts the instance's systemd service with `systemctl start`, and waits until a process other
|
|
69
|
+
* than `previous` holds the instance and answers on its recorded port. Fails with
|
|
70
|
+
* `SystemdStartError` if the service stops or waits to restart first, and then stops it, or after
|
|
71
|
+
* `timeout`, when the service keeps running. Fails with the `SystemctlError` of a
|
|
72
|
+
* `systemctl start` that fails, after it stops a service that waits to restart.
|
|
73
|
+
*/
|
|
74
|
+
export declare const startUnit: (directory: string & import("effect/Brand").Brand<"InstanceDirectory">, unit: string & import("effect/Brand").Brand<"SystemdUnit">, previous: number & import("effect/Brand").Brand<"ProcessId">, timeout: Duration.Duration) => Effect.Effect<StartedInstance, import("./instance/lock.ts").InstanceLockError | SystemctlError | SystemdStartError, import("effect/process/ChildProcessSpawner").ChildProcessSpawner | FileSystem.FileSystem | import("effect/http/HttpClient").HttpClient>;
|
|
75
|
+
/**
|
|
76
|
+
* Starts the instance again after `previous` stopped: with `systemctl start` if `unit` ran it, else
|
|
77
|
+
* in the background with `launch`.
|
|
78
|
+
*/
|
|
79
|
+
export declare const startAgain: (directory: string & import("effect/Brand").Brand<"InstanceDirectory">, launch: InstanceLaunch, unit: Option.Option<string & import("effect/Brand").Brand<"SystemdUnit">>, previous: number & import("effect/Brand").Brand<"ProcessId">, timeout: Duration.Duration) => Effect.Effect<StartedInstance, DetachedSpawnError | DetachedStartError | import("./instance/lock.ts").InstanceLockError | SystemctlError | SystemdStartError, import("effect/process/ChildProcessSpawner").ChildProcessSpawner | FileSystem.FileSystem | import("effect/http/HttpClient").HttpClient>;
|
|
80
|
+
/** Starts `usine up` in the background in the instance folder, unless it runs already. */
|
|
81
|
+
export declare const upDetached: (directory: string & import("effect/Brand").Brand<"InstanceDirectory">, command: UpCommand) => Effect.Effect<undefined, DetachedSpawnError | DetachedStartError | InstanceInUseError | import("./instance/lock.ts").InstanceLockError, FileSystem.FileSystem | import("effect/http/HttpClient").HttpClient>;
|
|
82
|
+
export {};
|
|
83
|
+
//# sourceMappingURL=detach.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detach.d.ts","sourceRoot":"","sources":["../src/detach.ts"],"names":[],"mappings":"AAGA,OAAO,EAAqB,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAY,MAAM,EAAE,MAAM,QAAQ,CAAC;AACnG,OAAO,EAAwD,KAAK,SAAS,EAAE,MAAM,UAAU,CAAC;AAChG,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,KAAK,cAAc,EAA2C,MAAM,sBAAsB,CAAC;AAGpG,OAAO,EAAE,KAAK,cAAc,EAAqC,MAAM,uBAAuB,CAAC;;IAe7F;;;OAGG;;;IAGH,8DAA8D;;;;;IAK9D,yEAAyE;;;AAlB3E;;;GAGG;AACH,qBAAa,kBAAmB,SAAQ,uBAgBtC;CAAG;;;;;AAEL,2EAA2E;AAC3E,qBAAa,kBAAmB,SAAQ,uBAEkC;CAAG;;;;IAgDzE,kFAAkF;;;AALtF,8EAA8E;AAC9E,qBAAa,eAAgB,SAAQ,oBASpC;CAAG;AAOJ;;;;;;GAMG;AACH,eAAO,MAAM,aAAa,8TAwIxB,CAAC;AAEH,iFAAiF;AACjF,eAAO,MAAM,cAAc,wBAAyB,eAAe,KAAG,MAMlE,CAAC;;;IAUH,kGAAkG;;IAElG,uFAAuF;;;;AAVzF;;;GAGG;AACH,qBAAa,iBAAkB,SAAQ,sBASrC;CAAG;AA0CL;;;;;;GAMG;AACH,eAAO,MAAM,SAAS,8dAuDpB,CAAC;AAEH;;;GAGG;AACH,eAAO,MAAM,UAAU,+iBAWrB,CAAC;AAEH,0FAA0F;AAC1F,eAAO,MAAM,UAAU,6SAkBrB,CAAC"}
|
package/dist/detach.js
ADDED
|
@@ -0,0 +1,320 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import { closeSync, fstatSync, openSync, readSync } from "node:fs";
|
|
3
|
+
import { Console, Deferred, Duration, Effect, FileSystem, Option, Schedule, Schema } from "effect";
|
|
4
|
+
import { DEFAULT_LIFECYCLE_TIMEOUT_SECONDS, Port, SERVER_HOST } from "./cli.js";
|
|
5
|
+
import { InstanceInUseError } from "./instance/lock.js";
|
|
6
|
+
import { ProcessId, currentLaunch, instanceFiles } from "./instance/record.js";
|
|
7
|
+
import { answers } from "./instance/operator-api.js";
|
|
8
|
+
import { probeInstance } from "./instance/state.js";
|
|
9
|
+
import { SystemdUnit, systemctl, unitState } from "./instance/systemd.js";
|
|
10
|
+
const READY_POLL_INTERVAL = "250 millis";
|
|
11
|
+
/** Spaces the checks of a starting systemd service, each of which runs `systemctl show`. */
|
|
12
|
+
const UNIT_POLL_INTERVAL = "500 millis";
|
|
13
|
+
const LOG_TAIL_LINES = 20;
|
|
14
|
+
const LOG_TAIL_BYTES = 64 * 1024;
|
|
15
|
+
/**
|
|
16
|
+
* A `usine up` started in the background exited before it listened, or stopped writing to its log
|
|
17
|
+
* without listening.
|
|
18
|
+
*/
|
|
19
|
+
export class DetachedStartError extends Schema.TaggedError("@usine/server/DetachedStartError")("DetachedStartError", {
|
|
20
|
+
/**
|
|
21
|
+
* `exited` if the process ended. `silent` if it still runs, but neither listened nor wrote to
|
|
22
|
+
* its log for `timeout`.
|
|
23
|
+
*/
|
|
24
|
+
outcome: Schema.Literals(["exited", "silent"]),
|
|
25
|
+
pid: Schema.Option(ProcessId),
|
|
26
|
+
/** How the process ended, such as `status 1` or `SIGKILL`. */
|
|
27
|
+
exit: Schema.Option(Schema.String),
|
|
28
|
+
timeout: Schema.Duration,
|
|
29
|
+
port: Port,
|
|
30
|
+
log: Schema.String,
|
|
31
|
+
/** The last lines that the process wrote to the log after it started. */
|
|
32
|
+
tail: Schema.String,
|
|
33
|
+
}) {
|
|
34
|
+
}
|
|
35
|
+
/** The log file couldn't be opened, or the process couldn't be spawned. */
|
|
36
|
+
export class DetachedSpawnError extends Schema.TaggedError("@usine/server/DetachedSpawnError")("DetachedSpawnError", { command: Schema.String, reason: Schema.String }) {
|
|
37
|
+
}
|
|
38
|
+
const reasonOf = (cause) => cause instanceof Error ? cause.message : String(cause);
|
|
39
|
+
const launchArguments = (launch) => {
|
|
40
|
+
const args = [
|
|
41
|
+
...launch.nodeOptions,
|
|
42
|
+
launch.script,
|
|
43
|
+
"up",
|
|
44
|
+
"--port",
|
|
45
|
+
String(launch.port),
|
|
46
|
+
"--log-level",
|
|
47
|
+
launch.logLevel.toLowerCase(),
|
|
48
|
+
];
|
|
49
|
+
if (Option.isSome(launch.origin))
|
|
50
|
+
args.push("--origin", launch.origin.value);
|
|
51
|
+
if (launch.allowVolatileInstance)
|
|
52
|
+
args.push("--allow-volatile-instance");
|
|
53
|
+
return args;
|
|
54
|
+
};
|
|
55
|
+
/** Returns the last lines of `log` after byte `offset`. */
|
|
56
|
+
const logTail = (log, offset) => Effect.try({
|
|
57
|
+
try: () => {
|
|
58
|
+
const descriptor = openSync(log, "r");
|
|
59
|
+
try {
|
|
60
|
+
const size = fstatSync(descriptor).size;
|
|
61
|
+
const start = Math.max(offset, size - LOG_TAIL_BYTES);
|
|
62
|
+
const buffer = Buffer.alloc(Math.max(0, size - start));
|
|
63
|
+
readSync(descriptor, buffer, 0, buffer.length, start);
|
|
64
|
+
return buffer.toString("utf8").trimEnd().split("\n").slice(-LOG_TAIL_LINES).join("\n");
|
|
65
|
+
}
|
|
66
|
+
finally {
|
|
67
|
+
closeSync(descriptor);
|
|
68
|
+
}
|
|
69
|
+
},
|
|
70
|
+
catch: (cause) => cause,
|
|
71
|
+
}).pipe(Effect.tapError((cause) => Effect.logWarning("Could not read the instance log", { log, cause })), Effect.orElseSucceed(() => ""));
|
|
72
|
+
/** A `usine up` that `startDetached` started and that answers on its port. */
|
|
73
|
+
export class StartedInstance extends Schema.Class("@usine/server/StartedInstance")({
|
|
74
|
+
pid: ProcessId,
|
|
75
|
+
port: Port,
|
|
76
|
+
/** The systemd service that started the process, whose journal has its output. */
|
|
77
|
+
unit: Schema.Option(SystemdUnit).pipe(Schema.withConstructorDefault(Effect.succeed(Option.none()))),
|
|
78
|
+
}) {
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Starts `usine up` in the background with `launch`, in its own session and with its output
|
|
82
|
+
* appended to `.usine/usine.log`. Waits until the new process holds the instance and answers HTTP
|
|
83
|
+
* requests. A usine version that writes only `.usine/instance.pid` also counts. Fails with
|
|
84
|
+
* `DetachedStartError` if the process exits first, or if it neither answers nor writes to the log
|
|
85
|
+
* for `timeout`.
|
|
86
|
+
*/
|
|
87
|
+
export const startDetached = Effect.fn("Cli.startDetached")(function* (directory, launch, timeout) {
|
|
88
|
+
const files = instanceFiles(directory);
|
|
89
|
+
const fileSystem = yield* FileSystem.FileSystem;
|
|
90
|
+
const args = launchArguments(launch);
|
|
91
|
+
yield* Effect.annotateCurrentSpan({
|
|
92
|
+
instanceDirectory: directory,
|
|
93
|
+
port: launch.port,
|
|
94
|
+
script: launch.script,
|
|
95
|
+
});
|
|
96
|
+
const spawnError = (cause) => new DetachedSpawnError({ command: [launch.node, ...args].join(" "), reason: reasonOf(cause) });
|
|
97
|
+
yield* fileSystem
|
|
98
|
+
.makeDirectory(files.folder, { recursive: true })
|
|
99
|
+
.pipe(Effect.mapError(spawnError));
|
|
100
|
+
const logSize = fileSystem.stat(files.log).pipe(Effect.map(({ size }) => Number(size)), Effect.orElseSucceed(() => 0));
|
|
101
|
+
const offset = yield* logSize;
|
|
102
|
+
const ended = yield* Deferred.make();
|
|
103
|
+
const child = yield* Effect.try({
|
|
104
|
+
try: () => {
|
|
105
|
+
const output = openSync(files.log, "a", 0o600);
|
|
106
|
+
try {
|
|
107
|
+
return spawn(launch.node, args, {
|
|
108
|
+
cwd: directory,
|
|
109
|
+
detached: true,
|
|
110
|
+
stdio: ["ignore", output, output],
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
finally {
|
|
114
|
+
closeSync(output);
|
|
115
|
+
}
|
|
116
|
+
},
|
|
117
|
+
catch: spawnError,
|
|
118
|
+
});
|
|
119
|
+
child.once("exit", (code, signal) => {
|
|
120
|
+
Deferred.doneUnsafe(ended, Effect.succeed(signal ?? `status ${code ?? "unknown"}`));
|
|
121
|
+
});
|
|
122
|
+
child.once("error", (error) => {
|
|
123
|
+
Deferred.doneUnsafe(ended, Effect.succeed(error.message));
|
|
124
|
+
});
|
|
125
|
+
child.unref();
|
|
126
|
+
const pid = Schema.decodeUnknownOption(ProcessId)(child.pid);
|
|
127
|
+
yield* Effect.logInfo("Started usine up in the background", {
|
|
128
|
+
pid: Option.getOrUndefined(pid),
|
|
129
|
+
log: files.log,
|
|
130
|
+
port: launch.port,
|
|
131
|
+
});
|
|
132
|
+
// Polls HTTP first: the lock probe takes a read lock, and by the time the server answers, the new
|
|
133
|
+
// process has held the instance lock for a while.
|
|
134
|
+
const listening = Effect.gen(function* () {
|
|
135
|
+
while (true) {
|
|
136
|
+
if (yield* answers(launch.port)) {
|
|
137
|
+
const state = yield* probeInstance(directory);
|
|
138
|
+
const holder = state._tag === "Running"
|
|
139
|
+
? Option.some(state.record.pid)
|
|
140
|
+
: state._tag === "Unrecorded"
|
|
141
|
+
? state.pid
|
|
142
|
+
: Option.none();
|
|
143
|
+
if (Option.isSome(pid) && Option.contains(holder, pid.value)) {
|
|
144
|
+
const started = new StartedInstance({ pid: pid.value, port: launch.port });
|
|
145
|
+
return { _tag: "Listening", started };
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
yield* Effect.sleep(READY_POLL_INTERVAL);
|
|
149
|
+
}
|
|
150
|
+
});
|
|
151
|
+
const exited = Deferred.await(ended).pipe(Effect.map((exit) => ({ _tag: "Exited", exit })));
|
|
152
|
+
/** Returns `Silent` once the log size, starting from `bytes`, stays the same for `timeout`. */
|
|
153
|
+
const silence = (bytes) => logSize.pipe(Effect.repeat({
|
|
154
|
+
schedule: Schedule.spaced(READY_POLL_INTERVAL),
|
|
155
|
+
until: (size) => size !== bytes,
|
|
156
|
+
}), Effect.timeoutOption(timeout), Effect.flatMap(Option.match({
|
|
157
|
+
onNone: () => Effect.succeed({ _tag: "Silent" }),
|
|
158
|
+
onSome: silence,
|
|
159
|
+
})));
|
|
160
|
+
// Never completes. At `timeout`, a log that grew since the spawn restarted `silence`, so the
|
|
161
|
+
// command says that it keeps waiting.
|
|
162
|
+
const stillStarting = Effect.sleep(timeout).pipe(Effect.andThen(logSize), Effect.flatMap((size) => size === offset
|
|
163
|
+
? Effect.void
|
|
164
|
+
: Effect.logInfo("The background usine up isn't listening yet; waiting while it writes to its log", {
|
|
165
|
+
pid: Option.getOrUndefined(pid),
|
|
166
|
+
port: launch.port,
|
|
167
|
+
log: files.log,
|
|
168
|
+
timeoutSeconds: Duration.toSeconds(timeout),
|
|
169
|
+
})), Effect.andThen(Effect.never));
|
|
170
|
+
// `raceAllFirst` ends the wait on the first result, including a failed readiness probe.
|
|
171
|
+
// `raceAll` would hide that failure until the log fell silent.
|
|
172
|
+
const outcome = yield* Effect.raceAllFirst([listening, exited, silence(offset), stillStarting]);
|
|
173
|
+
if (outcome._tag === "Listening") {
|
|
174
|
+
yield* Effect.logInfo("The background usine up is listening", {
|
|
175
|
+
pid: outcome.started.pid,
|
|
176
|
+
port: launch.port,
|
|
177
|
+
});
|
|
178
|
+
return outcome.started;
|
|
179
|
+
}
|
|
180
|
+
const tail = yield* logTail(files.log, offset);
|
|
181
|
+
const error = new DetachedStartError({
|
|
182
|
+
outcome: outcome._tag === "Exited" ? "exited" : "silent",
|
|
183
|
+
pid,
|
|
184
|
+
exit: outcome._tag === "Exited" ? Option.some(outcome.exit) : Option.none(),
|
|
185
|
+
timeout,
|
|
186
|
+
port: launch.port,
|
|
187
|
+
log: files.log,
|
|
188
|
+
tail,
|
|
189
|
+
});
|
|
190
|
+
yield* Effect.logWarning("The background usine up did not start listening", {
|
|
191
|
+
outcome: error.outcome,
|
|
192
|
+
pid: Option.getOrUndefined(pid),
|
|
193
|
+
exit: Option.getOrUndefined(error.exit),
|
|
194
|
+
});
|
|
195
|
+
return yield* error;
|
|
196
|
+
});
|
|
197
|
+
/** Returns the line that names a started instance's address, PID, and output. */
|
|
198
|
+
export const startedMessage = ({ pid, port, unit }) => Option.match(unit, {
|
|
199
|
+
onNone: () => `usine is running at http://${SERVER_HOST}:${port} (pid ${pid}), with its output in .usine/usine.log.`,
|
|
200
|
+
onSome: (service) => `usine is running at http://${SERVER_HOST}:${port} (pid ${pid}) in ${service}, with its output in the journal: journalctl -u ${service}.`,
|
|
201
|
+
});
|
|
202
|
+
/**
|
|
203
|
+
* The systemd service that `systemctl start` started failed before its `usine up` answered, or its
|
|
204
|
+
* `usine up` didn't answer within the timeout.
|
|
205
|
+
*/
|
|
206
|
+
export class SystemdStartError extends Schema.TaggedError("@usine/server/SystemdStartError")("SystemdStartError", {
|
|
207
|
+
unit: SystemdUnit,
|
|
208
|
+
/** `failed` if the service stopped or waits to restart, `silent` if it runs but didn't answer. */
|
|
209
|
+
outcome: Schema.Literals(["failed", "silent"]),
|
|
210
|
+
/** The service's `ActiveState` and `SubState`, such as `activating (auto-restart)`. */
|
|
211
|
+
state: Schema.String,
|
|
212
|
+
timeout: Schema.Duration,
|
|
213
|
+
}) {
|
|
214
|
+
}
|
|
215
|
+
/** The service states that end a start before `usine up` answers. */
|
|
216
|
+
const ENDED_STATES = new Set(["failed", "inactive", "deactivating"]);
|
|
217
|
+
/**
|
|
218
|
+
* Stops `unit` if it waits to restart after `systemctl start` failed, as a `Type=exec` service with
|
|
219
|
+
* `Restart=on-failure` does when its command can't run, so that the failed start doesn't repeat.
|
|
220
|
+
* Logs a `systemctl` that fails here, and never fails itself.
|
|
221
|
+
*/
|
|
222
|
+
const cancelPendingRestart = Effect.fn("Cli.cancelPendingRestart")(function* (unit, failure) {
|
|
223
|
+
const state = yield* unitState(unit);
|
|
224
|
+
if (state.sub !== "auto-restart") {
|
|
225
|
+
yield* Effect.logWarning("systemctl start failed; the service doesn't wait to restart", {
|
|
226
|
+
unit,
|
|
227
|
+
state: `${state.active} (${state.sub})`,
|
|
228
|
+
reason: failure.reason,
|
|
229
|
+
});
|
|
230
|
+
return;
|
|
231
|
+
}
|
|
232
|
+
yield* Effect.logWarning("systemctl start failed and the service waits to restart; stopping it", {
|
|
233
|
+
unit,
|
|
234
|
+
reason: failure.reason,
|
|
235
|
+
});
|
|
236
|
+
yield* systemctl(unit, ["stop", "--no-block"]);
|
|
237
|
+
}, Effect.catchTag("SystemctlError", (error) => Effect.logWarning("Could not check or cancel the restart of the service after systemctl start failed", {
|
|
238
|
+
unit: error.unit,
|
|
239
|
+
command: error.command,
|
|
240
|
+
reason: error.reason,
|
|
241
|
+
})));
|
|
242
|
+
/**
|
|
243
|
+
* Starts the instance's systemd service with `systemctl start`, and waits until a process other
|
|
244
|
+
* than `previous` holds the instance and answers on its recorded port. Fails with
|
|
245
|
+
* `SystemdStartError` if the service stops or waits to restart first, and then stops it, or after
|
|
246
|
+
* `timeout`, when the service keeps running. Fails with the `SystemctlError` of a
|
|
247
|
+
* `systemctl start` that fails, after it stops a service that waits to restart.
|
|
248
|
+
*/
|
|
249
|
+
export const startUnit = Effect.fn("Cli.startUnit")(function* (directory, unit, previous, timeout) {
|
|
250
|
+
yield* Effect.annotateCurrentSpan({ instanceDirectory: directory, unit });
|
|
251
|
+
yield* systemctl(unit, ["start"]).pipe(Effect.tapError((failure) => cancelPendingRestart(unit, failure)));
|
|
252
|
+
yield* Effect.logInfo("Started the instance's systemd service", { unit });
|
|
253
|
+
let last = "unknown";
|
|
254
|
+
const listening = Effect.gen(function* () {
|
|
255
|
+
while (true) {
|
|
256
|
+
const state = yield* probeInstance(directory);
|
|
257
|
+
if (state._tag === "Running" &&
|
|
258
|
+
state.record.pid !== previous &&
|
|
259
|
+
(yield* answers(state.record.launch.port))) {
|
|
260
|
+
return new StartedInstance({
|
|
261
|
+
pid: state.record.pid,
|
|
262
|
+
port: state.record.launch.port,
|
|
263
|
+
unit: Option.some(unit),
|
|
264
|
+
});
|
|
265
|
+
}
|
|
266
|
+
const { active, sub } = yield* unitState(unit);
|
|
267
|
+
last = `${active} (${sub})`;
|
|
268
|
+
if (ENDED_STATES.has(active) || sub === "auto-restart") {
|
|
269
|
+
yield* Effect.logWarning("The instance's systemd service ended before usine up answered", {
|
|
270
|
+
unit,
|
|
271
|
+
state: last,
|
|
272
|
+
});
|
|
273
|
+
// Cancels the restart, so that a start that fails, such as a failed migration, doesn't repeat.
|
|
274
|
+
if (sub === "auto-restart")
|
|
275
|
+
yield* systemctl(unit, ["stop", "--no-block"]);
|
|
276
|
+
return yield* new SystemdStartError({ unit, outcome: "failed", state: last, timeout });
|
|
277
|
+
}
|
|
278
|
+
yield* Effect.sleep(UNIT_POLL_INTERVAL);
|
|
279
|
+
}
|
|
280
|
+
});
|
|
281
|
+
const started = yield* Effect.timeoutOption(listening, timeout);
|
|
282
|
+
if (Option.isSome(started)) {
|
|
283
|
+
yield* Effect.logInfo("The instance's systemd service is listening", {
|
|
284
|
+
unit,
|
|
285
|
+
pid: started.value.pid,
|
|
286
|
+
port: started.value.port,
|
|
287
|
+
});
|
|
288
|
+
return started.value;
|
|
289
|
+
}
|
|
290
|
+
yield* Effect.logWarning("The instance's systemd service didn't answer before the timeout", {
|
|
291
|
+
unit,
|
|
292
|
+
state: last,
|
|
293
|
+
timeoutSeconds: Duration.toSeconds(timeout),
|
|
294
|
+
});
|
|
295
|
+
return yield* new SystemdStartError({ unit, outcome: "silent", state: last, timeout });
|
|
296
|
+
});
|
|
297
|
+
/**
|
|
298
|
+
* Starts the instance again after `previous` stopped: with `systemctl start` if `unit` ran it, else
|
|
299
|
+
* in the background with `launch`.
|
|
300
|
+
*/
|
|
301
|
+
export const startAgain = Effect.fn("Cli.startAgain")(function* (directory, launch, unit, previous, timeout) {
|
|
302
|
+
return yield* Option.match(unit, {
|
|
303
|
+
onNone: () => startDetached(directory, launch, timeout),
|
|
304
|
+
onSome: (service) => startUnit(directory, service, previous, timeout),
|
|
305
|
+
});
|
|
306
|
+
});
|
|
307
|
+
/** Starts `usine up` in the background in the instance folder, unless it runs already. */
|
|
308
|
+
export const upDetached = Effect.fn("Cli.upDetached")(function* (directory, command) {
|
|
309
|
+
const state = yield* probeInstance(directory);
|
|
310
|
+
if (state._tag !== "Stopped") {
|
|
311
|
+
return yield* new InstanceInUseError({
|
|
312
|
+
directory,
|
|
313
|
+
holder: state._tag === "Running" ? Option.some(state.record.pid) : state.pid,
|
|
314
|
+
});
|
|
315
|
+
}
|
|
316
|
+
const launch = yield* currentLaunch(command);
|
|
317
|
+
const started = yield* startDetached(directory, launch, Duration.seconds(DEFAULT_LIFECYCLE_TIMEOUT_SECONDS));
|
|
318
|
+
yield* Console.log(startedMessage(started));
|
|
319
|
+
});
|
|
320
|
+
//# sourceMappingURL=detach.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detach.js","sourceRoot":"","sources":["../src/detach.ts"],"names":[],"mappings":"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"}
|
package/dist/export-run.d.ts
CHANGED
|
@@ -13,7 +13,7 @@ declare const RunExportError_base: Schema.Class<RunExportError, Schema.TaggedStr
|
|
|
13
13
|
readonly reason: Schema.String;
|
|
14
14
|
readonly cause: Schema.Defect;
|
|
15
15
|
}>, import("effect/Cause").YieldableError>;
|
|
16
|
-
/**
|
|
16
|
+
/** A failure to read, encode, or write Run evidence. */
|
|
17
17
|
export declare class RunExportError extends RunExportError_base {
|
|
18
18
|
}
|
|
19
19
|
/** Exports from the current instance without loading GitHub credentials or starting execution. */
|
package/dist/export-run.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"export-run.d.ts","sourceRoot":"","sources":["../src/export-run.ts"],"names":[],"mappings":"AAIA,OAAO,EAAqB,MAAM,EAAE,UAAU,EAAS,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAE5F,uFAAuF;AACvF,eAAO,MAAM,mBAAmB;;;;;IAS/B,CAAC;;;;;;;;AAEF,
|
|
1
|
+
{"version":3,"file":"export-run.d.ts","sourceRoot":"","sources":["../src/export-run.ts"],"names":[],"mappings":"AAIA,OAAO,EAAqB,MAAM,EAAE,UAAU,EAAS,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAE5F,uFAAuF;AACvF,eAAO,MAAM,mBAAmB;;;;;IAS/B,CAAC;;;;;;;;AAEF,wDAAwD;AACxD,qBAAa,cAAe,SAAQ,mBAQlC;CAAG;AAoDL,kGAAkG;AAClG,eAAO,MAAM,SAAS,oNA2CrB,CAAC"}
|
package/dist/export-run.js
CHANGED
|
@@ -9,7 +9,7 @@ export const RunEvidenceFromJson = Schema.fromJsonString(Schema.toCodecJson(Sche
|
|
|
9
9
|
exportedAt: Schema.DateTimeUtc,
|
|
10
10
|
...RunEvidence.fields,
|
|
11
11
|
})), { space: 2 });
|
|
12
|
-
/**
|
|
12
|
+
/** A failure to read, encode, or write Run evidence. */
|
|
13
13
|
export class RunExportError extends Schema.TaggedError("@usine/server/RunExportError")("RunExportError", {
|
|
14
14
|
runId: RunId,
|
|
15
15
|
operation: Schema.Literals(["read", "encode", "write"]),
|
|
@@ -36,7 +36,7 @@ const writeRunEvidence = Effect.fn("RunEvidence.write")(function* (evidence, out
|
|
|
36
36
|
});
|
|
37
37
|
const staged = path.join(temporary, "evidence.json");
|
|
38
38
|
yield* fileSystem.writeFileString(staged, `${json}\n`, { mode: 0o600 });
|
|
39
|
-
//
|
|
39
|
+
// Hard-link the complete staged file into place; the link fails if the destination exists.
|
|
40
40
|
yield* fileSystem.link(staged, output);
|
|
41
41
|
})).pipe(Effect.mapError((cause) => new RunExportError({
|
|
42
42
|
runId,
|
|
@@ -70,7 +70,7 @@ export const exportRun = Effect.fn("Cli.exportRun")(function* (runId, output) {
|
|
|
70
70
|
cause,
|
|
71
71
|
})));
|
|
72
72
|
yield* writeRunEvidence(evidence, destination);
|
|
73
|
-
yield* Console.log(`Exported
|
|
73
|
+
yield* Console.log(`Exported run ${runId} to ${destination}`);
|
|
74
74
|
}, Effect.tapError((error) => Effect.logWarning("Run evidence export failed", Match.valueTags(error, {
|
|
75
75
|
RunNotFoundError: ({ runId, _tag }) => ({ runId, errorTag: _tag }),
|
|
76
76
|
RunExportError: ({ runId, _tag, operation, path, reason, cause }) => ({
|
package/dist/export-run.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"export-run.js","sourceRoot":"","sources":["../src/export-run.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AACxC,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAE5F,uFAAuF;AACvF,MAAM,CAAC,MAAM,mBAAmB,GAAG,MAAM,CAAC,cAAc,CACtD,MAAM,CAAC,WAAW,CAChB,MAAM,CAAC,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC,WAAW;IAC9B,GAAG,WAAW,CAAC,MAAM;CACtB,CAAC,CACH,EACD,EAAE,KAAK,EAAE,CAAC,EAAE,CACb,CAAC;AAEF,
|
|
1
|
+
{"version":3,"file":"export-run.js","sourceRoot":"","sources":["../src/export-run.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { type Effect } from "effect";
|
|
2
|
+
import type { backup } from "./backup.ts";
|
|
3
|
+
import type { CliUsageError, CliVersionError } from "./cli.ts";
|
|
4
|
+
import type { upDetached } from "./detach.ts";
|
|
5
|
+
import type { exportRun } from "./export-run.ts";
|
|
6
|
+
import type { instanceEnvironment } from "./instance/environment.ts";
|
|
7
|
+
import type { restart } from "./restart.ts";
|
|
8
|
+
import type { status } from "./status.ts";
|
|
9
|
+
import type { stop } from "./stop.ts";
|
|
10
|
+
import type { up } from "./up.ts";
|
|
11
|
+
import type { upgrade } from "./upgrade.ts";
|
|
12
|
+
/** The expected failures of CLI commands. Defects aren't included and still crash. */
|
|
13
|
+
export type CliFailure = CliUsageError | CliVersionError | Effect.Error<ReturnType<typeof instanceEnvironment>> | Effect.Error<ReturnType<typeof up>> | Effect.Error<ReturnType<typeof upDetached>> | Effect.Error<ReturnType<typeof status>> | Effect.Error<ReturnType<typeof stop>> | Effect.Error<ReturnType<typeof restart>> | Effect.Error<ReturnType<typeof upgrade>> | Effect.Error<ReturnType<typeof backup>> | Effect.Error<ReturnType<typeof exportRun>>;
|
|
14
|
+
/**
|
|
15
|
+
* Returns the operator message for a failed CLI command, with the file, setting, Worker, or Run at
|
|
16
|
+
* fault and the next step.
|
|
17
|
+
*/
|
|
18
|
+
export declare const failureMessage: (failure: CliFailure) => string;
|
|
19
|
+
//# sourceMappingURL=failure-message.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"failure-message.d.ts","sourceRoot":"","sources":["../src/failure-message.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,MAAM,EAAyB,MAAM,QAAQ,CAAC;AACtE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAC/D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AACrE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,KAAK,EAAwB,IAAI,EAAE,MAAM,WAAW,CAAC;AAC5D,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,KAAK,EAAsB,OAAO,EAAE,MAAM,cAAc,CAAC;AAEhE,sFAAsF;AACtF,MAAM,MAAM,UAAU,GAClB,aAAa,GACb,eAAe,GACf,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,OAAO,mBAAmB,CAAC,CAAC,GACpD,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC,CAAC,GACnC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,OAAO,UAAU,CAAC,CAAC,GAC3C,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,OAAO,MAAM,CAAC,CAAC,GACvC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,OAAO,IAAI,CAAC,CAAC,GACrC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,OAAO,OAAO,CAAC,CAAC,GACxC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,OAAO,OAAO,CAAC,CAAC,GACxC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,OAAO,MAAM,CAAC,CAAC,GACvC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,OAAO,SAAS,CAAC,CAAC,CAAC;AAwI/C;;;GAGG;AACH,eAAO,MAAM,cAAc,YAAa,UAAU,KAAG,MAgIjD,CAAC"}
|