@usine/durable 0.0.0-stage → 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/LICENSE +661 -0
- package/README.md +83 -2
- package/dist/attempt/documents.d.ts +86 -0
- package/dist/attempt/documents.d.ts.map +1 -0
- package/dist/attempt/documents.js +30 -0
- package/dist/attempt/documents.js.map +1 -0
- package/dist/attempt/events.d.ts +22 -0
- package/dist/attempt/events.d.ts.map +1 -0
- package/dist/attempt/events.js +110 -0
- package/dist/attempt/events.js.map +1 -0
- package/dist/attempt/extension.d.ts +48 -0
- package/dist/attempt/extension.d.ts.map +1 -0
- package/dist/attempt/extension.js +34 -0
- package/dist/attempt/extension.js.map +1 -0
- package/dist/attempt/hubs.d.ts +133 -0
- package/dist/attempt/hubs.d.ts.map +1 -0
- package/dist/attempt/hubs.js +146 -0
- package/dist/attempt/hubs.js.map +1 -0
- package/dist/attempt/outcome.d.ts +22 -0
- package/dist/attempt/outcome.d.ts.map +1 -0
- package/dist/attempt/outcome.js +84 -0
- package/dist/attempt/outcome.js.map +1 -0
- package/dist/attempt/parent.d.ts +27 -0
- package/dist/attempt/parent.d.ts.map +1 -0
- package/dist/attempt/parent.js +109 -0
- package/dist/attempt/parent.js.map +1 -0
- package/dist/attempt/relay.d.ts +41 -0
- package/dist/attempt/relay.d.ts.map +1 -0
- package/dist/attempt/relay.js +457 -0
- package/dist/attempt/relay.js.map +1 -0
- package/dist/attempt/repair.d.ts +14 -0
- package/dist/attempt/repair.d.ts.map +1 -0
- package/dist/attempt/repair.js +150 -0
- package/dist/attempt/repair.js.map +1 -0
- package/dist/attempt/request.d.ts +18 -0
- package/dist/attempt/request.d.ts.map +1 -0
- package/dist/attempt/request.js +24 -0
- package/dist/attempt/request.js.map +1 -0
- package/dist/attempt/runtime.d.ts +10 -0
- package/dist/attempt/runtime.d.ts.map +1 -0
- package/dist/attempt/runtime.js +429 -0
- package/dist/attempt/runtime.js.map +1 -0
- package/dist/attempt/services.d.ts +15 -0
- package/dist/attempt/services.d.ts.map +1 -0
- package/dist/attempt/services.js +2 -0
- package/dist/attempt/services.js.map +1 -0
- package/dist/attempt/subagent.d.ts +17 -0
- package/dist/attempt/subagent.d.ts.map +1 -0
- package/dist/attempt/subagent.js +208 -0
- package/dist/attempt/subagent.js.map +1 -0
- package/dist/attempt/task.d.ts +61 -0
- package/dist/attempt/task.d.ts.map +1 -0
- package/dist/attempt/task.js +302 -0
- package/dist/attempt/task.js.map +1 -0
- package/dist/attempt/watch.d.ts +8 -0
- package/dist/attempt/watch.d.ts.map +1 -0
- package/dist/attempt/watch.js +25 -0
- package/dist/attempt/watch.js.map +1 -0
- package/dist/attempt-runtime.d.ts +128 -0
- package/dist/attempt-runtime.d.ts.map +1 -0
- package/dist/attempt-runtime.js +78 -0
- package/dist/attempt-runtime.js.map +1 -0
- package/dist/backup.d.ts +26 -0
- package/dist/backup.d.ts.map +1 -0
- package/dist/backup.js +100 -0
- package/dist/backup.js.map +1 -0
- package/dist/harness.d.ts +101 -0
- package/dist/harness.d.ts.map +1 -0
- package/dist/harness.js +298 -0
- package/dist/harness.js.map +1 -0
- package/dist/live.d.ts +15 -0
- package/dist/live.d.ts.map +1 -0
- package/dist/live.js +51 -0
- package/dist/live.js.map +1 -0
- package/dist/storage-path.d.ts +4 -0
- package/dist/storage-path.d.ts.map +1 -0
- package/dist/storage-path.js +2 -0
- package/dist/storage-path.js.map +1 -0
- package/dist/testing.d.ts +116 -0
- package/dist/testing.d.ts.map +1 -0
- package/dist/testing.js +314 -0
- package/dist/testing.js.map +1 -0
- package/package.json +72 -3
|
@@ -0,0 +1,429 @@
|
|
|
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 { Deferred, 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 { abortEndedAttempts, 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 storageFailed = (failure) => new InfraFailure({
|
|
25
|
+
message: `Durable storage failed during the attempt: ${failure.message}`,
|
|
26
|
+
cause: failure,
|
|
27
|
+
});
|
|
28
|
+
const LIVE_STATUSES = ["pending", "running", "waiting"];
|
|
29
|
+
const encodeIntervention = Schema.encodeSync(AttemptChannel.Intervention);
|
|
30
|
+
const makeAttemptRuntime = Effect.gen(function* () {
|
|
31
|
+
const durable = yield* DurableHarness;
|
|
32
|
+
const backend = yield* ChildBackend;
|
|
33
|
+
const services = yield* Effect.context();
|
|
34
|
+
const hubs = yield* attemptHubs;
|
|
35
|
+
const { extension, task } = usineExtension({
|
|
36
|
+
hubs,
|
|
37
|
+
backend,
|
|
38
|
+
defaultModel: durable.defaultModel,
|
|
39
|
+
run: (program, signal) => Effect.runPromiseWith(services)(program, { signal }),
|
|
40
|
+
});
|
|
41
|
+
yield* durable.install(extension);
|
|
42
|
+
yield* durable.subscribe(hubs.listener);
|
|
43
|
+
yield* durable.use("open the root conversation", (harness, context) => harness.root(context));
|
|
44
|
+
yield* durable.resume((harness, storage) => repairUnreadableConversations(harness, storage).pipe(Effect.andThen(Effect.suspend(() => abortEndedAttempts(harness, hubs.takeEnded())))));
|
|
45
|
+
const createOrFind = Effect.fn("AttemptRuntime.createOrFind")(function* (request) {
|
|
46
|
+
const attemptId = request.spec.attemptId;
|
|
47
|
+
const input = taskInput(request);
|
|
48
|
+
return yield* durable.use("create or find the Attempt task", async (harness, context) => {
|
|
49
|
+
const root = await harness.root(context);
|
|
50
|
+
return root.commit(async (tx) => {
|
|
51
|
+
const record = await tx.doc(AttemptRecordDoc, attemptId, null);
|
|
52
|
+
if (record.taskId !== null)
|
|
53
|
+
return { taskId: record.taskId, created: false };
|
|
54
|
+
const taskId = await tx.createTask(task, input, { ownership: { kind: "conversation" } });
|
|
55
|
+
record.taskId = taskId;
|
|
56
|
+
return { taskId, created: true };
|
|
57
|
+
}, context);
|
|
58
|
+
});
|
|
59
|
+
});
|
|
60
|
+
const execute = Effect.fn("AttemptRuntime.execute")(function* (request, io) {
|
|
61
|
+
const attemptId = request.spec.attemptId;
|
|
62
|
+
yield* Effect.annotateCurrentSpan({
|
|
63
|
+
attemptId,
|
|
64
|
+
sessionId: parentSessionId(attemptId),
|
|
65
|
+
repository: request.spec.repository,
|
|
66
|
+
worker: request.worker,
|
|
67
|
+
});
|
|
68
|
+
const found = yield* createOrFind(request);
|
|
69
|
+
yield* Effect.logInfo(found.created
|
|
70
|
+
? "Created the Attempt's durable task"
|
|
71
|
+
: "Reattached to the Attempt's durable task", { taskId: found.taskId });
|
|
72
|
+
const hub = yield* hubs.hub(attemptId, found.taskId);
|
|
73
|
+
const settled = yield* relayAttempt(durable, hubs, hub, request, io).pipe(Effect.raceFirst(Deferred.await(hub.storageFailure).pipe(Effect.tap((failure) => Effect.logError("A storage error failed the durable harness; the Attempt fails", {
|
|
74
|
+
generation: failure.generation,
|
|
75
|
+
cause: failure.message,
|
|
76
|
+
})), Effect.flatMap((failure) => Effect.fail(storageFailed(failure))))));
|
|
77
|
+
return yield* Result.match(settled, {
|
|
78
|
+
onSuccess: (report) => Effect.logInfo("The Attempt completed").pipe(Effect.as(report)),
|
|
79
|
+
onFailure: (failure) => Effect.logInfo("The Attempt ended without success", { failure: failure._tag }).pipe(Effect.andThen(Effect.fail(failure))),
|
|
80
|
+
});
|
|
81
|
+
}, (effect, request) => effect.pipe(Effect.catchTag("DurableHarnessError", (error) => Effect.fail(infra(error))), Effect.annotateLogs({ attemptId: request.spec.attemptId })));
|
|
82
|
+
// An aborted task is never live: `cancel` aborts a task only for an Attempt the engine closes,
|
|
83
|
+
// and a reopened harness aborts one only for an Attempt whose `execute` a storage failure ended.
|
|
84
|
+
const isLive = Effect.fn("AttemptRuntime.isLive")(function* (attemptId) {
|
|
85
|
+
yield* Effect.annotateCurrentSpan({ attemptId });
|
|
86
|
+
const record = yield* readRecord(durable, attemptId);
|
|
87
|
+
if (record === undefined || record.taskId === null) {
|
|
88
|
+
yield* Effect.logDebug("The Attempt has no durable task; it is not live", { attemptId });
|
|
89
|
+
return false;
|
|
90
|
+
}
|
|
91
|
+
const taskId = record.taskId;
|
|
92
|
+
const task = yield* durable.use("read the Attempt task", (harness, context) => harness.getTask(taskId, context));
|
|
93
|
+
const outcome = task?.state.outcome?.status;
|
|
94
|
+
const live = task !== undefined && outcome !== "aborted" && !record.terminalRelayed;
|
|
95
|
+
yield* Effect.logDebug("Checked whether the Attempt is live", {
|
|
96
|
+
attemptId,
|
|
97
|
+
taskId,
|
|
98
|
+
status: task?.state.status,
|
|
99
|
+
outcome,
|
|
100
|
+
terminalRelayed: record.terminalRelayed,
|
|
101
|
+
live,
|
|
102
|
+
});
|
|
103
|
+
return live;
|
|
104
|
+
}, Effect.catchTag("DurableHarnessError", (error) => Effect.fail(infra(error))));
|
|
105
|
+
const finished = Effect.fn("AttemptRuntime.finished")(function* (attemptId) {
|
|
106
|
+
yield* Effect.annotateCurrentSpan({ attemptId });
|
|
107
|
+
const record = yield* readRecord(durable, attemptId);
|
|
108
|
+
if (record === undefined || record.taskId === null)
|
|
109
|
+
return Option.none();
|
|
110
|
+
const taskId = record.taskId;
|
|
111
|
+
const task = yield* durable.use("read the Attempt task", (harness, context) => harness.getTask(taskId, context));
|
|
112
|
+
const found = task === undefined ? Option.none() : finishedOf(record, task);
|
|
113
|
+
if (record.result !== undefined &&
|
|
114
|
+
Option.isSome(found) &&
|
|
115
|
+
found.value._tag === "ParentReported") {
|
|
116
|
+
yield* Effect.logWarning("The Attempt's recorded result does not decode; its checkout is harvested again", { attemptId, taskId });
|
|
117
|
+
}
|
|
118
|
+
yield* Effect.logDebug("Read what the Attempt's finished task left", {
|
|
119
|
+
attemptId,
|
|
120
|
+
taskId,
|
|
121
|
+
terminalRelayed: record.terminalRelayed,
|
|
122
|
+
outcome: task?.state.outcome?.status,
|
|
123
|
+
finished: Option.match(found, { onNone: () => "none", onSome: ({ _tag }) => _tag }),
|
|
124
|
+
});
|
|
125
|
+
return found;
|
|
126
|
+
}, Effect.catchTag("DurableHarnessError", (error) => Effect.fail(infra(error))));
|
|
127
|
+
const recordResult = Effect.fn("AttemptRuntime.recordResult")(function* (attemptId, result) {
|
|
128
|
+
yield* Effect.annotateCurrentSpan({ attemptId });
|
|
129
|
+
const encoded = encodeResult(result);
|
|
130
|
+
yield* durable.use("record the Attempt's result", (harness, context) => harness.commit(async (tx) => {
|
|
131
|
+
const record = await tx.doc(AttemptRecordDoc, attemptId, null);
|
|
132
|
+
record.result = encoded;
|
|
133
|
+
}, context));
|
|
134
|
+
yield* Effect.logInfo("Recorded the Attempt's harvested result", {
|
|
135
|
+
attemptId,
|
|
136
|
+
facts: result.facts.length,
|
|
137
|
+
});
|
|
138
|
+
}, Effect.catchTag("DurableHarnessError", (error) => Effect.fail(infra(error))));
|
|
139
|
+
const recordUnsupervised = Effect.fn("AttemptRuntime.recordUnsupervised")(function* (attemptId, unsupervised) {
|
|
140
|
+
yield* Effect.annotateCurrentSpan({ attemptId });
|
|
141
|
+
const millis = Duration.toMillis(unsupervised);
|
|
142
|
+
const kept = yield* durable.use("record the Attempt's unsupervised time", (harness, context) => harness.commit(async (tx) => {
|
|
143
|
+
const record = await tx.doc(AttemptRecordDoc, attemptId, null);
|
|
144
|
+
record.unsupervisedMillis = Math.max(record.unsupervisedMillis ?? 0, millis);
|
|
145
|
+
return record.unsupervisedMillis;
|
|
146
|
+
}, context));
|
|
147
|
+
yield* Effect.logDebug("Recorded the Attempt's unsupervised time", {
|
|
148
|
+
attemptId,
|
|
149
|
+
unsupervisedMillis: millis,
|
|
150
|
+
keptMillis: kept,
|
|
151
|
+
});
|
|
152
|
+
}, Effect.catchTag("DurableHarnessError", (error) => Effect.fail(infra(error))));
|
|
153
|
+
const unsupervised = Effect.fn("AttemptRuntime.unsupervised")(function* (attemptId) {
|
|
154
|
+
yield* Effect.annotateCurrentSpan({ attemptId });
|
|
155
|
+
const record = yield* readRecord(durable, attemptId);
|
|
156
|
+
return Option.map(Option.fromNullishOr(record?.unsupervisedMillis), Duration.millis);
|
|
157
|
+
}, Effect.catchTag("DurableHarnessError", (error) => Effect.fail(infra(error))));
|
|
158
|
+
const request = Effect.fn("AttemptRuntime.request")(function* (attemptId) {
|
|
159
|
+
yield* Effect.annotateCurrentSpan({ attemptId });
|
|
160
|
+
return yield* readStoredRequest(durable, attemptId);
|
|
161
|
+
}, Effect.catchTag("DurableHarnessError", (error) => Effect.fail(infra(error))));
|
|
162
|
+
/** Commits a change to the Hold document. Returns `None` if the task is no longer live. */
|
|
163
|
+
const supervise = (hub, change) => durable.use("update the Hold", (harness, context) => harness.commit(async (tx) => {
|
|
164
|
+
const current = await tx.task(hub.taskId);
|
|
165
|
+
if (current === undefined || !LIVE_STATUSES.includes(current.state.status)) {
|
|
166
|
+
return Option.none();
|
|
167
|
+
}
|
|
168
|
+
return Option.some(change(await tx.doc(HoldDoc, hub.taskId)));
|
|
169
|
+
}, context));
|
|
170
|
+
const hold = (hub, update) => supervise(hub, (document) => {
|
|
171
|
+
document.held = update(document.held);
|
|
172
|
+
});
|
|
173
|
+
/**
|
|
174
|
+
* Applies operator input to a live child. A working child reads a message at its next turn
|
|
175
|
+
* boundary, so the message is first reported as queued.
|
|
176
|
+
*/
|
|
177
|
+
const routeChild = Effect.fn("AttemptRuntime.routeChild")(function* (hub, target, intervention, inputSequence) {
|
|
178
|
+
const child = hub.children.get(target.sessionId);
|
|
179
|
+
if (child === undefined)
|
|
180
|
+
return yield* refuse("This session is no longer live");
|
|
181
|
+
const action = intervention.action;
|
|
182
|
+
const state = yield* child
|
|
183
|
+
.intervene(action, (delivered) => hubs.delivery(hub, { _tag: "Delivery", inputSequence, intervention, delivered }))
|
|
184
|
+
.pipe(Effect.mapError((error) => refuse(error.message)));
|
|
185
|
+
if (action._tag === "OperatorMessage" || action._tag === "Release") {
|
|
186
|
+
yield* hold(hub, (held) => state.held
|
|
187
|
+
? [...held.filter((id) => id !== target.sessionId), target.sessionId]
|
|
188
|
+
: held.filter((id) => id !== target.sessionId));
|
|
189
|
+
}
|
|
190
|
+
if (state.queued) {
|
|
191
|
+
hub.childInputs.add(inputSequence);
|
|
192
|
+
yield* durable.use("record the queued operator input", (harness, context) => harness.commit(async (tx) => {
|
|
193
|
+
const record = await tx.doc(AttemptRecordDoc, hub.attemptId, null);
|
|
194
|
+
record.queuedInputs = [
|
|
195
|
+
...(record.queuedInputs ?? []),
|
|
196
|
+
{
|
|
197
|
+
inputSequence,
|
|
198
|
+
child: target.sessionId,
|
|
199
|
+
intervention: encodeIntervention(intervention),
|
|
200
|
+
},
|
|
201
|
+
];
|
|
202
|
+
}, context));
|
|
203
|
+
yield* Effect.logInfo("The working child reads the operator input at its next boundary", {
|
|
204
|
+
sessionId: target.sessionId,
|
|
205
|
+
action: action._tag,
|
|
206
|
+
});
|
|
207
|
+
}
|
|
208
|
+
return state;
|
|
209
|
+
});
|
|
210
|
+
/**
|
|
211
|
+
* Commits a Hold change that depends on whether the parent is mid-turn. Returns `None` if the
|
|
212
|
+
* task is no longer live.
|
|
213
|
+
*/
|
|
214
|
+
const superviseParent = (hub, parent, change) => durable.use("update the parent's Hold", (harness, context) => harness.commit(async (tx) => {
|
|
215
|
+
const current = await tx.task(hub.taskId);
|
|
216
|
+
if (current === undefined || !LIVE_STATUSES.includes(current.state.status)) {
|
|
217
|
+
return Option.none();
|
|
218
|
+
}
|
|
219
|
+
const live = await tx.doc(LiveDoc, parent);
|
|
220
|
+
return Option.some(change(await tx.doc(HoldDoc, hub.taskId), live.run !== undefined));
|
|
221
|
+
}, context));
|
|
222
|
+
/**
|
|
223
|
+
* Applies operator input to the Pi parent (ADR 0018). An operator message places a Hold and a
|
|
224
|
+
* steer doesn't; input to a working parent is reported as queued until the running tool call
|
|
225
|
+
* returns.
|
|
226
|
+
*/
|
|
227
|
+
const routeParent = Effect.fn("AttemptRuntime.routeParent")(function* (hub, intervention, inputSequence) {
|
|
228
|
+
if (Option.isNone(hub.parent))
|
|
229
|
+
return yield* refuse("The parent hasn't started yet");
|
|
230
|
+
const parent = hub.parent.value;
|
|
231
|
+
const parentId = parentSessionId(hub.attemptId);
|
|
232
|
+
const action = intervention.action;
|
|
233
|
+
const stateOf = (document, queued) => new AttemptChannel.InterventionState({
|
|
234
|
+
held: document.held.includes(parentId),
|
|
235
|
+
paused: document.paused,
|
|
236
|
+
queued,
|
|
237
|
+
});
|
|
238
|
+
if (action._tag === "Interrupt") {
|
|
239
|
+
const marked = yield* supervise(hub, (document) => {
|
|
240
|
+
const already = document.paused;
|
|
241
|
+
document.paused = true;
|
|
242
|
+
return { already, state: stateOf(document, false) };
|
|
243
|
+
});
|
|
244
|
+
if (Option.isNone(marked))
|
|
245
|
+
return yield* refuse("This session has already returned");
|
|
246
|
+
if (marked.value.already)
|
|
247
|
+
return marked.value.state;
|
|
248
|
+
yield* Effect.logInfo("Interrupting the Pi parent; it holds until the operator resumes it");
|
|
249
|
+
yield* durable.use("abort the parent's turn", async (harness, context) => {
|
|
250
|
+
const conversation = await harness.conversation(parent, context);
|
|
251
|
+
await conversation?.abort(context);
|
|
252
|
+
});
|
|
253
|
+
// The abort withdrew any queued operator input; send its rejection receipt.
|
|
254
|
+
yield* relayDeliveries(durable, hub, "live");
|
|
255
|
+
return marked.value.state;
|
|
256
|
+
}
|
|
257
|
+
if (action._tag === "Release") {
|
|
258
|
+
const released = yield* superviseParent(hub, parent, (document, busy) => {
|
|
259
|
+
if (!document.paused && !document.held.includes(parentId)) {
|
|
260
|
+
return { _tag: "NotSupervised" };
|
|
261
|
+
}
|
|
262
|
+
document.held = document.held.filter((id) => id !== parentId);
|
|
263
|
+
// The interrupted turn may end after this commit, so add guidance for it to resume with.
|
|
264
|
+
if (document.paused) {
|
|
265
|
+
document.guidance = [...document.guidance, RELEASE_GUIDANCE];
|
|
266
|
+
document.paused = false;
|
|
267
|
+
}
|
|
268
|
+
return { _tag: "Released", busy, state: stateOf(document, false) };
|
|
269
|
+
});
|
|
270
|
+
if (Option.isNone(released))
|
|
271
|
+
return yield* refuse("This session has already returned");
|
|
272
|
+
if (released.value._tag === "NotSupervised") {
|
|
273
|
+
return yield* refuse("Only a paused or held session can be released");
|
|
274
|
+
}
|
|
275
|
+
yield* Effect.logInfo(released.value.busy
|
|
276
|
+
? "Released the working Pi parent; its next answer ends the Attempt"
|
|
277
|
+
: "Released the waiting Pi parent; it continues the task");
|
|
278
|
+
return released.value.state;
|
|
279
|
+
}
|
|
280
|
+
const holds = action._tag === "OperatorMessage";
|
|
281
|
+
const routed = yield* superviseParent(hub, parent, (document, busy) => {
|
|
282
|
+
if (holds && !document.held.includes(parentId))
|
|
283
|
+
document.held = [...document.held, parentId];
|
|
284
|
+
if (busy && !document.paused)
|
|
285
|
+
return { _tag: "Steer", state: stateOf(document, true) };
|
|
286
|
+
document.guidance = [...document.guidance, action.message];
|
|
287
|
+
document.paused = false;
|
|
288
|
+
return { _tag: "NextTurn", state: stateOf(document, false) };
|
|
289
|
+
});
|
|
290
|
+
if (Option.isNone(routed))
|
|
291
|
+
return yield* refuse("This session has already returned");
|
|
292
|
+
if (routed.value._tag === "NextTurn") {
|
|
293
|
+
yield* Effect.logInfo("The Pi parent takes the operator input as its next turn", {
|
|
294
|
+
holds,
|
|
295
|
+
});
|
|
296
|
+
return routed.value.state;
|
|
297
|
+
}
|
|
298
|
+
const requestId = `intervention:${hub.attemptId}:${inputSequence}`;
|
|
299
|
+
yield* durable.use("steer the parent", async (harness, context) => {
|
|
300
|
+
const conversation = await harness.conversation(parent, context);
|
|
301
|
+
await conversation?.submit({ type: "input", content: action.message, whenBusy: "steer", requestId }, context);
|
|
302
|
+
});
|
|
303
|
+
const queued = yield* durable.use("record the queued operator input", (harness, context) => harness.commit(async (tx) => {
|
|
304
|
+
const submission = await tx.submissionByRequest(parent, requestId);
|
|
305
|
+
if (submission?.status !== "queued")
|
|
306
|
+
return false;
|
|
307
|
+
const record = await tx.doc(AttemptRecordDoc, hub.attemptId, null);
|
|
308
|
+
record.queuedInputs = [
|
|
309
|
+
...(record.queuedInputs ?? []),
|
|
310
|
+
{
|
|
311
|
+
inputSequence,
|
|
312
|
+
submission: submission.id,
|
|
313
|
+
intervention: encodeIntervention(intervention),
|
|
314
|
+
},
|
|
315
|
+
];
|
|
316
|
+
return true;
|
|
317
|
+
}, context));
|
|
318
|
+
if (queued) {
|
|
319
|
+
yield* Effect.logInfo("The working Pi parent reads the operator input when its running tool call returns", { holds });
|
|
320
|
+
return routed.value.state;
|
|
321
|
+
}
|
|
322
|
+
yield* Effect.logInfo("The Pi parent read the operator input at once", { holds });
|
|
323
|
+
return new AttemptChannel.InterventionState({ ...routed.value.state, queued: false });
|
|
324
|
+
});
|
|
325
|
+
const intervene = Effect.fn("AttemptRuntime.intervene")(function* (attemptId, intervention) {
|
|
326
|
+
yield* Effect.annotateCurrentSpan({
|
|
327
|
+
attemptId,
|
|
328
|
+
target: intervention.target._tag,
|
|
329
|
+
action: intervention.action._tag,
|
|
330
|
+
});
|
|
331
|
+
const found = hubs.find(attemptId);
|
|
332
|
+
if (Option.isNone(found) || Option.isNone(found.value.channel)) {
|
|
333
|
+
yield* Effect.logWarning("Operator input addressed an Attempt with no live channel", {
|
|
334
|
+
action: intervention.action._tag,
|
|
335
|
+
});
|
|
336
|
+
return yield* new AgentFailure({ message: "This attempt no longer has a live channel" });
|
|
337
|
+
}
|
|
338
|
+
const hub = found.value;
|
|
339
|
+
yield* hub.routing.withPermits(1)(Effect.gen(function* () {
|
|
340
|
+
const inputSequence = yield* appendInbound(durable, hub, intervention.operator, intervention.target, intervention.action);
|
|
341
|
+
const target = intervention.target;
|
|
342
|
+
const applied = yield* (target._tag === "Child"
|
|
343
|
+
? routeChild(hub, target, intervention, inputSequence)
|
|
344
|
+
: routeParent(hub, intervention, inputSequence)).pipe(Effect.catchTag("DurableHarnessError", (error) => Effect.fail(refuse(error.message))), Effect.result);
|
|
345
|
+
if (Result.isFailure(applied)) {
|
|
346
|
+
yield* Effect.logWarning("Session refused operator input", {
|
|
347
|
+
action: intervention.action._tag,
|
|
348
|
+
message: applied.failure.message,
|
|
349
|
+
});
|
|
350
|
+
yield* emitPayload(durable, hub, new AttemptChannel.InterventionRejected({
|
|
351
|
+
inputSequence,
|
|
352
|
+
intervention,
|
|
353
|
+
message: applied.failure.message,
|
|
354
|
+
}));
|
|
355
|
+
return;
|
|
356
|
+
}
|
|
357
|
+
yield* emitPayload(durable, hub, new AttemptChannel.InterventionApplied({
|
|
358
|
+
inputSequence,
|
|
359
|
+
intervention,
|
|
360
|
+
state: applied.success,
|
|
361
|
+
}));
|
|
362
|
+
yield* Effect.logInfo("Operator input applied", {
|
|
363
|
+
action: intervention.action._tag,
|
|
364
|
+
held: applied.success.held,
|
|
365
|
+
paused: applied.success.paused,
|
|
366
|
+
queued: applied.success.queued,
|
|
367
|
+
});
|
|
368
|
+
}));
|
|
369
|
+
}, (effect, attemptId) => effect.pipe(Effect.catchTag("DurableHarnessError", (error) => Effect.fail(infra(error))), Effect.annotateLogs({ attemptId })));
|
|
370
|
+
const attached = Effect.fn("AttemptRuntime.attached")(function* (attemptId) {
|
|
371
|
+
yield* Effect.annotateCurrentSpan({ attemptId });
|
|
372
|
+
const relayed = Option.exists(hubs.find(attemptId), ({ channel }) => Option.isSome(channel));
|
|
373
|
+
if (!relayed) {
|
|
374
|
+
yield* Effect.logDebug("Waiting for an execute call to relay the Attempt's channel");
|
|
375
|
+
}
|
|
376
|
+
yield* hubs.attached(attemptId);
|
|
377
|
+
if (!relayed)
|
|
378
|
+
yield* Effect.logDebug("The Attempt's channel is relayed in this process");
|
|
379
|
+
}, (effect, attemptId) => effect.pipe(Effect.annotateLogs({ attemptId })));
|
|
380
|
+
const cancel = Effect.fn("AttemptRuntime.cancel")(function* (attemptId) {
|
|
381
|
+
yield* Effect.annotateCurrentSpan({ attemptId });
|
|
382
|
+
const record = yield* readRecord(durable, attemptId);
|
|
383
|
+
if (record === undefined || record.taskId === null) {
|
|
384
|
+
yield* Effect.logInfo("The Attempt has no durable task; nothing to cancel");
|
|
385
|
+
return;
|
|
386
|
+
}
|
|
387
|
+
const taskId = record.taskId;
|
|
388
|
+
const hub = hubs.find(attemptId);
|
|
389
|
+
if (Option.isSome(hub) && Option.isSome(hub.value.channel)) {
|
|
390
|
+
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", {
|
|
391
|
+
errorTag: error._tag,
|
|
392
|
+
})), Effect.ignore);
|
|
393
|
+
}
|
|
394
|
+
const marked = yield* durable.use("abort the Attempt task", (harness, context) => harness.abortTask(taskId, context));
|
|
395
|
+
yield* Effect.logInfo("Canceling the Attempt's durable task", { taskId, marked });
|
|
396
|
+
yield* durable.use("wait for the canceled Attempt task", (harness, context) => harness.waitForTask(taskId, context));
|
|
397
|
+
yield* Effect.logInfo("The canceled Attempt's task stopped", { taskId });
|
|
398
|
+
}, (effect, attemptId) => effect.pipe(Effect.catchTag("DurableHarnessError", (error) => Effect.fail(infra(error))), Effect.annotateLogs({ attemptId })));
|
|
399
|
+
const notify = Effect.fn("AttemptRuntime.notify")(function* (attemptId, notice) {
|
|
400
|
+
yield* Effect.annotateCurrentSpan({ attemptId, notice: notice._tag });
|
|
401
|
+
const routed = yield* hubs.notice(attemptId, notice);
|
|
402
|
+
if (routed._tag === "Kept")
|
|
403
|
+
yield* Effect.logDebug("Kept a Worker notice for an Attempt not tracked here yet; it is relayed after the parent starts", {
|
|
404
|
+
notice: notice._tag,
|
|
405
|
+
worker: notice.worker,
|
|
406
|
+
kept: routed.kept.map(({ _tag }) => _tag),
|
|
407
|
+
});
|
|
408
|
+
}, (effect, attemptId) => effect.pipe(Effect.annotateLogs({ attemptId })));
|
|
409
|
+
yield* Effect.logInfo("The durable Attempt runtime is ready");
|
|
410
|
+
return AttemptRuntime.of({
|
|
411
|
+
execute,
|
|
412
|
+
isLive,
|
|
413
|
+
finished,
|
|
414
|
+
recordResult,
|
|
415
|
+
recordUnsupervised,
|
|
416
|
+
unsupervised,
|
|
417
|
+
request,
|
|
418
|
+
intervene,
|
|
419
|
+
attached,
|
|
420
|
+
cancel,
|
|
421
|
+
notify,
|
|
422
|
+
});
|
|
423
|
+
});
|
|
424
|
+
/**
|
|
425
|
+
* Provides `AttemptRuntime` on the durable harness. Building it installs the usine extension and
|
|
426
|
+
* resumes unfinished Attempts.
|
|
427
|
+
*/
|
|
428
|
+
export const layer = Layer.effect(AttemptRuntime, makeAttemptRuntime);
|
|
429
|
+
//# sourceMappingURL=runtime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../src/attempt/runtime.ts"],"names":[],"mappings":"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"}
|
|
@@ -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 @@
|
|
|
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;AA6B7C,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;AAkD/C;;;;GAIG;AACH,eAAO,MAAM,YAAY,aAAc,iBAAiB;;iBAwOvD,CAAC"}
|