cueline 0.1.2 → 0.1.3
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/.claude-plugin/plugin.json +1 -1
- package/.codex-plugin/plugin.json +1 -1
- package/CHANGELOG.md +17 -0
- package/README.ja.md +15 -6
- package/README.ko.md +15 -6
- package/README.md +15 -6
- package/README.zh-CN.md +15 -6
- package/README.zh-TW.md +15 -6
- package/dist/src/api.d.ts +23 -1
- package/dist/src/api.js +110 -6
- package/dist/src/api.js.map +1 -1
- package/dist/src/browser/browser-adapter.d.ts +1 -0
- package/dist/src/browser/codex-iab/bootstrap.d.ts +6 -0
- package/dist/src/browser/codex-iab/bootstrap.js.map +1 -1
- package/dist/src/browser/codex-iab/chatgpt-client.js +138 -41
- package/dist/src/browser/codex-iab/chatgpt-client.js.map +1 -1
- package/dist/src/cli/main.js +150 -8
- package/dist/src/cli/main.js.map +1 -1
- package/dist/src/core/controller-loop.d.ts +6 -0
- package/dist/src/core/controller-loop.js +240 -74
- package/dist/src/core/controller-loop.js.map +1 -1
- package/dist/src/core/run-status.d.ts +50 -0
- package/dist/src/core/run-status.js +169 -0
- package/dist/src/core/run-status.js.map +1 -0
- package/dist/src/core/state-machine.d.ts +2 -1
- package/dist/src/core/state-machine.js +22 -1
- package/dist/src/core/state-machine.js.map +1 -1
- package/dist/src/jobs/status.d.ts +6 -0
- package/dist/src/jobs/status.js.map +1 -1
- package/dist/src/jobs/supervisor.d.ts +2 -0
- package/dist/src/jobs/supervisor.js +44 -12
- package/dist/src/jobs/supervisor.js.map +1 -1
- package/dist/src/protocol/types.d.ts +1 -1
- package/dist/src/protocol/validate-command.js +18 -0
- package/dist/src/protocol/validate-command.js.map +1 -1
- package/dist/src/router/resolver.js +7 -1
- package/dist/src/router/resolver.js.map +1 -1
- package/dist/src/runners/process-runner.d.ts +2 -2
- package/dist/src/runners/process-runner.js +56 -5
- package/dist/src/runners/process-runner.js.map +1 -1
- package/dist/src/runners/runner-adapter.d.ts +9 -2
- package/dist/src/runners/runner-adapter.js.map +1 -1
- package/dist/src/state/cancellation.d.ts +42 -0
- package/dist/src/state/cancellation.js +160 -0
- package/dist/src/state/cancellation.js.map +1 -0
- package/dist/src/state/paths.d.ts +3 -0
- package/dist/src/state/paths.js +3 -0
- package/dist/src/state/paths.js.map +1 -1
- package/dist/src/state/runtime-lease.d.ts +28 -0
- package/dist/src/state/runtime-lease.js +179 -0
- package/dist/src/state/runtime-lease.js.map +1 -0
- package/dist/src/version.d.ts +1 -1
- package/dist/src/version.js +1 -1
- package/docs/compatibility.md +3 -1
- package/docs/controller-protocol.md +4 -2
- package/docs/runner-contract.md +7 -1
- package/docs/state-and-recovery.md +34 -9
- package/package.json +3 -2
- package/schemas/controller-observation.schema.json +1 -1
- package/scripts/validate-plugin.mjs +66 -0
- package/skills/cueline/SKILL.md +33 -5
|
@@ -25,7 +25,7 @@ export class ProcessRunner {
|
|
|
25
25
|
this.registry = registry;
|
|
26
26
|
this.#environment = { ...(options.environment ?? runtimeEnvironment()) };
|
|
27
27
|
}
|
|
28
|
-
async run(spec) {
|
|
28
|
+
async run(spec, hooks = {}) {
|
|
29
29
|
if (this.#environment.CUELINE_DEPTH !== undefined || spec.env?.CUELINE_DEPTH !== undefined) {
|
|
30
30
|
throw new CueLineError("NESTED_ROUTING_REJECTED", "nested CueLine routing is not allowed");
|
|
31
31
|
}
|
|
@@ -42,8 +42,27 @@ export class ProcessRunner {
|
|
|
42
42
|
if (registered.executable !== executable) {
|
|
43
43
|
throw new CueLineError("RUNNER_EXECUTABLE_UNREGISTERED", "argv executable registration did not match");
|
|
44
44
|
}
|
|
45
|
-
|
|
46
|
-
|
|
45
|
+
const startedAt = new Date().toISOString();
|
|
46
|
+
if (spec.signal?.aborted) {
|
|
47
|
+
const finishedAt = new Date().toISOString();
|
|
48
|
+
return {
|
|
49
|
+
status: "cancelled",
|
|
50
|
+
exitCode: null,
|
|
51
|
+
stdout: "",
|
|
52
|
+
stderr: "",
|
|
53
|
+
output: "",
|
|
54
|
+
emptyOutput: true,
|
|
55
|
+
timedOut: false,
|
|
56
|
+
cancelled: true,
|
|
57
|
+
ambiguousSideEffects: false,
|
|
58
|
+
retryable: false,
|
|
59
|
+
startedAt,
|
|
60
|
+
finishedAt,
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
let spawnedPid;
|
|
64
|
+
let cancelSpawned;
|
|
65
|
+
const completion = new Promise((resolve) => {
|
|
47
66
|
const environment = {
|
|
48
67
|
...this.#environment,
|
|
49
68
|
...spec.env,
|
|
@@ -52,6 +71,7 @@ export class ProcessRunner {
|
|
|
52
71
|
let stdout = "";
|
|
53
72
|
let stderr = "";
|
|
54
73
|
let timedOut = false;
|
|
74
|
+
let cancelled = false;
|
|
55
75
|
let settled = false;
|
|
56
76
|
let timeoutTimer;
|
|
57
77
|
let forceKillTimer;
|
|
@@ -66,6 +86,7 @@ export class ProcessRunner {
|
|
|
66
86
|
if (forceKillTimer !== undefined) {
|
|
67
87
|
clearTimeout(forceKillTimer);
|
|
68
88
|
}
|
|
89
|
+
spec.signal?.removeEventListener("abort", cancel);
|
|
69
90
|
const output = combineOutput(stdout, stderr);
|
|
70
91
|
resolve({
|
|
71
92
|
status,
|
|
@@ -75,6 +96,7 @@ export class ProcessRunner {
|
|
|
75
96
|
output,
|
|
76
97
|
emptyOutput: output.length === 0,
|
|
77
98
|
timedOut,
|
|
99
|
+
cancelled,
|
|
78
100
|
ambiguousSideEffects: spec.mode === "work" && status !== "succeeded",
|
|
79
101
|
retryable: false,
|
|
80
102
|
startedAt,
|
|
@@ -82,6 +104,14 @@ export class ProcessRunner {
|
|
|
82
104
|
});
|
|
83
105
|
};
|
|
84
106
|
let child;
|
|
107
|
+
const cancel = () => {
|
|
108
|
+
if (settled || cancelled)
|
|
109
|
+
return;
|
|
110
|
+
cancelled = true;
|
|
111
|
+
child.kill("SIGTERM");
|
|
112
|
+
forceKillTimer = setTimeout(() => child.kill("SIGKILL"), 250);
|
|
113
|
+
};
|
|
114
|
+
cancelSpawned = cancel;
|
|
85
115
|
try {
|
|
86
116
|
child = spawn(executable, [...spec.argv.slice(1)], {
|
|
87
117
|
cwd: spec.cwd,
|
|
@@ -95,6 +125,8 @@ export class ProcessRunner {
|
|
|
95
125
|
finish("failed", null);
|
|
96
126
|
return;
|
|
97
127
|
}
|
|
128
|
+
spawnedPid = child.pid;
|
|
129
|
+
spec.signal?.addEventListener("abort", cancel, { once: true });
|
|
98
130
|
timeoutTimer = setTimeout(() => {
|
|
99
131
|
timedOut = true;
|
|
100
132
|
child.kill("SIGTERM");
|
|
@@ -113,12 +145,31 @@ export class ProcessRunner {
|
|
|
113
145
|
}
|
|
114
146
|
child.once("error", (error) => {
|
|
115
147
|
stderr += errorText(error);
|
|
116
|
-
finish("failed", null);
|
|
148
|
+
finish(cancelled ? (spec.mode === "work" ? "ambiguous" : "cancelled") : "failed", null);
|
|
117
149
|
});
|
|
118
150
|
child.once("close", (exitCode) => {
|
|
119
|
-
finish(
|
|
151
|
+
finish(cancelled
|
|
152
|
+
? spec.mode === "work"
|
|
153
|
+
? "ambiguous"
|
|
154
|
+
: "cancelled"
|
|
155
|
+
: timedOut
|
|
156
|
+
? "timed_out"
|
|
157
|
+
: exitCode === 0
|
|
158
|
+
? "succeeded"
|
|
159
|
+
: "failed", exitCode);
|
|
120
160
|
});
|
|
121
161
|
});
|
|
162
|
+
if (spawnedPid !== undefined) {
|
|
163
|
+
try {
|
|
164
|
+
await hooks.onSpawn?.(spawnedPid);
|
|
165
|
+
}
|
|
166
|
+
catch (error) {
|
|
167
|
+
cancelSpawned?.();
|
|
168
|
+
await completion;
|
|
169
|
+
throw error;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
return completion;
|
|
122
173
|
}
|
|
123
174
|
}
|
|
124
175
|
//# sourceMappingURL=process-runner.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"process-runner.js","sourceRoot":"","sources":["../../../src/runners/process-runner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAqB,MAAM,oBAAoB,CAAC;AAE9D,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"process-runner.js","sourceRoot":"","sources":["../../../src/runners/process-runner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAqB,MAAM,oBAAoB,CAAC;AAE9D,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAOxD,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAM/C,SAAS,aAAa,CAAC,MAAc,EAAE,MAAc;IACnD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,OAAO,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,GAAG,MAAM,EAAE,CAAC,CAAC,CAAC,GAAG,MAAM,KAAK,MAAM,EAAE,CAAC;AAC/E,CAAC;AAED,SAAS,SAAS,CAAC,KAAc;IAC/B,OAAO,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAChE,CAAC;AAED;;;GAGG;AACH,MAAM,OAAO,aAAa;IAIL,QAAQ;IAHlB,YAAY,CAAoB;IAEzC,YACmB,QAAwB,EACzC,OAAO,GAAyB,EAAE;wBADjB,QAAQ;QAGzB,IAAI,CAAC,YAAY,GAAG,EAAE,GAAG,CAAC,OAAO,CAAC,WAAW,IAAI,kBAAkB,EAAE,CAAC,EAAE,CAAC;IAC3E,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,IAAgB,EAAE,KAAK,GAAmB,EAAE;QACpD,IAAI,IAAI,CAAC,YAAY,CAAC,aAAa,KAAK,SAAS,IAAI,IAAI,CAAC,GAAG,EAAE,aAAa,KAAK,SAAS,EAAE,CAAC;YAC3F,MAAM,IAAI,YAAY,CAAC,yBAAyB,EAAE,uCAAuC,CAAC,CAAC;QAC7F,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,SAAS,IAAI,CAAC,EAAE,CAAC;YAC5D,MAAM,IAAI,YAAY,CAAC,yBAAyB,EAAE,kDAAkD,EAAE;gBACpG,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE;aACvC,CAAC,CAAC;QACL,CAAC;QAED,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACxD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAChC,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;YAC7B,MAAM,IAAI,YAAY,CAAC,qBAAqB,EAAE,8CAA8C,CAAC,CAAC;QAChG,CAAC;QACD,IAAI,UAAU,CAAC,UAAU,KAAK,UAAU,EAAE,CAAC;YACzC,MAAM,IAAI,YAAY,CAAC,gCAAgC,EAAE,4CAA4C,CAAC,CAAC;QACzG,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAC3C,IAAI,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC;YACzB,MAAM,UAAU,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;YAC5C,OAAO;gBACL,MAAM,EAAE,WAAW;gBACnB,QAAQ,EAAE,IAAI;gBACd,MAAM,EAAE,EAAE;gBACV,MAAM,EAAE,EAAE;gBACV,MAAM,EAAE,EAAE;gBACV,WAAW,EAAE,IAAI;gBACjB,QAAQ,EAAE,KAAK;gBACf,SAAS,EAAE,IAAI;gBACf,oBAAoB,EAAE,KAAK;gBAC3B,SAAS,EAAE,KAAK;gBAChB,SAAS;gBACT,UAAU;aACX,CAAC;QACJ,CAAC;QAED,IAAI,UAA8B,CAAC;QACnC,IAAI,aAAuC,CAAC;QAC5C,MAAM,UAAU,GAAG,IAAI,OAAO,CAAY,CAAC,OAAO,EAAE,EAAE;YACpD,MAAM,WAAW,GAAsB;gBACrC,GAAG,IAAI,CAAC,YAAY;gBACpB,GAAG,IAAI,CAAC,GAAG;gBACX,aAAa,EAAE,GAAG;aACnB,CAAC;YACF,IAAI,MAAM,GAAG,EAAE,CAAC;YAChB,IAAI,MAAM,GAAG,EAAE,CAAC;YAChB,IAAI,QAAQ,GAAG,KAAK,CAAC;YACrB,IAAI,SAAS,GAAG,KAAK,CAAC;YACtB,IAAI,OAAO,GAAG,KAAK,CAAC;YACpB,IAAI,YAAuD,CAAC;YAC5D,IAAI,cAAyD,CAAC;YAE9D,MAAM,MAAM,GAAG,CAAC,MAA2B,EAAE,QAAuB,EAAQ,EAAE;gBAC5E,IAAI,OAAO,EAAE,CAAC;oBACZ,OAAO;gBACT,CAAC;gBACD,OAAO,GAAG,IAAI,CAAC;gBACf,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;oBAC/B,YAAY,CAAC,YAAY,CAAC,CAAC;gBAC7B,CAAC;gBACD,IAAI,cAAc,KAAK,SAAS,EAAE,CAAC;oBACjC,YAAY,CAAC,cAAc,CAAC,CAAC;gBAC/B,CAAC;gBACD,IAAI,CAAC,MAAM,EAAE,mBAAmB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;gBAClD,MAAM,MAAM,GAAG,aAAa,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;gBAC7C,OAAO,CAAC;oBACN,MAAM;oBACN,QAAQ;oBACR,MAAM;oBACN,MAAM;oBACN,MAAM;oBACN,WAAW,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC;oBAChC,QAAQ;oBACR,SAAS;oBACT,oBAAoB,EAAE,IAAI,CAAC,IAAI,KAAK,MAAM,IAAI,MAAM,KAAK,WAAW;oBACpE,SAAS,EAAE,KAAK;oBAChB,SAAS;oBACT,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;iBACrC,CAAC,CAAC;YACL,CAAC,CAAC;YAEF,IAAI,KAAmB,CAAC;YACxB,MAAM,MAAM,GAAG,GAAS,EAAE;gBACxB,IAAI,OAAO,IAAI,SAAS;oBAAE,OAAO;gBACjC,SAAS,GAAG,IAAI,CAAC;gBACjB,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBACtB,cAAc,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,CAAC,CAAC;YAChE,CAAC,CAAC;YACF,aAAa,GAAG,MAAM,CAAC;YACvB,IAAI,CAAC;gBACH,KAAK,GAAG,KAAK,CAAC,UAAU,EAAE,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE;oBACjD,GAAG,EAAE,IAAI,CAAC,GAAG;oBACb,GAAG,EAAE,WAAW;oBAChB,KAAK,EAAE,KAAK;oBACZ,KAAK,EAAE,CAAC,IAAI,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;iBACtE,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;gBAC1B,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;gBACvB,OAAO;YACT,CAAC;YAED,UAAU,GAAG,KAAK,CAAC,GAAG,CAAC;YACvB,IAAI,CAAC,MAAM,EAAE,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;YAE/D,YAAY,GAAG,UAAU,CAAC,GAAG,EAAE;gBAC7B,QAAQ,GAAG,IAAI,CAAC;gBAChB,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBACtB,cAAc,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,CAAC,CAAC;YAChE,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;YAEnB,KAAK,CAAC,MAAM,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;YAClC,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,KAAsB,EAAE,EAAE;gBAClD,MAAM,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;YAC7B,CAAC,CAAC,CAAC;YACH,KAAK,CAAC,MAAM,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;YAClC,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,KAAsB,EAAE,EAAE;gBAClD,MAAM,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;YAC7B,CAAC,CAAC,CAAC;YACH,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;gBAC7B,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;YACvC,CAAC;YACD,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;gBAC5B,MAAM,IAAI,SAAS,CAAC,KAAK,CAAC,CAAC;gBAC3B,MAAM,CACJ,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,EACzE,IAAI,CACL,CAAC;YACJ,CAAC,CAAC,CAAC;YACH,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,EAAE;gBAC/B,MAAM,CACJ,SAAS;oBACP,CAAC,CAAC,IAAI,CAAC,IAAI,KAAK,MAAM;wBACpB,CAAC,CAAC,WAAW;wBACb,CAAC,CAAC,WAAW;oBACf,CAAC,CAAC,QAAQ;wBACR,CAAC,CAAC,WAAW;wBACb,CAAC,CAAC,QAAQ,KAAK,CAAC;4BACd,CAAC,CAAC,WAAW;4BACb,CAAC,CAAC,QAAQ,EAChB,QAAQ,CACT,CAAC;YACJ,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QACH,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;YAC7B,IAAI,CAAC;gBACH,MAAM,KAAK,CAAC,OAAO,EAAE,CAAC,UAAU,CAAC,CAAC;YACpC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,aAAa,EAAE,EAAE,CAAC;gBAClB,MAAM,UAAU,CAAC;gBACjB,MAAM,KAAK,CAAC;YACd,CAAC;QACH,CAAC;QACD,OAAO,UAAU,CAAC;IACpB,CAAC;CACF"}
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import type { JobMode } from "../protocol/types.js";
|
|
2
2
|
export type JobExecution = "foreground" | "background";
|
|
3
|
-
export type JobResultStatus = "succeeded" | "failed" | "timed_out" | "ambiguous";
|
|
3
|
+
export type JobResultStatus = "succeeded" | "failed" | "timed_out" | "cancelled" | "ambiguous";
|
|
4
4
|
export interface RunnerSpec {
|
|
5
5
|
jobId: string;
|
|
6
|
+
runId?: string;
|
|
7
|
+
jobKey?: string;
|
|
6
8
|
argv: readonly string[];
|
|
7
9
|
stdin?: string;
|
|
8
10
|
mode: JobMode;
|
|
@@ -12,6 +14,7 @@ export interface RunnerSpec {
|
|
|
12
14
|
task?: string;
|
|
13
15
|
cwd?: string;
|
|
14
16
|
env?: NodeJS.ProcessEnv;
|
|
17
|
+
signal?: AbortSignal;
|
|
15
18
|
}
|
|
16
19
|
export interface JobResult {
|
|
17
20
|
status: JobResultStatus;
|
|
@@ -21,12 +24,16 @@ export interface JobResult {
|
|
|
21
24
|
output: string;
|
|
22
25
|
emptyOutput: boolean;
|
|
23
26
|
timedOut: boolean;
|
|
27
|
+
cancelled: boolean;
|
|
24
28
|
ambiguousSideEffects: boolean;
|
|
25
29
|
retryable: false;
|
|
26
30
|
startedAt: string;
|
|
27
31
|
finishedAt: string;
|
|
28
32
|
}
|
|
33
|
+
export interface RunnerRunHooks {
|
|
34
|
+
onSpawn?(pid: number): void | Promise<void>;
|
|
35
|
+
}
|
|
29
36
|
export interface RunnerAdapter {
|
|
30
|
-
run(spec: RunnerSpec): Promise<JobResult>;
|
|
37
|
+
run(spec: RunnerSpec, hooks?: RunnerRunHooks): Promise<JobResult>;
|
|
31
38
|
}
|
|
32
39
|
export declare function executionFor(spec: Pick<RunnerSpec, "background">): JobExecution;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runner-adapter.js","sourceRoot":"","sources":["../../../src/runners/runner-adapter.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"runner-adapter.js","sourceRoot":"","sources":["../../../src/runners/runner-adapter.ts"],"names":[],"mappings":"AAiDA,MAAM,UAAU,YAAY,CAAC,IAAoC;IAC/D,OAAO,IAAI,CAAC,UAAU,KAAK,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC;AAChE,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
declare const CANCELLATION_PROTOCOL = "cueline/cancellation/0.1";
|
|
2
|
+
export interface RunCancellationRequest {
|
|
3
|
+
protocol: typeof CANCELLATION_PROTOCOL;
|
|
4
|
+
run_id: string;
|
|
5
|
+
target: "run";
|
|
6
|
+
reason: string;
|
|
7
|
+
requested_at: string;
|
|
8
|
+
}
|
|
9
|
+
export interface JobCancellationRequest {
|
|
10
|
+
protocol: typeof CANCELLATION_PROTOCOL;
|
|
11
|
+
run_id: string;
|
|
12
|
+
target: "job";
|
|
13
|
+
job_id: string;
|
|
14
|
+
reason: string;
|
|
15
|
+
requested_at: string;
|
|
16
|
+
}
|
|
17
|
+
export interface CancellationObservation {
|
|
18
|
+
runRequested: boolean;
|
|
19
|
+
jobRequests: string[];
|
|
20
|
+
}
|
|
21
|
+
export interface CancellationWatcherOptions {
|
|
22
|
+
home: string;
|
|
23
|
+
runId: string;
|
|
24
|
+
intervalMs?: number;
|
|
25
|
+
onRun(request: RunCancellationRequest): void | Promise<void>;
|
|
26
|
+
onJob(request: JobCancellationRequest): void | Promise<void>;
|
|
27
|
+
onError(error: unknown): void;
|
|
28
|
+
}
|
|
29
|
+
export declare function requestRunCancellation(home: string, runId: string, reason: string, now?: () => Date): Promise<RunCancellationRequest>;
|
|
30
|
+
export declare function requestJobCancellation(home: string, runId: string, jobId: string, reason: string, now?: () => Date): Promise<JobCancellationRequest>;
|
|
31
|
+
export declare function readRunCancellation(home: string, runId: string): Promise<RunCancellationRequest | undefined>;
|
|
32
|
+
export declare function readJobCancellations(home: string, runId: string): Promise<JobCancellationRequest[]>;
|
|
33
|
+
export declare function readCancellationObservation(home: string, runId: string): Promise<CancellationObservation>;
|
|
34
|
+
export declare class CancellationWatcher {
|
|
35
|
+
#private;
|
|
36
|
+
private readonly options;
|
|
37
|
+
constructor(options: CancellationWatcherOptions);
|
|
38
|
+
start(): void;
|
|
39
|
+
stop(): Promise<void>;
|
|
40
|
+
private poll;
|
|
41
|
+
}
|
|
42
|
+
export {};
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
import { readdir, readFile } from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { CueLineError } from "../core/errors.js";
|
|
4
|
+
import { atomicWriteJson } from "./atomic-write.js";
|
|
5
|
+
import { runPaths } from "./paths.js";
|
|
6
|
+
const CANCELLATION_PROTOCOL = "cueline/cancellation/0.1";
|
|
7
|
+
const JOB_ID_PATTERN = /^[A-Za-z0-9][A-Za-z0-9_-]*$/;
|
|
8
|
+
function assertJobId(jobId) {
|
|
9
|
+
if (!JOB_ID_PATTERN.test(jobId)) {
|
|
10
|
+
throw new CueLineError("JOB_ID_INVALID", "job id contains unsupported path characters", {
|
|
11
|
+
details: { jobId },
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
function isNotFound(error) {
|
|
16
|
+
return typeof error === "object" && error !== null && "code" in error && error.code === "ENOENT";
|
|
17
|
+
}
|
|
18
|
+
function parseRequest(source, runId) {
|
|
19
|
+
const value = JSON.parse(source);
|
|
20
|
+
if (value.protocol !== CANCELLATION_PROTOCOL ||
|
|
21
|
+
value.run_id !== runId ||
|
|
22
|
+
(value.target !== "run" && value.target !== "job") ||
|
|
23
|
+
typeof value.reason !== "string" ||
|
|
24
|
+
value.reason.trim() === "" ||
|
|
25
|
+
typeof value.requested_at !== "string" ||
|
|
26
|
+
(value.target === "job" &&
|
|
27
|
+
(typeof value.job_id !== "string" || !JOB_ID_PATTERN.test(value.job_id)))) {
|
|
28
|
+
throw new CueLineError("CANCELLATION_REQUEST_INVALID", `CueLine run '${runId}' has an invalid cancellation request.`);
|
|
29
|
+
}
|
|
30
|
+
if (value.target === "run") {
|
|
31
|
+
return {
|
|
32
|
+
protocol: CANCELLATION_PROTOCOL,
|
|
33
|
+
run_id: runId,
|
|
34
|
+
target: "run",
|
|
35
|
+
reason: value.reason,
|
|
36
|
+
requested_at: value.requested_at,
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
return {
|
|
40
|
+
protocol: CANCELLATION_PROTOCOL,
|
|
41
|
+
run_id: runId,
|
|
42
|
+
target: "job",
|
|
43
|
+
job_id: value.job_id,
|
|
44
|
+
reason: value.reason,
|
|
45
|
+
requested_at: value.requested_at,
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
export async function requestRunCancellation(home, runId, reason, now = () => new Date()) {
|
|
49
|
+
const request = {
|
|
50
|
+
protocol: CANCELLATION_PROTOCOL,
|
|
51
|
+
run_id: runId,
|
|
52
|
+
target: "run",
|
|
53
|
+
reason,
|
|
54
|
+
requested_at: now().toISOString(),
|
|
55
|
+
};
|
|
56
|
+
await atomicWriteJson(runPaths(home, runId).runCancellation, request);
|
|
57
|
+
return request;
|
|
58
|
+
}
|
|
59
|
+
export async function requestJobCancellation(home, runId, jobId, reason, now = () => new Date()) {
|
|
60
|
+
assertJobId(jobId);
|
|
61
|
+
const request = {
|
|
62
|
+
protocol: CANCELLATION_PROTOCOL,
|
|
63
|
+
run_id: runId,
|
|
64
|
+
target: "job",
|
|
65
|
+
job_id: jobId,
|
|
66
|
+
reason,
|
|
67
|
+
requested_at: now().toISOString(),
|
|
68
|
+
};
|
|
69
|
+
await atomicWriteJson(path.join(runPaths(home, runId).jobCancellationsDir, `${jobId}.json`), request);
|
|
70
|
+
return request;
|
|
71
|
+
}
|
|
72
|
+
export async function readRunCancellation(home, runId) {
|
|
73
|
+
try {
|
|
74
|
+
const request = parseRequest(await readFile(runPaths(home, runId).runCancellation, "utf8"), runId);
|
|
75
|
+
if (request.target !== "run") {
|
|
76
|
+
throw new CueLineError("CANCELLATION_REQUEST_INVALID", `CueLine run '${runId}' has a job request in its run cancellation path.`);
|
|
77
|
+
}
|
|
78
|
+
return request;
|
|
79
|
+
}
|
|
80
|
+
catch (error) {
|
|
81
|
+
if (isNotFound(error))
|
|
82
|
+
return undefined;
|
|
83
|
+
throw error;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
export async function readJobCancellations(home, runId) {
|
|
87
|
+
const directory = runPaths(home, runId).jobCancellationsDir;
|
|
88
|
+
let names;
|
|
89
|
+
try {
|
|
90
|
+
names = await readdir(directory);
|
|
91
|
+
}
|
|
92
|
+
catch (error) {
|
|
93
|
+
if (isNotFound(error))
|
|
94
|
+
return [];
|
|
95
|
+
throw error;
|
|
96
|
+
}
|
|
97
|
+
const requests = [];
|
|
98
|
+
for (const name of names.filter((candidate) => candidate.endsWith(".json")).sort()) {
|
|
99
|
+
const request = parseRequest(await readFile(path.join(directory, name), "utf8"), runId);
|
|
100
|
+
if (request.target !== "job") {
|
|
101
|
+
throw new CueLineError("CANCELLATION_REQUEST_INVALID", `CueLine run '${runId}' has a run request in its job cancellation directory.`);
|
|
102
|
+
}
|
|
103
|
+
requests.push(request);
|
|
104
|
+
}
|
|
105
|
+
return requests;
|
|
106
|
+
}
|
|
107
|
+
export async function readCancellationObservation(home, runId) {
|
|
108
|
+
const [runRequest, jobRequests] = await Promise.all([
|
|
109
|
+
readRunCancellation(home, runId),
|
|
110
|
+
readJobCancellations(home, runId),
|
|
111
|
+
]);
|
|
112
|
+
return {
|
|
113
|
+
runRequested: runRequest !== undefined,
|
|
114
|
+
jobRequests: jobRequests.map((request) => request.job_id),
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
export class CancellationWatcher {
|
|
118
|
+
options;
|
|
119
|
+
#seenJobs = new Set();
|
|
120
|
+
#sawRun = false;
|
|
121
|
+
#timer;
|
|
122
|
+
#pollChain = Promise.resolve();
|
|
123
|
+
constructor(options) {
|
|
124
|
+
this.options = options;
|
|
125
|
+
}
|
|
126
|
+
start() {
|
|
127
|
+
if (this.#timer !== undefined)
|
|
128
|
+
return;
|
|
129
|
+
const schedule = () => {
|
|
130
|
+
this.#pollChain = this.#pollChain.then(() => this.poll()).catch((error) => {
|
|
131
|
+
this.options.onError(error);
|
|
132
|
+
});
|
|
133
|
+
};
|
|
134
|
+
schedule();
|
|
135
|
+
this.#timer = setInterval(schedule, this.options.intervalMs ?? 250);
|
|
136
|
+
this.#timer.unref();
|
|
137
|
+
}
|
|
138
|
+
async stop() {
|
|
139
|
+
if (this.#timer !== undefined)
|
|
140
|
+
clearInterval(this.#timer);
|
|
141
|
+
this.#timer = undefined;
|
|
142
|
+
await this.#pollChain;
|
|
143
|
+
}
|
|
144
|
+
async poll() {
|
|
145
|
+
if (!this.#sawRun) {
|
|
146
|
+
const request = await readRunCancellation(this.options.home, this.options.runId);
|
|
147
|
+
if (request !== undefined) {
|
|
148
|
+
this.#sawRun = true;
|
|
149
|
+
await this.options.onRun(request);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
for (const request of await readJobCancellations(this.options.home, this.options.runId)) {
|
|
153
|
+
if (this.#seenJobs.has(request.job_id))
|
|
154
|
+
continue;
|
|
155
|
+
this.#seenJobs.add(request.job_id);
|
|
156
|
+
await this.options.onJob(request);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
//# sourceMappingURL=cancellation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cancellation.js","sourceRoot":"","sources":["../../../src/state/cancellation.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,6 +3,9 @@ export interface RunPaths {
|
|
|
3
3
|
runsDir: string;
|
|
4
4
|
runDir: string;
|
|
5
5
|
events: string;
|
|
6
|
+
runtimeLease: string;
|
|
7
|
+
runCancellation: string;
|
|
8
|
+
jobCancellationsDir: string;
|
|
6
9
|
snapshot: string;
|
|
7
10
|
}
|
|
8
11
|
export declare function defaultCueLineHome(environment?: NodeJS.ProcessEnv): string;
|
package/dist/src/state/paths.js
CHANGED
|
@@ -31,6 +31,9 @@ export function runPaths(home, runId) {
|
|
|
31
31
|
runsDir,
|
|
32
32
|
runDir,
|
|
33
33
|
events: path.join(runDir, "events.jsonl"),
|
|
34
|
+
runtimeLease: path.join(runDir, "runtime.json"),
|
|
35
|
+
runCancellation: path.join(runDir, "cancel.json"),
|
|
36
|
+
jobCancellationsDir: path.join(runDir, "job-cancellations"),
|
|
34
37
|
snapshot: path.join(runDir, "snapshot.json"),
|
|
35
38
|
};
|
|
36
39
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../../../src/state/paths.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAElC,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAExD,MAAM,cAAc,GAAG,oCAAoC,CAAC;
|
|
1
|
+
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../../../src/state/paths.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAElC,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAExD,MAAM,cAAc,GAAG,oCAAoC,CAAC;AAa5D,MAAM,UAAU,kBAAkB,CAAC,WAAW,GAAsB,kBAAkB,EAAE;IACtF,MAAM,UAAU,GAAG,WAAW,CAAC,YAAY,CAAC;IAC5C,MAAM,QAAQ,GAAG,WAAW,CAAC,IAAI,IAAI,OAAO,EAAE,CAAC;IAC/C,IAAI,CAAC,UAAU,IAAI,UAAU,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QAC5C,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;IAC5C,CAAC;IACD,IAAI,UAAU,KAAK,GAAG,EAAE,CAAC;QACvB,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAChC,CAAC;IACD,IAAI,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;QAC/B,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACrD,CAAC;IACD,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,IAAY,EAAE,KAAa;IAClD,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAChC,MAAM,IAAI,KAAK,CAAC,oBAAoB,KAAK,GAAG,CAAC,CAAC;IAChD,CAAC;IACD,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACxC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;IAChD,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IACzC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QAC3C,MAAM,IAAI,KAAK,CAAC,oBAAoB,KAAK,GAAG,CAAC,CAAC;IAChD,CAAC;IACD,OAAO;QACL,IAAI,EAAE,YAAY;QAClB,OAAO;QACP,MAAM;QACN,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,cAAc,CAAC;QACzC,YAAY,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,cAAc,CAAC;QAC/C,eAAe,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,aAAa,CAAC;QACjD,mBAAmB,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,mBAAmB,CAAC;QAC3D,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,eAAe,CAAC;KAC7C,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export type RuntimeOwnership = "active" | "stale" | "released" | "missing" | "invalid";
|
|
2
|
+
export interface RuntimeLeaseObservation {
|
|
3
|
+
ownership: RuntimeOwnership;
|
|
4
|
+
heartbeatAt?: string;
|
|
5
|
+
ageMs?: number;
|
|
6
|
+
ownerId?: string;
|
|
7
|
+
pid?: string;
|
|
8
|
+
}
|
|
9
|
+
export interface RuntimeLeaseOptions {
|
|
10
|
+
home: string;
|
|
11
|
+
runId: string;
|
|
12
|
+
now?: () => Date;
|
|
13
|
+
heartbeatIntervalMs?: number;
|
|
14
|
+
staleAfterMs?: number;
|
|
15
|
+
}
|
|
16
|
+
export declare function readRuntimeLease(home: string, runId: string, options?: {
|
|
17
|
+
now?: () => Date;
|
|
18
|
+
staleAfterMs?: number;
|
|
19
|
+
}): Promise<RuntimeLeaseObservation>;
|
|
20
|
+
export declare class RuntimeLease {
|
|
21
|
+
#private;
|
|
22
|
+
private constructor();
|
|
23
|
+
static claim(options: RuntimeLeaseOptions): Promise<RuntimeLease>;
|
|
24
|
+
private startHeartbeat;
|
|
25
|
+
private heartbeat;
|
|
26
|
+
assertHealthy(): void;
|
|
27
|
+
release(): Promise<void>;
|
|
28
|
+
}
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import { open, readFile, unlink } from "node:fs/promises";
|
|
3
|
+
import { CueLineError } from "../core/errors.js";
|
|
4
|
+
import { canonicalJson } from "../core/ids.js";
|
|
5
|
+
import { runtimePidTag } from "../core/runtime.js";
|
|
6
|
+
import { atomicWriteJson } from "./atomic-write.js";
|
|
7
|
+
import { runPaths } from "./paths.js";
|
|
8
|
+
const LEASE_PROTOCOL = "cueline/runtime-lease/0.1";
|
|
9
|
+
const DEFAULT_HEARTBEAT_INTERVAL_MS = 5_000;
|
|
10
|
+
const DEFAULT_STALE_AFTER_MS = 20_000;
|
|
11
|
+
function isNotFound(error) {
|
|
12
|
+
return typeof error === "object" && error !== null && "code" in error && error.code === "ENOENT";
|
|
13
|
+
}
|
|
14
|
+
function parseLease(source, runId) {
|
|
15
|
+
const value = JSON.parse(source);
|
|
16
|
+
if (value.protocol !== LEASE_PROTOCOL ||
|
|
17
|
+
value.run_id !== runId ||
|
|
18
|
+
typeof value.owner_id !== "string" ||
|
|
19
|
+
typeof value.pid !== "string" ||
|
|
20
|
+
(value.state !== "active" && value.state !== "released") ||
|
|
21
|
+
typeof value.claimed_at !== "string" ||
|
|
22
|
+
typeof value.heartbeat_at !== "string") {
|
|
23
|
+
throw new Error("RUNTIME_LEASE_INVALID");
|
|
24
|
+
}
|
|
25
|
+
return value;
|
|
26
|
+
}
|
|
27
|
+
async function readLeaseRecord(home, runId) {
|
|
28
|
+
try {
|
|
29
|
+
return parseLease(await readFile(runPaths(home, runId).runtimeLease, "utf8"), runId);
|
|
30
|
+
}
|
|
31
|
+
catch (error) {
|
|
32
|
+
if (isNotFound(error))
|
|
33
|
+
return undefined;
|
|
34
|
+
throw error;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
export async function readRuntimeLease(home, runId, options = {}) {
|
|
38
|
+
let record;
|
|
39
|
+
try {
|
|
40
|
+
record = await readLeaseRecord(home, runId);
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
return { ownership: "invalid" };
|
|
44
|
+
}
|
|
45
|
+
if (!record)
|
|
46
|
+
return { ownership: "missing" };
|
|
47
|
+
if (record.state === "released") {
|
|
48
|
+
return {
|
|
49
|
+
ownership: "released",
|
|
50
|
+
heartbeatAt: record.heartbeat_at,
|
|
51
|
+
ownerId: record.owner_id,
|
|
52
|
+
pid: record.pid,
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
const now = options.now ?? (() => new Date());
|
|
56
|
+
const ageMs = Math.max(0, now().getTime() - Date.parse(record.heartbeat_at));
|
|
57
|
+
const ownership = Number.isFinite(ageMs) && ageMs <= (options.staleAfterMs ?? DEFAULT_STALE_AFTER_MS)
|
|
58
|
+
? "active"
|
|
59
|
+
: "stale";
|
|
60
|
+
return {
|
|
61
|
+
ownership,
|
|
62
|
+
heartbeatAt: record.heartbeat_at,
|
|
63
|
+
ageMs,
|
|
64
|
+
ownerId: record.owner_id,
|
|
65
|
+
pid: record.pid,
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
async function createExclusiveLease(target, record) {
|
|
69
|
+
let handle;
|
|
70
|
+
try {
|
|
71
|
+
handle = await open(target, "wx", 0o600);
|
|
72
|
+
await handle.writeFile(`${canonicalJson(record)}\n`, "utf8");
|
|
73
|
+
await handle.sync();
|
|
74
|
+
}
|
|
75
|
+
finally {
|
|
76
|
+
await handle?.close();
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
export class RuntimeLease {
|
|
80
|
+
#target;
|
|
81
|
+
#now;
|
|
82
|
+
#heartbeatIntervalMs;
|
|
83
|
+
#record;
|
|
84
|
+
#timer;
|
|
85
|
+
#writeChain = Promise.resolve();
|
|
86
|
+
#heartbeatError;
|
|
87
|
+
constructor(target, record, now, heartbeatIntervalMs) {
|
|
88
|
+
this.#target = target;
|
|
89
|
+
this.#record = record;
|
|
90
|
+
this.#now = now;
|
|
91
|
+
this.#heartbeatIntervalMs = heartbeatIntervalMs;
|
|
92
|
+
}
|
|
93
|
+
static async claim(options) {
|
|
94
|
+
const now = options.now ?? (() => new Date());
|
|
95
|
+
const observation = await readRuntimeLease(options.home, options.runId, {
|
|
96
|
+
now,
|
|
97
|
+
...(options.staleAfterMs === undefined ? {} : { staleAfterMs: options.staleAfterMs }),
|
|
98
|
+
});
|
|
99
|
+
if (observation.ownership === "active") {
|
|
100
|
+
throw new CueLineError("RUN_ALREADY_ACTIVE", `CueLine run '${options.runId}' already has an active runtime lease.`);
|
|
101
|
+
}
|
|
102
|
+
if (observation.ownership === "stale") {
|
|
103
|
+
throw new CueLineError("RUN_STALE_REQUIRES_TAKEOVER", `CueLine run '${options.runId}' has a stale runtime lease; explicit recovery is required.`);
|
|
104
|
+
}
|
|
105
|
+
if (observation.ownership === "invalid") {
|
|
106
|
+
throw new CueLineError("RUNTIME_LEASE_INVALID", `CueLine run '${options.runId}' has an unreadable runtime lease.`);
|
|
107
|
+
}
|
|
108
|
+
const target = runPaths(options.home, options.runId).runtimeLease;
|
|
109
|
+
if (observation.ownership === "released")
|
|
110
|
+
await unlink(target).catch(() => undefined);
|
|
111
|
+
const timestamp = now().toISOString();
|
|
112
|
+
const record = {
|
|
113
|
+
protocol: LEASE_PROTOCOL,
|
|
114
|
+
run_id: options.runId,
|
|
115
|
+
owner_id: randomUUID(),
|
|
116
|
+
pid: runtimePidTag(),
|
|
117
|
+
state: "active",
|
|
118
|
+
claimed_at: timestamp,
|
|
119
|
+
heartbeat_at: timestamp,
|
|
120
|
+
};
|
|
121
|
+
try {
|
|
122
|
+
await createExclusiveLease(target, record);
|
|
123
|
+
}
|
|
124
|
+
catch (error) {
|
|
125
|
+
if (typeof error === "object" && error !== null && "code" in error && error.code === "EEXIST") {
|
|
126
|
+
throw new CueLineError("RUN_ALREADY_ACTIVE", `CueLine run '${options.runId}' was claimed by another runtime.`, { cause: error });
|
|
127
|
+
}
|
|
128
|
+
throw error;
|
|
129
|
+
}
|
|
130
|
+
const lease = new RuntimeLease(target, record, now, options.heartbeatIntervalMs ?? DEFAULT_HEARTBEAT_INTERVAL_MS);
|
|
131
|
+
lease.startHeartbeat();
|
|
132
|
+
return lease;
|
|
133
|
+
}
|
|
134
|
+
startHeartbeat() {
|
|
135
|
+
this.#timer = setInterval(() => {
|
|
136
|
+
this.#writeChain = this.#writeChain.then(async () => {
|
|
137
|
+
try {
|
|
138
|
+
await this.heartbeat();
|
|
139
|
+
}
|
|
140
|
+
catch (error) {
|
|
141
|
+
this.#heartbeatError = error;
|
|
142
|
+
}
|
|
143
|
+
});
|
|
144
|
+
}, this.#heartbeatIntervalMs);
|
|
145
|
+
this.#timer.unref();
|
|
146
|
+
}
|
|
147
|
+
async heartbeat() {
|
|
148
|
+
const current = parseLease(await readFile(this.#target, "utf8"), this.#record.run_id);
|
|
149
|
+
if (!current || current.owner_id !== this.#record.owner_id || current.state !== "active") {
|
|
150
|
+
throw new CueLineError("RUNTIME_LEASE_LOST", `CueLine run '${this.#record.run_id}' runtime lease ownership changed.`);
|
|
151
|
+
}
|
|
152
|
+
this.#record = { ...this.#record, heartbeat_at: this.#now().toISOString() };
|
|
153
|
+
await atomicWriteJson(this.#target, this.#record);
|
|
154
|
+
}
|
|
155
|
+
assertHealthy() {
|
|
156
|
+
if (this.#heartbeatError === undefined)
|
|
157
|
+
return;
|
|
158
|
+
throw new CueLineError("RUNTIME_LEASE_HEARTBEAT_FAILED", `CueLine run '${this.#record.run_id}' runtime lease heartbeat failed.`, { cause: this.#heartbeatError });
|
|
159
|
+
}
|
|
160
|
+
async release() {
|
|
161
|
+
if (this.#timer !== undefined)
|
|
162
|
+
clearInterval(this.#timer);
|
|
163
|
+
await this.#writeChain;
|
|
164
|
+
const current = await readFile(this.#target, "utf8")
|
|
165
|
+
.then((source) => parseLease(source, this.#record.run_id))
|
|
166
|
+
.catch(() => undefined);
|
|
167
|
+
if (!current || current.owner_id !== this.#record.owner_id)
|
|
168
|
+
return;
|
|
169
|
+
const timestamp = this.#now().toISOString();
|
|
170
|
+
this.#record = {
|
|
171
|
+
...this.#record,
|
|
172
|
+
state: "released",
|
|
173
|
+
heartbeat_at: timestamp,
|
|
174
|
+
released_at: timestamp,
|
|
175
|
+
};
|
|
176
|
+
await atomicWriteJson(this.#target, this.#record);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
//# sourceMappingURL=runtime-lease.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime-lease.js","sourceRoot":"","sources":["../../../src/state/runtime-lease.ts"],"names":[],"mappings":"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"}
|
package/dist/src/version.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare const CUELINE_VERSION = "0.1.
|
|
1
|
+
export declare const CUELINE_VERSION = "0.1.3";
|