@sift-wiki/conductor 0.2.0-beta.1 → 0.2.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.
Files changed (95) hide show
  1. package/dist/adapters/claudeAgent.js +1 -0
  2. package/dist/adapters/claudeAgent.js.map +1 -1
  3. package/dist/adapters/codexAgent.js +1 -0
  4. package/dist/adapters/codexAgent.js.map +1 -1
  5. package/dist/adapters/fakeAgent.js +1 -0
  6. package/dist/adapters/fakeAgent.js.map +1 -1
  7. package/dist/adapters/httpAgent.js +1 -0
  8. package/dist/adapters/httpAgent.js.map +1 -1
  9. package/dist/adapters/processAgent.js +4 -0
  10. package/dist/adapters/processAgent.js.map +1 -1
  11. package/dist/adapters/provider/runProvider.js +4 -0
  12. package/dist/adapters/provider/runProvider.js.map +1 -1
  13. package/dist/adapters/provider/store.js +3 -4
  14. package/dist/adapters/provider/store.js.map +1 -1
  15. package/dist/adapters/types.d.ts +9 -0
  16. package/dist/cli.d.ts +6 -0
  17. package/dist/cli.js +16 -4
  18. package/dist/cli.js.map +1 -1
  19. package/dist/conductorClient.d.ts +56 -19
  20. package/dist/conductorClient.js +91 -40
  21. package/dist/conductorClient.js.map +1 -1
  22. package/dist/config.js +4 -5
  23. package/dist/config.js.map +1 -1
  24. package/dist/daemon.d.ts +19 -6
  25. package/dist/daemon.js +199 -121
  26. package/dist/daemon.js.map +1 -1
  27. package/dist/desktop/app/controller.d.ts +1 -1
  28. package/dist/desktop/app/runtimeController.d.ts +7 -0
  29. package/dist/desktop/app/runtimeController.js +12 -1
  30. package/dist/desktop/app/runtimeController.js.map +1 -1
  31. package/dist/localApi/contracts.d.ts +15 -4
  32. package/dist/localApi/contracts.js +19 -1
  33. package/dist/localApi/contracts.js.map +1 -1
  34. package/dist/localApi/recovery.d.ts +66 -0
  35. package/dist/localApi/recovery.js +118 -0
  36. package/dist/localApi/recovery.js.map +1 -0
  37. package/dist/localApi/server.js +3 -1
  38. package/dist/localApi/server.js.map +1 -1
  39. package/dist/localApp/service.js +16 -4
  40. package/dist/localApp/service.js.map +1 -1
  41. package/dist/protocol/fenced.d.ts +135 -0
  42. package/dist/protocol/fenced.js +142 -0
  43. package/dist/protocol/fenced.js.map +1 -0
  44. package/dist/redaction.js +2 -0
  45. package/dist/redaction.js.map +1 -1
  46. package/dist/runtime/atomicFile.d.ts +6 -0
  47. package/dist/runtime/atomicFile.js +78 -0
  48. package/dist/runtime/atomicFile.js.map +1 -0
  49. package/dist/runtime/daemonCapabilities.d.ts +7 -0
  50. package/dist/runtime/daemonCapabilities.js +24 -0
  51. package/dist/runtime/daemonCapabilities.js.map +1 -0
  52. package/dist/runtime/eventOutbox.d.ts +100 -0
  53. package/dist/runtime/eventOutbox.js +206 -0
  54. package/dist/runtime/eventOutbox.js.map +1 -0
  55. package/dist/runtime/executionJournal.d.ts +102 -0
  56. package/dist/runtime/executionJournal.js +209 -0
  57. package/dist/runtime/executionJournal.js.map +1 -0
  58. package/dist/runtime/executionSafety.d.ts +76 -0
  59. package/dist/runtime/executionSafety.js +207 -0
  60. package/dist/runtime/executionSafety.js.map +1 -0
  61. package/dist/runtime/fencedExecutionState.d.ts +43 -0
  62. package/dist/runtime/fencedExecutionState.js +158 -0
  63. package/dist/runtime/fencedExecutionState.js.map +1 -0
  64. package/dist/runtime/leaseManager.d.ts +38 -0
  65. package/dist/runtime/leaseManager.js +102 -0
  66. package/dist/runtime/leaseManager.js.map +1 -0
  67. package/dist/runtime/localRunQueue.d.ts +1 -1
  68. package/dist/runtime/localRunQueue.js +8 -0
  69. package/dist/runtime/localRunQueue.js.map +1 -1
  70. package/dist/runtime/localSessionCache.d.ts +1 -1
  71. package/dist/runtime/localSessionCache.js.map +1 -1
  72. package/dist/runtime/process.d.ts +13 -1
  73. package/dist/runtime/process.js +39 -9
  74. package/dist/runtime/process.js.map +1 -1
  75. package/dist/runtime/recoveryCoordinator.d.ts +19 -0
  76. package/dist/runtime/recoveryCoordinator.js +183 -0
  77. package/dist/runtime/recoveryCoordinator.js.map +1 -0
  78. package/dist/runtime/runtimeLock.d.ts +33 -0
  79. package/dist/runtime/runtimeLock.js +140 -0
  80. package/dist/runtime/runtimeLock.js.map +1 -0
  81. package/dist/runtime/runtimeService.d.ts +6 -1
  82. package/dist/runtime/runtimeService.js +54 -20
  83. package/dist/runtime/runtimeService.js.map +1 -1
  84. package/dist/runtime/taskExecution.d.ts +4 -0
  85. package/dist/runtime/taskExecution.js +32 -12
  86. package/dist/runtime/taskExecution.js.map +1 -1
  87. package/dist/types.d.ts +28 -13
  88. package/dist/version.d.ts +1 -1
  89. package/dist/version.js +1 -1
  90. package/dist/version.js.map +1 -1
  91. package/dist/workTypes.d.ts +5 -5
  92. package/dist-web/assets/index-SwT063kc.js +72 -0
  93. package/dist-web/index.html +2 -2
  94. package/package.json +1 -1
  95. package/dist-web/assets/index-D5X9InfE.js +0 -72
@@ -0,0 +1,207 @@
1
+ import { FencedExecutionState } from "./fencedExecutionState.js";
2
+ import { LeaseAuthorityError, LeaseManager } from "./leaseManager.js";
3
+ import { isAbortError } from "./sleep.js";
4
+ const DEFAULT_NO_PROGRESS_MS = 5 * 60_000;
5
+ export const defaultDaemonTimer = {
6
+ schedule: (callback, ms) => setTimeout(callback, ms),
7
+ cancel: (handle) => clearTimeout(handle),
8
+ };
9
+ export async function createFencedState(input) {
10
+ if (input.job.authority === undefined)
11
+ return undefined;
12
+ if (input.journalStore === undefined || input.eventOutbox === undefined) {
13
+ throw new Error("Fenced claims require durable journal and outbox persistence before execution.");
14
+ }
15
+ return FencedExecutionState.create({
16
+ job: { ...input.job, authority: input.job.authority },
17
+ adapter: input.adapter,
18
+ store: input.journalStore,
19
+ outbox: input.eventOutbox,
20
+ now: input.now,
21
+ });
22
+ }
23
+ export async function emitRunEvent(input) {
24
+ if (input.event.eventType === "progress")
25
+ input.progressObserver?.recordProgress();
26
+ const summary = input.event.payload?.["summary"];
27
+ if (typeof summary === "string") {
28
+ input.logSpool?.append({
29
+ runId: input.job.runId,
30
+ message: summary,
31
+ stream: input.event.eventType === "log" ? "stdout" : "system",
32
+ occurredAt: input.event.occurredAt,
33
+ });
34
+ }
35
+ if (input.fencedState !== undefined) {
36
+ await input.fencedState.emit((event) => input.client.appendRunEvent(input.credential, input.job.runId, event), input.event);
37
+ return;
38
+ }
39
+ try {
40
+ await input.client.appendRunEvent(input.credential, input.job.runId, input.event);
41
+ }
42
+ catch (error) {
43
+ if (input.buffer === undefined)
44
+ throw error;
45
+ input.buffer.enqueue({ runId: input.job.runId, event: input.event, error });
46
+ }
47
+ }
48
+ export function observeRunProgress(input) {
49
+ const thresholdMs = noProgressThresholdMs(input.job);
50
+ let stopped = false;
51
+ let generation = 0;
52
+ let handle;
53
+ let pending = Promise.resolve();
54
+ const schedule = () => {
55
+ const scheduledGeneration = ++generation;
56
+ handle = input.timer.schedule(() => {
57
+ if (stopped || scheduledGeneration !== generation)
58
+ return;
59
+ handle = undefined;
60
+ const observedAt = input.now().toISOString();
61
+ pending = pending.then(async () => {
62
+ await input.fencedState?.recordNoProgress(observedAt);
63
+ input.logSpool?.append({
64
+ runId: input.job.runId,
65
+ occurredAt: observedAt,
66
+ stream: "system",
67
+ message: "No provider progress was observed during the configured interval.",
68
+ });
69
+ });
70
+ }, thresholdMs);
71
+ };
72
+ schedule();
73
+ return {
74
+ recordProgress() {
75
+ if (stopped)
76
+ return;
77
+ generation += 1;
78
+ if (handle !== undefined)
79
+ input.timer.cancel(handle);
80
+ schedule();
81
+ },
82
+ async stop() {
83
+ stopped = true;
84
+ generation += 1;
85
+ if (handle !== undefined)
86
+ input.timer.cancel(handle);
87
+ await pending;
88
+ },
89
+ };
90
+ }
91
+ export async function rejectExhaustedClaim(job, fencedState) {
92
+ if (job.maxAttempts === undefined || job.attempts <= job.maxAttempts)
93
+ return false;
94
+ await fencedState?.updatePhase("interrupted", "Sift returned a claim after its maximum attempt count was exhausted.");
95
+ return true;
96
+ }
97
+ export async function refreshLeaseUntilDone(input) {
98
+ for (;;) {
99
+ if (leaseDone(input.state))
100
+ return;
101
+ try {
102
+ await input.sleep(input.leaseRefreshMs, input.sleepSignal);
103
+ }
104
+ catch (error) {
105
+ if (isAbortError(error))
106
+ return;
107
+ throw error;
108
+ }
109
+ if (leaseDone(input.state))
110
+ return;
111
+ let refresh;
112
+ try {
113
+ refresh = input.fencedState === undefined
114
+ ? await input.client.refreshLease(input.credential, input.jobId)
115
+ : await renewFencedLease({
116
+ client: input.client,
117
+ credential: input.credential,
118
+ jobId: input.jobId,
119
+ fencedState: input.fencedState,
120
+ sleep: input.sleep,
121
+ signal: input.sleepSignal,
122
+ nowMs: input.nowMs,
123
+ monotonicNowMs: input.monotonicNowMs,
124
+ random: input.random,
125
+ });
126
+ }
127
+ catch (error) {
128
+ if (error instanceof LeaseAuthorityError && input.fencedState !== undefined) {
129
+ input.state.authorityUncertain = true;
130
+ await input.fencedState.updatePhase("authority_uncertain", error.message);
131
+ if (input.continueInspectOnly !== true)
132
+ input.adapterAbort.abort();
133
+ return;
134
+ }
135
+ throw error;
136
+ }
137
+ if (refresh.cancelRequested) {
138
+ input.state.cancelRequested = true;
139
+ input.adapterAbort.abort();
140
+ return;
141
+ }
142
+ }
143
+ }
144
+ export async function renewFencedLease(input) {
145
+ const manager = new LeaseManager({
146
+ sleep: input.sleep,
147
+ nowMs: input.nowMs,
148
+ monotonicNowMs: input.monotonicNowMs,
149
+ random: input.random,
150
+ onHealth: (health) => input.fencedState.updateLeaseHealth(health),
151
+ });
152
+ const refresh = await manager.renew({
153
+ authority: input.fencedState.authority(),
154
+ signal: input.signal,
155
+ refresh: () => input.client.refreshLease(input.credential, input.jobId, input.fencedState.authority()),
156
+ });
157
+ if (refresh.authority === undefined) {
158
+ throw new LeaseAuthorityError("authority_uncertain", "Fenced renewal omitted authority.");
159
+ }
160
+ await input.fencedState.updateAuthority(refresh.authority);
161
+ return refresh;
162
+ }
163
+ export function scheduleRunTimeout(job, timer, adapterAbort, state, now) {
164
+ if (job.authority !== undefined) {
165
+ const delay = Date.parse(job.authority.mustStopAt) - now().getTime();
166
+ return timer.schedule(() => {
167
+ state.timedOut = true;
168
+ adapterAbort.abort();
169
+ }, Math.max(0, delay));
170
+ }
171
+ const maxRunMinutes = job.wakeEnvelope?.limits.maxRunMinutes;
172
+ if (maxRunMinutes === undefined)
173
+ return undefined;
174
+ return timer.schedule(() => {
175
+ state.timedOut = true;
176
+ adapterAbort.abort();
177
+ }, maxRunMinutes * 60_000);
178
+ }
179
+ export function updateLocalSession(cache, job, status, errorSummary) {
180
+ if (cache === undefined)
181
+ return;
182
+ const previous = cache.read(job.runId);
183
+ const now = new Date().toISOString();
184
+ cache.upsert({
185
+ runId: job.runId,
186
+ adapterType: job.adapterType,
187
+ localKey: job.localKey,
188
+ status,
189
+ localOnly: true,
190
+ updatedAt: now,
191
+ startedAt: previous?.startedAt ?? now,
192
+ ...(status === "running" || status === "starting" ? {} : { stoppedAt: now }),
193
+ taskKey: job.taskRecordId ?? job.wakeEnvelope?.task.id,
194
+ cancelRequested: status === "cancelled",
195
+ ...(errorSummary === undefined ? {} : { errorSummary }),
196
+ });
197
+ }
198
+ function leaseDone(state) {
199
+ return state.done;
200
+ }
201
+ function noProgressThresholdMs(job) {
202
+ const minutes = job.limits["noProgressMinutes"];
203
+ return typeof minutes === "number" && Number.isFinite(minutes) && minutes > 0
204
+ ? minutes * 60_000
205
+ : DEFAULT_NO_PROGRESS_MS;
206
+ }
207
+ //# sourceMappingURL=executionSafety.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"executionSafety.js","sourceRoot":"","sources":["../../src/runtime/executionSafety.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ import type { LocalAgentAdapter } from "../adapters/types.js";
2
+ import type { AttemptMutationOptions } from "../protocol/fenced.js";
3
+ import type { ClaimedJob, JsonObject, RunEventAppendResult, RunEventDeliveryInput, RunEventInput } from "../types.js";
4
+ import type { DurableEventOutbox } from "./eventOutbox.js";
5
+ import { type ExecutionJournal, type ExecutionJournalPhase, type ExecutionJournalStore } from "./executionJournal.js";
6
+ import type { LeaseHealth } from "./leaseManager.js";
7
+ export declare class FencedExecutionState {
8
+ private journal;
9
+ private readonly store;
10
+ private readonly outbox;
11
+ private readonly now;
12
+ private eventChain;
13
+ private updateChain;
14
+ private constructor();
15
+ static create(input: {
16
+ job: ClaimedJob & {
17
+ authority: NonNullable<ClaimedJob["authority"]>;
18
+ };
19
+ adapter: LocalAgentAdapter | undefined;
20
+ store: ExecutionJournalStore;
21
+ outbox: DurableEventOutbox;
22
+ now?: (() => Date) | undefined;
23
+ createId?: (() => string) | undefined;
24
+ }): Promise<FencedExecutionState>;
25
+ authority(): {
26
+ attemptId: string;
27
+ leaseGeneration: number;
28
+ leaseExpiresAt: string;
29
+ mustStopAt: string;
30
+ };
31
+ accessMode(): "inspect" | "write";
32
+ settlementOptions(): AttemptMutationOptions;
33
+ updateAuthority(authority: ExecutionJournal["authority"]): Promise<void>;
34
+ updateLeaseHealth(leaseHealth: LeaseHealth): Promise<void>;
35
+ updatePhase(phase: ExecutionJournalPhase, interruptionReason?: string): Promise<void>;
36
+ recordProcessIdentity(processIdentity: NonNullable<ExecutionJournal["provider"]["processIdentity"]>): Promise<void>;
37
+ recordProviderSession(sessionId: string): Promise<void>;
38
+ recordNoProgress(observedAt: string): Promise<void>;
39
+ recordTerminal(status: NonNullable<ExecutionJournal["terminalResult"]>["status"], summary: JsonObject, phase?: ExecutionJournalPhase): Promise<void>;
40
+ emit(deliver: (event: RunEventDeliveryInput) => Promise<RunEventAppendResult>, event: RunEventInput): Promise<void>;
41
+ private emitInSequence;
42
+ private update;
43
+ }
@@ -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 = typeof summary["summary"] === "string" ? summary["summary"] : summary["message"];
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":"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"}
1
+ {"version":3,"file":"localRunQueue.js","sourceRoot":"","sources":["../../src/runtime/localRunQueue.ts"],"names":[],"mappings":"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"}
@@ -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":"AA4BA,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
+ {"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"}