@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.
Files changed (83) hide show
  1. package/LICENSE +661 -0
  2. package/README.md +83 -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 +133 -0
  16. package/dist/attempt/hubs.d.ts.map +1 -0
  17. package/dist/attempt/hubs.js +146 -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 +14 -0
  32. package/dist/attempt/repair.d.ts.map +1 -0
  33. package/dist/attempt/repair.js +150 -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 +429 -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 +208 -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 +128 -0
  60. package/dist/attempt-runtime.d.ts.map +1 -0
  61. package/dist/attempt-runtime.js +78 -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 +101 -0
  68. package/dist/harness.d.ts.map +1 -0
  69. package/dist/harness.js +298 -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 +116 -0
  80. package/dist/testing.d.ts.map +1 -0
  81. package/dist/testing.js +314 -0
  82. package/dist/testing.js.map +1 -0
  83. package/package.json +72 -3
@@ -0,0 +1,208 @@
1
+ import { withAbortSignal } from "@earendil-works/chord/context";
2
+ import { Type } from "@earendil-works/pi-ai";
3
+ import { defineTool, } from "@earendil-works/pi-durable";
4
+ import { assembleChildPrompt } from "@usine/agents/prompt";
5
+ import { ChildRequest, ChildSessionBudgetExceededError, reportText, WorkingDirectory, } from "@usine/agents/runtime";
6
+ import { AgentSessionId, ChildSession, ChildSessionBudget, ChildSessionCount, SessionFinished, sessionPool, } from "@usine/core/agent/session";
7
+ import { Deferred, Effect, Exit, Fiber, Match, Option, Result, Stream } from "effect";
8
+ import { durableError } from "../harness.js";
9
+ import { AttemptRecordDoc, HoldDoc } from "./documents.js";
10
+ import { parentSessionId } from "./parent.js";
11
+ import { storedRequestOf } from "./request.js";
12
+ import { firstAccepted } from "./watch.js";
13
+ /** The name of the parent's only tool. */
14
+ export const SUBAGENT_TOOL = "subagent";
15
+ const TASK_EXCERPT_CHARACTERS = 160;
16
+ const taskExcerpt = (task) => {
17
+ const collapsed = task.replace(/\s+/gu, " ").trim();
18
+ return collapsed.length > TASK_EXCERPT_CHARACTERS
19
+ ? `${collapsed.slice(0, TASK_EXCERPT_CHARACTERS)}…`
20
+ : collapsed;
21
+ };
22
+ const call = (operation, run) => Effect.tryPromise({ try: run, catch: (cause) => durableError(operation, cause) });
23
+ const aborted = (context, sessionId) => Option.match(Option.fromNullishOr(context.abortSignal), {
24
+ onNone: () => Effect.logWarning("pi-durable supplied no abort signal; the child outlives only its scope", {
25
+ sessionId,
26
+ }).pipe(Effect.andThen(Effect.never)),
27
+ onSome: (signal) => Effect.callback((resume) => {
28
+ const onAbort = () => resume(Effect.void);
29
+ if (signal.aborted)
30
+ onAbort();
31
+ else
32
+ signal.addEventListener("abort", onAbort, { once: true });
33
+ return Effect.sync(() => signal.removeEventListener("abort", onAbort));
34
+ }),
35
+ });
36
+ /** Runs `effect` until the tool call aborts. On abort, runs `onAbort` and interrupts the call. */
37
+ const untilAborted = (effect, context, sessionId, onAbort) => Effect.raceFirst(effect, aborted(context, sessionId).pipe(Effect.andThen(onAbort), Effect.andThen(Effect.interrupt)));
38
+ /** Registers the child in `hub.children` until the scope closes. */
39
+ const register = (hub, child) => Effect.acquireRelease(Effect.sync(() => {
40
+ hub.children.set(child.session.id, child);
41
+ }), () => Effect.sync(() => hub.children.delete(child.session.id)));
42
+ /**
43
+ * Builds the `subagent` tool, which runs one task in a child of the Agent's harness and returns the
44
+ * child's report. After a restart, a running call ends as interrupted, because children aren't
45
+ * replay-safe.
46
+ */
47
+ export const subagentTool = (services) => {
48
+ const spawn = Effect.fn("Subagent.spawn")(function* (task, api, context) {
49
+ const owner = yield* call("find the parent's Attempt task", () => api.commit(async (tx) => {
50
+ const conversation = await tx.conversation(api.conversationId);
51
+ if (conversation?.owner === undefined)
52
+ return undefined;
53
+ const record = await tx.task(conversation.owner.taskId);
54
+ return record === undefined ? undefined : { taskId: record.id, input: record.input };
55
+ }, context));
56
+ if (owner === undefined) {
57
+ return yield* Effect.die(new Error("The subagent tool runs only in an attempt's parent conversation"));
58
+ }
59
+ const stored = yield* storedRequestOf(owner.input);
60
+ const spec = stored.spec;
61
+ const parentId = parentSessionId(spec.attemptId);
62
+ const hub = yield* services.hubs.hub(spec.attemptId, owner.taskId);
63
+ services.hubs.bindParent(hub, api.conversationId);
64
+ const excerpt = taskExcerpt(task);
65
+ const attemptedChildren = ChildSessionCount.make(yield* call("count the child spawn", () => api.commit(async (tx) => {
66
+ const record = await tx.doc(AttemptRecordDoc, spec.attemptId, null);
67
+ record.children += 1;
68
+ if (record.children > spec.maxChildren && record.childBudgetExceeded === null) {
69
+ record.childBudgetExceeded = { attempted: record.children, max: spec.maxChildren };
70
+ }
71
+ return record.children;
72
+ }, context)));
73
+ yield* Effect.annotateCurrentSpan({
74
+ attemptId: spec.attemptId,
75
+ attemptedChildren,
76
+ maxChildren: spec.maxChildren,
77
+ parentSessionId: parentId,
78
+ });
79
+ if (attemptedChildren > spec.maxChildren) {
80
+ yield* Effect.logWarning("Child session budget exceeded", {
81
+ attemptedChildren,
82
+ maxChildren: spec.maxChildren,
83
+ parentSessionId: parentId,
84
+ taskExcerpt: excerpt,
85
+ });
86
+ return yield* new ChildSessionBudgetExceededError({
87
+ attemptedChildren,
88
+ maxChildren: ChildSessionBudget.make(spec.maxChildren),
89
+ message: `Attempt tried to spawn child ${attemptedChildren} after reaching its ${spec.maxChildren}-child budget`,
90
+ });
91
+ }
92
+ const sessionId = AgentSessionId.make(`${parentId}:child:${attemptedChildren}`);
93
+ if (!(yield* Deferred.isDone(hub.attached))) {
94
+ yield* Effect.logInfo("Waiting for execute to supply the Attempt's child host and environment before spawning a child", {
95
+ attemptId: spec.attemptId,
96
+ });
97
+ }
98
+ // An abort, such as the harness closing at shutdown, ends a wait for a released Attempt.
99
+ const request = yield* untilAborted(Deferred.await(hub.attached), context, sessionId, Effect.logInfo("Abandoning the child spawn of an aborted tool call; no execute call supplied the child host", { attemptId: spec.attemptId, sessionId }));
100
+ // Read when each child starts, so a preflight that ran after the Attempt launched applies.
101
+ const session = new ChildSession({
102
+ id: sessionId,
103
+ parentId,
104
+ agent: spec.agent.name,
105
+ brain: spec.agent.brain,
106
+ gatewayCredential: yield* request.gatewayCredential,
107
+ });
108
+ const childRequest = new ChildRequest({
109
+ session,
110
+ cwd: WorkingDirectory.make(request.cwd),
111
+ environment: request.environment,
112
+ host: request.host,
113
+ worker: request.worker,
114
+ machine: request.machine,
115
+ prompt: assembleChildPrompt({
116
+ agent: spec.agent.name,
117
+ persona: spec.agent.persona,
118
+ task,
119
+ }),
120
+ });
121
+ yield* Effect.annotateCurrentSpan({ agent: session.agent, sessionId: session.id });
122
+ yield* Effect.logInfo("Spawning child session", {
123
+ attemptedChildren,
124
+ maxChildren: spec.maxChildren,
125
+ sessionId: session.id,
126
+ pool: sessionPool(session),
127
+ taskExcerpt: excerpt,
128
+ });
129
+ // Annotate logs with the Attempt because this tool runs outside the Attempt's fiber. An abort
130
+ // interrupts a launch that is still waiting through retry delays.
131
+ const child = yield* untilAborted(services.backend
132
+ .launch(childRequest)
133
+ .pipe(Effect.annotateLogs({ attemptId: spec.attemptId, worker: request.worker })), context, session.id, Effect.logInfo("Abandoning the child launch of an aborted tool call", {
134
+ sessionId: session.id,
135
+ }));
136
+ yield* register(hub, child);
137
+ yield* Effect.addFinalizer((exit) => Exit.isFailure(exit)
138
+ ? Effect.logWarning("Child session ended before returning a result", {
139
+ sessionId: session.id,
140
+ }).pipe(Effect.andThen(services.hubs.event(hub, new SessionFinished({ session: child.session }))))
141
+ : Effect.void);
142
+ yield* call("publish the child's id", () => api.details({ childSessionId: session.id }, context));
143
+ const forward = (event) => services.hubs.event(hub, event).pipe(Effect.andThen(event._tag === "TextOutput"
144
+ ? Effect.try({
145
+ try: () => api.output(`${event.text}\n`),
146
+ catch: (cause) => durableError("record the child's output", cause),
147
+ }).pipe(Effect.tapError((error) => Effect.logWarning("Could not record the child's output on the tool call", {
148
+ sessionId: session.id,
149
+ message: error.message,
150
+ })), Effect.ignore)
151
+ : Effect.void));
152
+ // These errors end the stream with the same report the child's result contains, so they are
153
+ // ignored here.
154
+ const forwarding = yield* child.events.pipe(Stream.runForEach(forward), Effect.catchTag(["AgentResultError", "AgentBlockedError", "AgentQuestionError"], () => Effect.void), Effect.forkScoped);
155
+ const outcome = yield* untilAborted(child.result.pipe(Effect.map(Result.succeed), Effect.catchTag(["AgentResultError", "AgentBlockedError", "AgentQuestionError"], (report) => Effect.succeed(Result.fail(report)))), context, session.id, Effect.logInfo("Interrupting the child of an aborted tool call", {
156
+ sessionId: session.id,
157
+ }).pipe(Effect.andThen(child.interrupt)));
158
+ yield* Fiber.join(forwarding);
159
+ yield* call("wait for the child's Hold to end", async (signal) => {
160
+ const scoped = withAbortSignal(signal, context);
161
+ const watch = await api.watchDoc(HoldDoc, owner.taskId, scoped);
162
+ if (watch === undefined)
163
+ return;
164
+ await firstAccepted(watch, (hold) => !hold.held.includes(session.id), scoped);
165
+ });
166
+ const text = yield* Result.match(outcome, {
167
+ onFailure: (report) => Effect.gen(function* () {
168
+ const kind = Match.valueTags(report, {
169
+ AgentResultError: () => "failed",
170
+ AgentBlockedError: () => "blocked",
171
+ AgentQuestionError: () => "question",
172
+ });
173
+ yield* Effect.logInfo("Child session returned a reserved report to the Pi parent", {
174
+ sessionId: session.id,
175
+ kind,
176
+ });
177
+ const first = yield* call("record the child's report", () => api.commit(async (tx) => {
178
+ const record = await tx.doc(AttemptRecordDoc, spec.attemptId, null);
179
+ if (record.childBlocker !== null)
180
+ return false;
181
+ record.childBlocker = { sessionId: session.id, message: report.message, kind };
182
+ return true;
183
+ }, context));
184
+ if (!first) {
185
+ yield* Effect.logInfo("Kept the Attempt's first child report ahead of this one", {
186
+ sessionId: session.id,
187
+ });
188
+ }
189
+ yield* services.hubs.event(hub, new SessionFinished({ session: child.session }));
190
+ return reportText(report);
191
+ }),
192
+ onSuccess: (result) => Effect.logInfo("Child session returned to the Pi parent", { sessionId: session.id }).pipe(Effect.as(result.message)),
193
+ });
194
+ return {
195
+ output: [{ type: "text", text }],
196
+ details: { childSessionId: session.id },
197
+ };
198
+ }, Effect.scoped);
199
+ return defineTool({
200
+ name: SUBAGENT_TOOL,
201
+ description: "Delegate one focused task to the configured isolated child agent and wait for its report.",
202
+ parameters: Type.Object({ task: Type.String({ minLength: 1 }) }, { additionalProperties: false }),
203
+ executionMode: "parallel",
204
+ replay: "unsafe",
205
+ execute: (args, api, context) => services.run(spawn(args.task, api, context), undefined),
206
+ });
207
+ };
208
+ //# sourceMappingURL=subagent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subagent.js","sourceRoot":"","sources":["../../src/attempt/subagent.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,EAAE,IAAI,EAAE,MAAM,uBAAuB,CAAC;AAC7C,OAAO,EACL,UAAU,GAGX,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EACL,YAAY,EACZ,+BAA+B,EAC/B,UAAU,EAEV,gBAAgB,GACjB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAEL,cAAc,EACd,YAAY,EACZ,kBAAkB,EAClB,iBAAiB,EACjB,eAAe,EACf,WAAW,GACZ,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AACtF,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAE3D,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAE/C,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE3C,0CAA0C;AAC1C,MAAM,CAAC,MAAM,aAAa,GAAG,UAAU,CAAC;AAIxC,MAAM,uBAAuB,GAAG,GAAG,CAAC;AAEpC,MAAM,WAAW,GAAG,CAAC,IAAY,EAAU,EAAE;IAC3C,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IACpD,OAAO,SAAS,CAAC,MAAM,GAAG,uBAAuB;QAC/C,CAAC,CAAC,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,uBAAuB,CAAC,GAAG;QACnD,CAAC,CAAC,SAAS,CAAC;AAChB,CAAC,CAAC;AAEF,MAAM,IAAI,GAAG,CAAI,SAAiB,EAAE,GAA4C,EAAE,EAAE,CAClF,MAAM,CAAC,UAAU,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,YAAY,CAAC,SAAS,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC;AAEpF,MAAM,OAAO,GAAG,CAAC,OAAqB,EAAE,SAAyB,EAAuB,EAAE,CACxF,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE;IACtD,MAAM,EAAE,GAAG,EAAE,CACX,MAAM,CAAC,UAAU,CAAC,wEAAwE,EAAE;QAC1F,SAAS;KACV,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACvC,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE,CACjB,MAAM,CAAC,QAAQ,CAAO,CAAC,MAAM,EAAE,EAAE;QAC/B,MAAM,OAAO,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC1C,IAAI,MAAM,CAAC,OAAO;YAAE,OAAO,EAAE,CAAC;;YACzB,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/D,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;IACzE,CAAC,CAAC;CACL,CAAC,CAAC;AAEL,kGAAkG;AAClG,MAAM,YAAY,GAAG,CACnB,MAA8B,EAC9B,OAAqB,EACrB,SAAyB,EACzB,OAA+B,EAC/B,EAAE,CACF,MAAM,CAAC,SAAS,CACd,MAAM,EACN,OAAO,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAC5F,CAAC;AAEJ,oEAAoE;AACpE,MAAM,QAAQ,GAAG,CAAC,GAAe,EAAE,KAAqB,EAAE,EAAE,CAC1D,MAAM,CAAC,cAAc,CACnB,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE;IACf,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;AAC5C,CAAC,CAAC,EACF,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAC/D,CAAC;AAEJ;;;;GAIG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,QAA2B,EAAE,EAAE;IAC1D,MAAM,KAAK,GAAG,MAAM,CAAC,EAAE,CAAC,gBAAgB,CAAC,CAAC,QAAQ,CAAC,EACjD,IAAY,EACZ,GAAmC,EACnC,OAAqB;QAErB,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,gCAAgC,EAAE,GAAG,EAAE,CAC/D,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE;YACtB,MAAM,YAAY,GAAG,MAAM,EAAE,CAAC,YAAY,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;YAC/D,IAAI,YAAY,EAAE,KAAK,KAAK,SAAS;gBAAE,OAAO,SAAS,CAAC;YACxD,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YACxD,OAAO,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC;QACvF,CAAC,EAAE,OAAO,CAAC,CACZ,CAAC;QACF,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,GAAG,CACtB,IAAI,KAAK,CAAC,iEAAiE,CAAC,CAC7E,CAAC;QACJ,CAAC;QACD,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,eAAe,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACnD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;QACzB,MAAM,QAAQ,GAAG,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACjD,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;QACnE,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,cAAc,CAAC,CAAC;QAClD,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;QAClC,MAAM,iBAAiB,GAAG,iBAAiB,CAAC,IAAI,CAC9C,KAAK,CAAC,CAAC,IAAI,CAAC,uBAAuB,EAAE,GAAG,EAAE,CACxC,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE;YACtB,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,GAAG,CAAC,gBAAgB,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;YACpE,MAAM,CAAC,QAAQ,IAAI,CAAC,CAAC;YACrB,IAAI,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAC,WAAW,IAAI,MAAM,CAAC,mBAAmB,KAAK,IAAI,EAAE,CAAC;gBAC9E,MAAM,CAAC,mBAAmB,GAAG,EAAE,SAAS,EAAE,MAAM,CAAC,QAAQ,EAAE,GAAG,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC;YACrF,CAAC;YACD,OAAO,MAAM,CAAC,QAAQ,CAAC;QACzB,CAAC,EAAE,OAAO,CAAC,CACZ,CACF,CAAC;QACF,KAAK,CAAC,CAAC,MAAM,CAAC,mBAAmB,CAAC;YAChC,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,iBAAiB;YACjB,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,eAAe,EAAE,QAAQ;SAC1B,CAAC,CAAC;QACH,IAAI,iBAAiB,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;YACzC,KAAK,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,+BAA+B,EAAE;gBACxD,iBAAiB;gBACjB,WAAW,EAAE,IAAI,CAAC,WAAW;gBAC7B,eAAe,EAAE,QAAQ;gBACzB,WAAW,EAAE,OAAO;aACrB,CAAC,CAAC;YACH,OAAO,KAAK,CAAC,CAAC,IAAI,+BAA+B,CAAC;gBAChD,iBAAiB;gBACjB,WAAW,EAAE,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC;gBACtD,OAAO,EAAE,gCAAgC,iBAAiB,uBAAuB,IAAI,CAAC,WAAW,eAAe;aACjH,CAAC,CAAC;QACL,CAAC;QACD,MAAM,SAAS,GAAG,cAAc,CAAC,IAAI,CAAC,GAAG,QAAQ,UAAU,iBAAiB,EAAE,CAAC,CAAC;QAChF,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;YAC5C,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CACnB,gGAAgG,EAChG;gBACE,SAAS,EAAE,IAAI,CAAC,SAAS;aAC1B,CACF,CAAC;QACJ,CAAC;QACD,yFAAyF;QACzF,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,YAAY,CACjC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,EAC5B,OAAO,EACP,SAAS,EACT,MAAM,CAAC,OAAO,CACZ,6FAA6F,EAC7F,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,SAAS,EAAE,CACzC,CACF,CAAC;QACF,2FAA2F;QAC3F,MAAM,OAAO,GAAG,IAAI,YAAY,CAAC;YAC/B,EAAE,EAAE,SAAS;YACb,QAAQ;YACR,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI;YACtB,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK;YACvB,iBAAiB,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,iBAAiB;SACpD,CAAC,CAAC;QACH,MAAM,YAAY,GAAG,IAAI,YAAY,CAAC;YACpC,OAAO;YACP,GAAG,EAAE,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC;YACvC,WAAW,EAAE,OAAO,CAAC,WAAW;YAChC,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,MAAM,EAAE,mBAAmB,CAAC;gBAC1B,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI;gBACtB,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO;gBAC3B,IAAI;aACL,CAAC;SACH,CAAC,CAAC;QACH,KAAK,CAAC,CAAC,MAAM,CAAC,mBAAmB,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;QACnF,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,wBAAwB,EAAE;YAC9C,iBAAiB;YACjB,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,SAAS,EAAE,OAAO,CAAC,EAAE;YACrB,IAAI,EAAE,WAAW,CAAC,OAAO,CAAC;YAC1B,WAAW,EAAE,OAAO;SACrB,CAAC,CAAC;QACH,8FAA8F;QAC9F,kEAAkE;QAClE,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,YAAY,CAC/B,QAAQ,CAAC,OAAO;aACb,MAAM,CAAC,YAAY,CAAC;aACpB,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,EACnF,OAAO,EACP,OAAO,CAAC,EAAE,EACV,MAAM,CAAC,OAAO,CAAC,qDAAqD,EAAE;YACpE,SAAS,EAAE,OAAO,CAAC,EAAE;SACtB,CAAC,CACH,CAAC;QACF,KAAK,CAAC,CAAC,QAAQ,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAC5B,KAAK,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,IAAI,EAAE,EAAE,CAClC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;YAClB,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,+CAA+C,EAAE;gBACjE,SAAS,EAAE,OAAO,CAAC,EAAE;aACtB,CAAC,CAAC,IAAI,CACL,MAAM,CAAC,OAAO,CACZ,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,IAAI,eAAe,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAC1E,CACF;YACH,CAAC,CAAC,MAAM,CAAC,IAAI,CAChB,CAAC;QACF,KAAK,CAAC,CAAC,IAAI,CAAC,wBAAwB,EAAE,GAAG,EAAE,CACzC,GAAG,CAAC,OAAO,CAAC,EAAE,cAAc,EAAE,OAAO,CAAC,EAAE,EAAE,EAAE,OAAO,CAAC,CACrD,CAAC;QACF,MAAM,OAAO,GAAG,CAAC,KAAwB,EAAE,EAAE,CAC3C,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,IAAI,CAClC,MAAM,CAAC,OAAO,CACZ,KAAK,CAAC,IAAI,KAAK,YAAY;YACzB,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;gBACT,GAAG,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC,IAAI,IAAI,CAAC;gBACxC,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,YAAY,CAAC,2BAA2B,EAAE,KAAK,CAAC;aACnE,CAAC,CAAC,IAAI,CACL,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,EAAE,EAAE,CACxB,MAAM,CAAC,UAAU,CAAC,sDAAsD,EAAE;gBACxE,SAAS,EAAE,OAAO,CAAC,EAAE;gBACrB,OAAO,EAAE,KAAK,CAAC,OAAO;aACvB,CAAC,CACH,EACD,MAAM,CAAC,MAAM,CACd;YACH,CAAC,CAAC,MAAM,CAAC,IAAI,CAChB,CACF,CAAC;QACJ,4FAA4F;QAC5F,gBAAgB;QAChB,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CACzC,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,EAC1B,MAAM,CAAC,QAAQ,CACb,CAAC,kBAAkB,EAAE,mBAAmB,EAAE,oBAAoB,CAAC,EAC/D,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,CAClB,EACD,MAAM,CAAC,UAAU,CAClB,CAAC;QACF,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,YAAY,CACjC,KAAK,CAAC,MAAM,CAAC,IAAI,CACf,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,EAC1B,MAAM,CAAC,QAAQ,CAAC,CAAC,kBAAkB,EAAE,mBAAmB,EAAE,oBAAoB,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,CAC1F,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CACpC,CACF,EACD,OAAO,EACP,OAAO,CAAC,EAAE,EACV,MAAM,CAAC,OAAO,CAAC,gDAAgD,EAAE;YAC/D,SAAS,EAAE,OAAO,CAAC,EAAE;SACtB,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CACzC,CAAC;QACF,KAAK,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC9B,KAAK,CAAC,CAAC,IAAI,CAAC,kCAAkC,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;YAC/D,MAAM,MAAM,GAAG,eAAe,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;YAChD,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YAChE,IAAI,KAAK,KAAK,SAAS;gBAAE,OAAO;YAChC,MAAM,aAAa,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;QAChF,CAAC,CAAC,CAAC;QACH,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE;YACxC,SAAS,EAAE,CAAC,MAAM,EAAE,EAAE,CACpB,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;gBAClB,MAAM,IAAI,GAAG,KAAK,CAAC,SAAS,CAAC,MAAM,EAAE;oBACnC,gBAAgB,EAAE,GAAG,EAAE,CAAC,QAAiB;oBACzC,iBAAiB,EAAE,GAAG,EAAE,CAAC,SAAkB;oBAC3C,kBAAkB,EAAE,GAAG,EAAE,CAAC,UAAmB;iBAC9C,CAAC,CAAC;gBACH,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,2DAA2D,EAAE;oBACjF,SAAS,EAAE,OAAO,CAAC,EAAE;oBACrB,IAAI;iBACL,CAAC,CAAC;gBACH,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,2BAA2B,EAAE,GAAG,EAAE,CAC1D,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE;oBACtB,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,GAAG,CAAC,gBAAgB,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;oBACpE,IAAI,MAAM,CAAC,YAAY,KAAK,IAAI;wBAAE,OAAO,KAAK,CAAC;oBAC/C,MAAM,CAAC,YAAY,GAAG,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC;oBAC/E,OAAO,IAAI,CAAC;gBACd,CAAC,EAAE,OAAO,CAAC,CACZ,CAAC;gBACF,IAAI,CAAC,KAAK,EAAE,CAAC;oBACX,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,yDAAyD,EAAE;wBAC/E,SAAS,EAAE,OAAO,CAAC,EAAE;qBACtB,CAAC,CAAC;gBACL,CAAC;gBACD,KAAK,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,IAAI,eAAe,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;gBACjF,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC;YAC5B,CAAC,CAAC;YACJ,SAAS,EAAE,CAAC,MAAM,EAAE,EAAE,CACpB,MAAM,CAAC,OAAO,CAAC,yCAAyC,EAAE,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CACvF,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAC1B;SACJ,CAAC,CAAC;QACH,OAAO;YACL,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,CAAC;YACzC,OAAO,EAAE,EAAE,cAAc,EAAE,OAAO,CAAC,EAAE,EAAE;SACI,CAAC;IAChD,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IAElB,OAAO,UAAU,CAAC;QAChB,IAAI,EAAE,aAAa;QACnB,WAAW,EACT,2FAA2F;QAC7F,UAAU,EAAE,IAAI,CAAC,MAAM,CACrB,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,EAAE,EACvC,EAAE,oBAAoB,EAAE,KAAK,EAAE,CAChC;QACD,aAAa,EAAE,UAAU;QACzB,MAAM,EAAE,QAAQ;QAChB,OAAO,EAAE,CAAC,IAAI,EAAE,GAAmC,EAAE,OAAO,EAAE,EAAE,CAC9D,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,SAAS,CAAC;KAC1D,CAAC,CAAC;AACL,CAAC,CAAC"}
@@ -0,0 +1,61 @@
1
+ import { type ConversationId, type Extension, type ToolRegistration } from "@earendil-works/pi-durable";
2
+ import { type AttemptResult } from "./documents.ts";
3
+ import type { ExtensionServices } from "./services.ts";
4
+ /** The task's checkpoint: resolving the parent, or running one parent turn. */
5
+ export type AttemptCheckpoint = {
6
+ phase: "prepare";
7
+ } | {
8
+ phase: "run";
9
+ parent: ConversationId;
10
+ /** Turn 1 submits the assembled prompt; later turns submit operator guidance. */
11
+ turn: number;
12
+ message: string | null;
13
+ };
14
+ /** The task name of an Attempt's parent task, stored in every task record. */
15
+ export declare const ATTEMPT_TASK = "usine.attempt";
16
+ /**
17
+ * Builds the `usine.attempt` task, which submits the assembled prompt and then operator guidance
18
+ * one turn at a time. Each turn is submitted exactly once across restarts.
19
+ */
20
+ export declare const attemptTask: (services: ExtensionServices, selection: () => {
21
+ readonly extension: Extension;
22
+ readonly tool: ToolRegistration;
23
+ }) => import("@earendil-works/pi-durable").Task<{
24
+ readonly spec: {
25
+ readonly attemptId: string;
26
+ readonly repository: string;
27
+ readonly revision: string;
28
+ readonly baseCommit: string;
29
+ readonly payload: import("effect/Schema").Json;
30
+ readonly task: string;
31
+ readonly agent: {
32
+ readonly name: string;
33
+ readonly brain: {
34
+ readonly harness: "claude" | "codex" | "pi";
35
+ readonly model: string;
36
+ readonly effort: "high" | "low" | "max" | "medium" | "minimal" | "off" | "xhigh";
37
+ };
38
+ readonly parentModel: string | null;
39
+ readonly parentEffort?: "high" | "low" | "max" | "medium" | "minimal" | "off" | "xhigh";
40
+ readonly persona: string;
41
+ };
42
+ readonly parentModel: string | null;
43
+ readonly maxChildren: number;
44
+ readonly parentEffort: "high" | "low" | "max" | "medium" | "minimal" | "off" | "xhigh";
45
+ readonly resume: {
46
+ readonly _tag: "Pushed";
47
+ readonly ref: string;
48
+ readonly commit: string;
49
+ } | null;
50
+ readonly conflictingSalvage?: {
51
+ readonly _tag: "Pushed";
52
+ readonly ref: string;
53
+ readonly commit: string;
54
+ } | null;
55
+ readonly preparedAt?: string | null;
56
+ readonly botLogin?: string | null;
57
+ };
58
+ readonly worker: string;
59
+ readonly cwd: string;
60
+ }, AttemptCheckpoint, AttemptResult, object>;
61
+ //# sourceMappingURL=task.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task.d.ts","sourceRoot":"","sources":["../../src/attempt/task.ts"],"names":[],"mappings":"AAEA,OAAO,EAGL,KAAK,cAAc,EAInB,KAAK,SAAS,EAKd,KAAK,gBAAgB,EAItB,MAAM,4BAA4B,CAAC;AAsBpC,OAAO,EAEL,KAAK,aAAa,EAKnB,MAAM,gBAAgB,CAAC;AAKxB,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAGvD,+EAA+E;AAC/E,MAAM,MAAM,iBAAiB,GACzB;IAAE,KAAK,EAAE,SAAS,CAAA;CAAE,GACpB;IACE,KAAK,EAAE,KAAK,CAAC;IACb,MAAM,EAAE,cAAc,CAAC;IACvB,iFAAiF;IACjF,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB,CAAC;AAKN,8EAA8E;AAC9E,eAAO,MAAM,YAAY,kBAAkB,CAAC;AA+E5C;;;GAGG;AACH,eAAO,MAAM,WAAW,aACZ,iBAAiB,aAChB,MAAM;IAAE,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAA;CAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4CAmUpF,CAAC"}
@@ -0,0 +1,302 @@
1
+ import { withAbortSignal } from "@earendil-works/chord/context";
2
+ import { AssistantEntry, configure, defineTask, ToolResultEntry, UserEntry, } from "@earendil-works/pi-durable";
3
+ import { assemblePrompt } from "@usine/agents/prompt";
4
+ import { reportedOutcome, toAttemptFailure } from "@usine/agents/runtime";
5
+ import { ModelId } from "@usine/core/agent/brain";
6
+ import { AgentFailure, BlockedFailure, ChildSessionBudgetFailure, InfraFailure, QuestionFailure, } from "@usine/core/attempt/failure";
7
+ import { ChildSessionBudget, ChildSessionCount, SessionIdle, SessionResumed, } from "@usine/core/agent/session";
8
+ import { Effect, Option, Result } from "effect";
9
+ import { durableError } from "../harness.js";
10
+ import { AttemptRecordDoc, HoldDoc, RELEASE_GUIDANCE, } from "./documents.js";
11
+ import { assistantText } from "./events.js";
12
+ import { completedOutcome, failedOutcome } from "./outcome.js";
13
+ import { parentSession, parentSessionId, resolveParent } from "./parent.js";
14
+ import { storedRequestOf } from "./request.js";
15
+ import { firstAccepted } from "./watch.js";
16
+ /** The task name of an Attempt's parent task, stored in every task record. */
17
+ export const ATTEMPT_TASK = "usine.attempt";
18
+ const call = (operation, run) => Effect.tryPromise({ try: run, catch: (cause) => durableError(operation, cause) });
19
+ const commit = (runtime, context, operation, change) => call(operation, () => runtime.commit((tx) => change(tx), context));
20
+ /**
21
+ * Returns the failure for a child's stored report if the parent didn't relay one. A harness failure
22
+ * maps to `AgentFailure`, which doesn't suppress the Item.
23
+ */
24
+ const childReportFailure = ({ message, kind, }) => {
25
+ if (kind === "question")
26
+ return new QuestionFailure({ question: message });
27
+ if (kind === "failed")
28
+ return new AgentFailure({ message });
29
+ return new BlockedFailure({ message });
30
+ };
31
+ const finalAnswer = Effect.fn("AttemptTask.finalAnswer")(function* (runtime, context, parent, answer) {
32
+ const entry = yield* call("read the parent's answer", () => runtime.entry(AssistantEntry, answer, context));
33
+ const text = entry === undefined ? Option.none() : assistantText(entry);
34
+ if (Option.isSome(text))
35
+ return text.value;
36
+ const view = yield* call("read the parent's transcript", () => runtime.context(parent, context));
37
+ for (const earlier of [...view.entries].reverse()) {
38
+ const earlierText = earlier.kind === AssistantEntry.kind ? assistantText(earlier) : Option.none();
39
+ if (Option.isSome(earlierText))
40
+ return earlierText.value;
41
+ }
42
+ return "Pi session completed";
43
+ });
44
+ /**
45
+ * Whether `answer` replies to an operator message or steer: the newest user entry before it isn't
46
+ * `ownInput`, and no tool result is between them.
47
+ */
48
+ const repliesToOperator = (entries, answer, ownInput) => {
49
+ for (const entry of [...entries].reverse()) {
50
+ if (entry.id >= answer)
51
+ continue;
52
+ if (entry.kind === ToolResultEntry.kind)
53
+ return false;
54
+ if (entry.kind === UserEntry.kind)
55
+ return !Option.contains(ownInput, entry.id);
56
+ }
57
+ return false;
58
+ };
59
+ /** Whether the parent is paused, has pending guidance, or is under a Hold. */
60
+ const supervised = (hold, attemptId) => hold.paused || hold.guidance.length > 0 || hold.held.includes(parentSessionId(attemptId));
61
+ const budgetExceeded = (runtime, context, attemptId) => call("watch the child-session budget", async (signal) => {
62
+ const scoped = withAbortSignal(signal, context);
63
+ const watch = await runtime.watchDoc(AttemptRecordDoc, attemptId, scoped);
64
+ if (watch === undefined)
65
+ throw new Error(`Attempt ${attemptId} has no durable record`);
66
+ const record = await firstAccepted(watch, (value) => value.childBudgetExceeded !== null, scoped);
67
+ return record.childBudgetExceeded;
68
+ });
69
+ /**
70
+ * Builds the `usine.attempt` task, which submits the assembled prompt and then operator guidance
71
+ * one turn at a time. Each turn is submitted exactly once across restarts.
72
+ */
73
+ export const attemptTask = (services, selection) => {
74
+ const prepare = Effect.fn("AttemptTask.prepare")(function* (task, runtime, context) {
75
+ const request = yield* storedRequestOf(task.input);
76
+ const spec = request.spec;
77
+ yield* Effect.annotateCurrentSpan({
78
+ attemptId: spec.attemptId,
79
+ taskId: task.id,
80
+ sessionId: parentSessionId(spec.attemptId),
81
+ });
82
+ const resolved = yield* resolveParent(runtime.models, services.defaultModel, spec).pipe(Effect.result);
83
+ if (Result.isFailure(resolved)) {
84
+ yield* Effect.logError("Pi parent could not start", {
85
+ attemptId: spec.attemptId,
86
+ errorTag: resolved.failure._tag,
87
+ message: resolved.failure.message,
88
+ });
89
+ yield* commit(runtime, context, "record the failed start", () => failedOutcome(toAttemptFailure(resolved.failure)));
90
+ return;
91
+ }
92
+ const { ref, model } = resolved.success;
93
+ const { extension, tool } = selection();
94
+ let parent = Option.none();
95
+ yield* commit(runtime, context, "create the parent conversation", async (tx) => {
96
+ const existing = (await tx.scanConversations({ ownerTaskId: task.id }, 1)).items[0];
97
+ const conversation = existing ?? (await tx.createConversation({ ownership: { kind: "task", taskId: task.id } }));
98
+ if (existing === undefined) {
99
+ await configure(tx, conversation.id, {
100
+ model: ref,
101
+ thinkingLevel: spec.parentEffort,
102
+ extensions: [extension],
103
+ tools: [tool],
104
+ });
105
+ }
106
+ await tx.doc(HoldDoc, task.id);
107
+ const record = await tx.doc(AttemptRecordDoc, spec.attemptId, null);
108
+ record.parentModel = model;
109
+ record.parentConversation = conversation.id;
110
+ parent = Option.some(conversation.id);
111
+ return {
112
+ status: "running",
113
+ checkpoint: { phase: "run", parent: conversation.id, turn: 1, message: null },
114
+ };
115
+ });
116
+ yield* Effect.logInfo("Created the Pi parent conversation", {
117
+ attemptId: spec.attemptId,
118
+ parentConversation: Option.getOrUndefined(parent),
119
+ model,
120
+ });
121
+ });
122
+ /** Queues a parent lifecycle event that has no parent entry, such as waiting on the operator. */
123
+ const announce = Effect.fn("AttemptTask.announce")(function* (spec, taskId, runtime, context, lifecycle) {
124
+ const record = yield* call("read the Attempt record", () => runtime.snapshot(AttemptRecordDoc, spec.attemptId, context));
125
+ const model = record?.parentModel ?? null;
126
+ if (model === null) {
127
+ return yield* Effect.logWarning("The parent has no resolved model; its lifecycle event is dropped", { lifecycle });
128
+ }
129
+ const session = parentSession(spec, ModelId.make(model));
130
+ const hub = yield* services.hubs.hub(spec.attemptId, taskId);
131
+ yield* services.hubs.event(hub, lifecycle === "Idle" ? new SessionIdle({ session }) : new SessionResumed({ session }));
132
+ });
133
+ /**
134
+ * Waits while the parent is supervised, then commits the oldest operator guidance, or
135
+ * `RELEASE_GUIDANCE` if there is none, as its next turn.
136
+ */
137
+ const awaitGuidance = Effect.fn("AttemptTask.awaitGuidance")(function* (task, runtime, context) {
138
+ const { spec } = yield* storedRequestOf(task.input);
139
+ const { parent, turn } = task.state.checkpoint;
140
+ const parentId = parentSessionId(spec.attemptId);
141
+ const released = (hold) => !hold.paused && !hold.held.includes(parentId);
142
+ const current = yield* call("read the Hold", () => runtime.snapshot(HoldDoc, task.id, context));
143
+ // Pending guidance resumes the parent immediately, so `Idle` is not announced.
144
+ const waits = (current?.guidance.length ?? 0) === 0;
145
+ if (waits)
146
+ yield* announce(spec, task.id, runtime, context, "Idle");
147
+ while (true) {
148
+ yield* call("wait for operator guidance", async (signal) => {
149
+ const scoped = withAbortSignal(signal, context);
150
+ const watch = await runtime.watchDoc(HoldDoc, task.id, scoped);
151
+ if (watch === undefined)
152
+ throw new Error("The attempt task has no Hold document");
153
+ return firstAccepted(watch, (hold) => hold.guidance.length > 0 || released(hold), scoped);
154
+ });
155
+ let resumed = Option.none();
156
+ yield* commit(runtime, context, "take operator guidance", async (tx) => {
157
+ const hold = await tx.doc(HoldDoc, task.id);
158
+ const [next, ...rest] = hold.guidance;
159
+ if (next === undefined && !released(hold))
160
+ return undefined;
161
+ hold.guidance = rest;
162
+ hold.paused = false;
163
+ resumed = Option.some(next === undefined ? "Release" : "Guidance");
164
+ return {
165
+ status: "running",
166
+ checkpoint: { phase: "run", parent, turn: turn + 1, message: next ?? RELEASE_GUIDANCE },
167
+ };
168
+ });
169
+ if (Option.isSome(resumed)) {
170
+ yield* Effect.logInfo("Resuming the Pi parent", {
171
+ turn: turn + 1,
172
+ resumedBy: resumed.value,
173
+ });
174
+ if (waits)
175
+ yield* announce(spec, task.id, runtime, context, "Resumed");
176
+ return;
177
+ }
178
+ }
179
+ });
180
+ const run = Effect.fn("AttemptTask.run")(function* (task, runtime, context) {
181
+ const request = yield* storedRequestOf(task.input);
182
+ const spec = request.spec;
183
+ const { parent, turn, message } = task.state.checkpoint;
184
+ yield* Effect.annotateCurrentSpan({
185
+ attemptId: spec.attemptId,
186
+ taskId: task.id,
187
+ sessionId: parentSessionId(spec.attemptId),
188
+ turn,
189
+ });
190
+ const conversation = yield* call("open the parent conversation", () => runtime.conversation(parent, context));
191
+ if (conversation === undefined) {
192
+ return yield* Effect.die(new Error(`Parent conversation ${parent} is missing`));
193
+ }
194
+ const content = message ??
195
+ assemblePrompt({
196
+ repository: spec.repository,
197
+ payload: spec.payload,
198
+ agent: spec.agent.name,
199
+ persona: spec.agent.persona,
200
+ task: spec.task,
201
+ resume: spec.resume,
202
+ conflictingSalvage: spec.conflictingSalvage,
203
+ });
204
+ const submission = yield* call("submit the parent turn", () => conversation.submit({ type: "input", content, requestId: `${ATTEMPT_TASK}:${task.id}:turn:${turn}` }, context));
205
+ yield* Effect.logInfo("Submitted a Pi parent turn", { turn, submissionId: submission.id });
206
+ const ended = yield* Effect.raceFirst(call("wait for the parent turn", (signal) => submission.wait(withAbortSignal(signal, context))).pipe(Effect.map((settled) => ({ _tag: "Settled", settled }))), budgetExceeded(runtime, context, spec.attemptId).pipe(Effect.map((exceeded) => ({ _tag: "BudgetExceeded", exceeded }))));
207
+ if (ended._tag === "BudgetExceeded") {
208
+ const attempted = ended.exceeded?.attempted ?? spec.maxChildren + 1;
209
+ yield* Effect.logWarning("Stopping the Pi parent after its child-session budget was exceeded", {
210
+ attemptedChildren: attempted,
211
+ maxChildren: spec.maxChildren,
212
+ });
213
+ // A failed outcome aborts the task's remaining work, including children.
214
+ yield* commit(runtime, context, "record the exceeded budget", () => failedOutcome(new ChildSessionBudgetFailure({
215
+ attemptedChildren: ChildSessionCount.make(attempted),
216
+ maxChildren: ChildSessionBudget.make(spec.maxChildren),
217
+ })));
218
+ return;
219
+ }
220
+ const settled = ended.settled;
221
+ if (settled.type === "input" && settled.status === "done") {
222
+ const answer = yield* finalAnswer(runtime, context, parent, settled.answer);
223
+ const view = yield* call("read the parent's transcript", () => runtime.context(parent, context));
224
+ const answeredOperator = repliesToOperator(view.entries, settled.answer, turn === 1 || message === RELEASE_GUIDANCE ? Option.some(settled.entry) : Option.none());
225
+ const record = yield* call("read the Attempt record", () => runtime.snapshot(AttemptRecordDoc, spec.attemptId, context));
226
+ const own = Option.map(reportedOutcome(Option.none(), answer), toAttemptFailure);
227
+ const relayed = Option.fromNullishOr(record?.childBlocker);
228
+ if (Option.isNone(own) && Option.isSome(relayed)) {
229
+ yield* Effect.logWarning("Pi parent finished without relaying its child's report", {
230
+ childSessionId: relayed.value.sessionId,
231
+ kind: relayed.value.kind ?? "blocked",
232
+ });
233
+ }
234
+ const outcome = Option.orElse(own, () => Option.map(relayed, childReportFailure));
235
+ let finished = false;
236
+ yield* commit(runtime, context, "record the parent's answer", async (tx) => {
237
+ if (supervised(await tx.doc(HoldDoc, task.id), spec.attemptId))
238
+ return undefined;
239
+ finished = true;
240
+ return Option.match(outcome, {
241
+ onNone: () => completedOutcome(answer, answeredOperator),
242
+ onSome: failedOutcome,
243
+ });
244
+ });
245
+ if (finished) {
246
+ yield* Effect.logInfo("Pi parent finished", {
247
+ turn,
248
+ answeredOperator,
249
+ report: Option.match(outcome, { onNone: () => "none", onSome: ({ _tag }) => _tag }),
250
+ });
251
+ return;
252
+ }
253
+ yield* Effect.logInfo("Pi parent answered under operator supervision; holding its answer for the operator", { turn, answeredOperator });
254
+ return yield* awaitGuidance(task, runtime, context);
255
+ }
256
+ if (settled.status === "unanswered" && settled.reason === "aborted") {
257
+ const hold = yield* call("read the Hold", () => runtime.snapshot(HoldDoc, task.id, context));
258
+ if (hold !== undefined && supervised(hold, spec.attemptId)) {
259
+ yield* Effect.logInfo("Pi parent turn was interrupted; waiting for operator guidance", {
260
+ turn,
261
+ });
262
+ return yield* awaitGuidance(task, runtime, context);
263
+ }
264
+ }
265
+ const reason = settled.status === "unanswered" ? settled.reason : settled.status;
266
+ yield* Effect.logError("Pi parent turn ended without an answer", { turn, reason });
267
+ yield* commit(runtime, context, "record the unanswered turn", () => failedOutcome(new InfraFailure({
268
+ message: `The Pi parent's turn ended without an answer: ${reason}`,
269
+ cause: settled.status === "unanswered" ? (settled.detail ?? reason) : reason,
270
+ })));
271
+ });
272
+ return defineTask({
273
+ name: ATTEMPT_TASK,
274
+ version: 1,
275
+ initial: () => ({ phase: "prepare" }),
276
+ phases: {
277
+ prepare: (task, runtime, context) => services.run(prepare(task, runtime, context), context.abortSignal),
278
+ run: (task, runtime, context) => services.run(run(task, runtime, context), context.abortSignal),
279
+ },
280
+ abort: (task, runtime, context) => services.run(Effect.gen(function* () {
281
+ const { spec } = yield* storedRequestOf(task.input);
282
+ const record = yield* call("read the Attempt record", () => runtime.snapshot(AttemptRecordDoc, spec.attemptId, context)).pipe(Effect.tapError((error) => Effect.logWarning("Could not read the aborted Attempt's record; ending it as canceled", {
283
+ attemptId: spec.attemptId,
284
+ message: error.message,
285
+ })), Effect.orElseSucceed(() => undefined));
286
+ const storageFailure = Option.fromUndefinedOr(record?.storageFailure);
287
+ yield* commit(runtime, context, "record the abort", () => Option.match(storageFailure, {
288
+ onNone: () => ({ status: "terminal", outcome: { status: "aborted" } }),
289
+ onSome: (message) => failedOutcome(new InfraFailure({ message, cause: message })),
290
+ }));
291
+ yield* Option.match(storageFailure, {
292
+ onNone: () => Effect.logInfo("Attempt task aborted", { taskId: task.id }),
293
+ onSome: (message) => Effect.logError("Attempt task failed: its parent conversation could not be read", {
294
+ taskId: task.id,
295
+ attemptId: spec.attemptId,
296
+ cause: message,
297
+ }),
298
+ });
299
+ }).pipe(Effect.withSpan("AttemptTask.abort")), context.abortSignal),
300
+ });
301
+ };
302
+ //# sourceMappingURL=task.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task.js","sourceRoot":"","sources":["../../src/attempt/task.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { Context as ChordContext } from "@earendil-works/chord";
2
+ import type { DocumentWatch, JsonObject } from "@earendil-works/pi-durable";
3
+ /**
4
+ * Resolves with the first committed document value that `accept` matches, starting with the current
5
+ * value. Rejects if the context is aborted or the watch ends, and stops the watch in every case.
6
+ */
7
+ export declare const firstAccepted: <T extends JsonObject>(watch: DocumentWatch<T>, accept: (value: Readonly<T>) => boolean, context: ChordContext) => Promise<Readonly<T>>;
8
+ //# sourceMappingURL=watch.d.ts.map