@usine/durable 0.1.0 → 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.
package/dist/harness.js CHANGED
@@ -1,223 +1,244 @@
1
1
  import { BACKGROUND_CONTEXT, withAbortSignal } from "@earendil-works/chord/context";
2
- import { createRegistry, Harness, StorageRejected, } from "@earendil-works/pi-durable";
3
- import { Context, Deferred, Effect, Layer, Option, Result, Schedule, Schema, Scope } from "effect";
2
+ import { createRegistry, Harness, SessionFailed, } from "@earendil-works/pi-durable";
3
+ import { Context, Deferred, Effect, Layer, Option, Result, Schema } from "effect";
4
4
  /** A failed pi-durable call. */
5
5
  export class DurableHarnessError extends Schema.TaggedError("@usine/durable/DurableHarnessError")("DurableHarnessError", {
6
6
  /**
7
- * A description of the failed operation, such as `open`, `resume`, or the `operation` passed to
8
- * `use`.
7
+ * A description of the failed operation, such as `open the durable harness`, or the
8
+ * `operation` passed to `use`.
9
9
  */
10
10
  operation: Schema.NonEmptyString,
11
- /** The error message, or the stop reason if the harness has stopped. */
11
+ /** The error message, or the storage error's message if a storage error failed the harness. */
12
12
  message: Schema.NonEmptyString,
13
13
  cause: Schema.Defect(),
14
14
  }) {
15
15
  }
16
16
  /**
17
- * The pi-durable Harness over one storage. Reopens the storage and resumes the tasks after a
18
- * poisoned Session or a stuck step, and stops if the reopened harness gets stuck within
19
- * `STUCK_AGAIN_MILLIS`.
17
+ * A storage error that failed the pi-durable Session. pi-durable then aborts the harness's running
18
+ * tasks and closes it, and every later call on it fails.
20
19
  */
21
- export class DurableHarness extends Context.Service()("@usine/durable/DurableHarness") {
20
+ export class DurableStorageFailed extends Schema.TaggedError("@usine/durable/DurableStorageFailed")("DurableStorageFailed", {
21
+ /** The failed harness's generation: 1 for the first open, and one more for each reopen. */
22
+ generation: Schema.Int,
23
+ /** The storage error's message. */
24
+ message: Schema.NonEmptyString,
25
+ cause: Schema.Defect(),
26
+ }) {
22
27
  }
23
- const POISONED_MESSAGE = "Session is poisoned";
24
28
  /**
25
- * Whether `cause` is pi-durable's poisoned-Session error, which is identified only by its message
26
- * prefix.
29
+ * The pi-durable Harness over one storage. After a storage error fails the harness, reopens the
30
+ * storage and resumes the tasks, unless `resume` hasn't completed yet. Stops if the reopen fails
31
+ * or if the reopened harness fails within a minute.
27
32
  */
28
- const isPoisoned = (cause) => cause instanceof Error && cause.message.startsWith(POISONED_MESSAGE);
33
+ export class DurableHarness extends Context.Service()("@usine/durable/DurableHarness") {
34
+ }
29
35
  /** The interval in which repeats of a reported failure are counted and then logged once. */
30
36
  const REPORT_LOG_INTERVAL_MILLIS = 5_000;
37
+ /** A reopened harness that fails within this time stops instead of reopening. */
38
+ const REFAIL_MILLIS = 60_000;
39
+ const RESUME_OPERATION = "resume the durable tasks";
40
+ const messageOf = (cause) => cause instanceof Error && cause.message.length > 0 ? cause.message : String(cause) || "unknown";
31
41
  /**
32
- * The number of reports of one failure, with no adopted commit between them, after which a step
33
- * counts as stuck.
42
+ * Returns a `DurableHarnessError` with the message of `cause`. For a `SessionFailed`, uses the
43
+ * message of the storage error that failed the harness.
34
44
  */
35
- export const StuckStepReports = Context.Reference("@usine/durable/StuckStepReports", {
36
- defaultValue: () => 1_000,
45
+ export const durableError = (operation, cause) => new DurableHarnessError({
46
+ operation,
47
+ message: messageOf(cause instanceof SessionFailed ? cause.cause : cause),
48
+ cause,
37
49
  });
38
- /**
39
- * If a harness reopened after a stuck step gets stuck again within this time, it stops instead of
40
- * reopening.
41
- */
42
- const STUCK_AGAIN_MILLIS = 60_000;
43
- const messageOf = (cause) => cause instanceof Error && cause.message.length > 0 ? cause.message : String(cause) || "unknown";
44
- export const durableError = (operation, cause) => new DurableHarnessError({ operation, message: messageOf(cause), cause });
45
- /** Returns `storage` with `onPoison` called on every commit failure except `StorageRejected`. */
46
- const watchCommits = (storage, onPoison) => {
47
- const commit = (writes, context) => storage.commit(writes, context).catch((cause) => {
48
- if (!(cause instanceof StorageRejected))
49
- onPoison(cause);
50
- throw cause;
51
- });
52
- return new Proxy(storage, {
53
- get: (target, property) => {
54
- if (property === "commit")
55
- return commit;
56
- // SAFETY: the proxy only forwards Storage members, bound to the target because storage
57
- // classes use private state.
58
- const member = target[property];
59
- return member instanceof Function ? member.bind(target) : member;
60
- },
61
- });
62
- };
63
50
  const make = Effect.fn("DurableHarness.make")(function* (options) {
64
51
  const services = yield* Effect.context();
65
52
  const fork = Effect.runForkWith(services);
66
- const stuckStepReports = yield* StuckStepReports;
67
53
  const scope = yield* Effect.scope;
68
54
  const registry = createRegistry();
69
55
  const listeners = new Set();
70
56
  let resumed = Option.none();
71
- let started = false;
72
- let closed = false;
73
- let reopening = Option.none();
74
- let stopped = Option.none();
75
- const open = Effect.fn("DurableHarness.open")(function* (generation, afterStuck) {
76
- yield* Effect.annotateCurrentSpan({ generation });
57
+ let finalizing = false;
58
+ let stopped = false;
59
+ /**
60
+ * Set while the current harness has failed. Succeeds with the reopened harness, or fails with the
61
+ * storage failure if no reopen follows.
62
+ */
63
+ let failed = Option.none();
64
+ const logRepeats = (generation, message, repeats) => {
65
+ fork(Effect.logWarning("pi-durable reported the same failure again", {
66
+ generation,
67
+ cause: message,
68
+ repeats: repeats.unlogged,
69
+ }));
70
+ repeats.unlogged = 0;
71
+ repeats.loggedAt = Date.now();
72
+ };
73
+ // Called synchronously from inside pi-durable.
74
+ function report(generation, cause) {
75
+ const message = messageOf(cause);
76
+ // pi-durable also reports the error that fails the Session; the failure handling logs it.
77
+ if (generation.failing) {
78
+ fork(Effect.logDebug("pi-durable reported a failure of a failed harness", {
79
+ generation: generation.number,
80
+ cause: message,
81
+ }));
82
+ return;
83
+ }
84
+ const repeats = generation.reports.get(message);
85
+ if (repeats === undefined) {
86
+ generation.reports.set(message, { unlogged: 0, loggedAt: Date.now() });
87
+ fork(Effect.logWarning("pi-durable reported a failure that did not fail its caller", {
88
+ generation: generation.number,
89
+ cause: message,
90
+ }));
91
+ return;
92
+ }
93
+ repeats.unlogged += 1;
94
+ if (Date.now() - repeats.loggedAt >= REPORT_LOG_INTERVAL_MILLIS) {
95
+ logRepeats(generation.number, message, repeats);
96
+ }
97
+ }
98
+ const open = Effect.fn("DurableHarness.open")(function* (number) {
99
+ yield* Effect.annotateCurrentSpan({ generation: number });
77
100
  const storage = yield* options.openStorage;
78
- const reports = new Map();
101
+ const generation = {
102
+ number,
103
+ reports: new Map(),
104
+ closing: false,
105
+ failing: false,
106
+ handled: false,
107
+ };
79
108
  const harness = yield* Effect.tryPromise({
80
- try: () => Harness.open(watchCommits(storage, (cause) => requestReopen(generation, cause, "poisoned")), {
81
- models: options.models,
82
- registry,
83
- onReport: (error) => report(generation, reports, error),
84
- }, BACKGROUND_CONTEXT),
85
- catch: (cause) => durableError("open", cause),
109
+ try: () => Harness.open(storage, { models: options.models, registry, onReport: (error) => report(generation, error) }, BACKGROUND_CONTEXT),
110
+ catch: (cause) => durableError("open the durable harness", cause),
111
+ });
112
+ const opened = { generation, harness, storage, openedAt: Date.now() };
113
+ harness.subscribeClose(() => {
114
+ if (generation.closing)
115
+ return;
116
+ generation.failing = true;
117
+ handleFailure(opened);
86
118
  });
87
119
  harness.subscribeCommits((publication) => {
88
- for (const [message, repeats] of reports) {
120
+ for (const [message, repeats] of generation.reports) {
89
121
  if (repeats.unlogged === 0)
90
- reports.delete(message);
91
- else
92
- repeats.count = 0;
122
+ generation.reports.delete(message);
93
123
  }
94
124
  for (const listener of listeners)
95
125
  listener.onCommit(publication);
96
126
  });
97
127
  if (Option.isSome(resumed)) {
98
- yield* resumed.value(harness);
99
- harness.resume();
128
+ yield* resumed.value(harness, storage);
129
+ yield* Effect.try({
130
+ try: () => harness.resume(),
131
+ catch: (cause) => durableError(RESUME_OPERATION, cause),
132
+ });
100
133
  }
101
134
  yield* Effect.logInfo("Opened the durable harness", {
102
- generation,
135
+ generation: number,
103
136
  resumed: Option.isSome(resumed),
104
137
  });
105
- return {
106
- generation,
107
- harness,
108
- openedAt: Date.now(),
109
- afterStuck,
110
- reports,
111
- };
138
+ return opened;
112
139
  });
113
- const logRepeats = (generation, message, repeats) => {
114
- fork(Effect.logWarning("pi-durable reported the same failure again", {
115
- generation,
116
- cause: message,
117
- repeats: repeats.unlogged,
118
- }));
119
- repeats.unlogged = 0;
120
- repeats.loggedAt = Date.now();
121
- };
122
- const close = Effect.fn("DurableHarness.close")(function* (opened) {
123
- yield* Effect.annotateCurrentSpan({ generation: opened.generation });
124
- for (const [message, repeats] of opened.reports) {
140
+ const flushReports = (generation) => {
141
+ for (const [message, repeats] of generation.reports) {
125
142
  if (repeats.unlogged > 0)
126
- logRepeats(opened.generation, message, repeats);
143
+ logRepeats(generation.number, message, repeats);
127
144
  }
145
+ };
146
+ const close = Effect.fn("DurableHarness.close")(function* (opened) {
147
+ const generation = opened.generation;
148
+ yield* Effect.annotateCurrentSpan({ generation: generation.number });
149
+ generation.closing = true;
150
+ flushReports(generation);
128
151
  yield* Effect.tryPromise({
129
152
  try: () => opened.harness.close(BACKGROUND_CONTEXT),
130
153
  catch: (cause) => durableError("close", cause),
131
154
  }).pipe(Effect.tapError((error) => Effect.logError("Could not close the durable harness", {
132
- generation: opened.generation,
155
+ generation: generation.number,
133
156
  message: error.message,
134
157
  })), Effect.ignore);
135
158
  });
136
- const reopen = Effect.fn("DurableHarness.reopen")(function* (previous, cause, ready, reason) {
137
- yield* Effect.annotateCurrentSpan({ generation: previous.generation, reason });
138
- yield* Effect.logError(reason === "poisoned"
139
- ? "A durable commit failed after storage admission and poisoned the Session; reopening the harness"
140
- : "pi-durable keeps retrying a step that cannot succeed; reopening the harness", { generation: previous.generation, cause: messageOf(cause) });
141
- yield* close(previous);
142
- const next = yield* open(previous.generation + 1, reason === "stuck").pipe(Effect.tapError((error) => Effect.logError("Could not reopen the durable harness; retrying", {
143
- generation: previous.generation + 1,
144
- message: error.message,
145
- })), Effect.retry(Schedule.spaced("1 second")), Effect.orDie);
146
- current = next;
147
- reopening = Option.none();
148
- yield* Deferred.succeed(ready, next);
149
- for (const listener of listeners)
150
- listener.onReopen();
151
- yield* Effect.logInfo("Reopened the durable harness", { generation: next.generation, reason });
159
+ const stop = Effect.fn("DurableHarness.stop")(function* (failure, ready) {
160
+ stopped = true;
161
+ yield* Effect.logError("Stopped the durable harness: the storage failed again on reopening; durable calls fail until the orchestrator restarts", { generation: failure.generation, cause: failure.message });
162
+ yield* Deferred.fail(ready, failure);
152
163
  });
153
- let current = yield* open(1, false);
154
- started = true;
155
- // Called synchronously from inside pi-durable; the reopen runs on its own fiber.
156
- function requestReopen(generation, cause, reason) {
157
- if (!started || closed || Option.isSome(stopped) || Option.isSome(reopening))
158
- return;
159
- if (current.generation !== generation)
160
- return;
161
- const ready = Deferred.makeUnsafe();
162
- reopening = Option.some(ready);
163
- fork(reopen(current, cause, ready, reason).pipe(Effect.forkIn(scope)));
164
- }
165
- function stop(target, cause) {
166
- stopped = Option.some(new Error(`pi-durable keeps retrying a step that fails with: ${messageOf(cause)}. Restart the orchestrator.`, { cause }));
167
- fork(Effect.logError("Stopped the durable harness: pi-durable kept retrying a step that cannot succeed, also on a reopened harness; durable calls fail until the orchestrator restarts", { generation: target.generation, cause: messageOf(cause) }));
164
+ const reopen = Effect.fn("DurableHarness.reopen")(function* (previous, ready) {
165
+ const number = previous.generation.number + 1;
166
+ yield* Effect.annotateCurrentSpan({ generation: number });
167
+ yield* Effect.logInfo("Reopening the durable harness", { generation: number });
168
+ const next = yield* open(number).pipe(Effect.result);
169
+ if (Result.isFailure(next)) {
170
+ return yield* stop(new DurableStorageFailed({
171
+ generation: number,
172
+ message: next.failure.message,
173
+ cause: next.failure,
174
+ }), ready);
175
+ }
176
+ current = next.success;
177
+ failed = Option.none();
178
+ yield* Deferred.succeed(ready, next.success);
179
+ yield* Effect.logInfo("Reopened the durable harness", { generation: number });
180
+ // A failure while opening found another harness current.
181
+ if (next.success.generation.failing)
182
+ handleFailure(next.success);
183
+ }, Effect.uninterruptible);
184
+ /** Waits until the failed harness has closed, then reopens it or completes `ready` with the failure. */
185
+ const recover = Effect.fn("DurableHarness.recover")(function* (opened, ready) {
186
+ const number = opened.generation.number;
187
+ yield* Effect.annotateCurrentSpan({ generation: number });
188
+ const end = yield* Effect.promise(() => opened.harness.closed);
189
+ flushReports(opened.generation);
190
+ const cause = end.reason === "failed" ? end.error : new Error("pi-durable closed the harness");
191
+ const failure = new DurableStorageFailed({
192
+ generation: number,
193
+ message: messageOf(cause),
194
+ cause,
195
+ });
196
+ yield* Effect.logError("A storage error failed the durable harness, and pi-durable closed it", {
197
+ generation: number,
198
+ cause: failure.message,
199
+ });
168
200
  for (const listener of listeners)
169
- listener.onStop();
170
- fork(close(target).pipe(Effect.forkIn(scope)));
171
- }
172
- function stuck(generation, cause) {
173
- if (!started || closed || Option.isSome(stopped) || Option.isSome(reopening))
174
- return;
175
- if (current.generation !== generation)
176
- return;
177
- const target = current;
178
- // Close now, because no fiber runs while pi-durable retries in microtasks. The reopen or stop
179
- // closes it again.
180
- void target.harness.close(BACKGROUND_CONTEXT).catch(() => undefined);
181
- if (target.afterStuck && Date.now() - target.openedAt < STUCK_AGAIN_MILLIS)
182
- stop(target, cause);
183
- else
184
- requestReopen(generation, cause, "stuck");
185
- }
186
- // Called synchronously from inside pi-durable, possibly thousands of times a second.
187
- function report(generation, reports, cause) {
188
- const message = messageOf(cause);
189
- const repeats = reports.get(message);
190
- if (repeats === undefined) {
191
- reports.set(message, { count: 1, unlogged: 0, loggedAt: Date.now() });
192
- fork(Effect.logWarning("pi-durable reported a failure that did not fail its caller", {
193
- generation,
194
- cause: message,
195
- }));
201
+ listener.onFailure(failure);
202
+ if (finalizing)
203
+ return yield* Deferred.fail(ready, failure);
204
+ if (Option.isNone(resumed)) {
205
+ yield* Effect.logError("The durable harness failed before its tasks resumed; it stays closed", {
206
+ generation: number,
207
+ cause: failure.message,
208
+ });
209
+ return yield* Deferred.fail(ready, failure);
196
210
  }
197
- else {
198
- repeats.count += 1;
199
- repeats.unlogged += 1;
200
- if (Date.now() - repeats.loggedAt >= REPORT_LOG_INTERVAL_MILLIS) {
201
- logRepeats(generation, message, repeats);
202
- }
211
+ if (number > 1 && Date.now() - opened.openedAt < REFAIL_MILLIS) {
212
+ return yield* stop(failure, ready);
203
213
  }
204
- if (isPoisoned(cause))
205
- requestReopen(generation, cause, "poisoned");
206
- else if ((repeats?.count ?? 1) >= stuckStepReports)
207
- stuck(generation, cause);
208
- }
209
- const unlessStopped = (operation) => Option.match(stopped, {
210
- onNone: () => Effect.void,
211
- onSome: (reason) => Effect.fail(durableError(operation, reason)),
214
+ yield* reopen(opened, ready);
212
215
  });
213
- const opened = Effect.suspend(() => Option.match(reopening, {
216
+ let current = yield* open(1);
217
+ // Called synchronously from inside pi-durable; the recovery runs on its own fiber.
218
+ function handleFailure(opened) {
219
+ if (opened.generation.handled || opened !== current || Option.isSome(failed))
220
+ return;
221
+ opened.generation.handled = true;
222
+ const ready = Deferred.makeUnsafe();
223
+ failed = Option.some(ready);
224
+ fork(recover(opened, ready).pipe(Effect.forkIn(scope)));
225
+ }
226
+ /** Returns the open harness, waiting for a reopen. Fails if the harness stays closed. */
227
+ const openHarness = (operation) => Effect.suspend(() => Option.match(failed, {
214
228
  onNone: () => Effect.succeed(current),
215
- onSome: Deferred.await,
229
+ onSome: (ready) => Deferred.await(ready).pipe(Effect.mapError((failure) => new DurableHarnessError({
230
+ operation,
231
+ message: stopped
232
+ ? `The durable harness stopped after repeated storage errors: ${failure.message}. Restart the orchestrator.`
233
+ : failure.message,
234
+ cause: failure,
235
+ }))),
216
236
  }));
237
+ /** Whether `cause` failed the call because a storage error failed `opened`'s harness. */
238
+ const failedHarness = (opened, cause) => opened.generation.failing || cause instanceof SessionFailed;
217
239
  const use = (operation, run) => Effect.gen(function* () {
218
240
  for (let attempt = 1;; attempt += 1) {
219
- yield* unlessStopped(operation);
220
- const target = yield* opened;
241
+ const target = yield* openHarness(operation);
221
242
  const outcome = yield* Effect.tryPromise({
222
243
  try: (signal) => run(target.harness, withAbortSignal(signal, BACKGROUND_CONTEXT)),
223
244
  catch: (cause) => cause,
@@ -225,14 +246,12 @@ const make = Effect.fn("DurableHarness.make")(function* (options) {
225
246
  if (Result.isSuccess(outcome))
226
247
  return outcome.success;
227
248
  const cause = outcome.failure;
228
- yield* unlessStopped(operation);
229
- if (isPoisoned(cause))
230
- requestReopen(target.generation, cause, "poisoned");
231
- const replaced = Option.isSome(reopening) || current.generation !== target.generation;
232
- if (attempt === 1 && replaced) {
233
- yield* Effect.logInfo("Repeating a durable call on the reopened harness", {
249
+ if (!failedHarness(target, cause))
250
+ return yield* durableError(operation, cause);
251
+ if (attempt === 1) {
252
+ yield* Effect.logInfo("Repeating a durable call after its harness failed", {
234
253
  operation,
235
- generation: target.generation,
254
+ generation: target.generation.number,
236
255
  });
237
256
  continue;
238
257
  }
@@ -240,24 +259,32 @@ const make = Effect.fn("DurableHarness.make")(function* (options) {
240
259
  }
241
260
  }).pipe(Effect.withSpan(`DurableHarness.use.${operation}`));
242
261
  yield* Effect.addFinalizer(() => Effect.gen(function* () {
243
- closed = true;
262
+ finalizing = true;
244
263
  yield* close(current);
245
- yield* Effect.logInfo("Closed the durable harness", { generation: current.generation });
264
+ yield* Effect.logInfo("Closed the durable harness", {
265
+ generation: current.generation.number,
266
+ });
246
267
  }));
247
268
  return DurableHarness.of({
248
269
  models: options.models,
249
270
  defaultModel: options.defaultModel,
250
271
  install: (extension) => Effect.sync(() => registry.install(extension)).pipe(Effect.tap(() => Effect.logDebug("Installed a durable extension", { name: extension.name }))),
251
272
  resume: Effect.fn("DurableHarness.resume")(function* (beforeResume) {
252
- yield* unlessStopped("resume");
253
- const target = yield* opened;
254
- yield* beforeResume(target.harness);
255
- yield* Effect.try({
273
+ const target = yield* openHarness(RESUME_OPERATION);
274
+ yield* beforeResume(target.harness, target.storage);
275
+ const started = yield* Effect.try({
256
276
  try: () => target.harness.resume(),
257
- catch: (cause) => durableError("resume", cause),
258
- });
277
+ catch: (cause) => cause,
278
+ }).pipe(Effect.result);
279
+ if (Result.isFailure(started)) {
280
+ if (failedHarness(target, started.failure))
281
+ yield* openHarness(RESUME_OPERATION);
282
+ return yield* durableError(RESUME_OPERATION, started.failure);
283
+ }
259
284
  resumed = Option.some(beforeResume);
260
- yield* Effect.logInfo("Resumed durable task scheduling", { generation: target.generation });
285
+ yield* Effect.logInfo("Resumed durable task scheduling", {
286
+ generation: target.generation.number,
287
+ });
261
288
  }),
262
289
  use,
263
290
  subscribe: (listener) => Effect.acquireRelease(Effect.sync(() => listeners.add(listener)), () => Effect.sync(() => listeners.delete(listener))).pipe(Effect.asVoid),
@@ -1 +1 @@
1
- {"version":3,"file":"harness.js","sourceRoot":"","sources":["../src/harness.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"harness.js","sourceRoot":"","sources":["../src/harness.ts"],"names":[],"mappings":"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"}
package/dist/live.d.ts CHANGED
@@ -6,10 +6,10 @@ import { Layer } from "effect";
6
6
  */
7
7
  export declare const harnessLayer: (instanceDirectory: InstanceDirectory) => Layer.Layer<import("./harness.ts").DurableHarness, import("./harness.ts").DurableHarnessError, never>;
8
8
  /** Provides the Claude Code, Codex, and Pi child backends, selected by the Agent's harness. */
9
- export declare const childBackendLayer: Layer.Layer<import("@usine/agents/runtime").ChildBackend, never, import("effect/unstable/process/ChildProcessSpawner").ChildProcessSpawner | import("@usine/agents/runtime").ClaudeLoginLock>;
9
+ export declare const childBackendLayer: Layer.Layer<import("@usine/agents/runtime").ChildBackend, never, import("effect/process/ChildProcessSpawner").ChildProcessSpawner | import("@usine/agents/runtime").ClaudeLoginLock>;
10
10
  /**
11
11
  * Provides the Node `AttemptRuntime` with the real child backends. Building it resumes every
12
12
  * unfinished Attempt.
13
13
  */
14
- export declare const layer: (instanceDirectory: InstanceDirectory) => Layer.Layer<import("./attempt-runtime.ts").AttemptRuntime | import("./harness.ts").DurableHarness, import("./harness.ts").DurableHarnessError, import("effect/unstable/process/ChildProcessSpawner").ChildProcessSpawner | import("@usine/agents/runtime").ClaudeLoginLock>;
14
+ export declare const layer: (instanceDirectory: InstanceDirectory) => Layer.Layer<import("./attempt-runtime.ts").AttemptRuntime | import("./harness.ts").DurableHarness, import("./harness.ts").DurableHarnessError, import("effect/process/ChildProcessSpawner").ChildProcessSpawner | import("@usine/agents/runtime").ClaudeLoginLock>;
15
15
  //# sourceMappingURL=live.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"live.d.ts","sourceRoot":"","sources":["../src/live.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAsB,KAAK,EAAgB,MAAM,QAAQ,CAAC;AA+CjE;;;GAGG;AACH,eAAO,MAAM,YAAY,sBAAuB,iBAAiB,0GACc,CAAC;AAQhF,+FAA+F;AAC/F,eAAO,MAAM,iBAAiB,+LAAiE,CAAC;AAEhG;;;GAGG;AACH,eAAO,MAAM,KAAK,sBAAuB,iBAAiB,gRAIvD,CAAC"}
1
+ {"version":3,"file":"live.d.ts","sourceRoot":"","sources":["../src/live.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAsB,KAAK,EAAgB,MAAM,QAAQ,CAAC;AA+CjE;;;GAGG;AACH,eAAO,MAAM,YAAY,sBAAuB,iBAAiB,0GACc,CAAC;AAQhF,+FAA+F;AAC/F,eAAO,MAAM,iBAAiB,sLAAiE,CAAC;AAEhG;;;GAGG;AACH,eAAO,MAAM,KAAK,sBAAuB,iBAAiB,uQAIvD,CAAC"}
package/dist/testing.d.ts CHANGED
@@ -43,6 +43,11 @@ export interface StubChild {
43
43
  * reports otherwise.
44
44
  */
45
45
  readonly fail: (message: string) => Effect.Effect<void>;
46
+ /**
47
+ * Ends without a result, as a Claude child whose output stream fails: the parent's `subagent`
48
+ * call fails with a `stream` `SessionOperationError` whose message is `message`.
49
+ */
50
+ readonly crash: (message: string) => Effect.Effect<void>;
46
51
  /** Completes when the parent's tool call interrupts the child (abort, cancel, or shutdown). */
47
52
  readonly interrupted: Effect.Effect<void>;
48
53
  readonly interventions: Effect.Effect<ReadonlyArray<AttemptChannel.OperatorAction>>;
@@ -1 +1 @@
1
- {"version":3,"file":"testing.d.ts","sourceRoot":"","sources":["../src/testing.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"testing.d.ts","sourceRoot":"","sources":["../src/testing.ts"],"names":[],"mappings":"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"}
package/dist/testing.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import { createModels } from "@earendil-works/pi-ai/models";
2
2
  import { fauxAssistantMessage, fauxProvider, fauxText, fauxToolCall, } from "@earendil-works/pi-ai/providers/faux";
3
3
  import { openNodeSqliteStorage } from "@earendil-works/pi-durable/storage/sqlite/node";
4
- import { AgentBlockedError, AgentQuestionError, AgentResultError, ChildBackend, reportText, SessionResult, } from "@usine/agents/runtime";
4
+ import { AgentBlockedError, AgentQuestionError, AgentResultError, ChildBackend, reportText, SessionOperationError, SessionResult, } from "@usine/agents/runtime";
5
5
  import { ModelId } from "@usine/core/agent/brain";
6
6
  import { AgentSessionId, ParentSession, SessionFinished, SessionIdle, SessionResumed, SessionStarted, TextOutput, } from "@usine/core/agent/session";
7
7
  import * as AttemptChannel from "@usine/core/attempt/channel";
@@ -73,6 +73,16 @@ const launchStub = Effect.fn("StubChildBackend.launch")(function* (request) {
73
73
  const block = (message) => report(new AgentBlockedError({ sessionId: Option.some(session.id), message }));
74
74
  const ask = (question) => report(new AgentQuestionError({ sessionId: Option.some(session.id), message: question }));
75
75
  const fail = (message) => report(new AgentResultError({ sessionId: Option.some(session.id), message }));
76
+ const crash = (message) => Effect.gen(function* () {
77
+ const error = new SessionOperationError({
78
+ operation: "stream",
79
+ sessionId: Option.some(session.id),
80
+ message,
81
+ cause: new Error("unexpected end of output"),
82
+ });
83
+ yield* Deferred.fail(result, error);
84
+ yield* Queue.fail(events, error);
85
+ });
76
86
  // A message to an idle or paused child starts its next turn; a working child queues it.
77
87
  const intervene = (action, onDelivery) => Effect.gen(function* () {
78
88
  interventions.push(action);
@@ -115,6 +125,7 @@ const launchStub = Effect.fn("StubChildBackend.launch")(function* (request) {
115
125
  block,
116
126
  ask,
117
127
  fail,
128
+ crash,
118
129
  interrupted: Deferred.await(interrupted),
119
130
  interventions: Effect.sync(() => [...interventions]),
120
131
  };