@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.
- package/LICENSE +21 -0
- package/README.md +81 -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 +117 -0
- package/dist/attempt/hubs.d.ts.map +1 -0
- package/dist/attempt/hubs.js +137 -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 +8 -0
- package/dist/attempt/repair.d.ts.map +1 -0
- package/dist/attempt/repair.js +130 -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 +422 -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 +203 -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 +123 -0
- package/dist/attempt-runtime.d.ts.map +1 -0
- package/dist/attempt-runtime.js +73 -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 +87 -0
- package/dist/harness.d.ts.map +1 -0
- package/dist/harness.js +271 -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 +111 -0
- package/dist/testing.d.ts.map +1 -0
- package/dist/testing.js +303 -0
- package/dist/testing.js.map +1 -0
- package/package.json +72 -3
|
@@ -0,0 +1,457 @@
|
|
|
1
|
+
import { UsageDoc, UserEntry, } from "@earendil-works/pi-durable";
|
|
2
|
+
import { ModelId } from "@usine/core/agent/brain";
|
|
3
|
+
import { SessionFinished, SessionStarted, SessionTokensUpdated, } from "@usine/core/agent/session";
|
|
4
|
+
import * as AttemptChannel from "@usine/core/attempt/channel";
|
|
5
|
+
import { AgentFailure } from "@usine/core/attempt/failure";
|
|
6
|
+
import { StepResult } from "@usine/core/step/result";
|
|
7
|
+
import { DateTime, Deferred, Effect, Option, Queue, Result, Schema } from "effect";
|
|
8
|
+
import { AttemptRecordDoc, HoldDoc } from "./documents.js";
|
|
9
|
+
import { entryEvents, ledgerUsage } from "./events.js";
|
|
10
|
+
import { keepNotice, } from "./hubs.js";
|
|
11
|
+
import { settledOf } from "./outcome.js";
|
|
12
|
+
import { parentSession, parentSessionId } from "./parent.js";
|
|
13
|
+
const PAGE = 64;
|
|
14
|
+
const unavailable = () => new AgentFailure({ message: "This attempt no longer has a live channel" });
|
|
15
|
+
/** Returns `value` as an `EntryId`, where 0 sorts before every committed entry. */
|
|
16
|
+
const entryId = (value) =>
|
|
17
|
+
// SAFETY: the value is 0 or an ID assigned by pi-durable and stored by this package.
|
|
18
|
+
value;
|
|
19
|
+
const entryQuery = (from, bound) => Option.match(bound, {
|
|
20
|
+
onNone: () => ({ minEntryId: entryId(from), order: "ascending" }),
|
|
21
|
+
onSome: (max) => ({ minEntryId: entryId(from), maxEntryId: max, order: "ascending" }),
|
|
22
|
+
});
|
|
23
|
+
const progressOf = (record) => ({
|
|
24
|
+
outbound: {
|
|
25
|
+
state: record.nextOutbound === 1
|
|
26
|
+
? "AwaitingStarted"
|
|
27
|
+
: record.terminalRelayed
|
|
28
|
+
? "Terminal"
|
|
29
|
+
: "Running",
|
|
30
|
+
nextSequence: record.nextOutbound,
|
|
31
|
+
},
|
|
32
|
+
inbound: record.nextInbound,
|
|
33
|
+
entry: record.relayedEntry,
|
|
34
|
+
tokens: record.relayedTokens,
|
|
35
|
+
});
|
|
36
|
+
const cursorOf = ({ entry, tokens }) => ({ entry, tokens });
|
|
37
|
+
/**
|
|
38
|
+
* Reads the Attempt's durable record. Returns `undefined` before the first `execute` creates its
|
|
39
|
+
* task.
|
|
40
|
+
*/
|
|
41
|
+
export const readRecord = (durable, attemptId) => durable.use("read the Attempt record", (harness, context) => harness.snapshot(AttemptRecordDoc, attemptId, context));
|
|
42
|
+
/**
|
|
43
|
+
* Appends `payloads` with the next sequence numbers, then commits the progress. Appending first
|
|
44
|
+
* means a crash resends the payloads with the same sequence numbers instead of leaving a gap.
|
|
45
|
+
*/
|
|
46
|
+
const emit = (durable, hub, payloads, advance) => hub.emission.withPermits(1)(Effect.gen(function* () {
|
|
47
|
+
if (Option.isNone(hub.channel))
|
|
48
|
+
return yield* unavailable();
|
|
49
|
+
const { io, progress } = hub.channel.value;
|
|
50
|
+
let outbound = progress.outbound;
|
|
51
|
+
for (const payload of payloads) {
|
|
52
|
+
const envelope = new AttemptChannel.OutboundEnvelope({
|
|
53
|
+
version: AttemptChannel.PROTOCOL_VERSION,
|
|
54
|
+
attemptId: hub.attemptId,
|
|
55
|
+
sequence: AttemptChannel.Sequence.make(outbound.nextSequence),
|
|
56
|
+
sentAt: yield* DateTime.now,
|
|
57
|
+
payload,
|
|
58
|
+
});
|
|
59
|
+
const admitted = AttemptChannel.admit(outbound, hub.attemptId, envelope);
|
|
60
|
+
if (Result.isFailure(admitted)) {
|
|
61
|
+
return yield* Effect.die(new Error(`${admitted.failure.message}: ${admitted.failure.detail}`));
|
|
62
|
+
}
|
|
63
|
+
yield* io.append("outbound", envelope);
|
|
64
|
+
outbound = admitted.success;
|
|
65
|
+
}
|
|
66
|
+
const cursor = advance(progress);
|
|
67
|
+
yield* durable.use("record the relayed envelopes", (harness, context) => harness.commit(async (tx) => {
|
|
68
|
+
const record = await tx.doc(AttemptRecordDoc, hub.attemptId, null);
|
|
69
|
+
record.nextOutbound = outbound.nextSequence;
|
|
70
|
+
record.relayedEntry = cursor.entry;
|
|
71
|
+
record.relayedTokens = cursor.tokens;
|
|
72
|
+
record.terminalRelayed = outbound.state === "Terminal";
|
|
73
|
+
}, context));
|
|
74
|
+
progress.outbound = outbound;
|
|
75
|
+
progress.entry = cursor.entry;
|
|
76
|
+
progress.tokens = cursor.tokens;
|
|
77
|
+
}));
|
|
78
|
+
/** Sends a payload that is not derived from a parent entry, such as an intervention result. */
|
|
79
|
+
export const emitPayload = (durable, hub, payload) => emit(durable, hub, [payload], cursorOf);
|
|
80
|
+
/** Appends an operator input to the transcript and returns its inbound sequence number. */
|
|
81
|
+
export const appendInbound = (durable, hub, operator, target, payload) => hub.emission.withPermits(1)(Effect.gen(function* () {
|
|
82
|
+
if (Option.isNone(hub.channel))
|
|
83
|
+
return yield* unavailable();
|
|
84
|
+
const { io, progress } = hub.channel.value;
|
|
85
|
+
const envelope = new AttemptChannel.InboundEnvelope({
|
|
86
|
+
version: AttemptChannel.PROTOCOL_VERSION,
|
|
87
|
+
attemptId: hub.attemptId,
|
|
88
|
+
sequence: AttemptChannel.Sequence.make(progress.inbound),
|
|
89
|
+
sentAt: yield* DateTime.now,
|
|
90
|
+
target,
|
|
91
|
+
operator,
|
|
92
|
+
payload,
|
|
93
|
+
});
|
|
94
|
+
yield* io.append("inbound", envelope);
|
|
95
|
+
yield* durable.use("record the inbound envelope", (harness, context) => harness.commit(async (tx) => {
|
|
96
|
+
const record = await tx.doc(AttemptRecordDoc, hub.attemptId, null);
|
|
97
|
+
record.nextInbound = envelope.sequence + 1;
|
|
98
|
+
}, context));
|
|
99
|
+
progress.inbound = envelope.sequence + 1;
|
|
100
|
+
return envelope.sequence;
|
|
101
|
+
}));
|
|
102
|
+
const decodeIntervention = Schema.decodeUnknownEffect(AttemptChannel.Intervention);
|
|
103
|
+
/**
|
|
104
|
+
* Returns the parent's supervision state after it read an input. A retired Hold counts as not
|
|
105
|
+
* paused and not held.
|
|
106
|
+
*/
|
|
107
|
+
const deliveredState = (durable, hub) => Effect.map(durable.use("read the Hold", (harness, context) => harness.snapshot(HoldDoc, hub.taskId, context)), (hold) => new AttemptChannel.InterventionState({
|
|
108
|
+
held: hold?.held.includes(parentSessionId(hub.attemptId)) ?? false,
|
|
109
|
+
paused: hold?.paused ?? false,
|
|
110
|
+
}));
|
|
111
|
+
/** Removes an operator input from `queuedInputs`. */
|
|
112
|
+
const forgetQueuedInput = (durable, hub, inputSequence) => durable.use("forget the delivered operator input", (harness, context) => harness.commit(async (tx) => {
|
|
113
|
+
const record = await tx.doc(AttemptRecordDoc, hub.attemptId, null);
|
|
114
|
+
record.queuedInputs = (record.queuedInputs ?? []).filter((queuedInput) => queuedInput.inputSequence !== inputSequence);
|
|
115
|
+
}, context));
|
|
116
|
+
/** Sends the second receipt for an operator input that a child queued and never read. */
|
|
117
|
+
const childStoppedFirst = (durable, hub, inputSequence, intervention) => emitPayload(durable, hub, new AttemptChannel.InterventionRejected({
|
|
118
|
+
inputSequence,
|
|
119
|
+
intervention,
|
|
120
|
+
message: "The child stopped before it read this message. Send it again if it still applies.",
|
|
121
|
+
}));
|
|
122
|
+
/**
|
|
123
|
+
* Sends the second receipt for each resolved queued operator input, and rejects all unread ones if
|
|
124
|
+
* `attempt` is `ended`. The caller must hold the hub's routing permit.
|
|
125
|
+
*/
|
|
126
|
+
export const relayDeliveries = Effect.fn("AttemptRelay.deliveries")(function* (durable, hub, attempt) {
|
|
127
|
+
const queued = (yield* readRecord(durable, hub.attemptId))?.queuedInputs ?? [];
|
|
128
|
+
for (const input of queued) {
|
|
129
|
+
if ("child" in input) {
|
|
130
|
+
if (attempt === "live" && hub.childInputs.has(input.inputSequence)) {
|
|
131
|
+
yield* Effect.logDebug("A queued operator input still waits for its child", {
|
|
132
|
+
inputSequence: input.inputSequence,
|
|
133
|
+
sessionId: input.child,
|
|
134
|
+
});
|
|
135
|
+
continue;
|
|
136
|
+
}
|
|
137
|
+
hub.childInputs.delete(input.inputSequence);
|
|
138
|
+
const intervention = yield* decodeIntervention(input.intervention).pipe(Effect.orDie);
|
|
139
|
+
yield* childStoppedFirst(durable, hub, AttemptChannel.Sequence.make(input.inputSequence), intervention);
|
|
140
|
+
yield* Effect.logWarning("The child stopped before it read a queued operator input", {
|
|
141
|
+
inputSequence: input.inputSequence,
|
|
142
|
+
sessionId: input.child,
|
|
143
|
+
action: intervention.action._tag,
|
|
144
|
+
attempt,
|
|
145
|
+
});
|
|
146
|
+
yield* forgetQueuedInput(durable, hub, input.inputSequence);
|
|
147
|
+
continue;
|
|
148
|
+
}
|
|
149
|
+
const status = yield* durable.use("read a queued operator input", async (harness, context) => {
|
|
150
|
+
const submission = await harness.submission(input.submission, context);
|
|
151
|
+
return submission === undefined ? undefined : (await submission.status(context)).status;
|
|
152
|
+
});
|
|
153
|
+
if (status === "queued" && attempt === "live") {
|
|
154
|
+
yield* Effect.logDebug("A queued operator input still waits for the parent", {
|
|
155
|
+
inputSequence: input.inputSequence,
|
|
156
|
+
});
|
|
157
|
+
continue;
|
|
158
|
+
}
|
|
159
|
+
const intervention = yield* decodeIntervention(input.intervention).pipe(Effect.orDie);
|
|
160
|
+
const inputSequence = AttemptChannel.Sequence.make(input.inputSequence);
|
|
161
|
+
if (status === "placed" || status === "done") {
|
|
162
|
+
yield* emitPayload(durable, hub, new AttemptChannel.InterventionApplied({
|
|
163
|
+
inputSequence,
|
|
164
|
+
intervention,
|
|
165
|
+
state: yield* deliveredState(durable, hub),
|
|
166
|
+
}));
|
|
167
|
+
yield* Effect.logInfo("The parent read a queued operator input", {
|
|
168
|
+
inputSequence,
|
|
169
|
+
action: intervention.action._tag,
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
else {
|
|
173
|
+
yield* emitPayload(durable, hub, new AttemptChannel.InterventionRejected({
|
|
174
|
+
inputSequence,
|
|
175
|
+
intervention,
|
|
176
|
+
message: "The parent stopped before it read this message. Send it again if it still applies.",
|
|
177
|
+
}));
|
|
178
|
+
yield* Effect.logWarning("The parent stopped before it read a queued operator input", {
|
|
179
|
+
inputSequence,
|
|
180
|
+
action: intervention.action._tag,
|
|
181
|
+
submissionStatus: status ?? "missing",
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
yield* forgetQueuedInput(durable, hub, input.inputSequence);
|
|
185
|
+
}
|
|
186
|
+
});
|
|
187
|
+
/**
|
|
188
|
+
* Sends the second receipt for a child-queued operator input when the child reports it, unless it
|
|
189
|
+
* was already sent. The caller must hold the hub's routing permit.
|
|
190
|
+
*/
|
|
191
|
+
const relayChildDelivery = Effect.fn("AttemptRelay.childDelivery")(function* (durable, hub, delivery) {
|
|
192
|
+
const { inputSequence, intervention } = delivery;
|
|
193
|
+
hub.childInputs.delete(inputSequence);
|
|
194
|
+
const queued = (yield* readRecord(durable, hub.attemptId))?.queuedInputs ?? [];
|
|
195
|
+
if (!queued.some((input) => input.inputSequence === inputSequence)) {
|
|
196
|
+
return yield* Effect.logDebug("A child reported an operator input already settled", {
|
|
197
|
+
inputSequence,
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
const fields = {
|
|
201
|
+
inputSequence,
|
|
202
|
+
action: intervention.action._tag,
|
|
203
|
+
sessionId: intervention.target._tag === "Child" ? intervention.target.sessionId : "parent",
|
|
204
|
+
};
|
|
205
|
+
if (Option.isSome(delivery.delivered)) {
|
|
206
|
+
yield* emitPayload(durable, hub, new AttemptChannel.InterventionApplied({
|
|
207
|
+
inputSequence,
|
|
208
|
+
intervention,
|
|
209
|
+
state: delivery.delivered.value,
|
|
210
|
+
}));
|
|
211
|
+
yield* Effect.logInfo("The child read a queued operator input", fields);
|
|
212
|
+
}
|
|
213
|
+
else {
|
|
214
|
+
yield* childStoppedFirst(durable, hub, inputSequence, intervention);
|
|
215
|
+
yield* Effect.logWarning("The child stopped before it read a queued operator input", fields);
|
|
216
|
+
}
|
|
217
|
+
yield* forgetQueuedInput(durable, hub, inputSequence);
|
|
218
|
+
});
|
|
219
|
+
/**
|
|
220
|
+
* Relays one Attempt to `io` in order of occurrence until exactly one terminal envelope (`Final`,
|
|
221
|
+
* `Failed`, or `Interrupted`) is sent. Continues from the durable progress of an earlier call.
|
|
222
|
+
*/
|
|
223
|
+
export const relayAttempt = Effect.fn("AttemptRelay.relay")(function* (durable, hubs, hub, request, io) {
|
|
224
|
+
const spec = request.spec;
|
|
225
|
+
yield* Effect.annotateCurrentSpan({ attemptId: hub.attemptId, taskId: hub.taskId });
|
|
226
|
+
const loaded = yield* readRecord(durable, hub.attemptId);
|
|
227
|
+
if (loaded === undefined) {
|
|
228
|
+
return yield* Effect.die(new Error(`Attempt ${hub.attemptId} has no durable record`));
|
|
229
|
+
}
|
|
230
|
+
const readTask = durable.use("read the Attempt task", (harness, context) => harness.getTask(hub.taskId, context));
|
|
231
|
+
if (loaded.terminalRelayed) {
|
|
232
|
+
const task = yield* readTask;
|
|
233
|
+
if (task === undefined) {
|
|
234
|
+
return yield* Effect.die(new Error(`Attempt task ${hub.taskId} is missing`));
|
|
235
|
+
}
|
|
236
|
+
yield* Effect.logInfo("The Attempt's terminal envelope was already relayed");
|
|
237
|
+
return settledOf(task);
|
|
238
|
+
}
|
|
239
|
+
const attached = yield* Effect.acquireRelease(Effect.sync(() => {
|
|
240
|
+
if (Option.isSome(hub.channel))
|
|
241
|
+
return false;
|
|
242
|
+
hub.channel = Option.some({ io, progress: progressOf(loaded) });
|
|
243
|
+
Deferred.doneUnsafe(hub.attached, Effect.succeed(request));
|
|
244
|
+
return true;
|
|
245
|
+
}), (attachedHere) => attachedHere
|
|
246
|
+
? Effect.sync(() => {
|
|
247
|
+
hub.channel = Option.none();
|
|
248
|
+
hub.attached = Deferred.makeUnsafe();
|
|
249
|
+
}).pipe(Effect.tap(() => Effect.logDebug("Detached the Attempt's channel")))
|
|
250
|
+
: Effect.void);
|
|
251
|
+
if (!attached) {
|
|
252
|
+
yield* Effect.logWarning("Another execute call is relaying this Attempt; waiting for its outcome");
|
|
253
|
+
const task = yield* durable.use("wait for the Attempt task", (harness, context) => harness.waitForTask(hub.taskId, context));
|
|
254
|
+
return settledOf(task);
|
|
255
|
+
}
|
|
256
|
+
yield* Effect.logInfo("Relaying the Attempt's channel", {
|
|
257
|
+
nextSequence: loaded.nextOutbound,
|
|
258
|
+
relayedEntry: loaded.relayedEntry,
|
|
259
|
+
});
|
|
260
|
+
const progress = () => Option.match(hub.channel, {
|
|
261
|
+
onNone: () => progressOf(loaded),
|
|
262
|
+
onSome: (channel) => channel.progress,
|
|
263
|
+
});
|
|
264
|
+
let session = Option.map(Option.fromNullishOr(loaded.parentModel), (model) => parentSession(spec, ModelId.make(model)));
|
|
265
|
+
if (loaded.parentConversation !== null)
|
|
266
|
+
hubs.bindParent(hub, loaded.parentConversation);
|
|
267
|
+
const startParent = Effect.gen(function* () {
|
|
268
|
+
if (Option.isSome(session) && progress().outbound.state !== "AwaitingStarted") {
|
|
269
|
+
return session;
|
|
270
|
+
}
|
|
271
|
+
const record = yield* readRecord(durable, hub.attemptId);
|
|
272
|
+
if (record === undefined || record.parentModel === null) {
|
|
273
|
+
return Option.none();
|
|
274
|
+
}
|
|
275
|
+
if (record.parentConversation !== null)
|
|
276
|
+
hubs.bindParent(hub, record.parentConversation);
|
|
277
|
+
const started = parentSession(spec, ModelId.make(record.parentModel));
|
|
278
|
+
session = Option.some(started);
|
|
279
|
+
if (progress().outbound.state === "AwaitingStarted") {
|
|
280
|
+
yield* emitPayload(durable, hub, new AttemptChannel.Started({
|
|
281
|
+
parentModel: started.brain.model,
|
|
282
|
+
conflictingSalvage: spec.conflictingSalvage,
|
|
283
|
+
}));
|
|
284
|
+
yield* emitPayload(durable, hub, new AttemptChannel.SessionEvent({ event: new SessionStarted({ session: started }) }));
|
|
285
|
+
yield* Effect.logInfo("Relayed the Attempt's start", { parentModel: started.brain.model });
|
|
286
|
+
}
|
|
287
|
+
return session;
|
|
288
|
+
});
|
|
289
|
+
const relayEarlyNotices = Effect.gen(function* () {
|
|
290
|
+
const early = hub.early;
|
|
291
|
+
if (early.length === 0)
|
|
292
|
+
return;
|
|
293
|
+
hub.early = [];
|
|
294
|
+
yield* emit(durable, hub, early, cursorOf);
|
|
295
|
+
yield* Effect.logInfo("Relayed the Worker notices that arrived before the parent started", {
|
|
296
|
+
notices: early.map(({ _tag }) => _tag),
|
|
297
|
+
});
|
|
298
|
+
});
|
|
299
|
+
/** Starts the parent and, if it started, relays the early Worker notices. */
|
|
300
|
+
const ensureStarted = Effect.gen(function* () {
|
|
301
|
+
const started = yield* startParent;
|
|
302
|
+
if (Option.isSome(started))
|
|
303
|
+
yield* relayEarlyNotices;
|
|
304
|
+
return started;
|
|
305
|
+
});
|
|
306
|
+
const relayTokens = Effect.fn("AttemptRelay.tokens")(function* (started) {
|
|
307
|
+
if (Option.isNone(hub.parent))
|
|
308
|
+
return;
|
|
309
|
+
const parent = hub.parent.value;
|
|
310
|
+
const usage = yield* durable.use("read the parent's usage", (harness, context) => harness.snapshot(UsageDoc, parent, context));
|
|
311
|
+
const total = ledgerUsage(usage);
|
|
312
|
+
if (total.totalTokens <= progress().tokens)
|
|
313
|
+
return;
|
|
314
|
+
yield* emit(durable, hub, [
|
|
315
|
+
new AttemptChannel.SessionEvent({
|
|
316
|
+
event: new SessionTokensUpdated({ session: started, ...total }),
|
|
317
|
+
}),
|
|
318
|
+
], (current) => ({ ...cursorOf(current), tokens: total.totalTokens }));
|
|
319
|
+
});
|
|
320
|
+
const deliveries = (attempt) => hub.routing.withPermits(1)(relayDeliveries(durable, hub, attempt));
|
|
321
|
+
const childDelivery = (delivery) => hub.routing.withPermits(1)(relayChildDelivery(durable, hub, delivery));
|
|
322
|
+
const relayEntries = Effect.fn("AttemptRelay.entries")(function* (bound) {
|
|
323
|
+
const started = yield* ensureStarted;
|
|
324
|
+
if (Option.isNone(started) || Option.isNone(hub.parent))
|
|
325
|
+
return;
|
|
326
|
+
const parent = hub.parent.value;
|
|
327
|
+
let placedInput = false;
|
|
328
|
+
let next = Option.none();
|
|
329
|
+
do {
|
|
330
|
+
const query = entryQuery(progress().entry + 1, bound);
|
|
331
|
+
const cursor = Option.getOrUndefined(next);
|
|
332
|
+
const found = yield* durable.use("read the parent's entries", async (harness, context) => {
|
|
333
|
+
const conversation = await harness.conversation(parent, context);
|
|
334
|
+
return conversation === undefined
|
|
335
|
+
? { items: [] }
|
|
336
|
+
: conversation.entries(query, PAGE, cursor, context);
|
|
337
|
+
});
|
|
338
|
+
for (const entry of found.items) {
|
|
339
|
+
if (entry.kind === UserEntry.kind)
|
|
340
|
+
placedInput = true;
|
|
341
|
+
const events = entryEvents(entry, started.value);
|
|
342
|
+
if (events.length === 0) {
|
|
343
|
+
progress().entry = entry.id;
|
|
344
|
+
continue;
|
|
345
|
+
}
|
|
346
|
+
yield* emit(durable, hub, events.map((event) => new AttemptChannel.SessionEvent({ event })), (latest) => ({ ...cursorOf(latest), entry: entry.id }));
|
|
347
|
+
}
|
|
348
|
+
next = Option.fromNullishOr(found.next);
|
|
349
|
+
} while (Option.isSome(next));
|
|
350
|
+
yield* relayTokens(started.value);
|
|
351
|
+
if (placedInput)
|
|
352
|
+
yield* deliveries("live");
|
|
353
|
+
});
|
|
354
|
+
const relayEvent = Effect.fn("AttemptRelay.event")(function* (event) {
|
|
355
|
+
const started = yield* ensureStarted;
|
|
356
|
+
if (Option.isNone(started)) {
|
|
357
|
+
return yield* Effect.logWarning("Dropped a session event that arrived before the parent started", {
|
|
358
|
+
event: event._tag,
|
|
359
|
+
});
|
|
360
|
+
}
|
|
361
|
+
yield* emitPayload(durable, hub, new AttemptChannel.SessionEvent({ event }));
|
|
362
|
+
});
|
|
363
|
+
const relayNotice = Effect.fn("AttemptRelay.notice")(function* (notice) {
|
|
364
|
+
const started = yield* ensureStarted;
|
|
365
|
+
if (Option.isNone(started)) {
|
|
366
|
+
hub.early = keepNotice(hub.early, notice);
|
|
367
|
+
return yield* Effect.logDebug("Kept a Worker notice until the parent starts", {
|
|
368
|
+
notice: notice._tag,
|
|
369
|
+
worker: notice.worker,
|
|
370
|
+
kept: hub.early.map(({ _tag }) => _tag),
|
|
371
|
+
});
|
|
372
|
+
}
|
|
373
|
+
yield* emitPayload(durable, hub, notice);
|
|
374
|
+
yield* Effect.logDebug("Relayed a Worker notice", {
|
|
375
|
+
notice: notice._tag,
|
|
376
|
+
worker: notice.worker,
|
|
377
|
+
});
|
|
378
|
+
});
|
|
379
|
+
const finish = Effect.fn("AttemptRelay.finish")(function* (task) {
|
|
380
|
+
const settled = settledOf(task);
|
|
381
|
+
const started = yield* ensureStarted;
|
|
382
|
+
if (Option.isNone(started) && hub.early.length > 0) {
|
|
383
|
+
yield* Effect.logWarning("Dropped the Worker notices kept for a parent that never started", {
|
|
384
|
+
notices: hub.early.map(({ _tag }) => _tag),
|
|
385
|
+
});
|
|
386
|
+
hub.early = [];
|
|
387
|
+
}
|
|
388
|
+
yield* deliveries("ended");
|
|
389
|
+
if (Result.isSuccess(settled)) {
|
|
390
|
+
if (Option.isSome(started)) {
|
|
391
|
+
yield* emitPayload(durable, hub, new AttemptChannel.SessionEvent({
|
|
392
|
+
event: new SessionFinished({ session: started.value }),
|
|
393
|
+
}));
|
|
394
|
+
}
|
|
395
|
+
yield* emitPayload(durable, hub, new AttemptChannel.Final({
|
|
396
|
+
result: new StepResult({ message: settled.success.message, facts: [] }),
|
|
397
|
+
}));
|
|
398
|
+
}
|
|
399
|
+
else if (task.state.outcome?.status === "aborted" && Option.isSome(started)) {
|
|
400
|
+
yield* emitPayload(durable, hub, new AttemptChannel.Interrupted());
|
|
401
|
+
}
|
|
402
|
+
else {
|
|
403
|
+
yield* emitPayload(durable, hub, new AttemptChannel.Failed({ failure: settled.failure }));
|
|
404
|
+
}
|
|
405
|
+
yield* Effect.logInfo("Relayed the Attempt's terminal envelope", {
|
|
406
|
+
outcome: task.state.outcome?.status,
|
|
407
|
+
});
|
|
408
|
+
return settled;
|
|
409
|
+
});
|
|
410
|
+
const pending = yield* Queue.clear(hub.queue);
|
|
411
|
+
const firstEntry = pending.find((item) => item._tag === "Entry");
|
|
412
|
+
yield* relayEntries(firstEntry?._tag === "Entry" ? Option.some(entryId(firstEntry.entry - 1)) : Option.none());
|
|
413
|
+
yield* deliveries("live");
|
|
414
|
+
pending.push({ _tag: "Wake" });
|
|
415
|
+
const take = Effect.suspend(() => {
|
|
416
|
+
const item = pending.shift();
|
|
417
|
+
return item === undefined ? Queue.take(hub.queue) : Effect.succeed(item);
|
|
418
|
+
});
|
|
419
|
+
while (true) {
|
|
420
|
+
const item = yield* take;
|
|
421
|
+
if (item._tag === "Entry") {
|
|
422
|
+
yield* relayEntries(Option.some(item.entry));
|
|
423
|
+
}
|
|
424
|
+
else if (item._tag === "Event") {
|
|
425
|
+
yield* relayEvent(item.event);
|
|
426
|
+
}
|
|
427
|
+
else if (item._tag === "Notice") {
|
|
428
|
+
yield* relayNotice(item.notice);
|
|
429
|
+
}
|
|
430
|
+
else if (item._tag === "Delivery") {
|
|
431
|
+
yield* childDelivery(item);
|
|
432
|
+
}
|
|
433
|
+
else {
|
|
434
|
+
yield* ensureStarted;
|
|
435
|
+
const task = yield* readTask;
|
|
436
|
+
if (task === undefined) {
|
|
437
|
+
return yield* Effect.die(new Error(`Attempt task ${hub.taskId} is missing`));
|
|
438
|
+
}
|
|
439
|
+
if (task.state.status !== "terminal")
|
|
440
|
+
continue;
|
|
441
|
+
const rest = [...pending.splice(0), ...(yield* Queue.clear(hub.queue))];
|
|
442
|
+
for (const remaining of rest) {
|
|
443
|
+
if (remaining._tag === "Entry")
|
|
444
|
+
yield* relayEntries(Option.some(remaining.entry));
|
|
445
|
+
else if (remaining._tag === "Event")
|
|
446
|
+
yield* relayEvent(remaining.event);
|
|
447
|
+
else if (remaining._tag === "Notice")
|
|
448
|
+
yield* relayNotice(remaining.notice);
|
|
449
|
+
else if (remaining._tag === "Delivery")
|
|
450
|
+
yield* childDelivery(remaining);
|
|
451
|
+
}
|
|
452
|
+
yield* relayEntries(Option.none());
|
|
453
|
+
return yield* finish(task);
|
|
454
|
+
}
|
|
455
|
+
}
|
|
456
|
+
}, Effect.scoped);
|
|
457
|
+
//# sourceMappingURL=relay.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"relay.js","sourceRoot":"","sources":["../../src/attempt/relay.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { type Harness } from "@earendil-works/pi-durable";
|
|
2
|
+
import { Effect } from "effect";
|
|
3
|
+
/**
|
|
4
|
+
* Replaces the unreadable documents of each live task's conversation and aborts the affected
|
|
5
|
+
* Attempt's task with the reason. Runs before the harness resumes its tasks.
|
|
6
|
+
*/
|
|
7
|
+
export declare const repairUnreadableConversations: (harness: Harness) => Effect.Effect<void>;
|
|
8
|
+
//# sourceMappingURL=repair.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repair.d.ts","sourceRoot":"","sources":["../../src/attempt/repair.ts"],"names":[],"mappings":"AACA,OAAO,EAIL,KAAK,OAAO,EAQb,MAAM,4BAA4B,CAAC;AAGpC,OAAO,EAAE,MAAM,EAAkB,MAAM,QAAQ,CAAC;AAiKhD;;;GAGG;AACH,eAAO,MAAM,6BAA6B,YAAa,OAAO,KAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAiBhF,CAAC"}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import { BACKGROUND_CONTEXT } from "@earendil-works/chord/context";
|
|
2
|
+
import { AgentDoc, InboxDoc, LiveDoc, ProviderDoc, UsageDoc, } from "@earendil-works/pi-durable";
|
|
3
|
+
import { Effect, Option, Result } from "effect";
|
|
4
|
+
import { durableError } from "../harness.js";
|
|
5
|
+
import { AttemptRecordDoc } from "./documents.js";
|
|
6
|
+
import { attemptIdOf } from "./request.js";
|
|
7
|
+
import { ATTEMPT_TASK } from "./task.js";
|
|
8
|
+
const call = (operation, run) => Effect.tryPromise({ try: run, catch: (cause) => durableError(operation, cause) });
|
|
9
|
+
const conversationDocument = (token) => ({
|
|
10
|
+
kind: token.definition.kind,
|
|
11
|
+
read: async (harness, conversationId) => {
|
|
12
|
+
await harness.snapshot(token, conversationId, BACKGROUND_CONTEXT);
|
|
13
|
+
},
|
|
14
|
+
replace: async (tx, conversationId) => {
|
|
15
|
+
await tx.retireDoc(token, conversationId);
|
|
16
|
+
await tx.doc(token, conversationId);
|
|
17
|
+
},
|
|
18
|
+
});
|
|
19
|
+
const CONVERSATION_DOCUMENTS = [
|
|
20
|
+
conversationDocument(LiveDoc),
|
|
21
|
+
conversationDocument(InboxDoc),
|
|
22
|
+
conversationDocument(UsageDoc),
|
|
23
|
+
conversationDocument(AgentDoc),
|
|
24
|
+
conversationDocument(ProviderDoc),
|
|
25
|
+
];
|
|
26
|
+
const messageOf = (cause) => cause instanceof Error && cause.message.length > 0 ? cause.message : String(cause);
|
|
27
|
+
/** Returns the conversation's documents that cannot be read, with each failure reason. */
|
|
28
|
+
const unreadableDocuments = Effect.fn("AttemptRepair.unreadableDocuments")(function* (harness, conversationId) {
|
|
29
|
+
const unreadable = [];
|
|
30
|
+
for (const document of CONVERSATION_DOCUMENTS) {
|
|
31
|
+
const read = yield* Effect.tryPromise({
|
|
32
|
+
try: () => document.read(harness, conversationId),
|
|
33
|
+
catch: messageOf,
|
|
34
|
+
}).pipe(Effect.result);
|
|
35
|
+
if (Result.isFailure(read))
|
|
36
|
+
unreadable.push({ document, message: read.failure });
|
|
37
|
+
}
|
|
38
|
+
return unreadable;
|
|
39
|
+
});
|
|
40
|
+
/**
|
|
41
|
+
* Returns the Attempt of the conversation's owner task, or `None` if that task isn't a
|
|
42
|
+
* `usine.attempt` task.
|
|
43
|
+
*/
|
|
44
|
+
const owningAttempt = Effect.fn("AttemptRepair.owningAttempt")(function* (harness, conversationId) {
|
|
45
|
+
const conversation = yield* call("read the conversation", () => harness.commit((tx) => tx.conversation(conversationId), BACKGROUND_CONTEXT));
|
|
46
|
+
const ownerTaskId = conversation?.owner?.taskId;
|
|
47
|
+
if (ownerTaskId === undefined)
|
|
48
|
+
return Option.none();
|
|
49
|
+
const owner = yield* call("read the conversation's owner task", () => harness.getTask(ownerTaskId, BACKGROUND_CONTEXT));
|
|
50
|
+
if (owner === undefined || owner.kind !== ATTEMPT_TASK)
|
|
51
|
+
return Option.none();
|
|
52
|
+
return attemptIdOf(owner.input);
|
|
53
|
+
});
|
|
54
|
+
/**
|
|
55
|
+
* Replaces the unreadable documents of the live tasks' conversations in one commit and sets
|
|
56
|
+
* `storageFailure` on each affected Attempt record.
|
|
57
|
+
*/
|
|
58
|
+
const replaceUnreadable = Effect.fn("AttemptRepair.replaceUnreadable")(function* (harness, tasks) {
|
|
59
|
+
const conversations = [...new Set(tasks.map(({ conversationId }) => conversationId))];
|
|
60
|
+
const repairs = [];
|
|
61
|
+
for (const conversationId of conversations) {
|
|
62
|
+
const unreadable = yield* unreadableDocuments(harness, conversationId);
|
|
63
|
+
if (unreadable.length === 0)
|
|
64
|
+
continue;
|
|
65
|
+
const reasons = unreadable.map(({ document, message }) => `${document.kind}: ${message}`);
|
|
66
|
+
repairs.push({
|
|
67
|
+
conversationId,
|
|
68
|
+
documents: unreadable.map(({ document }) => document),
|
|
69
|
+
attempt: yield* owningAttempt(harness, conversationId),
|
|
70
|
+
cause: `Can't read the parent conversation ${conversationId} from durable storage: ${reasons.join("; ")}`,
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
if (repairs.length === 0) {
|
|
74
|
+
yield* Effect.logDebug("Every live task's conversation reads back", {
|
|
75
|
+
conversations: conversations.length,
|
|
76
|
+
});
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
yield* call("replace the unreadable documents", () => harness.commit(async (tx) => {
|
|
80
|
+
for (const repair of repairs) {
|
|
81
|
+
for (const document of repair.documents)
|
|
82
|
+
await document.replace(tx, repair.conversationId);
|
|
83
|
+
if (Option.isSome(repair.attempt)) {
|
|
84
|
+
const record = await tx.doc(AttemptRecordDoc, repair.attempt.value, null);
|
|
85
|
+
record.storageFailure = repair.cause;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}, BACKGROUND_CONTEXT));
|
|
89
|
+
for (const repair of repairs) {
|
|
90
|
+
yield* Option.match(repair.attempt, {
|
|
91
|
+
onNone: () => Effect.logWarning("Replaced unreadable documents of a conversation no Attempt owns", {
|
|
92
|
+
conversationId: repair.conversationId,
|
|
93
|
+
cause: repair.cause,
|
|
94
|
+
}),
|
|
95
|
+
onSome: (attemptId) => Effect.logError("Replaced the unreadable documents of an Attempt's parent conversation; the Attempt fails", { attemptId, conversationId: repair.conversationId, cause: repair.cause }),
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
});
|
|
99
|
+
/** Aborts each live `usine.attempt` task whose Attempt record has a `storageFailure`. */
|
|
100
|
+
const abortFailedAttempts = Effect.fn("AttemptRepair.abortFailedAttempts")(function* (harness, tasks) {
|
|
101
|
+
for (const task of tasks) {
|
|
102
|
+
if (task.kind !== ATTEMPT_TASK || task.abortRequested)
|
|
103
|
+
continue;
|
|
104
|
+
const attemptId = attemptIdOf(task.input);
|
|
105
|
+
if (Option.isNone(attemptId))
|
|
106
|
+
continue;
|
|
107
|
+
const record = yield* call("read the Attempt record", () => harness.snapshot(AttemptRecordDoc, attemptId.value, BACKGROUND_CONTEXT));
|
|
108
|
+
if (record?.storageFailure === undefined)
|
|
109
|
+
continue;
|
|
110
|
+
yield* call("abort the Attempt task", () => harness.abortTask(task.id, BACKGROUND_CONTEXT));
|
|
111
|
+
yield* Effect.logInfo("Aborting the Attempt task whose conversation could not be read", {
|
|
112
|
+
attemptId: attemptId.value,
|
|
113
|
+
taskId: task.id,
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
});
|
|
117
|
+
/**
|
|
118
|
+
* Replaces the unreadable documents of each live task's conversation and aborts the affected
|
|
119
|
+
* Attempt's task with the reason. Runs before the harness resumes its tasks.
|
|
120
|
+
*/
|
|
121
|
+
export const repairUnreadableConversations = (harness) => Effect.gen(function* () {
|
|
122
|
+
const { tasks } = yield* call("inspect the live tasks", () => harness.inspect(BACKGROUND_CONTEXT));
|
|
123
|
+
const records = tasks.map(({ record }) => record);
|
|
124
|
+
yield* replaceUnreadable(harness, records);
|
|
125
|
+
yield* abortFailedAttempts(harness, records);
|
|
126
|
+
}).pipe(Effect.tapError((error) => Effect.logError("Could not repair the durable storage before resuming its tasks", {
|
|
127
|
+
operation: error.operation,
|
|
128
|
+
message: error.message,
|
|
129
|
+
})), Effect.ignore, Effect.withSpan("AttemptRepair.repair"));
|
|
130
|
+
//# sourceMappingURL=repair.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repair.js","sourceRoot":"","sources":["../../src/attempt/repair.ts"],"names":[],"mappings":"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"}
|