@astralyn/pi 0.84.5 → 0.84.6

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 (105) hide show
  1. package/CHANGELOG.md +27 -0
  2. package/dist/core/agent-session.d.ts.map +1 -1
  3. package/dist/core/agent-session.js +4 -0
  4. package/dist/core/agent-session.js.map +1 -1
  5. package/dist/core/extensions/index.d.ts +1 -1
  6. package/dist/core/extensions/index.d.ts.map +1 -1
  7. package/dist/core/extensions/index.js.map +1 -1
  8. package/dist/core/extensions/runner.d.ts +1 -0
  9. package/dist/core/extensions/runner.d.ts.map +1 -1
  10. package/dist/core/extensions/runner.js +6 -0
  11. package/dist/core/extensions/runner.js.map +1 -1
  12. package/dist/core/extensions/types.d.ts +11 -0
  13. package/dist/core/extensions/types.d.ts.map +1 -1
  14. package/dist/core/extensions/types.js.map +1 -1
  15. package/dist/core/tools/bash.d.ts +5 -0
  16. package/dist/core/tools/bash.d.ts.map +1 -1
  17. package/dist/core/tools/bash.js +1 -1
  18. package/dist/core/tools/bash.js.map +1 -1
  19. package/dist/extensions/background/index.d.ts +95 -20
  20. package/dist/extensions/background/index.d.ts.map +1 -1
  21. package/dist/extensions/background/index.js +470 -136
  22. package/dist/extensions/background/index.js.map +1 -1
  23. package/dist/extensions/background/manager.d.ts +14 -0
  24. package/dist/extensions/background/manager.d.ts.map +1 -1
  25. package/dist/extensions/background/manager.js +125 -24
  26. package/dist/extensions/background/manager.js.map +1 -1
  27. package/dist/extensions/background/registry.d.ts +82 -0
  28. package/dist/extensions/background/registry.d.ts.map +1 -1
  29. package/dist/extensions/background/registry.js +237 -6
  30. package/dist/extensions/background/registry.js.map +1 -1
  31. package/dist/extensions/background/render.d.ts +35 -11
  32. package/dist/extensions/background/render.d.ts.map +1 -1
  33. package/dist/extensions/background/render.js +172 -30
  34. package/dist/extensions/background/render.js.map +1 -1
  35. package/dist/extensions/subagent/activity.d.ts +3 -5
  36. package/dist/extensions/subagent/activity.d.ts.map +1 -1
  37. package/dist/extensions/subagent/activity.js +8 -89
  38. package/dist/extensions/subagent/activity.js.map +1 -1
  39. package/dist/extensions/subagent/agents-command.d.ts.map +1 -1
  40. package/dist/extensions/subagent/agents-command.js +40 -94
  41. package/dist/extensions/subagent/agents-command.js.map +1 -1
  42. package/dist/extensions/subagent/agents.d.ts +2 -0
  43. package/dist/extensions/subagent/agents.d.ts.map +1 -1
  44. package/dist/extensions/subagent/agents.js +7 -1
  45. package/dist/extensions/subagent/agents.js.map +1 -1
  46. package/dist/extensions/subagent/budget.d.ts +15 -0
  47. package/dist/extensions/subagent/budget.d.ts.map +1 -0
  48. package/dist/extensions/subagent/budget.js +96 -0
  49. package/dist/extensions/subagent/budget.js.map +1 -0
  50. package/dist/extensions/subagent/cancellation.d.ts +29 -0
  51. package/dist/extensions/subagent/cancellation.d.ts.map +1 -0
  52. package/dist/extensions/subagent/cancellation.js +73 -0
  53. package/dist/extensions/subagent/cancellation.js.map +1 -0
  54. package/dist/extensions/subagent/index.d.ts.map +1 -1
  55. package/dist/extensions/subagent/index.js +5 -22
  56. package/dist/extensions/subagent/index.js.map +1 -1
  57. package/dist/extensions/subagent/model-selection.d.ts +16 -0
  58. package/dist/extensions/subagent/model-selection.d.ts.map +1 -0
  59. package/dist/extensions/subagent/model-selection.js +51 -0
  60. package/dist/extensions/subagent/model-selection.js.map +1 -0
  61. package/dist/extensions/subagent/render.d.ts +6 -1
  62. package/dist/extensions/subagent/render.d.ts.map +1 -1
  63. package/dist/extensions/subagent/render.js +23 -12
  64. package/dist/extensions/subagent/render.js.map +1 -1
  65. package/dist/extensions/subagent/resolve.d.ts.map +1 -1
  66. package/dist/extensions/subagent/resolve.js +2 -21
  67. package/dist/extensions/subagent/resolve.js.map +1 -1
  68. package/dist/extensions/subagent/runner.d.ts +4 -5
  69. package/dist/extensions/subagent/runner.d.ts.map +1 -1
  70. package/dist/extensions/subagent/runner.js +71 -264
  71. package/dist/extensions/subagent/runner.js.map +1 -1
  72. package/dist/extensions/subagent/sdk-runner.d.ts +13 -11
  73. package/dist/extensions/subagent/sdk-runner.d.ts.map +1 -1
  74. package/dist/extensions/subagent/sdk-runner.js +167 -148
  75. package/dist/extensions/subagent/sdk-runner.js.map +1 -1
  76. package/dist/extensions/subagent/state.d.ts +89 -0
  77. package/dist/extensions/subagent/state.d.ts.map +1 -0
  78. package/dist/extensions/subagent/state.js +294 -0
  79. package/dist/extensions/subagent/state.js.map +1 -0
  80. package/dist/extensions/subagent/text.d.ts +4 -0
  81. package/dist/extensions/subagent/text.d.ts.map +1 -1
  82. package/dist/extensions/subagent/text.js +75 -0
  83. package/dist/extensions/subagent/text.js.map +1 -1
  84. package/dist/extensions/subagent/types.d.ts +3 -8
  85. package/dist/extensions/subagent/types.d.ts.map +1 -1
  86. package/dist/extensions/subagent/types.js.map +1 -1
  87. package/dist/extensions/subagent/ui/choices.d.ts +36 -0
  88. package/dist/extensions/subagent/ui/choices.d.ts.map +1 -0
  89. package/dist/extensions/subagent/ui/choices.js +54 -0
  90. package/dist/extensions/subagent/ui/choices.js.map +1 -0
  91. package/dist/extensions/subagent/ui/model-list.d.ts.map +1 -1
  92. package/dist/extensions/subagent/ui/model-list.js +10 -18
  93. package/dist/extensions/subagent/ui/model-list.js.map +1 -1
  94. package/dist/index.d.ts +1 -1
  95. package/dist/index.d.ts.map +1 -1
  96. package/dist/index.js.map +1 -1
  97. package/docs/bundled/README.md +1 -1
  98. package/docs/bundled/extensions/background.md +55 -20
  99. package/docs/extensions.md +13 -0
  100. package/npm-shrinkwrap.json +2 -2
  101. package/package.json +1 -1
  102. package/dist/extensions/subagent/retry.d.ts +0 -17
  103. package/dist/extensions/subagent/retry.d.ts.map +0 -1
  104. package/dist/extensions/subagent/retry.js +0 -41
  105. package/dist/extensions/subagent/retry.js.map +0 -1
@@ -2,9 +2,7 @@ import { DefaultResourceLoader } from "../../core/resource-loader.js";
2
2
  import { createAgentSession } from "../../core/sdk.js";
3
3
  import { SessionManager } from "../../core/session-manager.js";
4
4
  import { SettingsManager } from "../../core/settings-manager.js";
5
- import { activitySummary, addUsage, appendActivity, boundText, finalAssistantText, resultSummary } from "./activity.js";
6
- import { ERROR_TEXT_LIMIT, TASK_OUTPUT_LIMIT } from "./constants.js";
7
- import { beginSubagentRetry, clearSubagentRetry } from "./retry.js";
5
+ import { finalAssistantText } from "./activity.js";
8
6
  function workerSystemPrompt(base, task) {
9
7
  return [
10
8
  base,
@@ -54,53 +52,63 @@ function createThrottledEmitter(onProgress) {
54
52
  },
55
53
  };
56
54
  }
57
- export function applySubagentAutoRetryEvent(run, event) {
58
- if (event.type === "auto_retry_start") {
59
- beginSubagentRetry(run, {
60
- attempt: event.attempt,
61
- maxAttempts: event.maxAttempts,
62
- delayMs: event.delayMs,
63
- error: event.errorMessage,
64
- });
65
- return;
66
- }
67
- clearSubagentRetry(run);
55
+ // Neither resource loading nor session creation takes an abort signal, and
56
+ // both can hang on network work; race both against the scope. The losing
57
+ // chain keeps running, so its eventual result or rejection is always
58
+ // consumed by a no-op handler.
59
+ async function raceInitialization(chain, scope) {
60
+ return new Promise((resolve) => {
61
+ let settled = false;
62
+ const finish = (outcome) => {
63
+ if (settled)
64
+ return;
65
+ settled = true;
66
+ scope.signal.removeEventListener("abort", onAbort);
67
+ resolve(outcome);
68
+ };
69
+ const onAbort = () => {
70
+ finish({ kind: "aborted" });
71
+ };
72
+ if (scope.signal.aborted) {
73
+ onAbort();
74
+ void chain.then(() => undefined, () => undefined);
75
+ return;
76
+ }
77
+ scope.signal.addEventListener("abort", onAbort, { once: true });
78
+ void chain.then((outcome) => finish(outcome), (error) => finish({ kind: "error", error }));
79
+ });
68
80
  }
81
+ /**
82
+ * Runs one worker attempt as a pure adapter: it owns the worker session's
83
+ * lifecycle and translates AgentSessionEvents into SubagentRunEvents; every
84
+ * state transition happens in the reducer on the other side of dispatch.
85
+ */
69
86
  export async function runSdkTask(options) {
70
- const { task, run, modelRuntime, agentDir, projectTrusted, signal, onProgress } = options;
87
+ const { task, scope, dispatch, modelRuntime, agentDir, projectTrusted, onProgress } = options;
71
88
  const throttled = createThrottledEmitter(onProgress);
72
89
  let unsubscribe;
73
90
  let unregisterAbort;
74
91
  let session;
75
- const activeActivities = new Map();
92
+ // Streaming updates carry no semantic weight; the settled messages are
93
+ // where usage is accounted, and worker sessions can replay them.
76
94
  const seenAssistantMessages = new Set();
77
- const initializationAbortController = new AbortController();
78
- const markAbort = async () => {
79
- clearSubagentRetry(run);
80
- run.status = "aborted";
81
- run.error ??= "Subagent was aborted.";
82
- initializationAbortController.abort();
95
+ const emitImmediate = () => onProgress?.();
96
+ const emitThrottled = throttled.emit;
97
+ unregisterAbort = scope.onAbort(async () => {
83
98
  if (session)
84
99
  await session.abort();
85
- };
86
- const isAborted = () => signal?.aborted === true || run.status === "aborted";
87
- const abortListener = () => {
88
- void markAbort().catch(() => undefined);
89
- };
90
- unregisterAbort = options.registerAbort?.(markAbort);
91
- if (signal)
92
- signal.addEventListener("abort", abortListener, { once: true });
100
+ });
93
101
  try {
94
- if (isAborted()) {
95
- clearSubagentRetry(run);
96
- run.status = "aborted";
97
- run.error = "Subagent was aborted before it started.";
98
- return run;
102
+ if (scope.aborted) {
103
+ dispatch({
104
+ type: "settle",
105
+ verdict: "aborted",
106
+ report: "",
107
+ error: "Subagent was aborted before it started.",
108
+ endedAt: Date.now(),
109
+ });
110
+ return;
99
111
  }
100
- clearSubagentRetry(run);
101
- run.status = "running";
102
- run.startedAt = Date.now();
103
- onProgress?.();
104
112
  const settingsManager = SettingsManager.create(task.cwd, agentDir, { projectTrusted });
105
113
  const resourceLoader = new DefaultResourceLoader({
106
114
  cwd: task.cwd,
@@ -115,168 +123,179 @@ export async function runSdkTask(options) {
115
123
  noContextFiles: task.agent.omitContextFiles ?? false,
116
124
  systemPromptOverride: (base) => workerSystemPrompt(base, task),
117
125
  });
118
- await resourceLoader.reload();
119
- if (isAborted()) {
120
- run.error ??= "Subagent was aborted during initialization.";
121
- return run;
122
- }
123
- const createPromise = createAgentSession({
124
- cwd: task.cwd,
125
- agentDir,
126
- modelRuntime,
127
- model: task.model,
128
- thinkingLevel: task.thinking,
129
- tools: task.agent.tools,
130
- resourceLoader,
131
- sessionManager: SessionManager.inMemory(task.cwd),
132
- settingsManager,
133
- });
134
- // createAgentSession takes no signal and can hang on network work. Race
135
- // both parent-signal and registered shutdown cancellation against it;
136
- // only the winning branch owns disposal of the resulting session.
137
- const initializationSignal = initializationAbortController.signal;
138
- let creationAbortListener;
139
- const abortedOutcome = new Promise((resolve) => {
140
- const resolveAborted = () => resolve({ kind: "aborted" });
141
- if (initializationSignal.aborted) {
142
- resolveAborted();
143
- return;
144
- }
145
- creationAbortListener = resolveAborted;
146
- initializationSignal.addEventListener("abort", resolveAborted, { once: true });
147
- });
148
- const outcome = await Promise.race([
149
- createPromise.then((created) => ({ kind: "created", created })),
150
- abortedOutcome,
151
- ]).finally(() => {
152
- if (creationAbortListener)
153
- initializationSignal.removeEventListener("abort", creationAbortListener);
154
- });
126
+ const initialization = (async () => {
127
+ await resourceLoader.reload();
128
+ if (scope.signal.aborted)
129
+ return { kind: "aborted" };
130
+ const created = await createAgentSession({
131
+ cwd: task.cwd,
132
+ agentDir,
133
+ modelRuntime,
134
+ model: task.model,
135
+ thinkingLevel: task.thinking,
136
+ tools: task.agent.tools,
137
+ resourceLoader,
138
+ sessionManager: SessionManager.inMemory(task.cwd),
139
+ settingsManager,
140
+ });
141
+ return { kind: "created", session: created.session };
142
+ })();
143
+ const outcome = await raceInitialization(initialization, scope);
144
+ if (outcome.kind === "error")
145
+ throw outcome.error;
155
146
  if (outcome.kind === "aborted") {
156
- // The creation promise cannot be cancelled. Dispose its session if it
157
- // eventually resolves, but keep background cleanup from surfacing an
158
- // unhandled rejection after this run has already settled.
159
- void createPromise.then((createdLate) => {
160
- try {
161
- createdLate.session.dispose();
162
- }
163
- catch {
164
- // The aborted run has no remaining channel for cleanup errors.
147
+ // The initialization chain cannot be cancelled. Dispose the
148
+ // session if it eventually resolves, and swallow a late rejection
149
+ // after this run has already settled.
150
+ void initialization.then((late) => {
151
+ if (late.kind === "created") {
152
+ try {
153
+ late.session.dispose();
154
+ }
155
+ catch {
156
+ // The aborted run has no remaining channel for cleanup errors.
157
+ }
165
158
  }
166
159
  }, () => { });
167
- run.error ??= "Subagent was aborted during initialization.";
168
- return run;
160
+ dispatch({
161
+ type: "settle",
162
+ verdict: "aborted",
163
+ report: "",
164
+ error: "Subagent was aborted during initialization.",
165
+ endedAt: Date.now(),
166
+ });
167
+ return;
169
168
  }
170
- const created = outcome.created;
171
- session = created.session;
172
- if (isAborted()) {
173
- run.error ??= "Subagent was aborted during initialization.";
169
+ session = outcome.session;
170
+ if (scope.aborted) {
174
171
  await session.abort();
175
- return run;
172
+ dispatch({
173
+ type: "settle",
174
+ verdict: "aborted",
175
+ report: "",
176
+ error: "Subagent was aborted during initialization.",
177
+ endedAt: Date.now(),
178
+ });
179
+ return;
176
180
  }
177
- const emitImmediate = () => onProgress?.();
178
- const emitText = throttled.emit;
179
181
  unsubscribe = session.subscribe((event) => {
180
- if (event.type === "auto_retry_start" || event.type === "auto_retry_end") {
181
- applySubagentAutoRetryEvent(run, event);
182
+ if (event.type === "auto_retry_start") {
183
+ dispatch({
184
+ type: "auto_retry_start",
185
+ attempt: event.attempt,
186
+ maxAttempts: event.maxAttempts,
187
+ deadline: Date.now() + event.delayMs,
188
+ error: event.errorMessage,
189
+ });
190
+ emitImmediate();
191
+ return;
192
+ }
193
+ if (event.type === "auto_retry_end") {
194
+ dispatch({ type: "auto_retry_end" });
182
195
  emitImmediate();
183
196
  return;
184
197
  }
185
198
  if (event.type === "turn_end") {
186
- clearSubagentRetry(run);
187
- run.usage.turns++;
188
- run.currentActivity = undefined;
199
+ dispatch({ type: "turn_end" });
189
200
  emitImmediate();
190
201
  return;
191
202
  }
192
203
  if (event.type === "message_end" && event.message.role === "assistant") {
193
- // Streaming updates carry no semantic weight (message_update is
194
- // ignored); the settled message is where usage is accounted.
195
- clearSubagentRetry(run);
196
204
  if (!seenAssistantMessages.has(event.message)) {
197
205
  seenAssistantMessages.add(event.message);
198
- addUsage(run.usage, event.message.usage);
206
+ dispatch({ type: "assistant_message_settled", usage: event.message.usage });
207
+ }
208
+ else {
209
+ dispatch({ type: "assistant_message_settled", usage: undefined });
199
210
  }
200
211
  emitImmediate();
201
212
  return;
202
213
  }
203
214
  if (event.type === "tool_execution_start") {
204
- clearSubagentRetry(run);
205
- run.usage.toolUses++;
206
- const activity = {
207
- id: event.toolCallId,
215
+ dispatch({
216
+ type: "tool_started",
217
+ toolCallId: event.toolCallId,
208
218
  toolName: event.toolName,
209
- summary: activitySummary(event.toolName, event.args),
210
- status: "running",
219
+ args: event.args,
211
220
  startedAt: Date.now(),
212
- };
213
- activeActivities.set(event.toolCallId, activity);
214
- appendActivity(run.activities, activity);
215
- run.currentActivity = activity.summary;
221
+ });
216
222
  emitImmediate();
217
223
  return;
218
224
  }
219
225
  if (event.type === "tool_execution_update") {
220
- clearSubagentRetry(run);
221
- run.currentActivity = activitySummary(event.toolName, event.args);
222
- emitText();
226
+ dispatch({
227
+ type: "tool_updated",
228
+ toolCallId: event.toolCallId,
229
+ toolName: event.toolName,
230
+ args: event.args,
231
+ });
232
+ emitThrottled();
223
233
  return;
224
234
  }
225
235
  if (event.type === "tool_execution_end") {
226
- clearSubagentRetry(run);
227
- const activity = activeActivities.get(event.toolCallId);
228
- if (activity) {
229
- activity.status = event.isError ? "failed" : "succeeded";
230
- activity.endedAt = Date.now();
231
- activity.resultSummary = resultSummary(event.result);
232
- }
233
- activeActivities.delete(event.toolCallId);
234
- run.currentActivity = undefined;
236
+ dispatch({
237
+ type: "tool_ended",
238
+ toolCallId: event.toolCallId,
239
+ result: event.result,
240
+ isError: event.isError,
241
+ endedAt: Date.now(),
242
+ });
235
243
  emitImmediate();
236
244
  }
237
245
  });
238
246
  await session.prompt(task.prompt);
239
247
  const finalMessage = lastAssistantMessage(session);
240
- run.report = finalAssistantText(session.messages);
248
+ const report = finalAssistantText(session.messages);
241
249
  const error = assistantError(finalMessage);
242
- if (signal?.aborted || finalMessage?.stopReason === "aborted") {
243
- run.status = "aborted";
244
- run.error = boundText(error ?? "Subagent was aborted.", ERROR_TEXT_LIMIT);
250
+ if (scope.signal.aborted || finalMessage?.stopReason === "aborted") {
251
+ dispatch({
252
+ type: "settle",
253
+ verdict: "aborted",
254
+ report,
255
+ error: error ?? "Subagent was aborted.",
256
+ endedAt: Date.now(),
257
+ });
245
258
  }
246
259
  else if (finalMessage?.stopReason === "error" || error) {
247
- run.status = "failed";
248
- run.error = boundText(error ?? "Subagent failed.", ERROR_TEXT_LIMIT);
260
+ dispatch({
261
+ type: "settle",
262
+ verdict: "failed",
263
+ report,
264
+ error: error ?? "Subagent failed.",
265
+ endedAt: Date.now(),
266
+ });
249
267
  }
250
268
  else {
251
- run.status = "completed";
269
+ dispatch({ type: "settle", verdict: "completed", report, error: undefined, endedAt: Date.now() });
252
270
  }
253
271
  }
254
272
  catch (error) {
255
- if (signal?.aborted || run.status === "aborted") {
256
- run.status = "aborted";
257
- run.error = run.error ?? "Subagent was aborted.";
273
+ const report = session ? finalAssistantText(session.messages) : "";
274
+ if (scope.signal.aborted) {
275
+ dispatch({
276
+ type: "settle",
277
+ verdict: "aborted",
278
+ report,
279
+ error: "Subagent was aborted.",
280
+ endedAt: Date.now(),
281
+ });
258
282
  }
259
283
  else {
260
- run.status = "failed";
261
- run.error = boundText(error instanceof Error ? error.message : String(error), ERROR_TEXT_LIMIT);
284
+ dispatch({
285
+ type: "settle",
286
+ verdict: "failed",
287
+ report,
288
+ error: error instanceof Error ? error.message : String(error),
289
+ endedAt: Date.now(),
290
+ });
262
291
  }
263
- if (session)
264
- run.report = finalAssistantText(session.messages);
265
292
  }
266
293
  finally {
267
- if (signal)
268
- signal.removeEventListener("abort", abortListener);
269
294
  throttled.cancel();
270
295
  unregisterAbort?.();
271
296
  unsubscribe?.();
272
297
  session?.dispose();
273
- run.report = boundText(run.report, TASK_OUTPUT_LIMIT);
274
- if (run.error)
275
- run.error = boundText(run.error, ERROR_TEXT_LIMIT);
276
- clearSubagentRetry(run);
277
- run.endedAt = Date.now();
278
- onProgress?.();
298
+ emitImmediate();
279
299
  }
280
- return run;
281
300
  }
282
301
  //# sourceMappingURL=sdk-runner.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"sdk-runner.js","sourceRoot":"","sources":["../../../src/extensions/subagent/sdk-runner.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AACtE,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACjE,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,cAAc,EAAE,SAAS,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACxH,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACrE,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAcpE,SAAS,kBAAkB,CAAC,IAAwB,EAAE,IAA0B;IAC/E,OAAO;QACN,IAAI;QACJ,wBAAwB,IAAI,CAAC,KAAK,CAAC,IAAI,iDAAiD;QACxF,wIAAwI;QACxI,6GAA6G;QAC7G,8EAA8E;QAC9E,iEAAiE;QACjE,oGAAoG;QACpG,0EAA0E;QAC1E,6IAA6I;QAC7I,wJAAwJ;QACxJ,uLAAuL;QACvL,IAAI,CAAC,KAAK,CAAC,YAAY;KACvB;SACC,MAAM,CAAC,CAAC,IAAI,EAAkB,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;SACvD,IAAI,CAAC,MAAM,CAAC,CAAC;AAChB,CAAC;AAED,SAAS,oBAAoB,CAAC,OAA8C;IAC3E,KAAK,IAAI,KAAK,GAAG,OAAO,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC;QACnE,MAAM,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACxC,IAAI,OAAO,EAAE,IAAI,KAAK,WAAW;YAAE,OAAO,OAAO,CAAC;IACnD,CAAC;IACD,OAAO,SAAS,CAAC;AAClB,CAAC;AAED,SAAS,cAAc,CAAC,OAAgD;IACvE,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,IAAI,KAAK,WAAW;QAAE,OAAO,SAAS,CAAC;IAC/D,OAAO,OAAO,CAAC,YAAY,CAAC;AAC7B,CAAC;AAQD,SAAS,sBAAsB,CAAC,UAAoC;IACnE,IAAI,KAAgD,CAAC;IACrD,OAAO;QACN,IAAI,EAAE,GAAG,EAAE;YACV,IAAI,CAAC,UAAU,IAAI,KAAK;gBAAE,OAAO;YACjC,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;gBACvB,KAAK,GAAG,SAAS,CAAC;gBAClB,UAAU,EAAE,CAAC;YACd,CAAC,EAAE,EAAE,CAAC,CAAC;QACR,CAAC;QACD,MAAM,EAAE,GAAG,EAAE;YACZ,IAAI,KAAK;gBAAE,YAAY,CAAC,KAAK,CAAC,CAAC;YAC/B,KAAK,GAAG,SAAS,CAAC;QACnB,CAAC;KACD,CAAC;AACH,CAAC;AAID,MAAM,UAAU,2BAA2B,CAAC,GAAuB,EAAE,KAAqB;IACzF,IAAI,KAAK,CAAC,IAAI,KAAK,kBAAkB,EAAE,CAAC;QACvC,kBAAkB,CAAC,GAAG,EAAE;YACvB,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,WAAW,EAAE,KAAK,CAAC,WAAW;YAC9B,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,KAAK,EAAE,KAAK,CAAC,YAAY;SACzB,CAAC,CAAC;QACH,OAAO;IACR,CAAC;IACD,kBAAkB,CAAC,GAAG,CAAC,CAAC;AACzB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,OAAyB;IACzD,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,YAAY,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC;IAC1F,MAAM,SAAS,GAAG,sBAAsB,CAAC,UAAU,CAAC,CAAC;IACrD,IAAI,WAAqC,CAAC;IAC1C,IAAI,eAAyC,CAAC;IAC9C,IAAI,OAA8E,CAAC;IACnF,MAAM,gBAAgB,GAAG,IAAI,GAAG,EAAwB,CAAC;IACzD,MAAM,qBAAqB,GAAG,IAAI,GAAG,EAAW,CAAC;IACjD,MAAM,6BAA6B,GAAG,IAAI,eAAe,EAAE,CAAC;IAC5D,MAAM,SAAS,GAAG,KAAK,IAAmB,EAAE;QAC3C,kBAAkB,CAAC,GAAG,CAAC,CAAC;QACxB,GAAG,CAAC,MAAM,GAAG,SAAS,CAAC;QACvB,GAAG,CAAC,KAAK,KAAK,uBAAuB,CAAC;QACtC,6BAA6B,CAAC,KAAK,EAAE,CAAC;QACtC,IAAI,OAAO;YAAE,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;IACpC,CAAC,CAAC;IACF,MAAM,SAAS,GAAG,GAAY,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC;IACtF,MAAM,aAAa,GAAG,GAAG,EAAE;QAC1B,KAAK,SAAS,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;IACzC,CAAC,CAAC;IACF,eAAe,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,SAAS,CAAC,CAAC;IACrD,IAAI,MAAM;QAAE,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,aAAa,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IAE5E,IAAI,CAAC;QACJ,IAAI,SAAS,EAAE,EAAE,CAAC;YACjB,kBAAkB,CAAC,GAAG,CAAC,CAAC;YACxB,GAAG,CAAC,MAAM,GAAG,SAAS,CAAC;YACvB,GAAG,CAAC,KAAK,GAAG,yCAAyC,CAAC;YACtD,OAAO,GAAG,CAAC;QACZ,CAAC;QAED,kBAAkB,CAAC,GAAG,CAAC,CAAC;QACxB,GAAG,CAAC,MAAM,GAAG,SAAS,CAAC;QACvB,GAAG,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC3B,UAAU,EAAE,EAAE,CAAC;QACf,MAAM,eAAe,GAAG,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,EAAE,EAAE,cAAc,EAAE,CAAC,CAAC;QACvF,MAAM,cAAc,GAAG,IAAI,qBAAqB,CAAC;YAChD,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,QAAQ;YACR,eAAe;YACf,YAAY,EAAE,IAAI;YAClB,QAAQ,EAAE,IAAI;YACd,iBAAiB,EAAE,IAAI;YACvB,QAAQ,EAAE,IAAI;YACd,gEAAgE;YAChE,kEAAkE;YAClE,cAAc,EAAE,IAAI,CAAC,KAAK,CAAC,gBAAgB,IAAI,KAAK;YACpD,oBAAoB,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,kBAAkB,CAAC,IAAI,EAAE,IAAI,CAAC;SAC9D,CAAC,CAAC;QACH,MAAM,cAAc,CAAC,MAAM,EAAE,CAAC;QAC9B,IAAI,SAAS,EAAE,EAAE,CAAC;YACjB,GAAG,CAAC,KAAK,KAAK,6CAA6C,CAAC;YAC5D,OAAO,GAAG,CAAC;QACZ,CAAC;QACD,MAAM,aAAa,GAAG,kBAAkB,CAAC;YACxC,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,QAAQ;YACR,YAAY;YACZ,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,aAAa,EAAE,IAAI,CAAC,QAAQ;YAC5B,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK;YACvB,cAAc;YACd,cAAc,EAAE,cAAc,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC;YACjD,eAAe;SACf,CAAC,CAAC;QACH,wEAAwE;QACxE,sEAAsE;QACtE,kEAAkE;QAClE,MAAM,oBAAoB,GAAG,6BAA6B,CAAC,MAAM,CAAC;QAClE,IAAI,qBAA+C,CAAC;QACpD,MAAM,cAAc,GAAG,IAAI,OAAO,CAAsB,CAAC,OAAO,EAAE,EAAE;YACnE,MAAM,cAAc,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;YAC1D,IAAI,oBAAoB,CAAC,OAAO,EAAE,CAAC;gBAClC,cAAc,EAAE,CAAC;gBACjB,OAAO;YACR,CAAC;YACD,qBAAqB,GAAG,cAAc,CAAC;YACvC,oBAAoB,CAAC,gBAAgB,CAAC,OAAO,EAAE,cAAc,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QAChF,CAAC,CAAC,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC;YAClC,aAAa,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,SAAkB,EAAE,OAAO,EAAE,CAAC,CAAC;YACxE,cAAc;SACd,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE;YACf,IAAI,qBAAqB;gBAAE,oBAAoB,CAAC,mBAAmB,CAAC,OAAO,EAAE,qBAAqB,CAAC,CAAC;QACrG,CAAC,CAAC,CAAC;QACH,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAChC,sEAAsE;YACtE,qEAAqE;YACrE,0DAA0D;YAC1D,KAAK,aAAa,CAAC,IAAI,CACtB,CAAC,WAAW,EAAE,EAAE;gBACf,IAAI,CAAC;oBACJ,WAAW,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;gBAC/B,CAAC;gBAAC,MAAM,CAAC;oBACR,+DAA+D;gBAChE,CAAC;YACF,CAAC,EACD,GAAG,EAAE,GAAE,CAAC,CACR,CAAC;YACF,GAAG,CAAC,KAAK,KAAK,6CAA6C,CAAC;YAC5D,OAAO,GAAG,CAAC;QACZ,CAAC;QACD,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;QAChC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;QAC1B,IAAI,SAAS,EAAE,EAAE,CAAC;YACjB,GAAG,CAAC,KAAK,KAAK,6CAA6C,CAAC;YAC5D,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;YACtB,OAAO,GAAG,CAAC;QACZ,CAAC;QACD,MAAM,aAAa,GAAG,GAAG,EAAE,CAAC,UAAU,EAAE,EAAE,CAAC;QAC3C,MAAM,QAAQ,GAAG,SAAS,CAAC,IAAI,CAAC;QAChC,WAAW,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,KAAwB,EAAE,EAAE;YAC5D,IAAI,KAAK,CAAC,IAAI,KAAK,kBAAkB,IAAI,KAAK,CAAC,IAAI,KAAK,gBAAgB,EAAE,CAAC;gBAC1E,2BAA2B,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;gBACxC,aAAa,EAAE,CAAC;gBAChB,OAAO;YACR,CAAC;YACD,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;gBAC/B,kBAAkB,CAAC,GAAG,CAAC,CAAC;gBACxB,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;gBAClB,GAAG,CAAC,eAAe,GAAG,SAAS,CAAC;gBAChC,aAAa,EAAE,CAAC;gBAChB,OAAO;YACR,CAAC;YACD,IAAI,KAAK,CAAC,IAAI,KAAK,aAAa,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;gBACxE,gEAAgE;gBAChE,6DAA6D;gBAC7D,kBAAkB,CAAC,GAAG,CAAC,CAAC;gBACxB,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;oBAC/C,qBAAqB,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;oBACzC,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;gBAC1C,CAAC;gBACD,aAAa,EAAE,CAAC;gBAChB,OAAO;YACR,CAAC;YACD,IAAI,KAAK,CAAC,IAAI,KAAK,sBAAsB,EAAE,CAAC;gBAC3C,kBAAkB,CAAC,GAAG,CAAC,CAAC;gBACxB,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;gBACrB,MAAM,QAAQ,GAAiB;oBAC9B,EAAE,EAAE,KAAK,CAAC,UAAU;oBACpB,QAAQ,EAAE,KAAK,CAAC,QAAQ;oBACxB,OAAO,EAAE,eAAe,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC;oBACpD,MAAM,EAAE,SAAS;oBACjB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;iBACrB,CAAC;gBACF,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;gBACjD,cAAc,CAAC,GAAG,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;gBACzC,GAAG,CAAC,eAAe,GAAG,QAAQ,CAAC,OAAO,CAAC;gBACvC,aAAa,EAAE,CAAC;gBAChB,OAAO;YACR,CAAC;YACD,IAAI,KAAK,CAAC,IAAI,KAAK,uBAAuB,EAAE,CAAC;gBAC5C,kBAAkB,CAAC,GAAG,CAAC,CAAC;gBACxB,GAAG,CAAC,eAAe,GAAG,eAAe,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;gBAClE,QAAQ,EAAE,CAAC;gBACX,OAAO;YACR,CAAC;YACD,IAAI,KAAK,CAAC,IAAI,KAAK,oBAAoB,EAAE,CAAC;gBACzC,kBAAkB,CAAC,GAAG,CAAC,CAAC;gBACxB,MAAM,QAAQ,GAAG,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;gBACxD,IAAI,QAAQ,EAAE,CAAC;oBACd,QAAQ,CAAC,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC;oBACzD,QAAQ,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;oBAC9B,QAAQ,CAAC,aAAa,GAAG,aAAa,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;gBACtD,CAAC;gBACD,gBAAgB,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;gBAC1C,GAAG,CAAC,eAAe,GAAG,SAAS,CAAC;gBAChC,aAAa,EAAE,CAAC;YACjB,CAAC;QACF,CAAC,CAAC,CAAC;QACH,MAAM,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAClC,MAAM,YAAY,GAAG,oBAAoB,CAAC,OAAO,CAAC,CAAC;QACnD,GAAG,CAAC,MAAM,GAAG,kBAAkB,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAClD,MAAM,KAAK,GAAG,cAAc,CAAC,YAAY,CAAC,CAAC;QAC3C,IAAI,MAAM,EAAE,OAAO,IAAI,YAAY,EAAE,UAAU,KAAK,SAAS,EAAE,CAAC;YAC/D,GAAG,CAAC,MAAM,GAAG,SAAS,CAAC;YACvB,GAAG,CAAC,KAAK,GAAG,SAAS,CAAC,KAAK,IAAI,uBAAuB,EAAE,gBAAgB,CAAC,CAAC;QAC3E,CAAC;aAAM,IAAI,YAAY,EAAE,UAAU,KAAK,OAAO,IAAI,KAAK,EAAE,CAAC;YAC1D,GAAG,CAAC,MAAM,GAAG,QAAQ,CAAC;YACtB,GAAG,CAAC,KAAK,GAAG,SAAS,CAAC,KAAK,IAAI,kBAAkB,EAAE,gBAAgB,CAAC,CAAC;QACtE,CAAC;aAAM,CAAC;YACP,GAAG,CAAC,MAAM,GAAG,WAAW,CAAC;QAC1B,CAAC;IACF,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,IAAI,MAAM,EAAE,OAAO,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YACjD,GAAG,CAAC,MAAM,GAAG,SAAS,CAAC;YACvB,GAAG,CAAC,KAAK,GAAG,GAAG,CAAC,KAAK,IAAI,uBAAuB,CAAC;QAClD,CAAC;aAAM,CAAC;YACP,GAAG,CAAC,MAAM,GAAG,QAAQ,CAAC;YACtB,GAAG,CAAC,KAAK,GAAG,SAAS,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,gBAAgB,CAAC,CAAC;QACjG,CAAC;QACD,IAAI,OAAO;YAAE,GAAG,CAAC,MAAM,GAAG,kBAAkB,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAChE,CAAC;YAAS,CAAC;QACV,IAAI,MAAM;YAAE,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;QAC/D,SAAS,CAAC,MAAM,EAAE,CAAC;QACnB,eAAe,EAAE,EAAE,CAAC;QACpB,WAAW,EAAE,EAAE,CAAC;QAChB,OAAO,EAAE,OAAO,EAAE,CAAC;QACnB,GAAG,CAAC,MAAM,GAAG,SAAS,CAAC,GAAG,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;QACtD,IAAI,GAAG,CAAC,KAAK;YAAE,GAAG,CAAC,KAAK,GAAG,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,gBAAgB,CAAC,CAAC;QAClE,kBAAkB,CAAC,GAAG,CAAC,CAAC;QACxB,GAAG,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACzB,UAAU,EAAE,EAAE,CAAC;IAChB,CAAC;IACD,OAAO,GAAG,CAAC;AACZ,CAAC","sourcesContent":["import type { AgentMessage } from \"@earendil-works/pi-agent-core\";\nimport type { AgentSessionEvent } from \"../../core/agent-session.ts\";\nimport type { ModelRuntime } from \"../../core/model-runtime.ts\";\nimport { DefaultResourceLoader } from \"../../core/resource-loader.ts\";\nimport { createAgentSession } from \"../../core/sdk.ts\";\nimport { SessionManager } from \"../../core/session-manager.ts\";\nimport { SettingsManager } from \"../../core/settings-manager.ts\";\nimport { activitySummary, addUsage, appendActivity, boundText, finalAssistantText, resultSummary } from \"./activity.ts\";\nimport { ERROR_TEXT_LIMIT, TASK_OUTPUT_LIMIT } from \"./constants.ts\";\nimport { beginSubagentRetry, clearSubagentRetry } from \"./retry.ts\";\nimport type { ResolvedSubagentTask, SubagentRunDetails, ToolActivity } from \"./types.ts\";\n\nexport interface SdkRunnerOptions {\n\ttask: ResolvedSubagentTask;\n\trun: SubagentRunDetails;\n\tmodelRuntime: ModelRuntime;\n\tagentDir: string;\n\tprojectTrusted: boolean;\n\tsignal?: AbortSignal;\n\tonProgress?: () => void;\n\tregisterAbort?: (abort: () => Promise<void>) => () => void;\n}\n\nfunction workerSystemPrompt(base: string | undefined, task: ResolvedSubagentTask): string {\n\treturn [\n\t\tbase,\n\t\t`You are Pi subagent \"${task.agent.name}\", working independently on one delegated task.`,\n\t\t\"You cannot see the parent conversation; rely entirely on the task briefing and repository context available in your working directory.\",\n\t\t\"Only your final message is returned to the caller; nothing you write in earlier turns is visible to anyone.\",\n\t\t\"Complete the task fully—do not gold-plate it, but do not leave it half-done.\",\n\t\t\"Stay inside the assigned working directory and delegated scope.\",\n\t\t\"Do not ask the end user questions. If blocked, report the exact blocker and what would resolve it.\",\n\t\t\"Do not spawn subagents or invoke tools outside the configured tool list.\",\n\t\t\"When referencing files in the final report, use paths relative to the task's working directory so the caller can locate them unambiguously.\",\n\t\t\"Include code snippets only when the exact text is load-bearing (a bug you found, a signature the caller asked for); do not recap code you merely read.\",\n\t\t\"End with a concise report covering findings or changes, verification performed, blockers, and unresolved risks. The caller will relay it to the user, so include only the essentials.\",\n\t\ttask.agent.systemPrompt,\n\t]\n\t\t.filter((part): part is string => Boolean(part?.trim()))\n\t\t.join(\"\\n\\n\");\n}\n\nfunction lastAssistantMessage(session: { messages: readonly AgentMessage[] }) {\n\tfor (let index = session.messages.length - 1; index >= 0; index--) {\n\t\tconst message = session.messages[index];\n\t\tif (message?.role === \"assistant\") return message;\n\t}\n\treturn undefined;\n}\n\nfunction assistantError(message: ReturnType<typeof lastAssistantMessage>): string | undefined {\n\tif (!message || message.role !== \"assistant\") return undefined;\n\treturn message.errorMessage;\n}\n\ninterface ThrottledEmitter {\n\temit: () => void;\n\t/** Drops any pending timer so nothing fires after the run has settled. */\n\tcancel: () => void;\n}\n\nfunction createThrottledEmitter(onProgress: (() => void) | undefined): ThrottledEmitter {\n\tlet timer: ReturnType<typeof setTimeout> | undefined;\n\treturn {\n\t\temit: () => {\n\t\t\tif (!onProgress || timer) return;\n\t\t\ttimer = setTimeout(() => {\n\t\t\t\ttimer = undefined;\n\t\t\t\tonProgress();\n\t\t\t}, 80);\n\t\t},\n\t\tcancel: () => {\n\t\t\tif (timer) clearTimeout(timer);\n\t\t\ttimer = undefined;\n\t\t},\n\t};\n}\n\ntype AutoRetryEvent = Extract<AgentSessionEvent, { type: \"auto_retry_start\" | \"auto_retry_end\" }>;\n\nexport function applySubagentAutoRetryEvent(run: SubagentRunDetails, event: AutoRetryEvent): void {\n\tif (event.type === \"auto_retry_start\") {\n\t\tbeginSubagentRetry(run, {\n\t\t\tattempt: event.attempt,\n\t\t\tmaxAttempts: event.maxAttempts,\n\t\t\tdelayMs: event.delayMs,\n\t\t\terror: event.errorMessage,\n\t\t});\n\t\treturn;\n\t}\n\tclearSubagentRetry(run);\n}\n\nexport async function runSdkTask(options: SdkRunnerOptions): Promise<SubagentRunDetails> {\n\tconst { task, run, modelRuntime, agentDir, projectTrusted, signal, onProgress } = options;\n\tconst throttled = createThrottledEmitter(onProgress);\n\tlet unsubscribe: (() => void) | undefined;\n\tlet unregisterAbort: (() => void) | undefined;\n\tlet session: Awaited<ReturnType<typeof createAgentSession>>[\"session\"] | undefined;\n\tconst activeActivities = new Map<string, ToolActivity>();\n\tconst seenAssistantMessages = new Set<unknown>();\n\tconst initializationAbortController = new AbortController();\n\tconst markAbort = async (): Promise<void> => {\n\t\tclearSubagentRetry(run);\n\t\trun.status = \"aborted\";\n\t\trun.error ??= \"Subagent was aborted.\";\n\t\tinitializationAbortController.abort();\n\t\tif (session) await session.abort();\n\t};\n\tconst isAborted = (): boolean => signal?.aborted === true || run.status === \"aborted\";\n\tconst abortListener = () => {\n\t\tvoid markAbort().catch(() => undefined);\n\t};\n\tunregisterAbort = options.registerAbort?.(markAbort);\n\tif (signal) signal.addEventListener(\"abort\", abortListener, { once: true });\n\n\ttry {\n\t\tif (isAborted()) {\n\t\t\tclearSubagentRetry(run);\n\t\t\trun.status = \"aborted\";\n\t\t\trun.error = \"Subagent was aborted before it started.\";\n\t\t\treturn run;\n\t\t}\n\n\t\tclearSubagentRetry(run);\n\t\trun.status = \"running\";\n\t\trun.startedAt = Date.now();\n\t\tonProgress?.();\n\t\tconst settingsManager = SettingsManager.create(task.cwd, agentDir, { projectTrusted });\n\t\tconst resourceLoader = new DefaultResourceLoader({\n\t\t\tcwd: task.cwd,\n\t\t\tagentDir,\n\t\t\tsettingsManager,\n\t\t\tnoExtensions: true,\n\t\t\tnoSkills: true,\n\t\t\tnoPromptTemplates: true,\n\t\t\tnoThemes: true,\n\t\t\t// Read-only explorers skip AGENTS.md/CLAUDE.md: they don't need\n\t\t\t// commit/PR/style rules, and the parent interprets their results.\n\t\t\tnoContextFiles: task.agent.omitContextFiles ?? false,\n\t\t\tsystemPromptOverride: (base) => workerSystemPrompt(base, task),\n\t\t});\n\t\tawait resourceLoader.reload();\n\t\tif (isAborted()) {\n\t\t\trun.error ??= \"Subagent was aborted during initialization.\";\n\t\t\treturn run;\n\t\t}\n\t\tconst createPromise = createAgentSession({\n\t\t\tcwd: task.cwd,\n\t\t\tagentDir,\n\t\t\tmodelRuntime,\n\t\t\tmodel: task.model,\n\t\t\tthinkingLevel: task.thinking,\n\t\t\ttools: task.agent.tools,\n\t\t\tresourceLoader,\n\t\t\tsessionManager: SessionManager.inMemory(task.cwd),\n\t\t\tsettingsManager,\n\t\t});\n\t\t// createAgentSession takes no signal and can hang on network work. Race\n\t\t// both parent-signal and registered shutdown cancellation against it;\n\t\t// only the winning branch owns disposal of the resulting session.\n\t\tconst initializationSignal = initializationAbortController.signal;\n\t\tlet creationAbortListener: (() => void) | undefined;\n\t\tconst abortedOutcome = new Promise<{ kind: \"aborted\" }>((resolve) => {\n\t\t\tconst resolveAborted = () => resolve({ kind: \"aborted\" });\n\t\t\tif (initializationSignal.aborted) {\n\t\t\t\tresolveAborted();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcreationAbortListener = resolveAborted;\n\t\t\tinitializationSignal.addEventListener(\"abort\", resolveAborted, { once: true });\n\t\t});\n\t\tconst outcome = await Promise.race([\n\t\t\tcreatePromise.then((created) => ({ kind: \"created\" as const, created })),\n\t\t\tabortedOutcome,\n\t\t]).finally(() => {\n\t\t\tif (creationAbortListener) initializationSignal.removeEventListener(\"abort\", creationAbortListener);\n\t\t});\n\t\tif (outcome.kind === \"aborted\") {\n\t\t\t// The creation promise cannot be cancelled. Dispose its session if it\n\t\t\t// eventually resolves, but keep background cleanup from surfacing an\n\t\t\t// unhandled rejection after this run has already settled.\n\t\t\tvoid createPromise.then(\n\t\t\t\t(createdLate) => {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tcreatedLate.session.dispose();\n\t\t\t\t\t} catch {\n\t\t\t\t\t\t// The aborted run has no remaining channel for cleanup errors.\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t() => {},\n\t\t\t);\n\t\t\trun.error ??= \"Subagent was aborted during initialization.\";\n\t\t\treturn run;\n\t\t}\n\t\tconst created = outcome.created;\n\t\tsession = created.session;\n\t\tif (isAborted()) {\n\t\t\trun.error ??= \"Subagent was aborted during initialization.\";\n\t\t\tawait session.abort();\n\t\t\treturn run;\n\t\t}\n\t\tconst emitImmediate = () => onProgress?.();\n\t\tconst emitText = throttled.emit;\n\t\tunsubscribe = session.subscribe((event: AgentSessionEvent) => {\n\t\t\tif (event.type === \"auto_retry_start\" || event.type === \"auto_retry_end\") {\n\t\t\t\tapplySubagentAutoRetryEvent(run, event);\n\t\t\t\temitImmediate();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (event.type === \"turn_end\") {\n\t\t\t\tclearSubagentRetry(run);\n\t\t\t\trun.usage.turns++;\n\t\t\t\trun.currentActivity = undefined;\n\t\t\t\temitImmediate();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (event.type === \"message_end\" && event.message.role === \"assistant\") {\n\t\t\t\t// Streaming updates carry no semantic weight (message_update is\n\t\t\t\t// ignored); the settled message is where usage is accounted.\n\t\t\t\tclearSubagentRetry(run);\n\t\t\t\tif (!seenAssistantMessages.has(event.message)) {\n\t\t\t\t\tseenAssistantMessages.add(event.message);\n\t\t\t\t\taddUsage(run.usage, event.message.usage);\n\t\t\t\t}\n\t\t\t\temitImmediate();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (event.type === \"tool_execution_start\") {\n\t\t\t\tclearSubagentRetry(run);\n\t\t\t\trun.usage.toolUses++;\n\t\t\t\tconst activity: ToolActivity = {\n\t\t\t\t\tid: event.toolCallId,\n\t\t\t\t\ttoolName: event.toolName,\n\t\t\t\t\tsummary: activitySummary(event.toolName, event.args),\n\t\t\t\t\tstatus: \"running\",\n\t\t\t\t\tstartedAt: Date.now(),\n\t\t\t\t};\n\t\t\t\tactiveActivities.set(event.toolCallId, activity);\n\t\t\t\tappendActivity(run.activities, activity);\n\t\t\t\trun.currentActivity = activity.summary;\n\t\t\t\temitImmediate();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (event.type === \"tool_execution_update\") {\n\t\t\t\tclearSubagentRetry(run);\n\t\t\t\trun.currentActivity = activitySummary(event.toolName, event.args);\n\t\t\t\temitText();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (event.type === \"tool_execution_end\") {\n\t\t\t\tclearSubagentRetry(run);\n\t\t\t\tconst activity = activeActivities.get(event.toolCallId);\n\t\t\t\tif (activity) {\n\t\t\t\t\tactivity.status = event.isError ? \"failed\" : \"succeeded\";\n\t\t\t\t\tactivity.endedAt = Date.now();\n\t\t\t\t\tactivity.resultSummary = resultSummary(event.result);\n\t\t\t\t}\n\t\t\t\tactiveActivities.delete(event.toolCallId);\n\t\t\t\trun.currentActivity = undefined;\n\t\t\t\temitImmediate();\n\t\t\t}\n\t\t});\n\t\tawait session.prompt(task.prompt);\n\t\tconst finalMessage = lastAssistantMessage(session);\n\t\trun.report = finalAssistantText(session.messages);\n\t\tconst error = assistantError(finalMessage);\n\t\tif (signal?.aborted || finalMessage?.stopReason === \"aborted\") {\n\t\t\trun.status = \"aborted\";\n\t\t\trun.error = boundText(error ?? \"Subagent was aborted.\", ERROR_TEXT_LIMIT);\n\t\t} else if (finalMessage?.stopReason === \"error\" || error) {\n\t\t\trun.status = \"failed\";\n\t\t\trun.error = boundText(error ?? \"Subagent failed.\", ERROR_TEXT_LIMIT);\n\t\t} else {\n\t\t\trun.status = \"completed\";\n\t\t}\n\t} catch (error) {\n\t\tif (signal?.aborted || run.status === \"aborted\") {\n\t\t\trun.status = \"aborted\";\n\t\t\trun.error = run.error ?? \"Subagent was aborted.\";\n\t\t} else {\n\t\t\trun.status = \"failed\";\n\t\t\trun.error = boundText(error instanceof Error ? error.message : String(error), ERROR_TEXT_LIMIT);\n\t\t}\n\t\tif (session) run.report = finalAssistantText(session.messages);\n\t} finally {\n\t\tif (signal) signal.removeEventListener(\"abort\", abortListener);\n\t\tthrottled.cancel();\n\t\tunregisterAbort?.();\n\t\tunsubscribe?.();\n\t\tsession?.dispose();\n\t\trun.report = boundText(run.report, TASK_OUTPUT_LIMIT);\n\t\tif (run.error) run.error = boundText(run.error, ERROR_TEXT_LIMIT);\n\t\tclearSubagentRetry(run);\n\t\trun.endedAt = Date.now();\n\t\tonProgress?.();\n\t}\n\treturn run;\n}\n"]}
1
+ {"version":3,"file":"sdk-runner.js","sourceRoot":"","sources":["../../../src/extensions/subagent/sdk-runner.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AgentMessage } from \"@earendil-works/pi-agent-core\";\nimport type { AgentSessionEvent } from \"../../core/agent-session.ts\";\nimport type { ModelRuntime } from \"../../core/model-runtime.ts\";\nimport { DefaultResourceLoader } from \"../../core/resource-loader.ts\";\nimport { createAgentSession } from \"../../core/sdk.ts\";\nimport { SessionManager } from \"../../core/session-manager.ts\";\nimport { SettingsManager } from \"../../core/settings-manager.ts\";\nimport { finalAssistantText } from \"./activity.ts\";\nimport type { RunCancellation } from \"./cancellation.ts\";\nimport type { SubagentRunEvent } from \"./state.ts\";\nimport type { ResolvedSubagentTask } from \"./types.ts\";\n\nexport interface SdkRunnerOptions {\n\ttask: ResolvedSubagentTask;\n\t/** Cancellation scope covering this attempt (queued through session end). */\n\tscope: RunCancellation;\n\t/** Reducer input; the adapter never touches run state directly. */\n\tdispatch: (event: SubagentRunEvent) => void;\n\tmodelRuntime: ModelRuntime;\n\tagentDir: string;\n\tprojectTrusted: boolean;\n\tonProgress?: () => void;\n}\n\nfunction workerSystemPrompt(base: string | undefined, task: ResolvedSubagentTask): string {\n\treturn [\n\t\tbase,\n\t\t`You are Pi subagent \"${task.agent.name}\", working independently on one delegated task.`,\n\t\t\"You cannot see the parent conversation; rely entirely on the task briefing and repository context available in your working directory.\",\n\t\t\"Only your final message is returned to the caller; nothing you write in earlier turns is visible to anyone.\",\n\t\t\"Complete the task fully—do not gold-plate it, but do not leave it half-done.\",\n\t\t\"Stay inside the assigned working directory and delegated scope.\",\n\t\t\"Do not ask the end user questions. If blocked, report the exact blocker and what would resolve it.\",\n\t\t\"Do not spawn subagents or invoke tools outside the configured tool list.\",\n\t\t\"When referencing files in the final report, use paths relative to the task's working directory so the caller can locate them unambiguously.\",\n\t\t\"Include code snippets only when the exact text is load-bearing (a bug you found, a signature the caller asked for); do not recap code you merely read.\",\n\t\t\"End with a concise report covering findings or changes, verification performed, blockers, and unresolved risks. The caller will relay it to the user, so include only the essentials.\",\n\t\ttask.agent.systemPrompt,\n\t]\n\t\t.filter((part): part is string => Boolean(part?.trim()))\n\t\t.join(\"\\n\\n\");\n}\n\nfunction lastAssistantMessage(session: { messages: readonly AgentMessage[] }) {\n\tfor (let index = session.messages.length - 1; index >= 0; index--) {\n\t\tconst message = session.messages[index];\n\t\tif (message?.role === \"assistant\") return message;\n\t}\n\treturn undefined;\n}\n\nfunction assistantError(message: ReturnType<typeof lastAssistantMessage>): string | undefined {\n\tif (!message || message.role !== \"assistant\") return undefined;\n\treturn message.errorMessage;\n}\n\ninterface ThrottledEmitter {\n\temit: () => void;\n\t/** Drops any pending timer so nothing fires after the run has settled. */\n\tcancel: () => void;\n}\n\nfunction createThrottledEmitter(onProgress: (() => void) | undefined): ThrottledEmitter {\n\tlet timer: ReturnType<typeof setTimeout> | undefined;\n\treturn {\n\t\temit: () => {\n\t\t\tif (!onProgress || timer) return;\n\t\t\ttimer = setTimeout(() => {\n\t\t\t\ttimer = undefined;\n\t\t\t\tonProgress();\n\t\t\t}, 80);\n\t\t},\n\t\tcancel: () => {\n\t\t\tif (timer) clearTimeout(timer);\n\t\t\ttimer = undefined;\n\t\t},\n\t};\n}\n\ntype InitializationOutcome =\n\t| { kind: \"created\"; session: Awaited<ReturnType<typeof createAgentSession>>[\"session\"] }\n\t| { kind: \"aborted\" }\n\t| { kind: \"error\"; error: unknown };\n\n// Neither resource loading nor session creation takes an abort signal, and\n// both can hang on network work; race both against the scope. The losing\n// chain keeps running, so its eventual result or rejection is always\n// consumed by a no-op handler.\nasync function raceInitialization(\n\tchain: Promise<InitializationOutcome>,\n\tscope: RunCancellation,\n): Promise<InitializationOutcome> {\n\treturn new Promise<InitializationOutcome>((resolve) => {\n\t\tlet settled = false;\n\t\tconst finish = (outcome: InitializationOutcome): void => {\n\t\t\tif (settled) return;\n\t\t\tsettled = true;\n\t\t\tscope.signal.removeEventListener(\"abort\", onAbort);\n\t\t\tresolve(outcome);\n\t\t};\n\t\tconst onAbort = (): void => {\n\t\t\tfinish({ kind: \"aborted\" });\n\t\t};\n\t\tif (scope.signal.aborted) {\n\t\t\tonAbort();\n\t\t\tvoid chain.then(\n\t\t\t\t() => undefined,\n\t\t\t\t() => undefined,\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\t\tscope.signal.addEventListener(\"abort\", onAbort, { once: true });\n\t\tvoid chain.then(\n\t\t\t(outcome) => finish(outcome),\n\t\t\t(error) => finish({ kind: \"error\", error }),\n\t\t);\n\t});\n}\n\n/**\n * Runs one worker attempt as a pure adapter: it owns the worker session's\n * lifecycle and translates AgentSessionEvents into SubagentRunEvents; every\n * state transition happens in the reducer on the other side of dispatch.\n */\nexport async function runSdkTask(options: SdkRunnerOptions): Promise<void> {\n\tconst { task, scope, dispatch, modelRuntime, agentDir, projectTrusted, onProgress } = options;\n\tconst throttled = createThrottledEmitter(onProgress);\n\tlet unsubscribe: (() => void) | undefined;\n\tlet unregisterAbort: (() => void) | undefined;\n\tlet session: Awaited<ReturnType<typeof createAgentSession>>[\"session\"] | undefined;\n\t// Streaming updates carry no semantic weight; the settled messages are\n\t// where usage is accounted, and worker sessions can replay them.\n\tconst seenAssistantMessages = new Set<unknown>();\n\tconst emitImmediate = (): void => onProgress?.();\n\tconst emitThrottled = throttled.emit;\n\n\tunregisterAbort = scope.onAbort(async () => {\n\t\tif (session) await session.abort();\n\t});\n\n\ttry {\n\t\tif (scope.aborted) {\n\t\t\tdispatch({\n\t\t\t\ttype: \"settle\",\n\t\t\t\tverdict: \"aborted\",\n\t\t\t\treport: \"\",\n\t\t\t\terror: \"Subagent was aborted before it started.\",\n\t\t\t\tendedAt: Date.now(),\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tconst settingsManager = SettingsManager.create(task.cwd, agentDir, { projectTrusted });\n\t\tconst resourceLoader = new DefaultResourceLoader({\n\t\t\tcwd: task.cwd,\n\t\t\tagentDir,\n\t\t\tsettingsManager,\n\t\t\tnoExtensions: true,\n\t\t\tnoSkills: true,\n\t\t\tnoPromptTemplates: true,\n\t\t\tnoThemes: true,\n\t\t\t// Read-only explorers skip AGENTS.md/CLAUDE.md: they don't need\n\t\t\t// commit/PR/style rules, and the parent interprets their results.\n\t\t\tnoContextFiles: task.agent.omitContextFiles ?? false,\n\t\t\tsystemPromptOverride: (base) => workerSystemPrompt(base, task),\n\t\t});\n\t\tconst initialization = (async (): Promise<InitializationOutcome> => {\n\t\t\tawait resourceLoader.reload();\n\t\t\tif (scope.signal.aborted) return { kind: \"aborted\" };\n\t\t\tconst created = await createAgentSession({\n\t\t\t\tcwd: task.cwd,\n\t\t\t\tagentDir,\n\t\t\t\tmodelRuntime,\n\t\t\t\tmodel: task.model,\n\t\t\t\tthinkingLevel: task.thinking,\n\t\t\t\ttools: task.agent.tools,\n\t\t\t\tresourceLoader,\n\t\t\t\tsessionManager: SessionManager.inMemory(task.cwd),\n\t\t\t\tsettingsManager,\n\t\t\t});\n\t\t\treturn { kind: \"created\", session: created.session };\n\t\t})();\n\t\tconst outcome = await raceInitialization(initialization, scope);\n\t\tif (outcome.kind === \"error\") throw outcome.error;\n\t\tif (outcome.kind === \"aborted\") {\n\t\t\t// The initialization chain cannot be cancelled. Dispose the\n\t\t\t// session if it eventually resolves, and swallow a late rejection\n\t\t\t// after this run has already settled.\n\t\t\tvoid initialization.then(\n\t\t\t\t(late) => {\n\t\t\t\t\tif (late.kind === \"created\") {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tlate.session.dispose();\n\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\t// The aborted run has no remaining channel for cleanup errors.\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t() => {},\n\t\t\t);\n\t\t\tdispatch({\n\t\t\t\ttype: \"settle\",\n\t\t\t\tverdict: \"aborted\",\n\t\t\t\treport: \"\",\n\t\t\t\terror: \"Subagent was aborted during initialization.\",\n\t\t\t\tendedAt: Date.now(),\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\t\tsession = outcome.session;\n\t\tif (scope.aborted) {\n\t\t\tawait session.abort();\n\t\t\tdispatch({\n\t\t\t\ttype: \"settle\",\n\t\t\t\tverdict: \"aborted\",\n\t\t\t\treport: \"\",\n\t\t\t\terror: \"Subagent was aborted during initialization.\",\n\t\t\t\tendedAt: Date.now(),\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tunsubscribe = session.subscribe((event: AgentSessionEvent) => {\n\t\t\tif (event.type === \"auto_retry_start\") {\n\t\t\t\tdispatch({\n\t\t\t\t\ttype: \"auto_retry_start\",\n\t\t\t\t\tattempt: event.attempt,\n\t\t\t\t\tmaxAttempts: event.maxAttempts,\n\t\t\t\t\tdeadline: Date.now() + event.delayMs,\n\t\t\t\t\terror: event.errorMessage,\n\t\t\t\t});\n\t\t\t\temitImmediate();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (event.type === \"auto_retry_end\") {\n\t\t\t\tdispatch({ type: \"auto_retry_end\" });\n\t\t\t\temitImmediate();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (event.type === \"turn_end\") {\n\t\t\t\tdispatch({ type: \"turn_end\" });\n\t\t\t\temitImmediate();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (event.type === \"message_end\" && event.message.role === \"assistant\") {\n\t\t\t\tif (!seenAssistantMessages.has(event.message)) {\n\t\t\t\t\tseenAssistantMessages.add(event.message);\n\t\t\t\t\tdispatch({ type: \"assistant_message_settled\", usage: event.message.usage });\n\t\t\t\t} else {\n\t\t\t\t\tdispatch({ type: \"assistant_message_settled\", usage: undefined });\n\t\t\t\t}\n\t\t\t\temitImmediate();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (event.type === \"tool_execution_start\") {\n\t\t\t\tdispatch({\n\t\t\t\t\ttype: \"tool_started\",\n\t\t\t\t\ttoolCallId: event.toolCallId,\n\t\t\t\t\ttoolName: event.toolName,\n\t\t\t\t\targs: event.args,\n\t\t\t\t\tstartedAt: Date.now(),\n\t\t\t\t});\n\t\t\t\temitImmediate();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (event.type === \"tool_execution_update\") {\n\t\t\t\tdispatch({\n\t\t\t\t\ttype: \"tool_updated\",\n\t\t\t\t\ttoolCallId: event.toolCallId,\n\t\t\t\t\ttoolName: event.toolName,\n\t\t\t\t\targs: event.args,\n\t\t\t\t});\n\t\t\t\temitThrottled();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (event.type === \"tool_execution_end\") {\n\t\t\t\tdispatch({\n\t\t\t\t\ttype: \"tool_ended\",\n\t\t\t\t\ttoolCallId: event.toolCallId,\n\t\t\t\t\tresult: event.result,\n\t\t\t\t\tisError: event.isError,\n\t\t\t\t\tendedAt: Date.now(),\n\t\t\t\t});\n\t\t\t\temitImmediate();\n\t\t\t}\n\t\t});\n\t\tawait session.prompt(task.prompt);\n\t\tconst finalMessage = lastAssistantMessage(session);\n\t\tconst report = finalAssistantText(session.messages);\n\t\tconst error = assistantError(finalMessage);\n\t\tif (scope.signal.aborted || finalMessage?.stopReason === \"aborted\") {\n\t\t\tdispatch({\n\t\t\t\ttype: \"settle\",\n\t\t\t\tverdict: \"aborted\",\n\t\t\t\treport,\n\t\t\t\terror: error ?? \"Subagent was aborted.\",\n\t\t\t\tendedAt: Date.now(),\n\t\t\t});\n\t\t} else if (finalMessage?.stopReason === \"error\" || error) {\n\t\t\tdispatch({\n\t\t\t\ttype: \"settle\",\n\t\t\t\tverdict: \"failed\",\n\t\t\t\treport,\n\t\t\t\terror: error ?? \"Subagent failed.\",\n\t\t\t\tendedAt: Date.now(),\n\t\t\t});\n\t\t} else {\n\t\t\tdispatch({ type: \"settle\", verdict: \"completed\", report, error: undefined, endedAt: Date.now() });\n\t\t}\n\t} catch (error) {\n\t\tconst report = session ? finalAssistantText(session.messages) : \"\";\n\t\tif (scope.signal.aborted) {\n\t\t\tdispatch({\n\t\t\t\ttype: \"settle\",\n\t\t\t\tverdict: \"aborted\",\n\t\t\t\treport,\n\t\t\t\terror: \"Subagent was aborted.\",\n\t\t\t\tendedAt: Date.now(),\n\t\t\t});\n\t\t} else {\n\t\t\tdispatch({\n\t\t\t\ttype: \"settle\",\n\t\t\t\tverdict: \"failed\",\n\t\t\t\treport,\n\t\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t\t\tendedAt: Date.now(),\n\t\t\t});\n\t\t}\n\t} finally {\n\t\tthrottled.cancel();\n\t\tunregisterAbort?.();\n\t\tunsubscribe?.();\n\t\tsession?.dispose();\n\t\temitImmediate();\n\t}\n}\n"]}
@@ -0,0 +1,89 @@
1
+ import type { Usage } from "@earendil-works/pi-ai";
2
+ import type { ResolvedSubagentTask, SubagentDetails, SubagentRunDetails, ToolActivity } from "./types.ts";
3
+ /**
4
+ * Mutable-run state plus an internal revision counter. All transitions go
5
+ * through {@link reduceRun}; the batch runner compares version sums instead
6
+ * of diffing rendered fields.
7
+ */
8
+ export interface SubagentRunState extends SubagentRunDetails {
9
+ /** Monotonic per-run revision; bumped by every applied event. */
10
+ version: number;
11
+ }
12
+ /** The adapter layer's only output and the reducer's only input. */
13
+ export type SubagentRunEvent = {
14
+ type: "slot_acquired";
15
+ startedAt: number;
16
+ } | {
17
+ type: "retry_scheduled";
18
+ attempt: number;
19
+ maxAttempts: number;
20
+ deadline: number;
21
+ error: string | undefined;
22
+ } | {
23
+ type: "retry_started";
24
+ } | {
25
+ type: "auto_retry_start";
26
+ attempt: number;
27
+ maxAttempts: number;
28
+ deadline: number;
29
+ error: string;
30
+ } | {
31
+ type: "auto_retry_end";
32
+ } | {
33
+ type: "turn_end";
34
+ } | {
35
+ type: "assistant_message_settled";
36
+ usage: Usage | undefined;
37
+ } | {
38
+ type: "tool_started";
39
+ toolCallId: string;
40
+ toolName: string;
41
+ args: unknown;
42
+ startedAt: number;
43
+ } | {
44
+ type: "tool_updated";
45
+ toolCallId: string;
46
+ toolName: string;
47
+ args: unknown;
48
+ } | {
49
+ type: "tool_ended";
50
+ toolCallId: string;
51
+ result: unknown;
52
+ isError: boolean;
53
+ endedAt: number;
54
+ } | {
55
+ type: "settle";
56
+ verdict: "completed" | "failed" | "aborted";
57
+ report: string;
58
+ error: string | undefined;
59
+ endedAt: number;
60
+ } | {
61
+ type: "abort_while_queued";
62
+ endedAt: number;
63
+ } | {
64
+ type: "abort_while_retrying";
65
+ endedAt: number;
66
+ };
67
+ export declare function createRunState(task: ResolvedSubagentTask, index: number, batchId: string | undefined, parentCwd: string): SubagentRunState;
68
+ /** Strips internal fields for projection into the public details shape. */
69
+ export declare function toRunDetails(state: SubagentRunState): SubagentRunDetails;
70
+ export declare function deriveCurrentActivity(state: SubagentRunState): string | undefined;
71
+ export declare function appendActivity(activities: ToolActivity[], activity: ToolActivity): void;
72
+ /**
73
+ * Pure transition function; timestamps and deadlines arrive in the event.
74
+ * Events applied after a terminal verdict are ignored (settle is idempotent)
75
+ * — except retry_scheduled, the one sanctioned reopening transition.
76
+ */
77
+ export declare function reduceRun(state: SubagentRunState, event: SubagentRunEvent): SubagentRunState;
78
+ export declare function versionSum(runs: readonly SubagentRunState[]): number;
79
+ export declare function statusOf(runs: readonly SubagentRunDetails[]): SubagentDetails["status"];
80
+ export declare function isSubagentError(details: Pick<SubagentDetails, "status" | "runs">): boolean;
81
+ export declare function statusSummary(details: SubagentDetails): string;
82
+ export interface SubagentRetryView {
83
+ attempt: number;
84
+ maxAttempts: number;
85
+ remainingSeconds: number;
86
+ error: string;
87
+ }
88
+ export declare function getSubagentRetryView(run: SubagentRunDetails, now?: number): SubagentRetryView | undefined;
89
+ //# sourceMappingURL=state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../../src/extensions/subagent/state.ts"],"names":[],"mappings":"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"}