@usine/durable 0.0.0-stage → 0.1.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 (83) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +81 -2
  3. package/dist/attempt/documents.d.ts +86 -0
  4. package/dist/attempt/documents.d.ts.map +1 -0
  5. package/dist/attempt/documents.js +30 -0
  6. package/dist/attempt/documents.js.map +1 -0
  7. package/dist/attempt/events.d.ts +22 -0
  8. package/dist/attempt/events.d.ts.map +1 -0
  9. package/dist/attempt/events.js +110 -0
  10. package/dist/attempt/events.js.map +1 -0
  11. package/dist/attempt/extension.d.ts +48 -0
  12. package/dist/attempt/extension.d.ts.map +1 -0
  13. package/dist/attempt/extension.js +34 -0
  14. package/dist/attempt/extension.js.map +1 -0
  15. package/dist/attempt/hubs.d.ts +117 -0
  16. package/dist/attempt/hubs.d.ts.map +1 -0
  17. package/dist/attempt/hubs.js +137 -0
  18. package/dist/attempt/hubs.js.map +1 -0
  19. package/dist/attempt/outcome.d.ts +22 -0
  20. package/dist/attempt/outcome.d.ts.map +1 -0
  21. package/dist/attempt/outcome.js +84 -0
  22. package/dist/attempt/outcome.js.map +1 -0
  23. package/dist/attempt/parent.d.ts +27 -0
  24. package/dist/attempt/parent.d.ts.map +1 -0
  25. package/dist/attempt/parent.js +109 -0
  26. package/dist/attempt/parent.js.map +1 -0
  27. package/dist/attempt/relay.d.ts +41 -0
  28. package/dist/attempt/relay.d.ts.map +1 -0
  29. package/dist/attempt/relay.js +457 -0
  30. package/dist/attempt/relay.js.map +1 -0
  31. package/dist/attempt/repair.d.ts +8 -0
  32. package/dist/attempt/repair.d.ts.map +1 -0
  33. package/dist/attempt/repair.js +130 -0
  34. package/dist/attempt/repair.js.map +1 -0
  35. package/dist/attempt/request.d.ts +18 -0
  36. package/dist/attempt/request.d.ts.map +1 -0
  37. package/dist/attempt/request.js +24 -0
  38. package/dist/attempt/request.js.map +1 -0
  39. package/dist/attempt/runtime.d.ts +10 -0
  40. package/dist/attempt/runtime.d.ts.map +1 -0
  41. package/dist/attempt/runtime.js +422 -0
  42. package/dist/attempt/runtime.js.map +1 -0
  43. package/dist/attempt/services.d.ts +15 -0
  44. package/dist/attempt/services.d.ts.map +1 -0
  45. package/dist/attempt/services.js +2 -0
  46. package/dist/attempt/services.js.map +1 -0
  47. package/dist/attempt/subagent.d.ts +17 -0
  48. package/dist/attempt/subagent.d.ts.map +1 -0
  49. package/dist/attempt/subagent.js +203 -0
  50. package/dist/attempt/subagent.js.map +1 -0
  51. package/dist/attempt/task.d.ts +61 -0
  52. package/dist/attempt/task.d.ts.map +1 -0
  53. package/dist/attempt/task.js +302 -0
  54. package/dist/attempt/task.js.map +1 -0
  55. package/dist/attempt/watch.d.ts +8 -0
  56. package/dist/attempt/watch.d.ts.map +1 -0
  57. package/dist/attempt/watch.js +25 -0
  58. package/dist/attempt/watch.js.map +1 -0
  59. package/dist/attempt-runtime.d.ts +123 -0
  60. package/dist/attempt-runtime.d.ts.map +1 -0
  61. package/dist/attempt-runtime.js +73 -0
  62. package/dist/attempt-runtime.js.map +1 -0
  63. package/dist/backup.d.ts +26 -0
  64. package/dist/backup.d.ts.map +1 -0
  65. package/dist/backup.js +100 -0
  66. package/dist/backup.js.map +1 -0
  67. package/dist/harness.d.ts +87 -0
  68. package/dist/harness.d.ts.map +1 -0
  69. package/dist/harness.js +271 -0
  70. package/dist/harness.js.map +1 -0
  71. package/dist/live.d.ts +15 -0
  72. package/dist/live.d.ts.map +1 -0
  73. package/dist/live.js +51 -0
  74. package/dist/live.js.map +1 -0
  75. package/dist/storage-path.d.ts +4 -0
  76. package/dist/storage-path.d.ts.map +1 -0
  77. package/dist/storage-path.js +2 -0
  78. package/dist/storage-path.js.map +1 -0
  79. package/dist/testing.d.ts +111 -0
  80. package/dist/testing.d.ts.map +1 -0
  81. package/dist/testing.js +303 -0
  82. package/dist/testing.js.map +1 -0
  83. package/package.json +72 -3
@@ -0,0 +1,18 @@
1
+ import type { JsonValue } from "@earendil-works/chord";
2
+ import type { AttemptId } from "@usine/core/attempt";
3
+ import { Effect, Option } from "effect";
4
+ import { type AttemptRequest, StoredRequest } from "../attempt-runtime.ts";
5
+ import type { DurableHarness } from "../harness.ts";
6
+ /**
7
+ * The input of the `usine.attempt` task: the encoded `StoredRequest`, which contains no
8
+ * credentials.
9
+ */
10
+ export type AttemptTaskInput = typeof StoredRequest.Encoded;
11
+ /** Returns the Attempt ID of a task input, or `None` if the input isn't a stored request. */
12
+ export declare const attemptIdOf: (input: JsonValue) => Option.Option<AttemptId>;
13
+ export declare const taskInput: (request: AttemptRequest) => AttemptTaskInput;
14
+ /** Decodes a stored task input. Dies on a malformed input, since only this package writes it. */
15
+ export declare const storedRequestOf: (input: AttemptTaskInput | JsonValue) => Effect.Effect<StoredRequest, never, never>;
16
+ /** Reads the request the Attempt's task was created with, or `None` if the Attempt has no task. */
17
+ export declare const readStoredRequest: (durable: DurableHarness["Service"], attemptId: AttemptId) => Effect.Effect<Option.None<StoredRequest> | Option.Some<StoredRequest>, import("../harness.ts").DurableHarnessError, never>;
18
+ //# sourceMappingURL=request.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"request.d.ts","sourceRoot":"","sources":["../../src/attempt/request.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,MAAM,EAAE,MAAM,EAAU,MAAM,QAAQ,CAAC;AAChD,OAAO,EAAE,KAAK,cAAc,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAC3E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAGpD;;;GAGG;AACH,MAAM,MAAM,gBAAgB,GAAG,OAAO,aAAa,CAAC,OAAO,CAAC;AAM5D,6FAA6F;AAC7F,eAAO,MAAM,WAAW,UAAW,SAAS,KAAG,MAAM,CAAC,MAAM,CAAC,SAAS,CACD,CAAC;AAEtE,eAAO,MAAM,SAAS,YAAa,cAAc,KAAG,gBAC+C,CAAC;AAEpG,iGAAiG;AACjG,eAAO,MAAM,eAAe,UAAW,gBAAgB,GAAG,SAAS,+CAC3B,CAAC;AAEzC,mGAAmG;AACnG,eAAO,MAAM,iBAAiB,YAAa,cAAc,CAAC,SAAS,CAAC,aAAa,SAAS,+HActF,CAAC"}
@@ -0,0 +1,24 @@
1
+ import { Effect, Option, Schema } from "effect";
2
+ import { StoredRequest } from "../attempt-runtime.js";
3
+ import { readRecord } from "./relay.js";
4
+ const encodeStored = Schema.encodeSync(StoredRequest);
5
+ const decodeStored = Schema.decodeUnknownEffect(StoredRequest);
6
+ const decodeStoredOption = Schema.decodeUnknownOption(StoredRequest);
7
+ /** Returns the Attempt ID of a task input, or `None` if the input isn't a stored request. */
8
+ export const attemptIdOf = (input) => Option.map(decodeStoredOption(input), ({ spec }) => spec.attemptId);
9
+ export const taskInput = (request) => encodeStored(new StoredRequest({ spec: request.spec, worker: request.worker, cwd: request.cwd }));
10
+ /** Decodes a stored task input. Dies on a malformed input, since only this package writes it. */
11
+ export const storedRequestOf = (input) => decodeStored(input).pipe(Effect.orDie);
12
+ /** Reads the request the Attempt's task was created with, or `None` if the Attempt has no task. */
13
+ export const readStoredRequest = (durable, attemptId) => Effect.gen(function* () {
14
+ const taskId = (yield* readRecord(durable, attemptId))?.taskId ?? null;
15
+ const task = taskId === null
16
+ ? undefined
17
+ : yield* durable.use("read the Attempt task", (harness, context) => harness.getTask(taskId, context));
18
+ yield* Effect.logDebug("Read the Attempt's stored request", {
19
+ attemptId,
20
+ found: task !== undefined,
21
+ });
22
+ return task === undefined ? Option.none() : Option.some(yield* storedRequestOf(task.input));
23
+ });
24
+ //# sourceMappingURL=request.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"request.js","sourceRoot":"","sources":["../../src/attempt/request.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChD,OAAO,EAAuB,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAE3E,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAQxC,MAAM,YAAY,GAAG,MAAM,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;AACtD,MAAM,YAAY,GAAG,MAAM,CAAC,mBAAmB,CAAC,aAAa,CAAC,CAAC;AAC/D,MAAM,kBAAkB,GAAG,MAAM,CAAC,mBAAmB,CAAC,aAAa,CAAC,CAAC;AAErE,6FAA6F;AAC7F,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,KAAgB,EAA4B,EAAE,CACxE,MAAM,CAAC,GAAG,CAAC,kBAAkB,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;AAEtE,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,OAAuB,EAAoB,EAAE,CACrE,YAAY,CAAC,IAAI,aAAa,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;AAEpG,iGAAiG;AACjG,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,KAAmC,EAAE,EAAE,CACrE,YAAY,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAEzC,mGAAmG;AACnG,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,OAAkC,EAAE,SAAoB,EAAE,EAAE,CAC5F,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,MAAM,GAAG,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,EAAE,MAAM,IAAI,IAAI,CAAC;IACvE,MAAM,IAAI,GACR,MAAM,KAAK,IAAI;QACb,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,uBAAuB,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,CAC/D,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,CACjC,CAAC;IACR,KAAK,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,mCAAmC,EAAE;QAC1D,SAAS;QACT,KAAK,EAAE,IAAI,KAAK,SAAS;KAC1B,CAAC,CAAC;IACH,OAAO,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;AAC9F,CAAC,CAAC,CAAC"}
@@ -0,0 +1,10 @@
1
+ import { ChildBackend } from "@usine/agents/runtime";
2
+ import { Layer } from "effect";
3
+ import { AttemptRuntime } from "../attempt-runtime.ts";
4
+ import { DurableHarness, type DurableHarnessError } from "../harness.ts";
5
+ /**
6
+ * Provides `AttemptRuntime` on the durable harness. Building it installs the usine extension and
7
+ * resumes unfinished Attempts.
8
+ */
9
+ export declare const layer: Layer.Layer<AttemptRuntime, DurableHarnessError, ChildBackend | DurableHarness>;
10
+ //# sourceMappingURL=runtime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../src/attempt/runtime.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAKrD,OAAO,EAAoB,KAAK,EAA0B,MAAM,QAAQ,CAAC;AACzE,OAAO,EAAuB,cAAc,EAAwB,MAAM,uBAAuB,CAAC;AAClG,OAAO,EAAE,cAAc,EAAE,KAAK,mBAAmB,EAAE,MAAM,eAAe,CAAC;AA0jBzE;;;GAGG;AACH,eAAO,MAAM,KAAK,iFAAmD,CAAC"}
@@ -0,0 +1,422 @@
1
+ import { LiveDoc } from "@earendil-works/pi-durable";
2
+ import { ChildBackend } from "@usine/agents/runtime";
3
+ import * as AttemptChannel from "@usine/core/attempt/channel";
4
+ import { AgentFailure, InfraFailure } from "@usine/core/attempt/failure";
5
+ import { Duration, Effect, Layer, Option, Result, Schema } from "effect";
6
+ import { AttemptRuntime } from "../attempt-runtime.js";
7
+ import { DurableHarness } from "../harness.js";
8
+ import { AttemptRecordDoc, HoldDoc, RELEASE_GUIDANCE } from "./documents.js";
9
+ import { usineExtension } from "./extension.js";
10
+ import { attemptHubs } from "./hubs.js";
11
+ import { encodeResult, finishedOf } from "./outcome.js";
12
+ import { parentSessionId } from "./parent.js";
13
+ import { repairUnreadableConversations } from "./repair.js";
14
+ import { appendInbound, emitPayload, readRecord, relayAttempt, relayDeliveries } from "./relay.js";
15
+ import { readStoredRequest, taskInput } from "./request.js";
16
+ /**
17
+ * An operator input that couldn't be applied. The reason is recorded in the transcript and the
18
+ * Attempt continues.
19
+ */
20
+ class InterventionRefused extends Schema.TaggedError("@usine/durable/InterventionRefused")("InterventionRefused", { message: Schema.NonEmptyString }) {
21
+ }
22
+ const refuse = (message) => new InterventionRefused({ message });
23
+ const infra = (error) => new InfraFailure({ message: error.message, cause: error });
24
+ const LIVE_STATUSES = ["pending", "running", "waiting"];
25
+ const encodeIntervention = Schema.encodeSync(AttemptChannel.Intervention);
26
+ const makeAttemptRuntime = Effect.gen(function* () {
27
+ const durable = yield* DurableHarness;
28
+ const backend = yield* ChildBackend;
29
+ const services = yield* Effect.context();
30
+ const hubs = yield* attemptHubs;
31
+ const { extension, task } = usineExtension({
32
+ hubs,
33
+ backend,
34
+ defaultModel: durable.defaultModel,
35
+ run: (program, signal) => Effect.runPromiseWith(services)(program, { signal }),
36
+ });
37
+ yield* durable.install(extension);
38
+ yield* durable.subscribe(hubs.listener);
39
+ yield* durable.use("open the root conversation", (harness, context) => harness.root(context));
40
+ yield* durable.resume(repairUnreadableConversations);
41
+ const createOrFind = Effect.fn("AttemptRuntime.createOrFind")(function* (request) {
42
+ const attemptId = request.spec.attemptId;
43
+ const input = taskInput(request);
44
+ return yield* durable.use("create or find the Attempt task", async (harness, context) => {
45
+ const root = await harness.root(context);
46
+ return root.commit(async (tx) => {
47
+ const record = await tx.doc(AttemptRecordDoc, attemptId, null);
48
+ if (record.taskId !== null)
49
+ return { taskId: record.taskId, created: false };
50
+ const taskId = await tx.createTask(task, input, { ownership: { kind: "conversation" } });
51
+ record.taskId = taskId;
52
+ return { taskId, created: true };
53
+ }, context);
54
+ });
55
+ });
56
+ const execute = Effect.fn("AttemptRuntime.execute")(function* (request, io) {
57
+ const attemptId = request.spec.attemptId;
58
+ yield* Effect.annotateCurrentSpan({
59
+ attemptId,
60
+ sessionId: parentSessionId(attemptId),
61
+ repository: request.spec.repository,
62
+ worker: request.worker,
63
+ });
64
+ const found = yield* createOrFind(request);
65
+ yield* Effect.logInfo(found.created
66
+ ? "Created the Attempt's durable task"
67
+ : "Reattached to the Attempt's durable task", { taskId: found.taskId });
68
+ const hub = yield* hubs.hub(attemptId, found.taskId);
69
+ const settled = yield* relayAttempt(durable, hubs, hub, request, io);
70
+ return yield* Result.match(settled, {
71
+ onSuccess: (report) => Effect.logInfo("The Attempt completed").pipe(Effect.as(report)),
72
+ onFailure: (failure) => Effect.logInfo("The Attempt ended without success", { failure: failure._tag }).pipe(Effect.andThen(Effect.fail(failure))),
73
+ });
74
+ }, (effect, request) => effect.pipe(Effect.catchTag("DurableHarnessError", (error) => Effect.fail(infra(error))), Effect.annotateLogs({ attemptId: request.spec.attemptId })));
75
+ // An aborted task is never live: only `cancel` aborts a task, and every caller of `cancel` has
76
+ // the engine close the Attempt.
77
+ const isLive = Effect.fn("AttemptRuntime.isLive")(function* (attemptId) {
78
+ yield* Effect.annotateCurrentSpan({ attemptId });
79
+ const record = yield* readRecord(durable, attemptId);
80
+ if (record === undefined || record.taskId === null) {
81
+ yield* Effect.logDebug("The Attempt has no durable task; it is not live", { attemptId });
82
+ return false;
83
+ }
84
+ const taskId = record.taskId;
85
+ const task = yield* durable.use("read the Attempt task", (harness, context) => harness.getTask(taskId, context));
86
+ const outcome = task?.state.outcome?.status;
87
+ const live = task !== undefined && outcome !== "aborted" && !record.terminalRelayed;
88
+ yield* Effect.logDebug("Checked whether the Attempt is live", {
89
+ attemptId,
90
+ taskId,
91
+ status: task?.state.status,
92
+ outcome,
93
+ terminalRelayed: record.terminalRelayed,
94
+ live,
95
+ });
96
+ return live;
97
+ }, Effect.catchTag("DurableHarnessError", (error) => Effect.fail(infra(error))));
98
+ const finished = Effect.fn("AttemptRuntime.finished")(function* (attemptId) {
99
+ yield* Effect.annotateCurrentSpan({ attemptId });
100
+ const record = yield* readRecord(durable, attemptId);
101
+ if (record === undefined || record.taskId === null)
102
+ return Option.none();
103
+ const taskId = record.taskId;
104
+ const task = yield* durable.use("read the Attempt task", (harness, context) => harness.getTask(taskId, context));
105
+ const found = task === undefined ? Option.none() : finishedOf(record, task);
106
+ if (record.result !== undefined &&
107
+ Option.isSome(found) &&
108
+ found.value._tag === "ParentReported") {
109
+ yield* Effect.logWarning("The Attempt's recorded result does not decode; its checkout is harvested again", { attemptId, taskId });
110
+ }
111
+ yield* Effect.logDebug("Read what the Attempt's finished task left", {
112
+ attemptId,
113
+ taskId,
114
+ terminalRelayed: record.terminalRelayed,
115
+ outcome: task?.state.outcome?.status,
116
+ finished: Option.match(found, { onNone: () => "none", onSome: ({ _tag }) => _tag }),
117
+ });
118
+ return found;
119
+ }, Effect.catchTag("DurableHarnessError", (error) => Effect.fail(infra(error))));
120
+ const recordResult = Effect.fn("AttemptRuntime.recordResult")(function* (attemptId, result) {
121
+ yield* Effect.annotateCurrentSpan({ attemptId });
122
+ const encoded = encodeResult(result);
123
+ yield* durable.use("record the Attempt's result", (harness, context) => harness.commit(async (tx) => {
124
+ const record = await tx.doc(AttemptRecordDoc, attemptId, null);
125
+ record.result = encoded;
126
+ }, context));
127
+ yield* Effect.logInfo("Recorded the Attempt's harvested result", {
128
+ attemptId,
129
+ facts: result.facts.length,
130
+ });
131
+ }, Effect.catchTag("DurableHarnessError", (error) => Effect.fail(infra(error))));
132
+ const recordUnsupervised = Effect.fn("AttemptRuntime.recordUnsupervised")(function* (attemptId, unsupervised) {
133
+ yield* Effect.annotateCurrentSpan({ attemptId });
134
+ const millis = Duration.toMillis(unsupervised);
135
+ const kept = yield* durable.use("record the Attempt's unsupervised time", (harness, context) => harness.commit(async (tx) => {
136
+ const record = await tx.doc(AttemptRecordDoc, attemptId, null);
137
+ record.unsupervisedMillis = Math.max(record.unsupervisedMillis ?? 0, millis);
138
+ return record.unsupervisedMillis;
139
+ }, context));
140
+ yield* Effect.logDebug("Recorded the Attempt's unsupervised time", {
141
+ attemptId,
142
+ unsupervisedMillis: millis,
143
+ keptMillis: kept,
144
+ });
145
+ }, Effect.catchTag("DurableHarnessError", (error) => Effect.fail(infra(error))));
146
+ const unsupervised = Effect.fn("AttemptRuntime.unsupervised")(function* (attemptId) {
147
+ yield* Effect.annotateCurrentSpan({ attemptId });
148
+ const record = yield* readRecord(durable, attemptId);
149
+ return Option.map(Option.fromNullishOr(record?.unsupervisedMillis), Duration.millis);
150
+ }, Effect.catchTag("DurableHarnessError", (error) => Effect.fail(infra(error))));
151
+ const request = Effect.fn("AttemptRuntime.request")(function* (attemptId) {
152
+ yield* Effect.annotateCurrentSpan({ attemptId });
153
+ return yield* readStoredRequest(durable, attemptId);
154
+ }, Effect.catchTag("DurableHarnessError", (error) => Effect.fail(infra(error))));
155
+ /** Commits a change to the Hold document. Returns `None` if the task is no longer live. */
156
+ const supervise = (hub, change) => durable.use("update the Hold", (harness, context) => harness.commit(async (tx) => {
157
+ const current = await tx.task(hub.taskId);
158
+ if (current === undefined || !LIVE_STATUSES.includes(current.state.status)) {
159
+ return Option.none();
160
+ }
161
+ return Option.some(change(await tx.doc(HoldDoc, hub.taskId)));
162
+ }, context));
163
+ const hold = (hub, update) => supervise(hub, (document) => {
164
+ document.held = update(document.held);
165
+ });
166
+ /**
167
+ * Applies operator input to a live child. A working child reads a message at its next turn
168
+ * boundary, so the message is first reported as queued.
169
+ */
170
+ const routeChild = Effect.fn("AttemptRuntime.routeChild")(function* (hub, target, intervention, inputSequence) {
171
+ const child = hub.children.get(target.sessionId);
172
+ if (child === undefined)
173
+ return yield* refuse("This session is no longer live");
174
+ const action = intervention.action;
175
+ const state = yield* child
176
+ .intervene(action, (delivered) => hubs.delivery(hub, { _tag: "Delivery", inputSequence, intervention, delivered }))
177
+ .pipe(Effect.mapError((error) => refuse(error.message)));
178
+ if (action._tag === "OperatorMessage" || action._tag === "Release") {
179
+ yield* hold(hub, (held) => state.held
180
+ ? [...held.filter((id) => id !== target.sessionId), target.sessionId]
181
+ : held.filter((id) => id !== target.sessionId));
182
+ }
183
+ if (state.queued) {
184
+ hub.childInputs.add(inputSequence);
185
+ yield* durable.use("record the queued operator input", (harness, context) => harness.commit(async (tx) => {
186
+ const record = await tx.doc(AttemptRecordDoc, hub.attemptId, null);
187
+ record.queuedInputs = [
188
+ ...(record.queuedInputs ?? []),
189
+ {
190
+ inputSequence,
191
+ child: target.sessionId,
192
+ intervention: encodeIntervention(intervention),
193
+ },
194
+ ];
195
+ }, context));
196
+ yield* Effect.logInfo("The working child reads the operator input at its next boundary", {
197
+ sessionId: target.sessionId,
198
+ action: action._tag,
199
+ });
200
+ }
201
+ return state;
202
+ });
203
+ /**
204
+ * Commits a Hold change that depends on whether the parent is mid-turn. Returns `None` if the
205
+ * task is no longer live.
206
+ */
207
+ const superviseParent = (hub, parent, change) => durable.use("update the parent's Hold", (harness, context) => harness.commit(async (tx) => {
208
+ const current = await tx.task(hub.taskId);
209
+ if (current === undefined || !LIVE_STATUSES.includes(current.state.status)) {
210
+ return Option.none();
211
+ }
212
+ const live = await tx.doc(LiveDoc, parent);
213
+ return Option.some(change(await tx.doc(HoldDoc, hub.taskId), live.run !== undefined));
214
+ }, context));
215
+ /**
216
+ * Applies operator input to the Pi parent (ADR 0018). An operator message places a Hold and a
217
+ * steer doesn't; input to a working parent is reported as queued until the running tool call
218
+ * returns.
219
+ */
220
+ const routeParent = Effect.fn("AttemptRuntime.routeParent")(function* (hub, intervention, inputSequence) {
221
+ if (Option.isNone(hub.parent))
222
+ return yield* refuse("The parent hasn't started yet");
223
+ const parent = hub.parent.value;
224
+ const parentId = parentSessionId(hub.attemptId);
225
+ const action = intervention.action;
226
+ const stateOf = (document, queued) => new AttemptChannel.InterventionState({
227
+ held: document.held.includes(parentId),
228
+ paused: document.paused,
229
+ queued,
230
+ });
231
+ if (action._tag === "Interrupt") {
232
+ const marked = yield* supervise(hub, (document) => {
233
+ const already = document.paused;
234
+ document.paused = true;
235
+ return { already, state: stateOf(document, false) };
236
+ });
237
+ if (Option.isNone(marked))
238
+ return yield* refuse("This session has already returned");
239
+ if (marked.value.already)
240
+ return marked.value.state;
241
+ yield* Effect.logInfo("Interrupting the Pi parent; it holds until the operator resumes it");
242
+ yield* durable.use("abort the parent's turn", async (harness, context) => {
243
+ const conversation = await harness.conversation(parent, context);
244
+ await conversation?.abort(context);
245
+ });
246
+ // The abort withdrew any queued operator input; send its rejection receipt.
247
+ yield* relayDeliveries(durable, hub, "live");
248
+ return marked.value.state;
249
+ }
250
+ if (action._tag === "Release") {
251
+ const released = yield* superviseParent(hub, parent, (document, busy) => {
252
+ if (!document.paused && !document.held.includes(parentId)) {
253
+ return { _tag: "NotSupervised" };
254
+ }
255
+ document.held = document.held.filter((id) => id !== parentId);
256
+ // The interrupted turn may end after this commit, so add guidance for it to resume with.
257
+ if (document.paused) {
258
+ document.guidance = [...document.guidance, RELEASE_GUIDANCE];
259
+ document.paused = false;
260
+ }
261
+ return { _tag: "Released", busy, state: stateOf(document, false) };
262
+ });
263
+ if (Option.isNone(released))
264
+ return yield* refuse("This session has already returned");
265
+ if (released.value._tag === "NotSupervised") {
266
+ return yield* refuse("Only a paused or held session can be released");
267
+ }
268
+ yield* Effect.logInfo(released.value.busy
269
+ ? "Released the working Pi parent; its next answer ends the Attempt"
270
+ : "Released the waiting Pi parent; it continues the task");
271
+ return released.value.state;
272
+ }
273
+ const holds = action._tag === "OperatorMessage";
274
+ const routed = yield* superviseParent(hub, parent, (document, busy) => {
275
+ if (holds && !document.held.includes(parentId))
276
+ document.held = [...document.held, parentId];
277
+ if (busy && !document.paused)
278
+ return { _tag: "Steer", state: stateOf(document, true) };
279
+ document.guidance = [...document.guidance, action.message];
280
+ document.paused = false;
281
+ return { _tag: "NextTurn", state: stateOf(document, false) };
282
+ });
283
+ if (Option.isNone(routed))
284
+ return yield* refuse("This session has already returned");
285
+ if (routed.value._tag === "NextTurn") {
286
+ yield* Effect.logInfo("The Pi parent takes the operator input as its next turn", {
287
+ holds,
288
+ });
289
+ return routed.value.state;
290
+ }
291
+ const requestId = `intervention:${hub.attemptId}:${inputSequence}`;
292
+ yield* durable.use("steer the parent", async (harness, context) => {
293
+ const conversation = await harness.conversation(parent, context);
294
+ await conversation?.submit({ type: "input", content: action.message, whenBusy: "steer", requestId }, context);
295
+ });
296
+ const queued = yield* durable.use("record the queued operator input", (harness, context) => harness.commit(async (tx) => {
297
+ const submission = await tx.submissionByRequest(parent, requestId);
298
+ if (submission?.status !== "queued")
299
+ return false;
300
+ const record = await tx.doc(AttemptRecordDoc, hub.attemptId, null);
301
+ record.queuedInputs = [
302
+ ...(record.queuedInputs ?? []),
303
+ {
304
+ inputSequence,
305
+ submission: submission.id,
306
+ intervention: encodeIntervention(intervention),
307
+ },
308
+ ];
309
+ return true;
310
+ }, context));
311
+ if (queued) {
312
+ yield* Effect.logInfo("The working Pi parent reads the operator input when its running tool call returns", { holds });
313
+ return routed.value.state;
314
+ }
315
+ yield* Effect.logInfo("The Pi parent read the operator input at once", { holds });
316
+ return new AttemptChannel.InterventionState({ ...routed.value.state, queued: false });
317
+ });
318
+ const intervene = Effect.fn("AttemptRuntime.intervene")(function* (attemptId, intervention) {
319
+ yield* Effect.annotateCurrentSpan({
320
+ attemptId,
321
+ target: intervention.target._tag,
322
+ action: intervention.action._tag,
323
+ });
324
+ const found = hubs.find(attemptId);
325
+ if (Option.isNone(found) || Option.isNone(found.value.channel)) {
326
+ yield* Effect.logWarning("Operator input addressed an Attempt with no live channel", {
327
+ action: intervention.action._tag,
328
+ });
329
+ return yield* new AgentFailure({ message: "This attempt no longer has a live channel" });
330
+ }
331
+ const hub = found.value;
332
+ yield* hub.routing.withPermits(1)(Effect.gen(function* () {
333
+ const inputSequence = yield* appendInbound(durable, hub, intervention.operator, intervention.target, intervention.action);
334
+ const target = intervention.target;
335
+ const applied = yield* (target._tag === "Child"
336
+ ? routeChild(hub, target, intervention, inputSequence)
337
+ : routeParent(hub, intervention, inputSequence)).pipe(Effect.catchTag("DurableHarnessError", (error) => Effect.fail(refuse(error.message))), Effect.result);
338
+ if (Result.isFailure(applied)) {
339
+ yield* Effect.logWarning("Session refused operator input", {
340
+ action: intervention.action._tag,
341
+ message: applied.failure.message,
342
+ });
343
+ yield* emitPayload(durable, hub, new AttemptChannel.InterventionRejected({
344
+ inputSequence,
345
+ intervention,
346
+ message: applied.failure.message,
347
+ }));
348
+ return;
349
+ }
350
+ yield* emitPayload(durable, hub, new AttemptChannel.InterventionApplied({
351
+ inputSequence,
352
+ intervention,
353
+ state: applied.success,
354
+ }));
355
+ yield* Effect.logInfo("Operator input applied", {
356
+ action: intervention.action._tag,
357
+ held: applied.success.held,
358
+ paused: applied.success.paused,
359
+ queued: applied.success.queued,
360
+ });
361
+ }));
362
+ }, (effect, attemptId) => effect.pipe(Effect.catchTag("DurableHarnessError", (error) => Effect.fail(infra(error))), Effect.annotateLogs({ attemptId })));
363
+ const attached = Effect.fn("AttemptRuntime.attached")(function* (attemptId) {
364
+ yield* Effect.annotateCurrentSpan({ attemptId });
365
+ const relayed = Option.exists(hubs.find(attemptId), ({ channel }) => Option.isSome(channel));
366
+ if (!relayed) {
367
+ yield* Effect.logDebug("Waiting for an execute call to relay the Attempt's channel");
368
+ }
369
+ yield* hubs.attached(attemptId);
370
+ if (!relayed)
371
+ yield* Effect.logDebug("The Attempt's channel is relayed in this process");
372
+ }, (effect, attemptId) => effect.pipe(Effect.annotateLogs({ attemptId })));
373
+ const cancel = Effect.fn("AttemptRuntime.cancel")(function* (attemptId) {
374
+ yield* Effect.annotateCurrentSpan({ attemptId });
375
+ const record = yield* readRecord(durable, attemptId);
376
+ if (record === undefined || record.taskId === null) {
377
+ yield* Effect.logInfo("The Attempt has no durable task; nothing to cancel");
378
+ return;
379
+ }
380
+ const taskId = record.taskId;
381
+ const hub = hubs.find(attemptId);
382
+ if (Option.isSome(hub) && Option.isSome(hub.value.channel)) {
383
+ yield* appendInbound(durable, hub.value, "engine", new AttemptChannel.ParentTarget(), new AttemptChannel.Cancel()).pipe(Effect.tapError((error) => Effect.logWarning("Could not record the cancellation in the transcript", {
384
+ errorTag: error._tag,
385
+ })), Effect.ignore);
386
+ }
387
+ const marked = yield* durable.use("abort the Attempt task", (harness, context) => harness.abortTask(taskId, context));
388
+ yield* Effect.logInfo("Canceling the Attempt's durable task", { taskId, marked });
389
+ yield* durable.use("wait for the canceled Attempt task", (harness, context) => harness.waitForTask(taskId, context));
390
+ yield* Effect.logInfo("The canceled Attempt's task stopped", { taskId });
391
+ }, (effect, attemptId) => effect.pipe(Effect.catchTag("DurableHarnessError", (error) => Effect.fail(infra(error))), Effect.annotateLogs({ attemptId })));
392
+ const notify = Effect.fn("AttemptRuntime.notify")(function* (attemptId, notice) {
393
+ yield* Effect.annotateCurrentSpan({ attemptId, notice: notice._tag });
394
+ const routed = yield* hubs.notice(attemptId, notice);
395
+ if (routed._tag === "Kept")
396
+ yield* Effect.logDebug("Kept a Worker notice for an Attempt not tracked here yet; it is relayed after the parent starts", {
397
+ notice: notice._tag,
398
+ worker: notice.worker,
399
+ kept: routed.kept.map(({ _tag }) => _tag),
400
+ });
401
+ }, (effect, attemptId) => effect.pipe(Effect.annotateLogs({ attemptId })));
402
+ yield* Effect.logInfo("The durable Attempt runtime is ready");
403
+ return AttemptRuntime.of({
404
+ execute,
405
+ isLive,
406
+ finished,
407
+ recordResult,
408
+ recordUnsupervised,
409
+ unsupervised,
410
+ request,
411
+ intervene,
412
+ attached,
413
+ cancel,
414
+ notify,
415
+ });
416
+ });
417
+ /**
418
+ * Provides `AttemptRuntime` on the durable harness. Building it installs the usine extension and
419
+ * resumes unfinished Attempts.
420
+ */
421
+ export const layer = Layer.effect(AttemptRuntime, makeAttemptRuntime);
422
+ //# sourceMappingURL=runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../src/attempt/runtime.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuB,OAAO,EAAE,MAAM,4BAA4B,CAAC;AAC1E,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAErD,OAAO,KAAK,cAAc,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAEzE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AACzE,OAAO,EAAuB,cAAc,EAAwB,MAAM,uBAAuB,CAAC;AAClG,OAAO,EAAE,cAAc,EAA4B,MAAM,eAAe,CAAC;AACzE,OAAO,EAAE,gBAAgB,EAAa,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACxF,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAmB,WAAW,EAAE,MAAM,WAAW,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,6BAA6B,EAAE,MAAM,aAAa,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,UAAU,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AACnG,OAAO,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAE5D;;;GAGG;AACH,MAAM,mBAAoB,SAAQ,MAAM,CAAC,WAAW,CAClD,oCAAoC,CACrC,CAAC,qBAAqB,EAAE,EAAE,OAAO,EAAE,MAAM,CAAC,cAAc,EAAE,CAAC;CAAG;AAE/D,MAAM,MAAM,GAAG,CAAC,OAAe,EAAE,EAAE,CAAC,IAAI,mBAAmB,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;AAEzE,MAAM,KAAK,GAAG,CAAC,KAA0B,EAAE,EAAE,CAC3C,IAAI,YAAY,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;AAE7D,MAAM,aAAa,GAA0B,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;AAE/E,MAAM,kBAAkB,GAAG,MAAM,CAAC,UAAU,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC;AAE1E,MAAM,kBAAkB,GAAG,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAC7C,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,cAAc,CAAC;IACtC,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,YAAY,CAAC;IACpC,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,EAAS,CAAC;IAChD,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,WAAW,CAAC;IAChC,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,cAAc,CAAC;QACzC,IAAI;QACJ,OAAO;QACP,YAAY,EAAE,OAAO,CAAC,YAAY;QAClC,GAAG,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,CAAC;KAC/E,CAAC,CAAC;IACH,KAAK,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAClC,KAAK,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACxC,KAAK,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,4BAA4B,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;IAC9F,KAAK,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,6BAA6B,CAAC,CAAC;IAErD,MAAM,YAAY,GAAG,MAAM,CAAC,EAAE,CAAC,6BAA6B,CAAC,CAAC,QAAQ,CAAC,EACrE,OAAuB;QAEvB,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC;QACzC,MAAM,KAAK,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;QACjC,OAAO,KAAK,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,iCAAiC,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE;YACtF,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACzC,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE;gBAC9B,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,GAAG,CAAC,gBAAgB,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;gBAC/D,IAAI,MAAM,CAAC,MAAM,KAAK,IAAI;oBAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;gBAC7E,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,UAAU,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,SAAS,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,EAAE,CAAC,CAAC;gBACzF,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC;gBACvB,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;YACnC,CAAC,EAAE,OAAO,CAAC,CAAC;QACd,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,MAAM,OAAO,GAAG,MAAM,CAAC,EAAE,CAAC,wBAAwB,CAAC,CACjD,QAAQ,CAAC,EAAE,OAAuB,EAAE,EAAuB;QACzD,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC;QACzC,KAAK,CAAC,CAAC,MAAM,CAAC,mBAAmB,CAAC;YAChC,SAAS;YACT,SAAS,EAAE,eAAe,CAAC,SAAS,CAAC;YACrC,UAAU,EAAE,OAAO,CAAC,IAAI,CAAC,UAAU;YACnC,MAAM,EAAE,OAAO,CAAC,MAAM;SACvB,CAAC,CAAC;QACH,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;QAC3C,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CACnB,KAAK,CAAC,OAAO;YACX,CAAC,CAAC,oCAAoC;YACtC,CAAC,CAAC,0CAA0C,EAC9C,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CACzB,CAAC;QACF,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;QACrD,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,YAAY,CAAC,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC;QACrE,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE;YAClC,SAAS,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,uBAAuB,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC;YACtF,SAAS,EAAE,CAAC,OAAO,EAAE,EAAE,CACrB,MAAM,CAAC,OAAO,CAAC,mCAAmC,EAAE,EAAE,OAAO,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CACjF,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CACrC;SACJ,CAAC,CAAC;IACL,CAAC,EACD,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,CAClB,MAAM,CAAC,IAAI,CACT,MAAM,CAAC,QAAQ,CAAC,qBAAqB,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAC5E,MAAM,CAAC,YAAY,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAC3D,CACJ,CAAC;IAEF,+FAA+F;IAC/F,gCAAgC;IAChC,MAAM,MAAM,GAAG,MAAM,CAAC,EAAE,CAAC,uBAAuB,CAAC,CAC/C,QAAQ,CAAC,EAAE,SAAoB;QAC7B,KAAK,CAAC,CAAC,MAAM,CAAC,mBAAmB,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC;QACjD,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,UAAU,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QACrD,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;YACnD,KAAK,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,iDAAiD,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;YACzF,OAAO,KAAK,CAAC;QACf,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;QAC7B,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,uBAAuB,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,CAC5E,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,CACjC,CAAC;QACF,MAAM,OAAO,GAAG,IAAI,EAAE,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC;QAC5C,MAAM,IAAI,GAAG,IAAI,KAAK,SAAS,IAAI,OAAO,KAAK,SAAS,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC;QACpF,KAAK,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,qCAAqC,EAAE;YAC5D,SAAS;YACT,MAAM;YACN,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,MAAM;YAC1B,OAAO;YACP,eAAe,EAAE,MAAM,CAAC,eAAe;YACvC,IAAI;SACL,CAAC,CAAC;QACH,OAAO,IAAI,CAAC;IACd,CAAC,EACD,MAAM,CAAC,QAAQ,CAAC,qBAAqB,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAC7E,CAAC;IAEF,MAAM,QAAQ,GAAG,MAAM,CAAC,EAAE,CAAC,yBAAyB,CAAC,CACnD,QAAQ,CAAC,EAAE,SAAoB;QAC7B,KAAK,CAAC,CAAC,MAAM,CAAC,mBAAmB,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC;QACjD,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,UAAU,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QACrD,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,CAAC,MAAM,KAAK,IAAI;YAAE,OAAO,MAAM,CAAC,IAAI,EAAmB,CAAC;QAC1F,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;QAC7B,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,uBAAuB,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,CAC5E,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,CACjC,CAAC;QACF,MAAM,KAAK,GAAG,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,EAAmB,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QAC7F,IACE,MAAM,CAAC,MAAM,KAAK,SAAS;YAC3B,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC;YACpB,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,gBAAgB,EACrC,CAAC;YACD,KAAK,CAAC,CAAC,MAAM,CAAC,UAAU,CACtB,gFAAgF,EAChF,EAAE,SAAS,EAAE,MAAM,EAAE,CACtB,CAAC;QACJ,CAAC;QACD,KAAK,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,4CAA4C,EAAE;YACnE,SAAS;YACT,MAAM;YACN,eAAe,EAAE,MAAM,CAAC,eAAe;YACvC,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,OAAO,EAAE,MAAM;YACpC,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC;SACpF,CAAC,CAAC;QACH,OAAO,KAAK,CAAC;IACf,CAAC,EACD,MAAM,CAAC,QAAQ,CAAC,qBAAqB,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAC7E,CAAC;IAEF,MAAM,YAAY,GAAG,MAAM,CAAC,EAAE,CAAC,6BAA6B,CAAC,CAC3D,QAAQ,CAAC,EAAE,SAAoB,EAAE,MAAkB;QACjD,KAAK,CAAC,CAAC,MAAM,CAAC,mBAAmB,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC;QACjD,MAAM,OAAO,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;QACrC,KAAK,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,6BAA6B,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,CACrE,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE;YAC1B,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,GAAG,CAAC,gBAAgB,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;YAC/D,MAAM,CAAC,MAAM,GAAG,OAAO,CAAC;QAC1B,CAAC,EAAE,OAAO,CAAC,CACZ,CAAC;QACF,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,yCAAyC,EAAE;YAC/D,SAAS;YACT,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM;SAC3B,CAAC,CAAC;IACL,CAAC,EACD,MAAM,CAAC,QAAQ,CAAC,qBAAqB,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAC7E,CAAC;IAEF,MAAM,kBAAkB,GAAG,MAAM,CAAC,EAAE,CAAC,mCAAmC,CAAC,CACvE,QAAQ,CAAC,EAAE,SAAoB,EAAE,YAA+B;QAC9D,KAAK,CAAC,CAAC,MAAM,CAAC,mBAAmB,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC;QACjD,MAAM,MAAM,GAAG,QAAQ,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;QAC/C,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,OAAO,CAAC,GAAG,CAC7B,wCAAwC,EACxC,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,CACnB,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE;YAC1B,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,GAAG,CAAC,gBAAgB,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;YAC/D,MAAM,CAAC,kBAAkB,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,kBAAkB,IAAI,CAAC,EAAE,MAAM,CAAC,CAAC;YAC7E,OAAO,MAAM,CAAC,kBAAkB,CAAC;QACnC,CAAC,EAAE,OAAO,CAAC,CACd,CAAC;QACF,KAAK,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,0CAA0C,EAAE;YACjE,SAAS;YACT,kBAAkB,EAAE,MAAM;YAC1B,UAAU,EAAE,IAAI;SACjB,CAAC,CAAC;IACL,CAAC,EACD,MAAM,CAAC,QAAQ,CAAC,qBAAqB,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAC7E,CAAC;IAEF,MAAM,YAAY,GAAG,MAAM,CAAC,EAAE,CAAC,6BAA6B,CAAC,CAC3D,QAAQ,CAAC,EAAE,SAAoB;QAC7B,KAAK,CAAC,CAAC,MAAM,CAAC,mBAAmB,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC;QACjD,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,UAAU,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QACrD,OAAO,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,EAAE,kBAAkB,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IACvF,CAAC,EACD,MAAM,CAAC,QAAQ,CAAC,qBAAqB,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAC7E,CAAC;IAEF,MAAM,OAAO,GAAG,MAAM,CAAC,EAAE,CAAC,wBAAwB,CAAC,CACjD,QAAQ,CAAC,EAAE,SAAoB;QAC7B,KAAK,CAAC,CAAC,MAAM,CAAC,mBAAmB,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC;QACjD,OAAO,KAAK,CAAC,CAAC,iBAAiB,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IACtD,CAAC,EACD,MAAM,CAAC,QAAQ,CAAC,qBAAqB,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAC7E,CAAC;IAEF,2FAA2F;IAC3F,MAAM,SAAS,GAAG,CAAI,GAAe,EAAE,MAA6B,EAAE,EAAE,CACtE,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,CAClD,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE;QAC1B,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAC1C,IAAI,OAAO,KAAK,SAAS,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;YAC3E,OAAO,MAAM,CAAC,IAAI,EAAK,CAAC;QAC1B,CAAC;QACD,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAChE,CAAC,EAAE,OAAO,CAAC,CACZ,CAAC;IAEJ,MAAM,IAAI,GAAG,CAAC,GAAe,EAAE,MAAsD,EAAE,EAAE,CACvF,SAAS,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,EAAE;QAC1B,QAAQ,CAAC,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEL;;;OAGG;IACH,MAAM,UAAU,GAAG,MAAM,CAAC,EAAE,CAAC,2BAA2B,CAAC,CAAC,QAAQ,CAAC,EACjE,GAAe,EACf,MAAkC,EAClC,YAAyC,EACzC,aAAsC;QAEtC,MAAM,KAAK,GAAG,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACjD,IAAI,KAAK,KAAK,SAAS;YAAE,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,gCAAgC,CAAC,CAAC;QAChF,MAAM,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC;QACnC,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,KAAK;aACvB,SAAS,CAAC,MAAM,EAAE,CAAC,SAAS,EAAE,EAAE,CAC/B,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,aAAa,EAAE,YAAY,EAAE,SAAS,EAAE,CAAC,CACjF;aACA,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAC3D,IAAI,MAAM,CAAC,IAAI,KAAK,iBAAiB,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YACnE,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE,CACxB,KAAK,CAAC,IAAI;gBACR,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,KAAK,MAAM,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC,SAAS,CAAC;gBACrE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,KAAK,MAAM,CAAC,SAAS,CAAC,CACjD,CAAC;QACJ,CAAC;QACD,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;YACjB,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;YACnC,KAAK,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,kCAAkC,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,CAC1E,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE;gBAC1B,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,GAAG,CAAC,gBAAgB,EAAE,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;gBACnE,MAAM,CAAC,YAAY,GAAG;oBACpB,GAAG,CAAC,MAAM,CAAC,YAAY,IAAI,EAAE,CAAC;oBAC9B;wBACE,aAAa;wBACb,KAAK,EAAE,MAAM,CAAC,SAAS;wBACvB,YAAY,EAAE,kBAAkB,CAAC,YAAY,CAAC;qBAC/C;iBACF,CAAC;YACJ,CAAC,EAAE,OAAO,CAAC,CACZ,CAAC;YACF,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,iEAAiE,EAAE;gBACvF,SAAS,EAAE,MAAM,CAAC,SAAS;gBAC3B,MAAM,EAAE,MAAM,CAAC,IAAI;aACpB,CAAC,CAAC;QACL,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC,CAAC,CAAC;IAEH;;;OAGG;IACH,MAAM,eAAe,GAAG,CACtB,GAAe,EACf,MAAsB,EACtB,MAA4C,EAC5C,EAAE,CACF,OAAO,CAAC,GAAG,CAAC,0BAA0B,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,CAC3D,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE;QAC1B,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAC1C,IAAI,OAAO,KAAK,SAAS,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;YAC3E,OAAO,MAAM,CAAC,IAAI,EAAK,CAAC;QAC1B,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC3C,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC;IACxF,CAAC,EAAE,OAAO,CAAC,CACZ,CAAC;IAEJ;;;;OAIG;IACH,MAAM,WAAW,GAAG,MAAM,CAAC,EAAE,CAAC,4BAA4B,CAAC,CAAC,QAAQ,CAAC,EACnE,GAAe,EACf,YAAyC,EACzC,aAAsC;QAEtC,IAAI,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC;YAAE,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,+BAA+B,CAAC,CAAC;QACrF,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC;QAChC,MAAM,QAAQ,GAAG,eAAe,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAChD,MAAM,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC;QACnC,MAAM,OAAO,GAAG,CAAC,QAAc,EAAE,MAAe,EAAE,EAAE,CAClD,IAAI,cAAc,CAAC,iBAAiB,CAAC;YACnC,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;YACtC,MAAM,EAAE,QAAQ,CAAC,MAAM;YACvB,MAAM;SACP,CAAC,CAAC;QACL,IAAI,MAAM,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;YAChC,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,EAAE;gBAChD,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC;gBAChC,QAAQ,CAAC,MAAM,GAAG,IAAI,CAAC;gBACvB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,QAAQ,EAAE,KAAK,CAAC,EAAE,CAAC;YACtD,CAAC,CAAC,CAAC;YACH,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC;gBAAE,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,mCAAmC,CAAC,CAAC;YACrF,IAAI,MAAM,CAAC,KAAK,CAAC,OAAO;gBAAE,OAAO,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC;YACpD,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,oEAAoE,CAAC,CAAC;YAC5F,KAAK,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,yBAAyB,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE;gBACvE,MAAM,YAAY,GAAG,MAAM,OAAO,CAAC,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;gBACjE,MAAM,YAAY,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;YACrC,CAAC,CAAC,CAAC;YACH,4EAA4E;YAC5E,KAAK,CAAC,CAAC,eAAe,CAAC,OAAO,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;YAC7C,OAAO,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC;QAC5B,CAAC;QACD,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC9B,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,CAAC,QAAQ,EAAE,IAAI,EAAE,EAAE;gBACtE,IAAI,CAAC,QAAQ,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;oBAC1D,OAAO,EAAE,IAAI,EAAE,eAAe,EAAW,CAAC;gBAC5C,CAAC;gBACD,QAAQ,CAAC,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAC;gBAC9D,yFAAyF;gBACzF,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC;oBACpB,QAAQ,CAAC,QAAQ,GAAG,CAAC,GAAG,QAAQ,CAAC,QAAQ,EAAE,gBAAgB,CAAC,CAAC;oBAC7D,QAAQ,CAAC,MAAM,GAAG,KAAK,CAAC;gBAC1B,CAAC;gBACD,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,QAAQ,EAAE,KAAK,CAAC,EAAW,CAAC;YAC9E,CAAC,CAAC,CAAC;YACH,IAAI,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC;gBAAE,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,mCAAmC,CAAC,CAAC;YACvF,IAAI,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,eAAe,EAAE,CAAC;gBAC5C,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,+CAA+C,CAAC,CAAC;YACxE,CAAC;YACD,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CACnB,QAAQ,CAAC,KAAK,CAAC,IAAI;gBACjB,CAAC,CAAC,kEAAkE;gBACpE,CAAC,CAAC,uDAAuD,CAC5D,CAAC;YACF,OAAO,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC;QAC9B,CAAC;QACD,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,KAAK,iBAAiB,CAAC;QAChD,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,CAAC,QAAQ,EAAE,IAAI,EAAE,EAAE;YACpE,IAAI,KAAK,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;gBAAE,QAAQ,CAAC,IAAI,GAAG,CAAC,GAAG,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;YAC7F,IAAI,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM;gBAC1B,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,EAAW,CAAC;YACpE,QAAQ,CAAC,QAAQ,GAAG,CAAC,GAAG,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;YAC3D,QAAQ,CAAC,MAAM,GAAG,KAAK,CAAC;YACxB,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,OAAO,CAAC,QAAQ,EAAE,KAAK,CAAC,EAAW,CAAC;QACxE,CAAC,CAAC,CAAC;QACH,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC;YAAE,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,mCAAmC,CAAC,CAAC;QACrF,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;YACrC,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,yDAAyD,EAAE;gBAC/E,KAAK;aACN,CAAC,CAAC;YACH,OAAO,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC;QAC5B,CAAC;QACD,MAAM,SAAS,GAAG,gBAAgB,GAAG,CAAC,SAAS,IAAI,aAAa,EAAE,CAAC;QACnE,KAAK,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE;YAChE,MAAM,YAAY,GAAG,MAAM,OAAO,CAAC,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;YACjE,MAAM,YAAY,EAAE,MAAM,CACxB,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,EACxE,OAAO,CACR,CAAC;QACJ,CAAC,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,kCAAkC,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,CACzF,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE;YAC1B,MAAM,UAAU,GAAG,MAAM,EAAE,CAAC,mBAAmB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;YACnE,IAAI,UAAU,EAAE,MAAM,KAAK,QAAQ;gBAAE,OAAO,KAAK,CAAC;YAClD,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,GAAG,CAAC,gBAAgB,EAAE,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;YACnE,MAAM,CAAC,YAAY,GAAG;gBACpB,GAAG,CAAC,MAAM,CAAC,YAAY,IAAI,EAAE,CAAC;gBAC9B;oBACE,aAAa;oBACb,UAAU,EAAE,UAAU,CAAC,EAAE;oBACzB,YAAY,EAAE,kBAAkB,CAAC,YAAY,CAAC;iBAC/C;aACF,CAAC;YACF,OAAO,IAAI,CAAC;QACd,CAAC,EAAE,OAAO,CAAC,CACZ,CAAC;QACF,IAAI,MAAM,EAAE,CAAC;YACX,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CACnB,mFAAmF,EACnF,EAAE,KAAK,EAAE,CACV,CAAC;YACF,OAAO,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC;QAC5B,CAAC;QACD,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,+CAA+C,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;QAClF,OAAO,IAAI,cAAc,CAAC,iBAAiB,CAAC,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;IACxF,CAAC,CAAC,CAAC;IAEH,MAAM,SAAS,GAAG,MAAM,CAAC,EAAE,CAAC,0BAA0B,CAAC,CACrD,QAAQ,CAAC,EAAE,SAAoB,EAAE,YAAyC;QACxE,KAAK,CAAC,CAAC,MAAM,CAAC,mBAAmB,CAAC;YAChC,SAAS;YACT,MAAM,EAAE,YAAY,CAAC,MAAM,CAAC,IAAI;YAChC,MAAM,EAAE,YAAY,CAAC,MAAM,CAAC,IAAI;SACjC,CAAC,CAAC;QACH,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACnC,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;YAC/D,KAAK,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,0DAA0D,EAAE;gBACnF,MAAM,EAAE,YAAY,CAAC,MAAM,CAAC,IAAI;aACjC,CAAC,CAAC;YACH,OAAO,KAAK,CAAC,CAAC,IAAI,YAAY,CAAC,EAAE,OAAO,EAAE,2CAA2C,EAAE,CAAC,CAAC;QAC3F,CAAC;QACD,MAAM,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC;QACxB,KAAK,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAC/B,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;YAClB,MAAM,aAAa,GAAG,KAAK,CAAC,CAAC,aAAa,CACxC,OAAO,EACP,GAAG,EACH,YAAY,CAAC,QAAQ,EACrB,YAAY,CAAC,MAAM,EACnB,YAAY,CAAC,MAAM,CACpB,CAAC;YACF,MAAM,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC;YACnC,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CACrB,MAAM,CAAC,IAAI,KAAK,OAAO;gBACrB,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,YAAY,EAAE,aAAa,CAAC;gBACtD,CAAC,CAAC,WAAW,CAAC,GAAG,EAAE,YAAY,EAAE,aAAa,CAAC,CAClD,CAAC,IAAI,CACJ,MAAM,CAAC,QAAQ,CAAC,qBAAqB,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EACrF,MAAM,CAAC,MAAM,CACd,CAAC;YACF,IAAI,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC9B,KAAK,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,gCAAgC,EAAE;oBACzD,MAAM,EAAE,YAAY,CAAC,MAAM,CAAC,IAAI;oBAChC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,OAAO;iBACjC,CAAC,CAAC;gBACH,KAAK,CAAC,CAAC,WAAW,CAChB,OAAO,EACP,GAAG,EACH,IAAI,cAAc,CAAC,oBAAoB,CAAC;oBACtC,aAAa;oBACb,YAAY;oBACZ,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,OAAO;iBACjC,CAAC,CACH,CAAC;gBACF,OAAO;YACT,CAAC;YACD,KAAK,CAAC,CAAC,WAAW,CAChB,OAAO,EACP,GAAG,EACH,IAAI,cAAc,CAAC,mBAAmB,CAAC;gBACrC,aAAa;gBACb,YAAY;gBACZ,KAAK,EAAE,OAAO,CAAC,OAAO;aACvB,CAAC,CACH,CAAC;YACF,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,wBAAwB,EAAE;gBAC9C,MAAM,EAAE,YAAY,CAAC,MAAM,CAAC,IAAI;gBAChC,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,IAAI;gBAC1B,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC,MAAM;gBAC9B,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC,MAAM;aAC/B,CAAC,CAAC;QACL,CAAC,CAAC,CACH,CAAC;IACJ,CAAC,EACD,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,CACpB,MAAM,CAAC,IAAI,CACT,MAAM,CAAC,QAAQ,CAAC,qBAAqB,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAC5E,MAAM,CAAC,YAAY,CAAC,EAAE,SAAS,EAAE,CAAC,CACnC,CACJ,CAAC;IAEF,MAAM,QAAQ,GAAG,MAAM,CAAC,EAAE,CAAC,yBAAyB,CAAC,CACnD,QAAQ,CAAC,EAAE,SAAoB;QAC7B,KAAK,CAAC,CAAC,MAAM,CAAC,mBAAmB,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC;QACjD,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;QAC7F,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,KAAK,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,4DAA4D,CAAC,CAAC;QACvF,CAAC;QACD,KAAK,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;QAChC,IAAI,CAAC,OAAO;YAAE,KAAK,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,kDAAkD,CAAC,CAAC;IAC3F,CAAC,EACD,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,CACvE,CAAC;IAEF,MAAM,MAAM,GAAG,MAAM,CAAC,EAAE,CAAC,uBAAuB,CAAC,CAC/C,QAAQ,CAAC,EAAE,SAAoB;QAC7B,KAAK,CAAC,CAAC,MAAM,CAAC,mBAAmB,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC;QACjD,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,UAAU,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QACrD,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;YACnD,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,oDAAoD,CAAC,CAAC;YAC5E,OAAO;QACT,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;QAC7B,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACjC,IAAI,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;YAC3D,KAAK,CAAC,CAAC,aAAa,CAClB,OAAO,EACP,GAAG,CAAC,KAAK,EACT,QAAQ,EACR,IAAI,cAAc,CAAC,YAAY,EAAE,EACjC,IAAI,cAAc,CAAC,MAAM,EAAE,CAC5B,CAAC,IAAI,CACJ,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,EAAE,EAAE,CACxB,MAAM,CAAC,UAAU,CAAC,qDAAqD,EAAE;gBACvE,QAAQ,EAAE,KAAK,CAAC,IAAI;aACrB,CAAC,CACH,EACD,MAAM,CAAC,MAAM,CACd,CAAC;QACJ,CAAC;QACD,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,wBAAwB,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,CAC/E,OAAO,CAAC,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC,CACnC,CAAC;QACF,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,sCAAsC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;QAClF,KAAK,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,oCAAoC,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,CAC5E,OAAO,CAAC,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,CACrC,CAAC;QACF,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,qCAAqC,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;IAC3E,CAAC,EACD,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,CACpB,MAAM,CAAC,IAAI,CACT,MAAM,CAAC,QAAQ,CAAC,qBAAqB,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAC5E,MAAM,CAAC,YAAY,CAAC,EAAE,SAAS,EAAE,CAAC,CACnC,CACJ,CAAC;IAEF,MAAM,MAAM,GAAG,MAAM,CAAC,EAAE,CAAC,uBAAuB,CAAC,CAC/C,QAAQ,CAAC,EAAE,SAAoB,EAAE,MAAmC;QAClE,KAAK,CAAC,CAAC,MAAM,CAAC,mBAAmB,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QACtE,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QACrD,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM;YACxB,KAAK,CAAC,CAAC,MAAM,CAAC,QAAQ,CACpB,iGAAiG,EACjG;gBACE,MAAM,EAAE,MAAM,CAAC,IAAI;gBACnB,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC;aAC1C,CACF,CAAC;IACN,CAAC,EACD,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,CACvE,CAAC;IAEF,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,sCAAsC,CAAC,CAAC;IAC9D,OAAO,cAAc,CAAC,EAAE,CAAC;QACvB,OAAO;QACP,MAAM;QACN,QAAQ;QACR,YAAY;QACZ,kBAAkB;QAClB,YAAY;QACZ,OAAO;QACP,SAAS;QACT,QAAQ;QACR,MAAM;QACN,MAAM;KACP,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH;;;GAGG;AACH,MAAM,CAAC,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,cAAc,EAAE,kBAAkB,CAAC,CAAC"}
@@ -0,0 +1,15 @@
1
+ import type { ModelRef } from "@earendil-works/pi-durable";
2
+ import type { ChildBackend } from "@usine/agents/runtime";
3
+ import type { Effect, Option } from "effect";
4
+ import type { AttemptHubs } from "./hubs.ts";
5
+ /** The runtime services that the usine extension's tool and task use. */
6
+ export interface ExtensionServices {
7
+ readonly hubs: AttemptHubs;
8
+ readonly backend: ChildBackend["Service"];
9
+ readonly defaultModel: Option.Option<ModelRef>;
10
+ /**
11
+ * Runs `program` with the installing runtime's services and interrupts it when `signal` aborts.
12
+ */
13
+ readonly run: <A, E>(program: Effect.Effect<A, E>, signal: AbortSignal | undefined) => Promise<A>;
14
+ }
15
+ //# sourceMappingURL=services.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"services.d.ts","sourceRoot":"","sources":["../../src/attempt/services.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC7C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAE7C,yEAAyE;AACzE,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,YAAY,CAAC,SAAS,CAAC,CAAC;IAC1C,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC/C;;OAEG;IACH,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,WAAW,GAAG,SAAS,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC;CACnG"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=services.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"services.js","sourceRoot":"","sources":["../../src/attempt/services.ts"],"names":[],"mappings":""}
@@ -0,0 +1,17 @@
1
+ import { Type } from "@earendil-works/pi-ai";
2
+ import type { ExtensionServices } from "./services.ts";
3
+ /** The name of the parent's only tool. */
4
+ export declare const SUBAGENT_TOOL = "subagent";
5
+ type SpawnDetails = {
6
+ childSessionId: string;
7
+ };
8
+ /**
9
+ * Builds the `subagent` tool, which runs one task in a child of the Agent's harness and returns the
10
+ * child's report. After a restart, a running call ends as interrupted, because children aren't
11
+ * replay-safe.
12
+ */
13
+ export declare const subagentTool: (services: ExtensionServices) => import("@earendil-works/pi-durable").ToolRegistration<Type.TObject<{
14
+ task: Type.TString;
15
+ }>, SpawnDetails>;
16
+ export {};
17
+ //# sourceMappingURL=subagent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subagent.d.ts","sourceRoot":"","sources":["../../src/attempt/subagent.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,IAAI,EAAE,MAAM,uBAAuB,CAAC;AAyB7C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAGvD,0CAA0C;AAC1C,eAAO,MAAM,aAAa,aAAa,CAAC;AAExC,KAAK,YAAY,GAAG;IAAE,cAAc,EAAE,MAAM,CAAA;CAAE,CAAC;AAsC/C;;;;GAIG;AACH,eAAO,MAAM,YAAY,aAAc,iBAAiB;;iBAoOvD,CAAC"}