@sift-wiki/conductor 0.2.0-beta.1 → 0.2.0-beta.2
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/dist/adapters/claudeAgent.js +1 -0
- package/dist/adapters/claudeAgent.js.map +1 -1
- package/dist/adapters/codexAgent.js +1 -0
- package/dist/adapters/codexAgent.js.map +1 -1
- package/dist/adapters/fakeAgent.js +1 -0
- package/dist/adapters/fakeAgent.js.map +1 -1
- package/dist/adapters/httpAgent.js +1 -0
- package/dist/adapters/httpAgent.js.map +1 -1
- package/dist/adapters/processAgent.js +4 -0
- package/dist/adapters/processAgent.js.map +1 -1
- package/dist/adapters/provider/runProvider.js +4 -0
- package/dist/adapters/provider/runProvider.js.map +1 -1
- package/dist/adapters/provider/store.js +3 -4
- package/dist/adapters/provider/store.js.map +1 -1
- package/dist/adapters/types.d.ts +9 -0
- package/dist/cli.d.ts +6 -0
- package/dist/cli.js +16 -4
- package/dist/cli.js.map +1 -1
- package/dist/conductorClient.d.ts +56 -19
- package/dist/conductorClient.js +91 -40
- package/dist/conductorClient.js.map +1 -1
- package/dist/config.js +4 -5
- package/dist/config.js.map +1 -1
- package/dist/daemon.d.ts +19 -6
- package/dist/daemon.js +160 -122
- package/dist/daemon.js.map +1 -1
- package/dist/desktop/app/controller.d.ts +1 -1
- package/dist/desktop/app/runtimeController.d.ts +7 -0
- package/dist/desktop/app/runtimeController.js +12 -1
- package/dist/desktop/app/runtimeController.js.map +1 -1
- package/dist/localApi/contracts.d.ts +15 -4
- package/dist/localApi/contracts.js +19 -1
- package/dist/localApi/contracts.js.map +1 -1
- package/dist/localApi/recovery.d.ts +66 -0
- package/dist/localApi/recovery.js +115 -0
- package/dist/localApi/recovery.js.map +1 -0
- package/dist/localApi/server.js +3 -1
- package/dist/localApi/server.js.map +1 -1
- package/dist/localApp/service.js +16 -4
- package/dist/localApp/service.js.map +1 -1
- package/dist/protocol/fenced.d.ts +135 -0
- package/dist/protocol/fenced.js +142 -0
- package/dist/protocol/fenced.js.map +1 -0
- package/dist/redaction.js +2 -0
- package/dist/redaction.js.map +1 -1
- package/dist/runtime/atomicFile.d.ts +6 -0
- package/dist/runtime/atomicFile.js +78 -0
- package/dist/runtime/atomicFile.js.map +1 -0
- package/dist/runtime/daemonCapabilities.d.ts +7 -0
- package/dist/runtime/daemonCapabilities.js +24 -0
- package/dist/runtime/daemonCapabilities.js.map +1 -0
- package/dist/runtime/eventOutbox.d.ts +100 -0
- package/dist/runtime/eventOutbox.js +206 -0
- package/dist/runtime/eventOutbox.js.map +1 -0
- package/dist/runtime/executionJournal.d.ts +102 -0
- package/dist/runtime/executionJournal.js +209 -0
- package/dist/runtime/executionJournal.js.map +1 -0
- package/dist/runtime/executionSafety.d.ts +76 -0
- package/dist/runtime/executionSafety.js +207 -0
- package/dist/runtime/executionSafety.js.map +1 -0
- package/dist/runtime/fencedExecutionState.d.ts +43 -0
- package/dist/runtime/fencedExecutionState.js +158 -0
- package/dist/runtime/fencedExecutionState.js.map +1 -0
- package/dist/runtime/leaseManager.d.ts +38 -0
- package/dist/runtime/leaseManager.js +102 -0
- package/dist/runtime/leaseManager.js.map +1 -0
- package/dist/runtime/localRunQueue.d.ts +1 -1
- package/dist/runtime/localRunQueue.js +8 -0
- package/dist/runtime/localRunQueue.js.map +1 -1
- package/dist/runtime/localSessionCache.d.ts +1 -1
- package/dist/runtime/localSessionCache.js.map +1 -1
- package/dist/runtime/process.d.ts +13 -1
- package/dist/runtime/process.js +39 -9
- package/dist/runtime/process.js.map +1 -1
- package/dist/runtime/recoveryCoordinator.d.ts +19 -0
- package/dist/runtime/recoveryCoordinator.js +183 -0
- package/dist/runtime/recoveryCoordinator.js.map +1 -0
- package/dist/runtime/runtimeLock.d.ts +33 -0
- package/dist/runtime/runtimeLock.js +140 -0
- package/dist/runtime/runtimeLock.js.map +1 -0
- package/dist/runtime/runtimeService.d.ts +6 -1
- package/dist/runtime/runtimeService.js +54 -20
- package/dist/runtime/runtimeService.js.map +1 -1
- package/dist/runtime/taskExecution.d.ts +2 -0
- package/dist/runtime/taskExecution.js +18 -12
- package/dist/runtime/taskExecution.js.map +1 -1
- package/dist/types.d.ts +28 -13
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/dist/workTypes.d.ts +5 -5
- package/dist-web/assets/index-CWAdDb9V.js +72 -0
- package/dist-web/index.html +2 -2
- package/package.json +1 -1
- package/dist-web/assets/index-D5X9InfE.js +0 -72
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import { ConductorApiError } from "../conductorClient.js";
|
|
3
|
+
import { redactSecrets } from "../redaction.js";
|
|
4
|
+
import { JOURNAL_SCHEMA_VERSION, } from "./executionJournal.js";
|
|
5
|
+
export class FencedExecutionState {
|
|
6
|
+
journal;
|
|
7
|
+
store;
|
|
8
|
+
outbox;
|
|
9
|
+
now;
|
|
10
|
+
eventChain = Promise.resolve();
|
|
11
|
+
updateChain = Promise.resolve();
|
|
12
|
+
constructor(journal, store, outbox, now) {
|
|
13
|
+
this.journal = journal;
|
|
14
|
+
this.store = store;
|
|
15
|
+
this.outbox = outbox;
|
|
16
|
+
this.now = now;
|
|
17
|
+
}
|
|
18
|
+
static async create(input) {
|
|
19
|
+
const now = input.now ?? (() => new Date());
|
|
20
|
+
const accessMode = input.adapter?.capabilities["accessProfile"] === "inspect" ? "inspect" : "write";
|
|
21
|
+
const journal = {
|
|
22
|
+
schemaVersion: JOURNAL_SCHEMA_VERSION,
|
|
23
|
+
attemptId: input.job.authority.attemptId,
|
|
24
|
+
jobId: input.job.id,
|
|
25
|
+
runId: input.job.runId,
|
|
26
|
+
...(input.job.wakeEnvelope?.task.id === undefined && input.job.taskRecordId === undefined
|
|
27
|
+
? {}
|
|
28
|
+
: { taskRecordId: input.job.wakeEnvelope?.task.id ?? input.job.taskRecordId }),
|
|
29
|
+
localKey: input.job.localKey,
|
|
30
|
+
adapterType: input.job.adapterType,
|
|
31
|
+
authority: input.job.authority,
|
|
32
|
+
accessMode,
|
|
33
|
+
phase: "claimed",
|
|
34
|
+
leaseHealth: "healthy",
|
|
35
|
+
provider: { resumeSupported: input.adapter?.resumeSupport === "session" },
|
|
36
|
+
lastAcknowledgedClientSequence: 0,
|
|
37
|
+
nextClientSequence: 1,
|
|
38
|
+
settlementIdempotencyKey: (input.createId ?? randomUUID)(),
|
|
39
|
+
updatedAt: now().toISOString(),
|
|
40
|
+
};
|
|
41
|
+
await input.store.write(journal);
|
|
42
|
+
return new FencedExecutionState(journal, input.store, input.outbox, now);
|
|
43
|
+
}
|
|
44
|
+
authority() {
|
|
45
|
+
return this.journal.authority;
|
|
46
|
+
}
|
|
47
|
+
accessMode() {
|
|
48
|
+
return this.journal.accessMode;
|
|
49
|
+
}
|
|
50
|
+
settlementOptions() {
|
|
51
|
+
return {
|
|
52
|
+
authority: this.journal.authority,
|
|
53
|
+
idempotencyKey: this.journal.settlementIdempotencyKey,
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
async updateAuthority(authority) {
|
|
57
|
+
await this.update({ authority, leaseHealth: "healthy" });
|
|
58
|
+
}
|
|
59
|
+
async updateLeaseHealth(leaseHealth) {
|
|
60
|
+
await this.update({ leaseHealth });
|
|
61
|
+
}
|
|
62
|
+
async updatePhase(phase, interruptionReason) {
|
|
63
|
+
await this.update({
|
|
64
|
+
phase,
|
|
65
|
+
...(interruptionReason === undefined ? {} : { interruptionReason }),
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
async recordProcessIdentity(processIdentity) {
|
|
69
|
+
await this.update({
|
|
70
|
+
provider: {
|
|
71
|
+
...this.journal.provider,
|
|
72
|
+
processIdentity,
|
|
73
|
+
},
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
async recordProviderSession(sessionId) {
|
|
77
|
+
await this.update({
|
|
78
|
+
provider: {
|
|
79
|
+
...this.journal.provider,
|
|
80
|
+
sessionId: redactSecrets(sessionId).slice(0, 500),
|
|
81
|
+
},
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
async recordNoProgress(observedAt) {
|
|
85
|
+
await this.update({ noProgressObservedAt: observedAt });
|
|
86
|
+
}
|
|
87
|
+
async recordTerminal(status, summary, phase = "terminal") {
|
|
88
|
+
await this.update({
|
|
89
|
+
phase,
|
|
90
|
+
terminalResult: {
|
|
91
|
+
status,
|
|
92
|
+
summary: boundedSummary(summary),
|
|
93
|
+
},
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
emit(deliver, event) {
|
|
97
|
+
const operation = this.eventChain.then(() => this.emitInSequence(deliver, event));
|
|
98
|
+
this.eventChain = operation.catch(() => undefined);
|
|
99
|
+
return operation;
|
|
100
|
+
}
|
|
101
|
+
async emitInSequence(deliver, event) {
|
|
102
|
+
const sequence = this.journal.nextClientSequence;
|
|
103
|
+
const entry = await this.outbox.enqueue({
|
|
104
|
+
attemptId: this.journal.attemptId,
|
|
105
|
+
runId: this.journal.runId,
|
|
106
|
+
authority: this.journal.authority,
|
|
107
|
+
clientSequence: sequence,
|
|
108
|
+
event,
|
|
109
|
+
});
|
|
110
|
+
await this.update({
|
|
111
|
+
nextClientSequence: sequence + 1,
|
|
112
|
+
...(event.eventType === "progress"
|
|
113
|
+
? { lastProgressAt: this.now().toISOString(), noProgressObservedAt: undefined }
|
|
114
|
+
: {}),
|
|
115
|
+
});
|
|
116
|
+
try {
|
|
117
|
+
const response = await deliver({
|
|
118
|
+
...event,
|
|
119
|
+
clientEventId: entry.clientEventId,
|
|
120
|
+
clientSequence: entry.clientSequence,
|
|
121
|
+
authority: this.journal.authority,
|
|
122
|
+
});
|
|
123
|
+
const acknowledged = response.acknowledgedClientSequence;
|
|
124
|
+
if (acknowledged === undefined) {
|
|
125
|
+
throw new Error("Fenced event response omitted acknowledgedClientSequence.");
|
|
126
|
+
}
|
|
127
|
+
await this.outbox.acknowledge(this.journal.attemptId, acknowledged);
|
|
128
|
+
await this.update({
|
|
129
|
+
lastAcknowledgedClientSequence: Math.max(this.journal.lastAcknowledgedClientSequence, acknowledged),
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
catch (error) {
|
|
133
|
+
await this.outbox.recordFailure(entry.clientEventId, error, Date.now() + 1_000);
|
|
134
|
+
if (error instanceof ConductorApiError && error.disposition === "retryable")
|
|
135
|
+
return;
|
|
136
|
+
throw error;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
async update(update) {
|
|
140
|
+
const operation = this.updateChain.then(async () => {
|
|
141
|
+
const next = {
|
|
142
|
+
...this.journal,
|
|
143
|
+
...update,
|
|
144
|
+
updatedAt: this.now().toISOString(),
|
|
145
|
+
};
|
|
146
|
+
await this.store.write(next);
|
|
147
|
+
this.journal = next;
|
|
148
|
+
});
|
|
149
|
+
this.updateChain = operation.catch(() => undefined);
|
|
150
|
+
await operation;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
function boundedSummary(summary) {
|
|
154
|
+
const value = summary["summary"];
|
|
155
|
+
const text = typeof value === "string" ? value : "Local provider produced a terminal result.";
|
|
156
|
+
return redactSecrets(text).slice(0, 4_000);
|
|
157
|
+
}
|
|
158
|
+
//# sourceMappingURL=fencedExecutionState.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fencedExecutionState.js","sourceRoot":"","sources":["../../src/runtime/fencedExecutionState.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { AttemptAuthority } from "../protocol/fenced.js";
|
|
2
|
+
import type { LeaseRefresh } from "../types.js";
|
|
3
|
+
import type { Sleep } from "../adapters/types.js";
|
|
4
|
+
export type LeaseHealth = "healthy" | "retrying" | "authority-uncertain" | "lost";
|
|
5
|
+
export type LeaseManagerOptions = {
|
|
6
|
+
safetyMarginMs?: number | undefined;
|
|
7
|
+
baseRetryMs?: number | undefined;
|
|
8
|
+
maxRetryMs?: number | undefined;
|
|
9
|
+
gapToleranceMs?: number | undefined;
|
|
10
|
+
nowMs?: (() => number) | undefined;
|
|
11
|
+
monotonicNowMs?: (() => number) | undefined;
|
|
12
|
+
random?: (() => number) | undefined;
|
|
13
|
+
sleep: Sleep;
|
|
14
|
+
onHealth?: ((health: LeaseHealth) => Promise<void> | void) | undefined;
|
|
15
|
+
};
|
|
16
|
+
export declare class LeaseAuthorityError extends Error {
|
|
17
|
+
readonly reason: "authority_uncertain" | "sleep_gap" | "authority_lost";
|
|
18
|
+
readonly name = "LeaseAuthorityError";
|
|
19
|
+
constructor(reason: "authority_uncertain" | "sleep_gap" | "authority_lost", message: string);
|
|
20
|
+
}
|
|
21
|
+
export declare class LeaseManager {
|
|
22
|
+
private readonly options;
|
|
23
|
+
private readonly safetyMarginMs;
|
|
24
|
+
private readonly baseRetryMs;
|
|
25
|
+
private readonly maxRetryMs;
|
|
26
|
+
private readonly gapToleranceMs;
|
|
27
|
+
private readonly nowMs;
|
|
28
|
+
private readonly monotonicNowMs;
|
|
29
|
+
private readonly random;
|
|
30
|
+
constructor(options: LeaseManagerOptions);
|
|
31
|
+
renew(input: {
|
|
32
|
+
authority: AttemptAuthority;
|
|
33
|
+
refresh(): Promise<LeaseRefresh>;
|
|
34
|
+
signal?: AbortSignal | undefined;
|
|
35
|
+
}): Promise<LeaseRefresh>;
|
|
36
|
+
private assertWithinAuthority;
|
|
37
|
+
}
|
|
38
|
+
export declare function authoritySafetyDeadline(authority: AttemptAuthority, safetyMarginMs: number): number;
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { ConductorApiError } from "../conductorClient.js";
|
|
2
|
+
export class LeaseAuthorityError extends Error {
|
|
3
|
+
reason;
|
|
4
|
+
name = "LeaseAuthorityError";
|
|
5
|
+
constructor(reason, message) {
|
|
6
|
+
super(message);
|
|
7
|
+
this.reason = reason;
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
export class LeaseManager {
|
|
11
|
+
options;
|
|
12
|
+
safetyMarginMs;
|
|
13
|
+
baseRetryMs;
|
|
14
|
+
maxRetryMs;
|
|
15
|
+
gapToleranceMs;
|
|
16
|
+
nowMs;
|
|
17
|
+
monotonicNowMs;
|
|
18
|
+
random;
|
|
19
|
+
constructor(options) {
|
|
20
|
+
this.options = options;
|
|
21
|
+
this.safetyMarginMs = positive(options.safetyMarginMs, 3_000);
|
|
22
|
+
this.baseRetryMs = positive(options.baseRetryMs, 250);
|
|
23
|
+
this.maxRetryMs = positive(options.maxRetryMs, 5_000);
|
|
24
|
+
this.gapToleranceMs = positive(options.gapToleranceMs, 2_000);
|
|
25
|
+
this.nowMs = options.nowMs ?? Date.now;
|
|
26
|
+
this.monotonicNowMs = options.monotonicNowMs ?? (() => performance.now());
|
|
27
|
+
this.random = options.random ?? Math.random;
|
|
28
|
+
}
|
|
29
|
+
async renew(input) {
|
|
30
|
+
let attempt = 0;
|
|
31
|
+
const safetyDeadline = authoritySafetyDeadline(input.authority, this.safetyMarginMs);
|
|
32
|
+
for (;;) {
|
|
33
|
+
this.assertWithinAuthority(safetyDeadline);
|
|
34
|
+
try {
|
|
35
|
+
const refresh = await input.refresh();
|
|
36
|
+
const authority = requireRefreshedAuthority(input.authority, refresh);
|
|
37
|
+
if (this.nowMs() >= authoritySafetyDeadline(authority, this.safetyMarginMs)) {
|
|
38
|
+
throw new LeaseAuthorityError("authority_uncertain", "Sift returned lease authority without a safe local execution window.");
|
|
39
|
+
}
|
|
40
|
+
await this.options.onHealth?.("healthy");
|
|
41
|
+
return refresh;
|
|
42
|
+
}
|
|
43
|
+
catch (error) {
|
|
44
|
+
if (error instanceof LeaseAuthorityError)
|
|
45
|
+
throw error;
|
|
46
|
+
if (!retryable(error)) {
|
|
47
|
+
await this.options.onHealth?.("lost");
|
|
48
|
+
throw new LeaseAuthorityError("authority_lost", "Sift definitively rejected the current execution authority.");
|
|
49
|
+
}
|
|
50
|
+
await this.options.onHealth?.("retrying");
|
|
51
|
+
const delay = retryDelay(attempt, this.baseRetryMs, this.maxRetryMs, this.random);
|
|
52
|
+
attempt += 1;
|
|
53
|
+
const remaining = safetyDeadline - this.nowMs();
|
|
54
|
+
if (remaining <= 0 || delay >= remaining) {
|
|
55
|
+
await this.options.onHealth?.("authority-uncertain");
|
|
56
|
+
throw new LeaseAuthorityError("authority_uncertain", "Lease renewal could not be confirmed before the authority safety deadline.");
|
|
57
|
+
}
|
|
58
|
+
const before = this.monotonicNowMs();
|
|
59
|
+
await this.options.sleep(delay, input.signal);
|
|
60
|
+
const elapsed = this.monotonicNowMs() - before;
|
|
61
|
+
if (elapsed > delay + this.gapToleranceMs) {
|
|
62
|
+
await this.options.onHealth?.("authority-uncertain");
|
|
63
|
+
throw new LeaseAuthorityError("sleep_gap", "A system sleep or timer gap made the prior lease authority uncertain.");
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
assertWithinAuthority(safetyDeadline) {
|
|
69
|
+
if (this.nowMs() >= safetyDeadline) {
|
|
70
|
+
throw new LeaseAuthorityError("authority_uncertain", "Known lease authority reached its local safety deadline.");
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
export function authoritySafetyDeadline(authority, safetyMarginMs) {
|
|
75
|
+
const leaseExpiresAt = Date.parse(authority.leaseExpiresAt);
|
|
76
|
+
const mustStopAt = Date.parse(authority.mustStopAt);
|
|
77
|
+
if (!Number.isFinite(leaseExpiresAt) || !Number.isFinite(mustStopAt)) {
|
|
78
|
+
throw new LeaseAuthorityError("authority_lost", "Sift returned an invalid authority deadline.");
|
|
79
|
+
}
|
|
80
|
+
return Math.min(leaseExpiresAt, mustStopAt) - Math.max(0, safetyMarginMs);
|
|
81
|
+
}
|
|
82
|
+
function requireRefreshedAuthority(previous, refresh) {
|
|
83
|
+
const next = refresh.authority;
|
|
84
|
+
if (next === undefined) {
|
|
85
|
+
throw new LeaseAuthorityError("authority_uncertain", "Fenced lease renewal omitted refreshed authority.");
|
|
86
|
+
}
|
|
87
|
+
if (next.attemptId !== previous.attemptId || next.leaseGeneration !== previous.leaseGeneration) {
|
|
88
|
+
throw new LeaseAuthorityError("authority_lost", "Fenced lease renewal changed attempt identity or generation without reconciliation.");
|
|
89
|
+
}
|
|
90
|
+
return next;
|
|
91
|
+
}
|
|
92
|
+
function retryable(error) {
|
|
93
|
+
return error instanceof ConductorApiError && error.disposition === "retryable";
|
|
94
|
+
}
|
|
95
|
+
function retryDelay(attempt, baseRetryMs, maxRetryMs, random) {
|
|
96
|
+
const cap = Math.min(maxRetryMs, baseRetryMs * 2 ** Math.min(attempt, 20));
|
|
97
|
+
return Math.max(1, Math.floor(cap * (0.5 + Math.max(0, Math.min(1, random())) * 0.5)));
|
|
98
|
+
}
|
|
99
|
+
function positive(value, fallback) {
|
|
100
|
+
return value === undefined || !Number.isFinite(value) || value <= 0 ? fallback : value;
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=leaseManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"leaseManager.js","sourceRoot":"","sources":["../../src/runtime/leaseManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { LocalRuntimeSession } from "./localSessionCache.js";
|
|
2
2
|
import type { ClaimedJob, JsonObject } from "../types.js";
|
|
3
|
-
export type LocalRunQueueStatus = "claimed" | "starting" | "running" | "stopping" | "stopped" | "failed" | "completed" | "cancelled";
|
|
3
|
+
export type LocalRunQueueStatus = "claimed" | "starting" | "running" | "stopping" | "stopped" | "failed" | "completed" | "cancelled" | "recovering" | "interrupted" | "overtime" | "superseded";
|
|
4
4
|
export type LocalRunQueueItem = {
|
|
5
5
|
runId: string;
|
|
6
6
|
jobId: string;
|
|
@@ -59,6 +59,14 @@ function phaseFromStatus(status) {
|
|
|
59
59
|
return "Completed";
|
|
60
60
|
case "cancelled":
|
|
61
61
|
return "Cancelled";
|
|
62
|
+
case "recovering":
|
|
63
|
+
return "Recovering with Sift";
|
|
64
|
+
case "interrupted":
|
|
65
|
+
return "Interrupted";
|
|
66
|
+
case "overtime":
|
|
67
|
+
return "Stopped at deadline";
|
|
68
|
+
case "superseded":
|
|
69
|
+
return "Replaced by another attempt";
|
|
62
70
|
}
|
|
63
71
|
}
|
|
64
72
|
function buildSiftLinks(input) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"localRunQueue.js","sourceRoot":"","sources":["../../src/runtime/localRunQueue.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"localRunQueue.js","sourceRoot":"","sources":["../../src/runtime/localRunQueue.ts"],"names":[],"mappings":"AA0CA,MAAM,UAAU,wBAAwB,CAAC,KAIxC;IACC,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC;IACxC,MAAM,IAAI,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAChC,MAAM,MAAM,GAAG,iBAAiB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAChD,MAAM,MAAM,GAAG,QAAQ,EAAE,IAAI,CAAC,EAAE,IAAI,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC;IAC3D,OAAO;QACL,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK;QACtB,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE;QACnB,gBAAgB,EAAE,KAAK,CAAC,GAAG,CAAC,gBAAgB;QAC5C,QAAQ,EAAE,KAAK,CAAC,GAAG,CAAC,QAAQ;QAC5B,WAAW,EAAE,KAAK,CAAC,GAAG,CAAC,WAAW;QAClC,MAAM;QACN,KAAK,EAAE,eAAe,CAAC,MAAM,CAAC;QAC9B,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,GAAG,CAAC,SAAS;QACxC,WAAW,EAAE,QAAQ,EAAE,WAAW,IAAI,KAAK,CAAC,GAAG,CAAC,WAAW;QAC3D,MAAM,EAAE,QAAQ,EAAE,MAAM,IAAI,KAAK,CAAC,GAAG,CAAC,MAAM;QAC5C,UAAU,EAAE,QAAQ,EAAE,IAAI,CAAC,MAAM;QACjC,UAAU,EAAE,QAAQ,EAAE,IAAI,CAAC,MAAM;QACjC,MAAM;QACN,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,gBAAgB,EAAE,KAAK,CAAC,OAAO,EAAE,gBAAgB;QACjD,eAAe,EAAE,KAAK,CAAC,OAAO,EAAE,eAAe,IAAI,KAAK;QACxD,SAAS,EAAE,KAAK,CAAC,OAAO,EAAE,SAAS;QACnC,SAAS,EAAE,cAAc,CAAC;YACxB,OAAO,EAAE,KAAK,CAAC,cAAc;YAC7B,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK;YACtB,MAAM;SACP,CAAC;KACH,CAAC;AACJ,CAAC;AAED,SAAS,QAAQ,CAAC,QAAsC;IAItD,MAAM,IAAI,GAAG,QAAQ,EAAE,IAAI,CAAC;IAC5B,OAAO;QACL,KAAK,EAAE,OAAO,IAAI,EAAE,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS;QAC/D,QAAQ,EAAE,OAAO,IAAI,EAAE,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS;KACzE,CAAC;AACJ,CAAC;AAED,SAAS,iBAAiB,CAAC,OAAwC;IACjE,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC1B,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,OAAO,CAAC,MAAM,CAAC;AACxB,CAAC;AAED,SAAS,eAAe,CAAC,MAA2B;IAClD,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,SAAS;YACZ,OAAO,kBAAkB,CAAC;QAC5B,KAAK,UAAU;YACb,OAAO,wBAAwB,CAAC;QAClC,KAAK,SAAS;YACZ,OAAO,iBAAiB,CAAC;QAC3B,KAAK,UAAU;YACb,OAAO,UAAU,CAAC;QACpB,KAAK,SAAS;YACZ,OAAO,SAAS,CAAC;QACnB,KAAK,QAAQ;YACX,OAAO,QAAQ,CAAC;QAClB,KAAK,WAAW;YACd,OAAO,WAAW,CAAC;QACrB,KAAK,WAAW;YACd,OAAO,WAAW,CAAC;QACrB,KAAK,YAAY;YACf,OAAO,sBAAsB,CAAC;QAChC,KAAK,aAAa;YAChB,OAAO,aAAa,CAAC;QACvB,KAAK,UAAU;YACb,OAAO,qBAAqB,CAAC;QAC/B,KAAK,YAAY;YACf,OAAO,6BAA6B,CAAC;IACzC,CAAC;AACH,CAAC;AAED,SAAS,cAAc,CAAC,KAIvB;IACC,IAAI,KAAK,CAAC,OAAO,KAAK,SAAS,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9D,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IAChD,OAAO;QACL,OAAO,EAAE,GAAG,IAAI,SAAS,kBAAkB,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE;QAC1D,GAAG,CAAC,KAAK,CAAC,MAAM,KAAK,SAAS;YAC5B,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC,EAAE,QAAQ,EAAE,GAAG,IAAI,UAAU,kBAAkB,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;KACvE,CAAC;AACJ,CAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { JsonObject } from "../types.js";
|
|
2
|
-
export type LocalRuntimeSessionStatus = "starting" | "running" | "stopping" | "stopped" | "failed" | "completed" | "cancelled";
|
|
2
|
+
export type LocalRuntimeSessionStatus = "starting" | "running" | "stopping" | "stopped" | "failed" | "completed" | "cancelled" | "recovering" | "interrupted" | "overtime" | "superseded";
|
|
3
3
|
export type LocalRuntimeSession = {
|
|
4
4
|
runId: string;
|
|
5
5
|
adapterType: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"localSessionCache.js","sourceRoot":"","sources":["../../src/runtime/localSessionCache.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"localSessionCache.js","sourceRoot":"","sources":["../../src/runtime/localSessionCache.ts"],"names":[],"mappings":"AAgCA,MAAM,OAAO,wBAAwB;IAClB,QAAQ,GAAG,IAAI,GAAG,EAA+B,CAAC;IAEnE,MAAM,CAAC,OAA4B;QACjC,MAAM,IAAI,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;QACnC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QACpC,OAAO,YAAY,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC;IAED,IAAI,CAAC,KAAa;QAChB,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACzC,OAAO,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;IACnE,CAAC;IAED,IAAI;QACF,OAAO,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;aAC/B,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;aACvC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC;IAC1E,CAAC;IAED,MAAM,CAAC,KAAa;QAClB,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACrC,CAAC;IAED,KAAK;QACH,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;IACxB,CAAC;CACF;AAED,SAAS,YAAY,CAAC,OAA4B;IAChD,OAAO;QACL,GAAG,OAAO;QACV,GAAG,CAAC,OAAO,CAAC,aAAa,KAAK,SAAS;YACrC,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC,EAAE,aAAa,EAAE,eAAe,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,CAAC;QAC9D,GAAG,CAAC,OAAO,CAAC,YAAY,KAAK,SAAS;YACpC,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC,EAAE,YAAY,EAAE,eAAe,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC;KAC7D,CAAC;AACJ,CAAC"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { type ChildProcess, type SpawnOptions } from "node:child_process";
|
|
2
|
+
import type { SafeProcessIdentity } from "./executionJournal.js";
|
|
2
3
|
export type ProcessLogStream = "stdout" | "stderr";
|
|
3
4
|
export type RunProcessInput = {
|
|
4
5
|
command: string;
|
|
@@ -11,6 +12,7 @@ export type RunProcessInput = {
|
|
|
11
12
|
outputLimitBytes: number;
|
|
12
13
|
signal: AbortSignal;
|
|
13
14
|
onLog(stream: ProcessLogStream, chunk: string): Promise<void>;
|
|
15
|
+
onStarted?: ((identity: SafeProcessIdentity) => Promise<void>) | undefined;
|
|
14
16
|
};
|
|
15
17
|
export type RunProcessResult = {
|
|
16
18
|
exitCode: number | null;
|
|
@@ -23,5 +25,15 @@ export type RunProcessResult = {
|
|
|
23
25
|
};
|
|
24
26
|
export type RunProcess = (input: RunProcessInput) => Promise<RunProcessResult>;
|
|
25
27
|
export type SpawnLike = (command: string, args: string[], options: SpawnOptions) => ChildProcess;
|
|
26
|
-
export
|
|
28
|
+
export type ProcessTreeTerminator = (input: {
|
|
29
|
+
child: ChildProcess;
|
|
30
|
+
processGroupId: number | null;
|
|
31
|
+
signal: NodeJS.Signals;
|
|
32
|
+
}) => void;
|
|
33
|
+
export declare function createProcessRunner(spawn?: SpawnLike, terminate?: ProcessTreeTerminator, readStartMarker?: (pid: number) => Promise<string | undefined>): RunProcess;
|
|
27
34
|
export declare const runChildProcess: RunProcess;
|
|
35
|
+
export declare function processTreeTerminationCapability(platform?: NodeJS.Platform): {
|
|
36
|
+
supported: boolean;
|
|
37
|
+
mechanism: "process-group" | "taskkill-tree";
|
|
38
|
+
};
|
|
39
|
+
export declare function windowsTaskkillArgs(pid: number, signal: NodeJS.Signals): string[];
|
package/dist/runtime/process.js
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
|
-
import { spawn as nodeSpawn } from "node:child_process";
|
|
1
|
+
import { execFile, spawn as nodeSpawn, } from "node:child_process";
|
|
2
2
|
import { Buffer } from "node:buffer";
|
|
3
|
-
|
|
4
|
-
|
|
3
|
+
import { readProcessStartMarker } from "./runtimeLock.js";
|
|
4
|
+
export function createProcessRunner(spawn = nodeSpawn, terminate = terminateProcessTree, readStartMarker = readProcessStartMarker) {
|
|
5
|
+
return (input) => runChildProcessWithSpawn(input, spawn, terminate, readStartMarker);
|
|
5
6
|
}
|
|
6
7
|
export const runChildProcess = createProcessRunner();
|
|
7
|
-
async function runChildProcessWithSpawn(input, spawn) {
|
|
8
|
+
async function runChildProcessWithSpawn(input, spawn, terminate, readStartMarker) {
|
|
8
9
|
return new Promise((resolve, reject) => {
|
|
9
10
|
const child = spawn(input.command, input.args, {
|
|
10
11
|
cwd: input.cwd,
|
|
@@ -25,6 +26,7 @@ async function runChildProcessWithSpawn(input, spawn) {
|
|
|
25
26
|
let logChain = Promise.resolve();
|
|
26
27
|
let timeout;
|
|
27
28
|
let killTimeout;
|
|
29
|
+
const startPromise = recordProcessIdentity(child, input, readStartMarker);
|
|
28
30
|
const requestStop = (reason) => {
|
|
29
31
|
if (closed) {
|
|
30
32
|
return;
|
|
@@ -32,12 +34,13 @@ async function runChildProcessWithSpawn(input, spawn) {
|
|
|
32
34
|
if (reason === "timeout") {
|
|
33
35
|
timedOut = true;
|
|
34
36
|
}
|
|
35
|
-
|
|
37
|
+
terminate({ child, processGroupId, signal: "SIGTERM" });
|
|
36
38
|
killTimeout ??= setTimeout(() => {
|
|
37
|
-
|
|
39
|
+
terminate({ child, processGroupId, signal: "SIGKILL" });
|
|
38
40
|
}, Math.max(1, input.graceMs));
|
|
39
41
|
};
|
|
40
42
|
const onAbort = () => requestStop("abort");
|
|
43
|
+
void startPromise.catch(() => requestStop("abort"));
|
|
41
44
|
input.signal.addEventListener("abort", onAbort, { once: true });
|
|
42
45
|
if (input.signal.aborted) {
|
|
43
46
|
requestStop("abort");
|
|
@@ -69,7 +72,7 @@ async function runChildProcessWithSpawn(input, spawn) {
|
|
|
69
72
|
child.on("close", (code, closeSignal) => {
|
|
70
73
|
closed = true;
|
|
71
74
|
cleanup();
|
|
72
|
-
void logChain.
|
|
75
|
+
void Promise.all([logChain, startPromise]).then(() => {
|
|
73
76
|
resolve({
|
|
74
77
|
exitCode: code,
|
|
75
78
|
signal: closeSignal,
|
|
@@ -79,7 +82,7 @@ async function runChildProcessWithSpawn(input, spawn) {
|
|
|
79
82
|
pid: child.pid ?? null,
|
|
80
83
|
startedAt,
|
|
81
84
|
});
|
|
82
|
-
});
|
|
85
|
+
}).catch(reject);
|
|
83
86
|
});
|
|
84
87
|
function cleanup() {
|
|
85
88
|
input.signal.removeEventListener("abort", onAbort);
|
|
@@ -92,13 +95,22 @@ async function runChildProcessWithSpawn(input, spawn) {
|
|
|
92
95
|
}
|
|
93
96
|
});
|
|
94
97
|
}
|
|
98
|
+
async function recordProcessIdentity(child, input, readStartMarker) {
|
|
99
|
+
if (input.onStarted === undefined || child.pid === undefined || child.pid <= 0)
|
|
100
|
+
return;
|
|
101
|
+
const startMarker = await readStartMarker(child.pid);
|
|
102
|
+
if (startMarker === undefined)
|
|
103
|
+
return;
|
|
104
|
+
await input.onStarted({ pid: child.pid, startMarker });
|
|
105
|
+
}
|
|
95
106
|
function resolveProcessGroupId(child) {
|
|
96
107
|
if (process.platform === "win32") {
|
|
97
108
|
return null;
|
|
98
109
|
}
|
|
99
110
|
return typeof child.pid === "number" && child.pid > 0 ? child.pid : null;
|
|
100
111
|
}
|
|
101
|
-
function
|
|
112
|
+
function terminateProcessTree(input) {
|
|
113
|
+
const { child, processGroupId, signal } = input;
|
|
102
114
|
if (process.platform !== "win32" && processGroupId !== null) {
|
|
103
115
|
try {
|
|
104
116
|
process.kill(-processGroupId, signal);
|
|
@@ -108,10 +120,28 @@ function signalRunningProcess(child, processGroupId, signal) {
|
|
|
108
120
|
// Fall through to direct child signaling.
|
|
109
121
|
}
|
|
110
122
|
}
|
|
123
|
+
if (process.platform === "win32" && typeof child.pid === "number" && child.pid > 0) {
|
|
124
|
+
execFile("taskkill.exe", windowsTaskkillArgs(child.pid, signal), { windowsHide: true }, (error) => {
|
|
125
|
+
if (error !== null)
|
|
126
|
+
signalDirectChild(child, signal);
|
|
127
|
+
});
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
signalDirectChild(child, signal);
|
|
131
|
+
}
|
|
132
|
+
function signalDirectChild(child, signal) {
|
|
111
133
|
if (!child.killed) {
|
|
112
134
|
child.kill(signal);
|
|
113
135
|
}
|
|
114
136
|
}
|
|
137
|
+
export function processTreeTerminationCapability(platform = process.platform) {
|
|
138
|
+
return platform === "win32"
|
|
139
|
+
? { supported: true, mechanism: "taskkill-tree" }
|
|
140
|
+
: { supported: true, mechanism: "process-group" };
|
|
141
|
+
}
|
|
142
|
+
export function windowsTaskkillArgs(pid, signal) {
|
|
143
|
+
return ["/PID", String(pid), "/T", ...(signal === "SIGKILL" ? ["/F"] : [])];
|
|
144
|
+
}
|
|
115
145
|
function chunkToString(chunk) {
|
|
116
146
|
return Buffer.isBuffer(chunk) ? chunk.toString("utf8") : String(chunk);
|
|
117
147
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"process.js","sourceRoot":"","sources":["../../src/runtime/process.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"process.js","sourceRoot":"","sources":["../../src/runtime/process.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { LocalAgentAdapter } from "../adapters/types.js";
|
|
2
|
+
import type { ConductorClient, ConductorWorkClient } from "../types.js";
|
|
3
|
+
import type { DurableEventOutbox } from "./eventOutbox.js";
|
|
4
|
+
import type { ExecutionJournalStore } from "./executionJournal.js";
|
|
5
|
+
export type RecoverySummary = {
|
|
6
|
+
reconciledAttempts: number;
|
|
7
|
+
resumedAttempts: number;
|
|
8
|
+
closedAttempts: number;
|
|
9
|
+
canClaim: boolean;
|
|
10
|
+
};
|
|
11
|
+
export declare function reconcileUnfinishedAttempts(input: {
|
|
12
|
+
credential: string;
|
|
13
|
+
client: Pick<ConductorClient, "reconcileAttempt" | "appendRunEvent"> & Partial<Pick<ConductorClient, "acknowledgeCancellation">>;
|
|
14
|
+
workClient?: Pick<ConductorWorkClient, "setTaskDisposition"> | undefined;
|
|
15
|
+
journalStore: ExecutionJournalStore;
|
|
16
|
+
outbox: DurableEventOutbox;
|
|
17
|
+
adapters: LocalAgentAdapter[];
|
|
18
|
+
now?: (() => Date) | undefined;
|
|
19
|
+
}): Promise<RecoverySummary>;
|