@astralyn/pi 0.84.10 → 0.84.12

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 (186) hide show
  1. package/CHANGELOG.md +27 -0
  2. package/dist/cli/startup-ui.d.ts.map +1 -1
  3. package/dist/cli/startup-ui.js +2 -1
  4. package/dist/cli/startup-ui.js.map +1 -1
  5. package/dist/core/agent-session.d.ts +62 -8
  6. package/dist/core/agent-session.d.ts.map +1 -1
  7. package/dist/core/agent-session.js +395 -78
  8. package/dist/core/agent-session.js.map +1 -1
  9. package/dist/core/compaction/branch-summarization.d.ts.map +1 -1
  10. package/dist/core/compaction/branch-summarization.js +4 -3
  11. package/dist/core/compaction/branch-summarization.js.map +1 -1
  12. package/dist/core/compaction/compaction.d.ts +5 -0
  13. package/dist/core/compaction/compaction.d.ts.map +1 -1
  14. package/dist/core/compaction/compaction.js +19 -5
  15. package/dist/core/compaction/compaction.js.map +1 -1
  16. package/dist/core/extensions/index.d.ts +1 -1
  17. package/dist/core/extensions/index.d.ts.map +1 -1
  18. package/dist/core/extensions/index.js.map +1 -1
  19. package/dist/core/extensions/runner.d.ts +5 -0
  20. package/dist/core/extensions/runner.d.ts.map +1 -1
  21. package/dist/core/extensions/runner.js +44 -1
  22. package/dist/core/extensions/runner.js.map +1 -1
  23. package/dist/core/extensions/types.d.ts +18 -10
  24. package/dist/core/extensions/types.d.ts.map +1 -1
  25. package/dist/core/extensions/types.js.map +1 -1
  26. package/dist/core/session-manager.d.ts.map +1 -1
  27. package/dist/core/session-manager.js +4 -2
  28. package/dist/core/session-manager.js.map +1 -1
  29. package/dist/core/settings-manager.d.ts +8 -1
  30. package/dist/core/settings-manager.d.ts.map +1 -1
  31. package/dist/core/settings-manager.js +17 -0
  32. package/dist/core/settings-manager.js.map +1 -1
  33. package/dist/core/tools/bash.d.ts +5 -0
  34. package/dist/core/tools/bash.d.ts.map +1 -1
  35. package/dist/core/tools/bash.js +5 -1
  36. package/dist/core/tools/bash.js.map +1 -1
  37. package/dist/extensions/background/actions.d.ts +21 -0
  38. package/dist/extensions/background/actions.d.ts.map +1 -0
  39. package/dist/extensions/background/actions.js +264 -0
  40. package/dist/extensions/background/actions.js.map +1 -0
  41. package/dist/extensions/background/constants.d.ts +24 -0
  42. package/dist/extensions/background/constants.d.ts.map +1 -0
  43. package/dist/extensions/background/constants.js +24 -0
  44. package/dist/extensions/background/constants.js.map +1 -0
  45. package/dist/extensions/background/index.d.ts +6 -115
  46. package/dist/extensions/background/index.d.ts.map +1 -1
  47. package/dist/extensions/background/index.js +38 -509
  48. package/dist/extensions/background/index.js.map +1 -1
  49. package/dist/extensions/background/manager.d.ts +2 -1
  50. package/dist/extensions/background/manager.d.ts.map +1 -1
  51. package/dist/extensions/background/manager.js +8 -10
  52. package/dist/extensions/background/manager.js.map +1 -1
  53. package/dist/extensions/background/notify.d.ts +16 -0
  54. package/dist/extensions/background/notify.d.ts.map +1 -0
  55. package/dist/extensions/background/notify.js +114 -0
  56. package/dist/extensions/background/notify.js.map +1 -0
  57. package/dist/extensions/background/output-file.d.ts +58 -0
  58. package/dist/extensions/background/output-file.d.ts.map +1 -0
  59. package/dist/extensions/background/output-file.js +122 -0
  60. package/dist/extensions/background/output-file.js.map +1 -0
  61. package/dist/extensions/background/registry.d.ts +40 -72
  62. package/dist/extensions/background/registry.d.ts.map +1 -1
  63. package/dist/extensions/background/registry.js +71 -184
  64. package/dist/extensions/background/registry.js.map +1 -1
  65. package/dist/extensions/background/render.d.ts +3 -10
  66. package/dist/extensions/background/render.d.ts.map +1 -1
  67. package/dist/extensions/background/render.js +20 -60
  68. package/dist/extensions/background/render.js.map +1 -1
  69. package/dist/extensions/background/schema.d.ts +34 -0
  70. package/dist/extensions/background/schema.d.ts.map +1 -0
  71. package/dist/extensions/background/schema.js +89 -0
  72. package/dist/extensions/background/schema.js.map +1 -0
  73. package/dist/extensions/background/task-view.d.ts +48 -0
  74. package/dist/extensions/background/task-view.d.ts.map +1 -0
  75. package/dist/extensions/background/task-view.js +90 -0
  76. package/dist/extensions/background/task-view.js.map +1 -0
  77. package/dist/extensions/background/text.d.ts +15 -0
  78. package/dist/extensions/background/text.d.ts.map +1 -0
  79. package/dist/extensions/background/text.js +31 -0
  80. package/dist/extensions/background/text.js.map +1 -0
  81. package/dist/extensions/background/types.d.ts +74 -0
  82. package/dist/extensions/background/types.d.ts.map +1 -0
  83. package/dist/extensions/background/types.js +17 -0
  84. package/dist/extensions/background/types.js.map +1 -0
  85. package/dist/extensions/llama/client.d.ts +6 -0
  86. package/dist/extensions/llama/client.d.ts.map +1 -1
  87. package/dist/extensions/llama/client.js +7 -0
  88. package/dist/extensions/llama/client.js.map +1 -1
  89. package/dist/extensions/llama/provider.d.ts +3 -1
  90. package/dist/extensions/llama/provider.d.ts.map +1 -1
  91. package/dist/extensions/llama/provider.js +27 -6
  92. package/dist/extensions/llama/provider.js.map +1 -1
  93. package/dist/extensions/subagent/activity.d.ts +5 -0
  94. package/dist/extensions/subagent/activity.d.ts.map +1 -1
  95. package/dist/extensions/subagent/activity.js +5 -0
  96. package/dist/extensions/subagent/activity.js.map +1 -1
  97. package/dist/extensions/subagent/agents-command.d.ts.map +1 -1
  98. package/dist/extensions/subagent/agents-command.js +6 -391
  99. package/dist/extensions/subagent/agents-command.js.map +1 -1
  100. package/dist/extensions/subagent/constants.d.ts +1 -1
  101. package/dist/extensions/subagent/constants.d.ts.map +1 -1
  102. package/dist/extensions/subagent/constants.js +2 -1
  103. package/dist/extensions/subagent/constants.js.map +1 -1
  104. package/dist/extensions/subagent/index.js +2 -2
  105. package/dist/extensions/subagent/index.js.map +1 -1
  106. package/dist/extensions/subagent/render.d.ts +5 -5
  107. package/dist/extensions/subagent/render.d.ts.map +1 -1
  108. package/dist/extensions/subagent/render.js +106 -36
  109. package/dist/extensions/subagent/render.js.map +1 -1
  110. package/dist/extensions/subagent/resolve.d.ts.map +1 -1
  111. package/dist/extensions/subagent/resolve.js +2 -4
  112. package/dist/extensions/subagent/resolve.js.map +1 -1
  113. package/dist/extensions/subagent/runner.d.ts +1 -1
  114. package/dist/extensions/subagent/runner.d.ts.map +1 -1
  115. package/dist/extensions/subagent/runner.js +8 -8
  116. package/dist/extensions/subagent/runner.js.map +1 -1
  117. package/dist/extensions/subagent/sdk-runner.d.ts +11 -0
  118. package/dist/extensions/subagent/sdk-runner.d.ts.map +1 -1
  119. package/dist/extensions/subagent/sdk-runner.js +90 -79
  120. package/dist/extensions/subagent/sdk-runner.js.map +1 -1
  121. package/dist/extensions/subagent/state.d.ts.map +1 -1
  122. package/dist/extensions/subagent/state.js +145 -126
  123. package/dist/extensions/subagent/state.js.map +1 -1
  124. package/dist/extensions/subagent/text.d.ts.map +1 -1
  125. package/dist/extensions/subagent/text.js +4 -0
  126. package/dist/extensions/subagent/text.js.map +1 -1
  127. package/dist/extensions/subagent/ui/agents-dialog.d.ts +4 -0
  128. package/dist/extensions/subagent/ui/agents-dialog.d.ts.map +1 -0
  129. package/dist/extensions/subagent/ui/agents-dialog.js +84 -0
  130. package/dist/extensions/subagent/ui/agents-dialog.js.map +1 -0
  131. package/dist/extensions/subagent/ui/choice-menu.d.ts +39 -0
  132. package/dist/extensions/subagent/ui/choice-menu.d.ts.map +1 -0
  133. package/dist/extensions/subagent/ui/choice-menu.js +93 -0
  134. package/dist/extensions/subagent/ui/choice-menu.js.map +1 -0
  135. package/dist/extensions/subagent/ui/model-picker.d.ts +47 -0
  136. package/dist/extensions/subagent/ui/model-picker.d.ts.map +1 -0
  137. package/dist/extensions/subagent/ui/model-picker.js +142 -0
  138. package/dist/extensions/subagent/ui/model-picker.js.map +1 -0
  139. package/dist/extensions/subagent/ui/profile-settings-menu.d.ts +41 -0
  140. package/dist/extensions/subagent/ui/profile-settings-menu.d.ts.map +1 -0
  141. package/dist/extensions/subagent/ui/profile-settings-menu.js +98 -0
  142. package/dist/extensions/subagent/ui/profile-settings-menu.js.map +1 -0
  143. package/dist/index.d.ts +2 -1
  144. package/dist/index.d.ts.map +1 -1
  145. package/dist/index.js +1 -0
  146. package/dist/index.js.map +1 -1
  147. package/dist/main.d.ts.map +1 -1
  148. package/dist/main.js +2 -0
  149. package/dist/main.js.map +1 -1
  150. package/dist/modes/interactive/components/settings-selector.d.ts +2 -0
  151. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  152. package/dist/modes/interactive/components/settings-selector.js +10 -0
  153. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  154. package/dist/modes/interactive/interactive-mode.d.ts +4 -0
  155. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  156. package/dist/modes/interactive/interactive-mode.js +71 -58
  157. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  158. package/dist/modes/rpc/rpc-client.d.ts +7 -0
  159. package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
  160. package/dist/modes/rpc/rpc-client.js +7 -0
  161. package/dist/modes/rpc/rpc-client.js.map +1 -1
  162. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  163. package/dist/modes/rpc/rpc-mode.js +3 -0
  164. package/dist/modes/rpc/rpc-mode.js.map +1 -1
  165. package/dist/modes/rpc/rpc-types.d.ts +12 -0
  166. package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
  167. package/dist/modes/rpc/rpc-types.js.map +1 -1
  168. package/dist/utils/shell.d.ts.map +1 -1
  169. package/dist/utils/shell.js +6 -4
  170. package/dist/utils/shell.js.map +1 -1
  171. package/docs/bundled/extensions/subagent.md +1 -1
  172. package/docs/compaction.md +5 -12
  173. package/docs/environment-variables.md +3 -0
  174. package/docs/extensions.md +21 -5
  175. package/docs/keybindings.md +1 -1
  176. package/docs/quickstart.md +1 -1
  177. package/docs/rpc.md +23 -0
  178. package/docs/settings.md +7 -0
  179. package/docs/terminal-setup.md +12 -0
  180. package/docs/usage.md +4 -3
  181. package/npm-shrinkwrap.json +29 -29
  182. package/package.json +6 -6
  183. package/dist/core/compaction-controller.d.ts +0 -90
  184. package/dist/core/compaction-controller.d.ts.map +0 -1
  185. package/dist/core/compaction-controller.js +0 -471
  186. package/dist/core/compaction-controller.js.map +0 -1
@@ -115,147 +115,166 @@ function clearRetry(draft) {
115
115
  export function reduceRun(state, event) {
116
116
  if (isTerminal(state) && event.type !== "retry_scheduled")
117
117
  return state;
118
+ return withRevision(state, (draft) => {
119
+ // Cross-cutting pre-hook: every event clears the retry view except
120
+ // retry_scheduled (which sets it) and the two abort-terminal events
121
+ // (which clear it explicitly in their own body).
122
+ if (event.type !== "retry_scheduled")
123
+ clearRetry(draft);
124
+ applyEvent(draft, event);
125
+ // Cross-cutting post-hook: derive the live activity line from the
126
+ // new state. Terminal abort events override this to undefined.
127
+ draft.currentActivity = deriveCurrentActivity(draft);
128
+ });
129
+ }
130
+ // ─── Individual event handlers ───────────────────────────────────────────────
131
+ // Each handler mutates the draft in place. Cross-cutting clearRetry and
132
+ // deriveCurrentActivity are handled by the dispatch layer above.
133
+ function handleSlotAcquired(draft, event) {
134
+ draft.status = "running";
135
+ draft.startedAt = event.startedAt;
136
+ }
137
+ function handleRetryScheduled(draft, event) {
138
+ // Full reset: only runs that produced nothing are retried, so nothing of
139
+ // value is discarded. The retry view stays visible through the backoff.
140
+ const error = draft.error ?? "Subagent failed before retry.";
141
+ draft.status = "queued";
142
+ draft.error = undefined;
143
+ draft.startedAt = undefined;
144
+ draft.endedAt = undefined;
145
+ draft.report = "";
146
+ draft.activities = [];
147
+ draft.usage = emptyUsage();
148
+ draft.retry = makeRetry(event.attempt, event.maxAttempts, event.deadline, error);
149
+ }
150
+ function handleRetryStarted(draft) {
151
+ // No-op beyond the cross-cutting clearRetry already applied.
152
+ void draft;
153
+ }
154
+ function handleAutoRetryStart(draft, event) {
155
+ draft.retry = makeRetry(event.attempt, event.maxAttempts, event.deadline, event.error);
156
+ }
157
+ function handleAutoRetryEnd(draft) {
158
+ // No-op beyond the cross-cutting clearRetry already applied.
159
+ void draft;
160
+ }
161
+ function handleTurnEnd(draft) {
162
+ draft.usage.turns++;
163
+ }
164
+ function handleAssistantMessageSettled(draft, event) {
165
+ addUsage(draft.usage, event.usage);
166
+ }
167
+ function handleToolStarted(draft, event) {
168
+ draft.usage.toolUses++;
169
+ appendActivity(draft.activities, {
170
+ id: event.toolCallId,
171
+ toolName: event.toolName,
172
+ summary: activitySummary(event.toolName, event.args),
173
+ status: "running",
174
+ startedAt: event.startedAt,
175
+ });
176
+ }
177
+ function handleToolUpdated(draft, event) {
178
+ const summary = activitySummary(event.toolName, event.args);
179
+ const activity = draft.activities.find((candidate) => candidate.id === event.toolCallId && candidate.status === "running") ??
180
+ [...draft.activities].reverse().find((candidate) => candidate.status === "running");
181
+ if (activity)
182
+ activity.summary = summary;
183
+ }
184
+ function handleToolEnded(draft, event) {
185
+ const activity = draft.activities.find((candidate) => candidate.id === event.toolCallId);
186
+ if (activity && activity.status === "running") {
187
+ activity.status = event.isError ? "failed" : "succeeded";
188
+ activity.endedAt = event.endedAt;
189
+ activity.resultSummary = resultSummary(event.result) || undefined;
190
+ }
191
+ }
192
+ function handleCompactionStarted(draft, event) {
193
+ appendActivity(draft.activities, {
194
+ id: COMPACTION_ACTIVITY_ID,
195
+ toolName: COMPACTION_ACTIVITY_ID,
196
+ summary: "Compacting context…",
197
+ status: "running",
198
+ startedAt: event.startedAt,
199
+ });
200
+ }
201
+ function handleCompactionEnded(draft, event) {
202
+ const activity = [...draft.activities]
203
+ .reverse()
204
+ .find((candidate) => candidate.id === COMPACTION_ACTIVITY_ID && candidate.status === "running");
205
+ if (activity) {
206
+ activity.status = event.error ? "failed" : "succeeded";
207
+ activity.endedAt = event.endedAt;
208
+ activity.summary = compactionSummary(event.tokensBefore, event.tokensAfter);
209
+ activity.resultSummary = event.error ? compactionError(event.error) : undefined;
210
+ }
211
+ }
212
+ function handleSettle(draft, event) {
213
+ draft.status = event.verdict;
214
+ draft.report = boundText(event.report, TASK_OUTPUT_LIMIT);
215
+ draft.error = event.error ? boundText(event.error, ERROR_TEXT_LIMIT) : undefined;
216
+ draft.endedAt = event.endedAt;
217
+ draft.retry = undefined;
218
+ }
219
+ function handleAbortWhileQueued(draft, event) {
220
+ draft.status = "aborted";
221
+ draft.error = "Subagent was aborted while queued.";
222
+ draft.endedAt = event.endedAt;
223
+ draft.retry = undefined;
224
+ }
225
+ function handleAbortWhileRetrying(draft, event) {
226
+ draft.status = "aborted";
227
+ draft.error = "Subagent was aborted while waiting to retry.";
228
+ draft.endedAt = event.endedAt;
229
+ draft.retry = undefined;
230
+ }
231
+ function applyEvent(draft, event) {
118
232
  switch (event.type) {
119
233
  case "slot_acquired":
120
- return withRevision(state, (draft) => {
121
- clearRetry(draft);
122
- draft.status = "running";
123
- draft.startedAt = event.startedAt;
124
- draft.currentActivity = deriveCurrentActivity(draft);
125
- });
234
+ handleSlotAcquired(draft, event);
235
+ break;
126
236
  case "retry_scheduled":
127
- // The full reset matrix from the historical resetRunForRetry: only
128
- // runs that produced nothing are retried, so nothing of value is
129
- // discarded. The retry view stays visible through the backoff.
130
- return withRevision(state, (draft) => {
131
- const error = draft.error ?? "Subagent failed before retry.";
132
- draft.status = "queued";
133
- draft.error = undefined;
134
- draft.startedAt = undefined;
135
- draft.endedAt = undefined;
136
- draft.report = "";
137
- draft.activities = [];
138
- draft.usage = emptyUsage();
139
- draft.retry = makeRetry(event.attempt, event.maxAttempts, event.deadline, error);
140
- draft.currentActivity = deriveCurrentActivity(draft);
141
- });
237
+ handleRetryScheduled(draft, event);
238
+ break;
142
239
  case "retry_started":
143
- return withRevision(state, (draft) => {
144
- clearRetry(draft);
145
- draft.currentActivity = deriveCurrentActivity(draft);
146
- });
240
+ handleRetryStarted(draft);
241
+ break;
147
242
  case "auto_retry_start":
148
- return withRevision(state, (draft) => {
149
- draft.retry = makeRetry(event.attempt, event.maxAttempts, event.deadline, event.error);
150
- draft.currentActivity = deriveCurrentActivity(draft);
151
- });
243
+ handleAutoRetryStart(draft, event);
244
+ break;
152
245
  case "auto_retry_end":
153
- return withRevision(state, (draft) => {
154
- clearRetry(draft);
155
- draft.currentActivity = deriveCurrentActivity(draft);
156
- });
246
+ handleAutoRetryEnd(draft);
247
+ break;
157
248
  case "turn_end":
158
- return withRevision(state, (draft) => {
159
- clearRetry(draft);
160
- draft.usage.turns++;
161
- draft.currentActivity = deriveCurrentActivity(draft);
162
- });
249
+ handleTurnEnd(draft);
250
+ break;
163
251
  case "assistant_message_settled":
164
- return withRevision(state, (draft) => {
165
- clearRetry(draft);
166
- addUsage(draft.usage, event.usage);
167
- draft.currentActivity = deriveCurrentActivity(draft);
168
- });
252
+ handleAssistantMessageSettled(draft, event);
253
+ break;
169
254
  case "tool_started":
170
- return withRevision(state, (draft) => {
171
- clearRetry(draft);
172
- draft.usage.toolUses++;
173
- appendActivity(draft.activities, {
174
- id: event.toolCallId,
175
- toolName: event.toolName,
176
- summary: activitySummary(event.toolName, event.args),
177
- status: "running",
178
- startedAt: event.startedAt,
179
- });
180
- draft.currentActivity = deriveCurrentActivity(draft);
181
- });
182
- case "tool_updated": {
183
- const summary = activitySummary(event.toolName, event.args);
184
- return withRevision(state, (draft) => {
185
- clearRetry(draft);
186
- const activity = draft.activities.find((candidate) => candidate.id === event.toolCallId && candidate.status === "running") ?? [...draft.activities].reverse().find((candidate) => candidate.status === "running");
187
- if (activity)
188
- activity.summary = summary;
189
- draft.currentActivity = deriveCurrentActivity(draft);
190
- });
191
- }
255
+ handleToolStarted(draft, event);
256
+ break;
257
+ case "tool_updated":
258
+ handleToolUpdated(draft, event);
259
+ break;
192
260
  case "tool_ended":
193
- return withRevision(state, (draft) => {
194
- clearRetry(draft);
195
- const activity = draft.activities.find((candidate) => candidate.id === event.toolCallId);
196
- if (activity && activity.status === "running") {
197
- activity.status = event.isError ? "failed" : "succeeded";
198
- activity.endedAt = event.endedAt;
199
- activity.resultSummary = resultSummary(event.result) || undefined;
200
- }
201
- draft.currentActivity = deriveCurrentActivity(draft);
202
- });
261
+ handleToolEnded(draft, event);
262
+ break;
203
263
  case "compaction_started":
204
- // Auto-compaction is a synthetic activity: it has a start, an end and a
205
- // failure mode just like a tool call, so it reuses the activity log and its
206
- // budgets. It is not a tool call, so it never counts toward toolUses.
207
- return withRevision(state, (draft) => {
208
- clearRetry(draft);
209
- appendActivity(draft.activities, {
210
- id: COMPACTION_ACTIVITY_ID,
211
- toolName: COMPACTION_ACTIVITY_ID,
212
- summary: "Compacting context…",
213
- status: "running",
214
- startedAt: event.startedAt,
215
- });
216
- draft.currentActivity = deriveCurrentActivity(draft);
217
- });
264
+ handleCompactionStarted(draft, event);
265
+ break;
218
266
  case "compaction_ended":
219
- return withRevision(state, (draft) => {
220
- clearRetry(draft);
221
- // Only one compaction runs at a time, so the newest running entry with
222
- // this id is always the one that just ended.
223
- const activity = [...draft.activities]
224
- .reverse()
225
- .find((candidate) => candidate.id === COMPACTION_ACTIVITY_ID && candidate.status === "running");
226
- if (activity) {
227
- activity.status = event.error ? "failed" : "succeeded";
228
- activity.endedAt = event.endedAt;
229
- activity.summary = compactionSummary(event.tokensBefore, event.tokensAfter);
230
- activity.resultSummary = event.error ? compactionError(event.error) : undefined;
231
- }
232
- draft.currentActivity = deriveCurrentActivity(draft);
233
- });
267
+ handleCompactionEnded(draft, event);
268
+ break;
234
269
  case "settle":
235
- return withRevision(state, (draft) => {
236
- draft.status = event.verdict;
237
- draft.report = boundText(event.report, TASK_OUTPUT_LIMIT);
238
- draft.error = event.error ? boundText(event.error, ERROR_TEXT_LIMIT) : undefined;
239
- draft.endedAt = event.endedAt;
240
- draft.retry = undefined;
241
- draft.currentActivity = deriveCurrentActivity({ ...draft, status: event.verdict });
242
- });
270
+ handleSettle(draft, event);
271
+ break;
243
272
  case "abort_while_queued":
244
- return withRevision(state, (draft) => {
245
- draft.status = "aborted";
246
- draft.error = "Subagent was aborted while queued.";
247
- draft.endedAt = event.endedAt;
248
- draft.retry = undefined;
249
- draft.currentActivity = undefined;
250
- });
273
+ handleAbortWhileQueued(draft, event);
274
+ break;
251
275
  case "abort_while_retrying":
252
- return withRevision(state, (draft) => {
253
- draft.status = "aborted";
254
- draft.error = "Subagent was aborted while waiting to retry.";
255
- draft.endedAt = event.endedAt;
256
- draft.retry = undefined;
257
- draft.currentActivity = undefined;
258
- });
276
+ handleAbortWhileRetrying(draft, event);
277
+ break;
259
278
  }
260
279
  }
261
280
  export function versionSum(runs) {
@@ -1 +1 @@
1
- {"version":3,"file":"state.js","sourceRoot":"","sources":["../../../src/extensions/subagent/state.ts"],"names":[],"mappings":"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","sourcesContent":["import { relative } from \"node:path\";\nimport type { Usage } from \"@earendil-works/pi-ai\";\nimport {\n\tactivitySummary,\n\taddUsage,\n\tcompactionError,\n\tcompactionSummary,\n\temptyUsage,\n\tresultSummary,\n} from \"./activity.ts\";\nimport {\n\tACTIVITY_LIMIT,\n\tACTIVITY_TEXT_LIMIT,\n\tCOMPACTION_ACTIVITY_ID,\n\tERROR_TEXT_LIMIT,\n\tRETRY_ERROR_TEXT_LIMIT,\n\tTASK_OUTPUT_LIMIT,\n} from \"./constants.ts\";\nimport { modelId } from \"./model-selection.ts\";\nimport { boundText } from \"./text.ts\";\nimport type { ResolvedSubagentTask, SubagentDetails, SubagentRunDetails, ToolActivity } from \"./types.ts\";\n\n/**\n * Mutable-run state plus an internal revision counter. All transitions go\n * through {@link reduceRun}; the batch runner compares version sums instead\n * of diffing rendered fields.\n */\nexport interface SubagentRunState extends SubagentRunDetails {\n\t/** Monotonic per-run revision; bumped by every applied event. */\n\tversion: number;\n}\n\n/** The adapter layer's only output and the reducer's only input. */\nexport type SubagentRunEvent =\n\t| { type: \"slot_acquired\"; startedAt: number }\n\t| {\n\t\t\ttype: \"retry_scheduled\";\n\t\t\tattempt: number;\n\t\t\tmaxAttempts: number;\n\t\t\tdeadline: number;\n\t\t\terror: string | undefined;\n\t }\n\t| { type: \"retry_started\" }\n\t| { type: \"auto_retry_start\"; attempt: number; maxAttempts: number; deadline: number; error: string }\n\t| { type: \"auto_retry_end\" }\n\t| { type: \"turn_end\" }\n\t| { type: \"assistant_message_settled\"; usage: Usage | undefined }\n\t| { type: \"tool_started\"; toolCallId: string; toolName: string; args: unknown; startedAt: number }\n\t| { type: \"tool_updated\"; toolCallId: string; toolName: string; args: unknown }\n\t| { type: \"tool_ended\"; toolCallId: string; result: unknown; isError: boolean; endedAt: number }\n\t| { type: \"compaction_started\"; startedAt: number }\n\t| {\n\t\t\ttype: \"compaction_ended\";\n\t\t\ttokensBefore: number | undefined;\n\t\t\ttokensAfter: number | undefined;\n\t\t\terror: string | undefined;\n\t\t\tendedAt: number;\n\t }\n\t| {\n\t\t\ttype: \"settle\";\n\t\t\tverdict: \"completed\" | \"failed\" | \"aborted\";\n\t\t\treport: string;\n\t\t\terror: string | undefined;\n\t\t\tendedAt: number;\n\t }\n\t| { type: \"abort_while_queued\"; endedAt: number }\n\t| { type: \"abort_while_retrying\"; endedAt: number };\n\nfunction runId(batchId: string | undefined, index: number): string {\n\tif (!batchId) return `subagent-${index + 1}`;\n\t// toolCallIds are provider-shaped (\"call_ABC...\"); keep the readable\n\t// prefix, then disambiguate truncated collisions with a deterministic\n\t// hash of the full id.\n\tconst sanitized = batchId.replace(/[^A-Za-z0-9-]+/gu, \"-\").replace(/^-+|-+$/gu, \"\");\n\tconst hash = hashRunId(batchId);\n\tconst prefix = sanitized.length > 24 ? `${sanitized.slice(0, 24)}-${hash}` : sanitized || `run-${hash}`;\n\treturn `${prefix}-${index + 1}`;\n}\n\nfunction hashRunId(value: string): string {\n\tlet hash = 0x811c9dc5;\n\tfor (let index = 0; index < value.length; index++) {\n\t\thash ^= value.charCodeAt(index);\n\t\thash = Math.imul(hash, 0x01000193);\n\t}\n\treturn (hash >>> 0).toString(36).padStart(6, \"0\").slice(0, 6);\n}\n\nexport function createRunState(\n\ttask: ResolvedSubagentTask,\n\tindex: number,\n\tbatchId: string | undefined,\n\tparentCwd: string,\n): SubagentRunState {\n\treturn {\n\t\tid: runId(batchId, index),\n\t\tagent: task.agent.name,\n\t\tdescription: task.description,\n\t\t// Display-only relative path; the worker session itself uses the\n\t\t// resolved absolute task.cwd. Empty means \"same as the parent\".\n\t\tcwd: relative(parentCwd, task.cwd),\n\t\tmodel: modelId(task.model),\n\t\tthinking: task.thinking,\n\t\tstatus: \"queued\",\n\t\tactivities: [],\n\t\treport: \"\",\n\t\tusage: emptyUsage(),\n\t\tversion: 0,\n\t};\n}\n\n/** Strips internal fields for projection into the public details shape. */\nexport function toRunDetails(state: SubagentRunState): SubagentRunDetails {\n\tconst { version: _version, ...details } = state;\n\treturn details;\n}\n\n// The live \"current activity\" line is derived, never imperative: a pending\n// retry wins, then the most recent still-running tool. This is what keeps a\n// parallel batch's line correct when tools end out of order.\nexport function deriveCurrentActivity(state: SubagentRunState): string | undefined {\n\tif (state.status === \"completed\" || state.status === \"failed\" || state.status === \"aborted\") return undefined;\n\tif (state.retry) return `Retrying (${state.retry.attempt}/${state.retry.maxAttempts})…`;\n\tfor (let index = state.activities.length - 1; index >= 0; index--) {\n\t\tconst activity = state.activities[index];\n\t\tif (activity?.status === \"running\") return activity.summary;\n\t}\n\treturn undefined;\n}\n\nfunction positiveInteger(value: number, fallback: number): number {\n\treturn Number.isFinite(value) ? Math.max(1, Math.floor(value)) : fallback;\n}\n\nfunction retryError(error: string): string {\n\tconst normalized = error.replace(/\\s+/gu, \" \").trim();\n\treturn boundText(normalized, RETRY_ERROR_TEXT_LIMIT).replace(/\\s+/gu, \" \").trim();\n}\n\nfunction makeRetry(attempt: number, maxAttempts: number, deadline: number, error: string): SubagentRunState[\"retry\"] {\n\tconst normalizedAttempt = positiveInteger(attempt, 1);\n\treturn {\n\t\tattempt: normalizedAttempt,\n\t\tmaxAttempts: Math.max(normalizedAttempt, positiveInteger(maxAttempts, normalizedAttempt)),\n\t\tdeadline,\n\t\terror: retryError(error),\n\t};\n}\n\n// The in-memory activity log keeps the newest entries within both the count\n// and text budgets; a bounded O(ACTIVITY_LIMIT) rescan per event replaces\n// incremental byte bookkeeping. Exported for direct budget tests: real\n// events bound every summary, so the text-budget eviction is otherwise\n// purely defensive.\nexport function appendActivity(activities: ToolActivity[], activity: ToolActivity): void {\n\tactivities.push(activity);\n\twhile (activities.length > ACTIVITY_LIMIT) activities.shift();\n\twhile (\n\t\tactivities.reduce((total, item) => total + item.summary.length + (item.resultSummary?.length ?? 0), 0) >\n\t\tACTIVITY_TEXT_LIMIT\n\t) {\n\t\tif (activities.length <= 1) break;\n\t\tactivities.shift();\n\t}\n}\n\nfunction isTerminal(state: SubagentRunState): boolean {\n\treturn state.status === \"completed\" || state.status === \"failed\" || state.status === \"aborted\";\n}\n\nfunction withRevision(state: SubagentRunState, mutate: (draft: SubagentRunState) => void): SubagentRunState {\n\tconst draft: SubagentRunState = {\n\t\t...state,\n\t\tactivities: state.activities.map((activity) => ({ ...activity })),\n\t\tusage: { ...state.usage },\n\t};\n\tmutate(draft);\n\tdraft.version = state.version + 1;\n\treturn draft;\n}\n\nfunction clearRetry(draft: SubagentRunState): void {\n\tdraft.retry = undefined;\n}\n\n/**\n * Pure transition function; timestamps and deadlines arrive in the event.\n * Events applied after a terminal verdict are ignored (settle is idempotent)\n * — except retry_scheduled, the one sanctioned reopening transition.\n */\nexport function reduceRun(state: SubagentRunState, event: SubagentRunEvent): SubagentRunState {\n\tif (isTerminal(state) && event.type !== \"retry_scheduled\") return state;\n\n\tswitch (event.type) {\n\t\tcase \"slot_acquired\":\n\t\t\treturn withRevision(state, (draft) => {\n\t\t\t\tclearRetry(draft);\n\t\t\t\tdraft.status = \"running\";\n\t\t\t\tdraft.startedAt = event.startedAt;\n\t\t\t\tdraft.currentActivity = deriveCurrentActivity(draft);\n\t\t\t});\n\t\tcase \"retry_scheduled\":\n\t\t\t// The full reset matrix from the historical resetRunForRetry: only\n\t\t\t// runs that produced nothing are retried, so nothing of value is\n\t\t\t// discarded. The retry view stays visible through the backoff.\n\t\t\treturn withRevision(state, (draft) => {\n\t\t\t\tconst error = draft.error ?? \"Subagent failed before retry.\";\n\t\t\t\tdraft.status = \"queued\";\n\t\t\t\tdraft.error = undefined;\n\t\t\t\tdraft.startedAt = undefined;\n\t\t\t\tdraft.endedAt = undefined;\n\t\t\t\tdraft.report = \"\";\n\t\t\t\tdraft.activities = [];\n\t\t\t\tdraft.usage = emptyUsage();\n\t\t\t\tdraft.retry = makeRetry(event.attempt, event.maxAttempts, event.deadline, error);\n\t\t\t\tdraft.currentActivity = deriveCurrentActivity(draft);\n\t\t\t});\n\t\tcase \"retry_started\":\n\t\t\treturn withRevision(state, (draft) => {\n\t\t\t\tclearRetry(draft);\n\t\t\t\tdraft.currentActivity = deriveCurrentActivity(draft);\n\t\t\t});\n\t\tcase \"auto_retry_start\":\n\t\t\treturn withRevision(state, (draft) => {\n\t\t\t\tdraft.retry = makeRetry(event.attempt, event.maxAttempts, event.deadline, event.error);\n\t\t\t\tdraft.currentActivity = deriveCurrentActivity(draft);\n\t\t\t});\n\t\tcase \"auto_retry_end\":\n\t\t\treturn withRevision(state, (draft) => {\n\t\t\t\tclearRetry(draft);\n\t\t\t\tdraft.currentActivity = deriveCurrentActivity(draft);\n\t\t\t});\n\t\tcase \"turn_end\":\n\t\t\treturn withRevision(state, (draft) => {\n\t\t\t\tclearRetry(draft);\n\t\t\t\tdraft.usage.turns++;\n\t\t\t\tdraft.currentActivity = deriveCurrentActivity(draft);\n\t\t\t});\n\t\tcase \"assistant_message_settled\":\n\t\t\treturn withRevision(state, (draft) => {\n\t\t\t\tclearRetry(draft);\n\t\t\t\taddUsage(draft.usage, event.usage);\n\t\t\t\tdraft.currentActivity = deriveCurrentActivity(draft);\n\t\t\t});\n\t\tcase \"tool_started\":\n\t\t\treturn withRevision(state, (draft) => {\n\t\t\t\tclearRetry(draft);\n\t\t\t\tdraft.usage.toolUses++;\n\t\t\t\tappendActivity(draft.activities, {\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: event.startedAt,\n\t\t\t\t});\n\t\t\t\tdraft.currentActivity = deriveCurrentActivity(draft);\n\t\t\t});\n\t\tcase \"tool_updated\": {\n\t\t\tconst summary = activitySummary(event.toolName, event.args);\n\t\t\treturn withRevision(state, (draft) => {\n\t\t\t\tclearRetry(draft);\n\t\t\t\tconst activity =\n\t\t\t\t\tdraft.activities.find(\n\t\t\t\t\t\t(candidate) => candidate.id === event.toolCallId && candidate.status === \"running\",\n\t\t\t\t\t) ?? [...draft.activities].reverse().find((candidate) => candidate.status === \"running\");\n\t\t\t\tif (activity) activity.summary = summary;\n\t\t\t\tdraft.currentActivity = deriveCurrentActivity(draft);\n\t\t\t});\n\t\t}\n\t\tcase \"tool_ended\":\n\t\t\treturn withRevision(state, (draft) => {\n\t\t\t\tclearRetry(draft);\n\t\t\t\tconst activity = draft.activities.find((candidate) => candidate.id === event.toolCallId);\n\t\t\t\tif (activity && activity.status === \"running\") {\n\t\t\t\t\tactivity.status = event.isError ? \"failed\" : \"succeeded\";\n\t\t\t\t\tactivity.endedAt = event.endedAt;\n\t\t\t\t\tactivity.resultSummary = resultSummary(event.result) || undefined;\n\t\t\t\t}\n\t\t\t\tdraft.currentActivity = deriveCurrentActivity(draft);\n\t\t\t});\n\t\tcase \"compaction_started\":\n\t\t\t// Auto-compaction is a synthetic activity: it has a start, an end and a\n\t\t\t// failure mode just like a tool call, so it reuses the activity log and its\n\t\t\t// budgets. It is not a tool call, so it never counts toward toolUses.\n\t\t\treturn withRevision(state, (draft) => {\n\t\t\t\tclearRetry(draft);\n\t\t\t\tappendActivity(draft.activities, {\n\t\t\t\t\tid: COMPACTION_ACTIVITY_ID,\n\t\t\t\t\ttoolName: COMPACTION_ACTIVITY_ID,\n\t\t\t\t\tsummary: \"Compacting context…\",\n\t\t\t\t\tstatus: \"running\",\n\t\t\t\t\tstartedAt: event.startedAt,\n\t\t\t\t});\n\t\t\t\tdraft.currentActivity = deriveCurrentActivity(draft);\n\t\t\t});\n\t\tcase \"compaction_ended\":\n\t\t\treturn withRevision(state, (draft) => {\n\t\t\t\tclearRetry(draft);\n\t\t\t\t// Only one compaction runs at a time, so the newest running entry with\n\t\t\t\t// this id is always the one that just ended.\n\t\t\t\tconst activity = [...draft.activities]\n\t\t\t\t\t.reverse()\n\t\t\t\t\t.find((candidate) => candidate.id === COMPACTION_ACTIVITY_ID && candidate.status === \"running\");\n\t\t\t\tif (activity) {\n\t\t\t\t\tactivity.status = event.error ? \"failed\" : \"succeeded\";\n\t\t\t\t\tactivity.endedAt = event.endedAt;\n\t\t\t\t\tactivity.summary = compactionSummary(event.tokensBefore, event.tokensAfter);\n\t\t\t\t\tactivity.resultSummary = event.error ? compactionError(event.error) : undefined;\n\t\t\t\t}\n\t\t\t\tdraft.currentActivity = deriveCurrentActivity(draft);\n\t\t\t});\n\t\tcase \"settle\":\n\t\t\treturn withRevision(state, (draft) => {\n\t\t\t\tdraft.status = event.verdict;\n\t\t\t\tdraft.report = boundText(event.report, TASK_OUTPUT_LIMIT);\n\t\t\t\tdraft.error = event.error ? boundText(event.error, ERROR_TEXT_LIMIT) : undefined;\n\t\t\t\tdraft.endedAt = event.endedAt;\n\t\t\t\tdraft.retry = undefined;\n\t\t\t\tdraft.currentActivity = deriveCurrentActivity({ ...draft, status: event.verdict });\n\t\t\t});\n\t\tcase \"abort_while_queued\":\n\t\t\treturn withRevision(state, (draft) => {\n\t\t\t\tdraft.status = \"aborted\";\n\t\t\t\tdraft.error = \"Subagent was aborted while queued.\";\n\t\t\t\tdraft.endedAt = event.endedAt;\n\t\t\t\tdraft.retry = undefined;\n\t\t\t\tdraft.currentActivity = undefined;\n\t\t\t});\n\t\tcase \"abort_while_retrying\":\n\t\t\treturn withRevision(state, (draft) => {\n\t\t\t\tdraft.status = \"aborted\";\n\t\t\t\tdraft.error = \"Subagent was aborted while waiting to retry.\";\n\t\t\t\tdraft.endedAt = event.endedAt;\n\t\t\t\tdraft.retry = undefined;\n\t\t\t\tdraft.currentActivity = undefined;\n\t\t\t});\n\t}\n}\n\nexport function versionSum(runs: readonly SubagentRunState[]): number {\n\tlet total = 0;\n\tfor (const run of runs) total += run.version;\n\treturn total;\n}\n\nexport function statusOf(runs: readonly SubagentRunDetails[]): SubagentDetails[\"status\"] {\n\tif (runs.length === 0) return \"running\";\n\t// Active beats terminal: any queued or running run keeps the batch\n\t// \"running\" regardless of what the others have settled to.\n\tif (runs.some((run) => run.status === \"queued\" || run.status === \"running\")) return \"running\";\n\tif (runs.every((run) => run.status === \"completed\")) return \"completed\";\n\tif (runs.some((run) => run.status === \"completed\")) return \"partial\";\n\tif (runs.every((run) => run.status === \"aborted\")) return \"aborted\";\n\treturn \"failed\";\n}\n\nexport function isSubagentError(details: Pick<SubagentDetails, \"status\" | \"runs\">): boolean {\n\tif (details.status !== \"failed\" && details.status !== \"aborted\") return false;\n\t// A batch with any successful run is a partial result, not an error:\n\t// per-run status is already reported in the content sections.\n\treturn !details.runs.some((run) => run.status === \"completed\");\n}\n\nfunction statusText(details: SubagentDetails): string {\n\tif (details.runs.length === 0) return \"Initializing…\";\n\tconst running = details.runs.filter((run) => run.status === \"running\").length;\n\tconst queued = details.runs.filter((run) => run.status === \"queued\").length;\n\tconst completed = details.runs.filter((run) => run.status === \"completed\").length;\n\tconst failed = details.runs.filter((run) => run.status === \"failed\").length;\n\tconst aborted = details.runs.filter((run) => run.status === \"aborted\").length;\n\tconst parts = [`${completed}/${details.runs.length} complete`];\n\tif (running) parts.push(`${running} running`);\n\tif (queued) parts.push(`${queued} queued`);\n\tif (failed) parts.push(`${failed} failed`);\n\tif (aborted) parts.push(`${aborted} aborted`);\n\treturn parts.join(\" · \");\n}\n\nexport function statusSummary(details: SubagentDetails): string {\n\treturn statusText(details);\n}\n\nexport interface SubagentRetryView {\n\tattempt: number;\n\tmaxAttempts: number;\n\tremainingSeconds: number;\n\terror: string;\n}\n\nexport function getSubagentRetryView(run: SubagentRunDetails, now = Date.now()): SubagentRetryView | undefined {\n\tconst retry = run.retry;\n\tif (!retry || !Number.isFinite(retry.deadline)) return undefined;\n\tconst attempt = positiveInteger(retry.attempt, 1);\n\tconst maxAttempts = Math.max(attempt, positiveInteger(retry.maxAttempts, attempt));\n\tconst currentTime = Number.isFinite(now) ? now : retry.deadline;\n\treturn {\n\t\tattempt,\n\t\tmaxAttempts,\n\t\tremainingSeconds: Math.max(0, Math.ceil((retry.deadline - currentTime) / 1000)),\n\t\terror: retryError(typeof retry.error === \"string\" ? retry.error : \"\"),\n\t};\n}\n"]}
1
+ {"version":3,"file":"state.js","sourceRoot":"","sources":["../../../src/extensions/subagent/state.ts"],"names":[],"mappings":"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","sourcesContent":["import { relative } from \"node:path\";\nimport type { Usage } from \"@earendil-works/pi-ai\";\nimport {\n\tactivitySummary,\n\taddUsage,\n\tcompactionError,\n\tcompactionSummary,\n\temptyUsage,\n\tresultSummary,\n} from \"./activity.ts\";\nimport {\n\tACTIVITY_LIMIT,\n\tACTIVITY_TEXT_LIMIT,\n\tCOMPACTION_ACTIVITY_ID,\n\tERROR_TEXT_LIMIT,\n\tRETRY_ERROR_TEXT_LIMIT,\n\tTASK_OUTPUT_LIMIT,\n} from \"./constants.ts\";\nimport { modelId } from \"./model-selection.ts\";\nimport { boundText } from \"./text.ts\";\nimport type { ResolvedSubagentTask, SubagentDetails, SubagentRunDetails, ToolActivity } from \"./types.ts\";\n\n/**\n * Mutable-run state plus an internal revision counter. All transitions go\n * through {@link reduceRun}; the batch runner compares version sums instead\n * of diffing rendered fields.\n */\nexport interface SubagentRunState extends SubagentRunDetails {\n\t/** Monotonic per-run revision; bumped by every applied event. */\n\tversion: number;\n}\n\n/** The adapter layer's only output and the reducer's only input. */\nexport type SubagentRunEvent =\n\t| { type: \"slot_acquired\"; startedAt: number }\n\t| {\n\t\t\ttype: \"retry_scheduled\";\n\t\t\tattempt: number;\n\t\t\tmaxAttempts: number;\n\t\t\tdeadline: number;\n\t\t\terror: string | undefined;\n\t }\n\t| { type: \"retry_started\" }\n\t| { type: \"auto_retry_start\"; attempt: number; maxAttempts: number; deadline: number; error: string }\n\t| { type: \"auto_retry_end\" }\n\t| { type: \"turn_end\" }\n\t| { type: \"assistant_message_settled\"; usage: Usage | undefined }\n\t| { type: \"tool_started\"; toolCallId: string; toolName: string; args: unknown; startedAt: number }\n\t| { type: \"tool_updated\"; toolCallId: string; toolName: string; args: unknown }\n\t| { type: \"tool_ended\"; toolCallId: string; result: unknown; isError: boolean; endedAt: number }\n\t| { type: \"compaction_started\"; startedAt: number }\n\t| {\n\t\t\ttype: \"compaction_ended\";\n\t\t\ttokensBefore: number | undefined;\n\t\t\ttokensAfter: number | undefined;\n\t\t\terror: string | undefined;\n\t\t\tendedAt: number;\n\t }\n\t| {\n\t\t\ttype: \"settle\";\n\t\t\tverdict: \"completed\" | \"failed\" | \"aborted\";\n\t\t\treport: string;\n\t\t\terror: string | undefined;\n\t\t\tendedAt: number;\n\t }\n\t| { type: \"abort_while_queued\"; endedAt: number }\n\t| { type: \"abort_while_retrying\"; endedAt: number };\n\nfunction runId(batchId: string | undefined, index: number): string {\n\tif (!batchId) return `subagent-${index + 1}`;\n\t// toolCallIds are provider-shaped (\"call_ABC...\"); keep the readable\n\t// prefix, then disambiguate truncated collisions with a deterministic\n\t// hash of the full id.\n\tconst sanitized = batchId.replace(/[^A-Za-z0-9-]+/gu, \"-\").replace(/^-+|-+$/gu, \"\");\n\tconst hash = hashRunId(batchId);\n\tconst prefix = sanitized.length > 24 ? `${sanitized.slice(0, 24)}-${hash}` : sanitized || `run-${hash}`;\n\treturn `${prefix}-${index + 1}`;\n}\n\nfunction hashRunId(value: string): string {\n\tlet hash = 0x811c9dc5;\n\tfor (let index = 0; index < value.length; index++) {\n\t\thash ^= value.charCodeAt(index);\n\t\thash = Math.imul(hash, 0x01000193);\n\t}\n\treturn (hash >>> 0).toString(36).padStart(6, \"0\").slice(0, 6);\n}\n\nexport function createRunState(\n\ttask: ResolvedSubagentTask,\n\tindex: number,\n\tbatchId: string | undefined,\n\tparentCwd: string,\n): SubagentRunState {\n\treturn {\n\t\tid: runId(batchId, index),\n\t\tagent: task.agent.name,\n\t\tdescription: task.description,\n\t\t// Display-only relative path; the worker session itself uses the\n\t\t// resolved absolute task.cwd. Empty means \"same as the parent\".\n\t\tcwd: relative(parentCwd, task.cwd),\n\t\tmodel: modelId(task.model),\n\t\tthinking: task.thinking,\n\t\tstatus: \"queued\",\n\t\tactivities: [],\n\t\treport: \"\",\n\t\tusage: emptyUsage(),\n\t\tversion: 0,\n\t};\n}\n\n/** Strips internal fields for projection into the public details shape. */\nexport function toRunDetails(state: SubagentRunState): SubagentRunDetails {\n\tconst { version: _version, ...details } = state;\n\treturn details;\n}\n\n// The live \"current activity\" line is derived, never imperative: a pending\n// retry wins, then the most recent still-running tool. This is what keeps a\n// parallel batch's line correct when tools end out of order.\nexport function deriveCurrentActivity(state: SubagentRunState): string | undefined {\n\tif (state.status === \"completed\" || state.status === \"failed\" || state.status === \"aborted\") return undefined;\n\tif (state.retry) return `Retrying (${state.retry.attempt}/${state.retry.maxAttempts})…`;\n\tfor (let index = state.activities.length - 1; index >= 0; index--) {\n\t\tconst activity = state.activities[index];\n\t\tif (activity?.status === \"running\") return activity.summary;\n\t}\n\treturn undefined;\n}\n\nfunction positiveInteger(value: number, fallback: number): number {\n\treturn Number.isFinite(value) ? Math.max(1, Math.floor(value)) : fallback;\n}\n\nfunction retryError(error: string): string {\n\tconst normalized = error.replace(/\\s+/gu, \" \").trim();\n\treturn boundText(normalized, RETRY_ERROR_TEXT_LIMIT).replace(/\\s+/gu, \" \").trim();\n}\n\nfunction makeRetry(attempt: number, maxAttempts: number, deadline: number, error: string): SubagentRunState[\"retry\"] {\n\tconst normalizedAttempt = positiveInteger(attempt, 1);\n\treturn {\n\t\tattempt: normalizedAttempt,\n\t\tmaxAttempts: Math.max(normalizedAttempt, positiveInteger(maxAttempts, normalizedAttempt)),\n\t\tdeadline,\n\t\terror: retryError(error),\n\t};\n}\n\n// The in-memory activity log keeps the newest entries within both the count\n// and text budgets; a bounded O(ACTIVITY_LIMIT) rescan per event replaces\n// incremental byte bookkeeping. Exported for direct budget tests: real\n// events bound every summary, so the text-budget eviction is otherwise\n// purely defensive.\nexport function appendActivity(activities: ToolActivity[], activity: ToolActivity): void {\n\tactivities.push(activity);\n\twhile (activities.length > ACTIVITY_LIMIT) activities.shift();\n\twhile (\n\t\tactivities.reduce((total, item) => total + item.summary.length + (item.resultSummary?.length ?? 0), 0) >\n\t\tACTIVITY_TEXT_LIMIT\n\t) {\n\t\tif (activities.length <= 1) break;\n\t\tactivities.shift();\n\t}\n}\n\nfunction isTerminal(state: SubagentRunState): boolean {\n\treturn state.status === \"completed\" || state.status === \"failed\" || state.status === \"aborted\";\n}\n\nfunction withRevision(state: SubagentRunState, mutate: (draft: SubagentRunState) => void): SubagentRunState {\n\tconst draft: SubagentRunState = {\n\t\t...state,\n\t\tactivities: state.activities.map((activity) => ({ ...activity })),\n\t\tusage: { ...state.usage },\n\t};\n\tmutate(draft);\n\tdraft.version = state.version + 1;\n\treturn draft;\n}\n\nfunction clearRetry(draft: SubagentRunState): void {\n\tdraft.retry = undefined;\n}\n\n/**\n * Pure transition function; timestamps and deadlines arrive in the event.\n * Events applied after a terminal verdict are ignored (settle is idempotent)\n * — except retry_scheduled, the one sanctioned reopening transition.\n */\nexport function reduceRun(state: SubagentRunState, event: SubagentRunEvent): SubagentRunState {\n\tif (isTerminal(state) && event.type !== \"retry_scheduled\") return state;\n\treturn withRevision(state, (draft) => {\n\t\t// Cross-cutting pre-hook: every event clears the retry view except\n\t\t// retry_scheduled (which sets it) and the two abort-terminal events\n\t\t// (which clear it explicitly in their own body).\n\t\tif (event.type !== \"retry_scheduled\") clearRetry(draft);\n\t\tapplyEvent(draft, event);\n\t\t// Cross-cutting post-hook: derive the live activity line from the\n\t\t// new state. Terminal abort events override this to undefined.\n\t\tdraft.currentActivity = deriveCurrentActivity(draft);\n\t});\n}\n\n// ─── Individual event handlers ───────────────────────────────────────────────\n// Each handler mutates the draft in place. Cross-cutting clearRetry and\n// deriveCurrentActivity are handled by the dispatch layer above.\n\nfunction handleSlotAcquired(\n\tdraft: SubagentRunState,\n\tevent: Extract<SubagentRunEvent, { type: \"slot_acquired\" }>,\n): void {\n\tdraft.status = \"running\";\n\tdraft.startedAt = event.startedAt;\n}\n\nfunction handleRetryScheduled(\n\tdraft: SubagentRunState,\n\tevent: Extract<SubagentRunEvent, { type: \"retry_scheduled\" }>,\n): void {\n\t// Full reset: only runs that produced nothing are retried, so nothing of\n\t// value is discarded. The retry view stays visible through the backoff.\n\tconst error = draft.error ?? \"Subagent failed before retry.\";\n\tdraft.status = \"queued\";\n\tdraft.error = undefined;\n\tdraft.startedAt = undefined;\n\tdraft.endedAt = undefined;\n\tdraft.report = \"\";\n\tdraft.activities = [];\n\tdraft.usage = emptyUsage();\n\tdraft.retry = makeRetry(event.attempt, event.maxAttempts, event.deadline, error);\n}\n\nfunction handleRetryStarted(draft: SubagentRunState): void {\n\t// No-op beyond the cross-cutting clearRetry already applied.\n\tvoid draft;\n}\n\nfunction handleAutoRetryStart(\n\tdraft: SubagentRunState,\n\tevent: Extract<SubagentRunEvent, { type: \"auto_retry_start\" }>,\n): void {\n\tdraft.retry = makeRetry(event.attempt, event.maxAttempts, event.deadline, event.error);\n}\n\nfunction handleAutoRetryEnd(draft: SubagentRunState): void {\n\t// No-op beyond the cross-cutting clearRetry already applied.\n\tvoid draft;\n}\n\nfunction handleTurnEnd(draft: SubagentRunState): void {\n\tdraft.usage.turns++;\n}\n\nfunction handleAssistantMessageSettled(\n\tdraft: SubagentRunState,\n\tevent: Extract<SubagentRunEvent, { type: \"assistant_message_settled\" }>,\n): void {\n\taddUsage(draft.usage, event.usage);\n}\n\nfunction handleToolStarted(draft: SubagentRunState, event: Extract<SubagentRunEvent, { type: \"tool_started\" }>): void {\n\tdraft.usage.toolUses++;\n\tappendActivity(draft.activities, {\n\t\tid: event.toolCallId,\n\t\ttoolName: event.toolName,\n\t\tsummary: activitySummary(event.toolName, event.args),\n\t\tstatus: \"running\",\n\t\tstartedAt: event.startedAt,\n\t});\n}\n\nfunction handleToolUpdated(draft: SubagentRunState, event: Extract<SubagentRunEvent, { type: \"tool_updated\" }>): void {\n\tconst summary = activitySummary(event.toolName, event.args);\n\tconst activity =\n\t\tdraft.activities.find((candidate) => candidate.id === event.toolCallId && candidate.status === \"running\") ??\n\t\t[...draft.activities].reverse().find((candidate) => candidate.status === \"running\");\n\tif (activity) activity.summary = summary;\n}\n\nfunction handleToolEnded(draft: SubagentRunState, event: Extract<SubagentRunEvent, { type: \"tool_ended\" }>): void {\n\tconst activity = draft.activities.find((candidate) => candidate.id === event.toolCallId);\n\tif (activity && activity.status === \"running\") {\n\t\tactivity.status = event.isError ? \"failed\" : \"succeeded\";\n\t\tactivity.endedAt = event.endedAt;\n\t\tactivity.resultSummary = resultSummary(event.result) || undefined;\n\t}\n}\n\nfunction handleCompactionStarted(\n\tdraft: SubagentRunState,\n\tevent: Extract<SubagentRunEvent, { type: \"compaction_started\" }>,\n): void {\n\tappendActivity(draft.activities, {\n\t\tid: COMPACTION_ACTIVITY_ID,\n\t\ttoolName: COMPACTION_ACTIVITY_ID,\n\t\tsummary: \"Compacting context…\",\n\t\tstatus: \"running\",\n\t\tstartedAt: event.startedAt,\n\t});\n}\n\nfunction handleCompactionEnded(\n\tdraft: SubagentRunState,\n\tevent: Extract<SubagentRunEvent, { type: \"compaction_ended\" }>,\n): void {\n\tconst activity = [...draft.activities]\n\t\t.reverse()\n\t\t.find((candidate) => candidate.id === COMPACTION_ACTIVITY_ID && candidate.status === \"running\");\n\tif (activity) {\n\t\tactivity.status = event.error ? \"failed\" : \"succeeded\";\n\t\tactivity.endedAt = event.endedAt;\n\t\tactivity.summary = compactionSummary(event.tokensBefore, event.tokensAfter);\n\t\tactivity.resultSummary = event.error ? compactionError(event.error) : undefined;\n\t}\n}\n\nfunction handleSettle(draft: SubagentRunState, event: Extract<SubagentRunEvent, { type: \"settle\" }>): void {\n\tdraft.status = event.verdict;\n\tdraft.report = boundText(event.report, TASK_OUTPUT_LIMIT);\n\tdraft.error = event.error ? boundText(event.error, ERROR_TEXT_LIMIT) : undefined;\n\tdraft.endedAt = event.endedAt;\n\tdraft.retry = undefined;\n}\n\nfunction handleAbortWhileQueued(\n\tdraft: SubagentRunState,\n\tevent: Extract<SubagentRunEvent, { type: \"abort_while_queued\" }>,\n): void {\n\tdraft.status = \"aborted\";\n\tdraft.error = \"Subagent was aborted while queued.\";\n\tdraft.endedAt = event.endedAt;\n\tdraft.retry = undefined;\n}\n\nfunction handleAbortWhileRetrying(\n\tdraft: SubagentRunState,\n\tevent: Extract<SubagentRunEvent, { type: \"abort_while_retrying\" }>,\n): void {\n\tdraft.status = \"aborted\";\n\tdraft.error = \"Subagent was aborted while waiting to retry.\";\n\tdraft.endedAt = event.endedAt;\n\tdraft.retry = undefined;\n}\n\nfunction applyEvent(draft: SubagentRunState, event: SubagentRunEvent): void {\n\tswitch (event.type) {\n\t\tcase \"slot_acquired\":\n\t\t\thandleSlotAcquired(draft, event);\n\t\t\tbreak;\n\t\tcase \"retry_scheduled\":\n\t\t\thandleRetryScheduled(draft, event);\n\t\t\tbreak;\n\t\tcase \"retry_started\":\n\t\t\thandleRetryStarted(draft);\n\t\t\tbreak;\n\t\tcase \"auto_retry_start\":\n\t\t\thandleAutoRetryStart(draft, event);\n\t\t\tbreak;\n\t\tcase \"auto_retry_end\":\n\t\t\thandleAutoRetryEnd(draft);\n\t\t\tbreak;\n\t\tcase \"turn_end\":\n\t\t\thandleTurnEnd(draft);\n\t\t\tbreak;\n\t\tcase \"assistant_message_settled\":\n\t\t\thandleAssistantMessageSettled(draft, event);\n\t\t\tbreak;\n\t\tcase \"tool_started\":\n\t\t\thandleToolStarted(draft, event);\n\t\t\tbreak;\n\t\tcase \"tool_updated\":\n\t\t\thandleToolUpdated(draft, event);\n\t\t\tbreak;\n\t\tcase \"tool_ended\":\n\t\t\thandleToolEnded(draft, event);\n\t\t\tbreak;\n\t\tcase \"compaction_started\":\n\t\t\thandleCompactionStarted(draft, event);\n\t\t\tbreak;\n\t\tcase \"compaction_ended\":\n\t\t\thandleCompactionEnded(draft, event);\n\t\t\tbreak;\n\t\tcase \"settle\":\n\t\t\thandleSettle(draft, event);\n\t\t\tbreak;\n\t\tcase \"abort_while_queued\":\n\t\t\thandleAbortWhileQueued(draft, event);\n\t\t\tbreak;\n\t\tcase \"abort_while_retrying\":\n\t\t\thandleAbortWhileRetrying(draft, event);\n\t\t\tbreak;\n\t}\n}\n\nexport function versionSum(runs: readonly SubagentRunState[]): number {\n\tlet total = 0;\n\tfor (const run of runs) total += run.version;\n\treturn total;\n}\n\nexport function statusOf(runs: readonly SubagentRunDetails[]): SubagentDetails[\"status\"] {\n\tif (runs.length === 0) return \"running\";\n\t// Active beats terminal: any queued or running run keeps the batch\n\t// \"running\" regardless of what the others have settled to.\n\tif (runs.some((run) => run.status === \"queued\" || run.status === \"running\")) return \"running\";\n\tif (runs.every((run) => run.status === \"completed\")) return \"completed\";\n\tif (runs.some((run) => run.status === \"completed\")) return \"partial\";\n\tif (runs.every((run) => run.status === \"aborted\")) return \"aborted\";\n\treturn \"failed\";\n}\n\nexport function isSubagentError(details: Pick<SubagentDetails, \"status\" | \"runs\">): boolean {\n\tif (details.status !== \"failed\" && details.status !== \"aborted\") return false;\n\t// A batch with any successful run is a partial result, not an error:\n\t// per-run status is already reported in the content sections.\n\treturn !details.runs.some((run) => run.status === \"completed\");\n}\n\nfunction statusText(details: SubagentDetails): string {\n\tif (details.runs.length === 0) return \"Initializing…\";\n\tconst running = details.runs.filter((run) => run.status === \"running\").length;\n\tconst queued = details.runs.filter((run) => run.status === \"queued\").length;\n\tconst completed = details.runs.filter((run) => run.status === \"completed\").length;\n\tconst failed = details.runs.filter((run) => run.status === \"failed\").length;\n\tconst aborted = details.runs.filter((run) => run.status === \"aborted\").length;\n\tconst parts = [`${completed}/${details.runs.length} complete`];\n\tif (running) parts.push(`${running} running`);\n\tif (queued) parts.push(`${queued} queued`);\n\tif (failed) parts.push(`${failed} failed`);\n\tif (aborted) parts.push(`${aborted} aborted`);\n\treturn parts.join(\" · \");\n}\n\nexport function statusSummary(details: SubagentDetails): string {\n\treturn statusText(details);\n}\n\nexport interface SubagentRetryView {\n\tattempt: number;\n\tmaxAttempts: number;\n\tremainingSeconds: number;\n\terror: string;\n}\n\nexport function getSubagentRetryView(run: SubagentRunDetails, now = Date.now()): SubagentRetryView | undefined {\n\tconst retry = run.retry;\n\tif (!retry || !Number.isFinite(retry.deadline)) return undefined;\n\tconst attempt = positiveInteger(retry.attempt, 1);\n\tconst maxAttempts = Math.max(attempt, positiveInteger(retry.maxAttempts, attempt));\n\tconst currentTime = Number.isFinite(now) ? now : retry.deadline;\n\treturn {\n\t\tattempt,\n\t\tmaxAttempts,\n\t\tremainingSeconds: Math.max(0, Math.ceil((retry.deadline - currentTime) / 1000)),\n\t\terror: retryError(typeof retry.error === \"string\" ? retry.error : \"\"),\n\t};\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"text.d.ts","sourceRoot":"","sources":["../../../src/extensions/subagent/text.ts"],"names":[],"mappings":"AAGA,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAQ9C;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAOnD;AAID,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAG5D;AAGD,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAYjE;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAgBhE"}
1
+ {"version":3,"file":"text.d.ts","sourceRoot":"","sources":["../../../src/extensions/subagent/text.ts"],"names":[],"mappings":"AAGA,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAQ9C;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAOnD;AAID,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAG5D;AAGD,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAYjE;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAoBhE"}
@@ -44,6 +44,10 @@ export function boundText(text, maxBytes) {
44
44
  if (Buffer.byteLength(text, "utf8") <= maxBytes)
45
45
  return text;
46
46
  let output = utf8Prefix(text, maxBytes);
47
+ // The loop converges because the only variable in the notice is the digit
48
+ // count of "N bytes omitted" — each iteration shortens the prefix by at
49
+ // most the byte-length difference of one fewer digit, so it stabilizes in
50
+ // ≤2 iterations in practice. The cap of 8 is purely defensive.
47
51
  for (let attempt = 0; attempt < 8; attempt++) {
48
52
  const omitted = Buffer.byteLength(text, "utf8") - Buffer.byteLength(output, "utf8");
49
53
  const notice = `\n\n[Output truncated: ${omitted} bytes omitted.]`;
@@ -1 +1 @@
1
- {"version":3,"file":"text.js","sourceRoot":"","sources":["../../../src/extensions/subagent/text.ts"],"names":[],"mappings":"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","sourcesContent":["// Text utilities shared across the subagent extension: plain-text\n// projection, UTF-8 byte bounding, and code-point truncation.\n\nexport function plainLine(text: string): string {\n\treturn text\n\t\t.replace(/^\\s*#{1,6}\\s+/u, \"\")\n\t\t.replace(/`([^`]*)`/gu, \"$1\")\n\t\t.replace(/\\*\\*([^*]+)\\*\\*/gu, \"$1\")\n\t\t.replace(/\\[([^\\]]+)\\]\\([^)]*\\)/gu, \"$1\")\n\t\t.replace(/\\s+/gu, \" \")\n\t\t.trim();\n}\n\nexport function firstPlainLine(text: string): string {\n\treturn (\n\t\ttext\n\t\t\t.split(\"\\n\")\n\t\t\t.map((line) => plainLine(line))\n\t\t\t.find(Boolean) ?? \"\"\n\t);\n}\n\n// Truncates by code points (never splitting a surrogate pair) and appends an\n// ellipsis; for UTF-8 byte budgets use boundText instead.\nexport function truncate(text: string, limit: number): string {\n\tconst characters = [...text];\n\treturn characters.length <= limit ? text : `${characters.slice(0, Math.max(0, limit - 1)).join(\"\")}…`;\n}\n\n// Iterates code points so a surrogate pair is never split in half.\nexport function utf8Prefix(text: string, maxBytes: number): string {\n\tif (maxBytes <= 0) return \"\";\n\tif (Buffer.byteLength(text, \"utf8\") <= maxBytes) return text;\n\tlet output = \"\";\n\tlet bytes = 0;\n\tfor (const character of text) {\n\t\tconst characterBytes = Buffer.byteLength(character, \"utf8\");\n\t\tif (bytes + characterBytes > maxBytes) break;\n\t\toutput += character;\n\t\tbytes += characterBytes;\n\t}\n\treturn output;\n}\n\nexport function boundText(text: string, maxBytes: number): string {\n\tif (maxBytes <= 0) return \"\";\n\tif (Buffer.byteLength(text, \"utf8\") <= maxBytes) return text;\n\tlet output = utf8Prefix(text, maxBytes);\n\tfor (let attempt = 0; attempt < 8; attempt++) {\n\t\tconst omitted = Buffer.byteLength(text, \"utf8\") - Buffer.byteLength(output, \"utf8\");\n\t\tconst notice = `\\n\\n[Output truncated: ${omitted} bytes omitted.]`;\n\t\tconst available = maxBytes - Buffer.byteLength(notice, \"utf8\");\n\t\tif (available <= 0) return utf8Prefix(\"[Output truncated.]\", maxBytes);\n\t\tconst next = utf8Prefix(text, available);\n\t\tif (next === output) return `${output}${notice}`;\n\t\toutput = next;\n\t}\n\tconst omitted = Buffer.byteLength(text, \"utf8\") - Buffer.byteLength(output, \"utf8\");\n\tconst notice = `\\n\\n[Output truncated: ${omitted} bytes omitted.]`;\n\treturn `${utf8Prefix(output, Math.max(0, maxBytes - Buffer.byteLength(notice, \"utf8\")))}${notice}`;\n}\n"]}
1
+ {"version":3,"file":"text.js","sourceRoot":"","sources":["../../../src/extensions/subagent/text.ts"],"names":[],"mappings":"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","sourcesContent":["// Text utilities shared across the subagent extension: plain-text\n// projection, UTF-8 byte bounding, and code-point truncation.\n\nexport function plainLine(text: string): string {\n\treturn text\n\t\t.replace(/^\\s*#{1,6}\\s+/u, \"\")\n\t\t.replace(/`([^`]*)`/gu, \"$1\")\n\t\t.replace(/\\*\\*([^*]+)\\*\\*/gu, \"$1\")\n\t\t.replace(/\\[([^\\]]+)\\]\\([^)]*\\)/gu, \"$1\")\n\t\t.replace(/\\s+/gu, \" \")\n\t\t.trim();\n}\n\nexport function firstPlainLine(text: string): string {\n\treturn (\n\t\ttext\n\t\t\t.split(\"\\n\")\n\t\t\t.map((line) => plainLine(line))\n\t\t\t.find(Boolean) ?? \"\"\n\t);\n}\n\n// Truncates by code points (never splitting a surrogate pair) and appends an\n// ellipsis; for UTF-8 byte budgets use boundText instead.\nexport function truncate(text: string, limit: number): string {\n\tconst characters = [...text];\n\treturn characters.length <= limit ? text : `${characters.slice(0, Math.max(0, limit - 1)).join(\"\")}…`;\n}\n\n// Iterates code points so a surrogate pair is never split in half.\nexport function utf8Prefix(text: string, maxBytes: number): string {\n\tif (maxBytes <= 0) return \"\";\n\tif (Buffer.byteLength(text, \"utf8\") <= maxBytes) return text;\n\tlet output = \"\";\n\tlet bytes = 0;\n\tfor (const character of text) {\n\t\tconst characterBytes = Buffer.byteLength(character, \"utf8\");\n\t\tif (bytes + characterBytes > maxBytes) break;\n\t\toutput += character;\n\t\tbytes += characterBytes;\n\t}\n\treturn output;\n}\n\nexport function boundText(text: string, maxBytes: number): string {\n\tif (maxBytes <= 0) return \"\";\n\tif (Buffer.byteLength(text, \"utf8\") <= maxBytes) return text;\n\tlet output = utf8Prefix(text, maxBytes);\n\t// The loop converges because the only variable in the notice is the digit\n\t// count of \"N bytes omitted\" — each iteration shortens the prefix by at\n\t// most the byte-length difference of one fewer digit, so it stabilizes in\n\t// ≤2 iterations in practice. The cap of 8 is purely defensive.\n\tfor (let attempt = 0; attempt < 8; attempt++) {\n\t\tconst omitted = Buffer.byteLength(text, \"utf8\") - Buffer.byteLength(output, \"utf8\");\n\t\tconst notice = `\\n\\n[Output truncated: ${omitted} bytes omitted.]`;\n\t\tconst available = maxBytes - Buffer.byteLength(notice, \"utf8\");\n\t\tif (available <= 0) return utf8Prefix(\"[Output truncated.]\", maxBytes);\n\t\tconst next = utf8Prefix(text, available);\n\t\tif (next === output) return `${output}${notice}`;\n\t\toutput = next;\n\t}\n\tconst omitted = Buffer.byteLength(text, \"utf8\") - Buffer.byteLength(output, \"utf8\");\n\tconst notice = `\\n\\n[Output truncated: ${omitted} bytes omitted.]`;\n\treturn `${utf8Prefix(output, Math.max(0, maxBytes - Buffer.byteLength(notice, \"utf8\")))}${notice}`;\n}\n"]}
@@ -0,0 +1,4 @@
1
+ import type { ThinkingLevel } from "@earendil-works/pi-agent-core";
2
+ import type { ExtensionCommandContext } from "../../../core/extensions/types.ts";
3
+ export declare function showDialogAgentsCommand(ctx: ExtensionCommandContext, currentThinking: ThinkingLevel): Promise<void>;
4
+ //# sourceMappingURL=agents-dialog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agents-dialog.d.ts","sourceRoot":"","sources":["../../../../src/extensions/subagent/ui/agents-dialog.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAEnE,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,mCAAmC,CAAC;AA6GjF,wBAAsB,uBAAuB,CAC5C,GAAG,EAAE,uBAAuB,EAC5B,eAAe,EAAE,aAAa,GAC5B,OAAO,CAAC,IAAI,CAAC,CAMf"}
@@ -0,0 +1,84 @@
1
+ import { getAgentDir } from "../../../config.js";
2
+ import { AGENT_PROFILE_LABELS, AGENT_PROFILES } from "../agents.js";
3
+ import { loadSubagentConfig, updateProfileOverride } from "../settings.js";
4
+ import { buildModelChoices, buildSettingsRows, buildThinkingChoices, compareModels, } from "./choices.js";
5
+ async function persistOverride(ctx, profile, patch) {
6
+ try {
7
+ return await updateProfileOverride(profile.name, patch, getAgentDir());
8
+ }
9
+ catch (error) {
10
+ ctx.ui.notify(`Could not save ${AGENT_PROFILE_LABELS[profile.name]} settings: ${error instanceof Error ? error.message : String(error)}`, "error");
11
+ return undefined;
12
+ }
13
+ }
14
+ async function selectProfile(ctx) {
15
+ const labels = AGENT_PROFILES.map((profile) => AGENT_PROFILE_LABELS[profile.name]);
16
+ const label = await ctx.ui.select("Agents", labels);
17
+ return label === undefined
18
+ ? undefined
19
+ : AGENT_PROFILES.find((profile) => AGENT_PROFILE_LABELS[profile.name] === label);
20
+ }
21
+ async function showDialogSettingsMenu(ctx, profile, override, currentThinking) {
22
+ const options = new Map();
23
+ for (const row of buildSettingsRows({
24
+ override,
25
+ models: ctx.modelRegistry.getAvailable(),
26
+ currentSessionModel: ctx.model,
27
+ currentThinking,
28
+ })) {
29
+ options.set(`${row.label} — ${row.value}`, row.action);
30
+ }
31
+ const label = await ctx.ui.select(AGENT_PROFILE_LABELS[profile.name], [...options.keys()]);
32
+ return label === undefined ? undefined : options.get(label);
33
+ }
34
+ async function showDialogModelPicker(ctx, profile, override) {
35
+ const models = [...ctx.modelRegistry.getAvailable()].sort(compareModels);
36
+ const choices = buildModelChoices({
37
+ models,
38
+ currentSessionModel: ctx.model,
39
+ savedModelId: override?.model,
40
+ });
41
+ const label = await ctx.ui.select(`Model — ${AGENT_PROFILE_LABELS[profile.name]}`, [...choices.keys()]);
42
+ return label === undefined ? undefined : { modelId: choices.get(label) };
43
+ }
44
+ async function showDialogThinkingPicker(ctx, profile, override, currentThinking) {
45
+ const choices = buildThinkingChoices({
46
+ currentSessionModel: ctx.model,
47
+ models: ctx.modelRegistry.getAvailable(),
48
+ override,
49
+ currentThinking,
50
+ });
51
+ const label = await ctx.ui.select(`Thinking — ${AGENT_PROFILE_LABELS[profile.name]}`, [...choices.keys()]);
52
+ return label === undefined ? undefined : { level: choices.get(label) };
53
+ }
54
+ async function runDialogProfileSettings(ctx, profile, currentThinking) {
55
+ const agentDir = getAgentDir();
56
+ while (true) {
57
+ const config = await loadSubagentConfig(agentDir);
58
+ const override = config.profiles[profile.name];
59
+ const action = await showDialogSettingsMenu(ctx, profile, override, currentThinking);
60
+ if (!action)
61
+ return;
62
+ if (action === "model") {
63
+ const chosen = await showDialogModelPicker(ctx, profile, override);
64
+ if (!chosen)
65
+ continue;
66
+ await persistOverride(ctx, profile, { model: chosen.modelId });
67
+ }
68
+ else {
69
+ const chosen = await showDialogThinkingPicker(ctx, profile, override, currentThinking);
70
+ if (!chosen)
71
+ continue;
72
+ await persistOverride(ctx, profile, { thinking: chosen.level });
73
+ }
74
+ }
75
+ }
76
+ export async function showDialogAgentsCommand(ctx, currentThinking) {
77
+ while (true) {
78
+ const profile = await selectProfile(ctx);
79
+ if (!profile)
80
+ return;
81
+ await runDialogProfileSettings(ctx, profile, currentThinking);
82
+ }
83
+ }
84
+ //# sourceMappingURL=agents-dialog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agents-dialog.js","sourceRoot":"","sources":["../../../../src/extensions/subagent/ui/agents-dialog.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ThinkingLevel } from \"@earendil-works/pi-agent-core\";\nimport { getAgentDir } from \"../../../config.ts\";\nimport type { ExtensionCommandContext } from \"../../../core/extensions/types.ts\";\nimport { AGENT_PROFILE_LABELS, AGENT_PROFILES } from \"../agents.ts\";\nimport { loadSubagentConfig, updateProfileOverride } from \"../settings.ts\";\nimport type { AgentProfile, SubagentConfigFile, SubagentProfileOverride } from \"../types.ts\";\nimport {\n\tbuildModelChoices,\n\tbuildSettingsRows,\n\tbuildThinkingChoices,\n\tcompareModels,\n\ttype SettingsAction,\n} from \"./choices.ts\";\n\nasync function persistOverride(\n\tctx: ExtensionCommandContext,\n\tprofile: AgentProfile,\n\tpatch: Partial<SubagentProfileOverride>,\n): Promise<SubagentConfigFile | undefined> {\n\ttry {\n\t\treturn await updateProfileOverride(profile.name, patch, getAgentDir());\n\t} catch (error) {\n\t\tctx.ui.notify(\n\t\t\t`Could not save ${AGENT_PROFILE_LABELS[profile.name]} settings: ${error instanceof Error ? error.message : String(error)}`,\n\t\t\t\"error\",\n\t\t);\n\t\treturn undefined;\n\t}\n}\n\nasync function selectProfile(ctx: ExtensionCommandContext): Promise<AgentProfile | undefined> {\n\tconst labels = AGENT_PROFILES.map((profile) => AGENT_PROFILE_LABELS[profile.name]);\n\tconst label = await ctx.ui.select(\"Agents\", labels);\n\treturn label === undefined\n\t\t? undefined\n\t\t: AGENT_PROFILES.find((profile) => AGENT_PROFILE_LABELS[profile.name] === label);\n}\n\nasync function showDialogSettingsMenu(\n\tctx: ExtensionCommandContext,\n\tprofile: AgentProfile,\n\toverride: SubagentProfileOverride | undefined,\n\tcurrentThinking: ThinkingLevel,\n): Promise<SettingsAction | undefined> {\n\tconst options = new Map<string, SettingsAction>();\n\tfor (const row of buildSettingsRows({\n\t\toverride,\n\t\tmodels: ctx.modelRegistry.getAvailable(),\n\t\tcurrentSessionModel: ctx.model,\n\t\tcurrentThinking,\n\t})) {\n\t\toptions.set(`${row.label} — ${row.value}`, row.action);\n\t}\n\tconst label = await ctx.ui.select(AGENT_PROFILE_LABELS[profile.name], [...options.keys()]);\n\treturn label === undefined ? undefined : options.get(label);\n}\n\nasync function showDialogModelPicker(\n\tctx: ExtensionCommandContext,\n\tprofile: AgentProfile,\n\toverride: SubagentProfileOverride | undefined,\n): Promise<{ modelId: string | undefined } | undefined> {\n\tconst models = [...ctx.modelRegistry.getAvailable()].sort(compareModels);\n\tconst choices = buildModelChoices({\n\t\tmodels,\n\t\tcurrentSessionModel: ctx.model,\n\t\tsavedModelId: override?.model,\n\t});\n\tconst label = await ctx.ui.select(`Model — ${AGENT_PROFILE_LABELS[profile.name]}`, [...choices.keys()]);\n\treturn label === undefined ? undefined : { modelId: choices.get(label) };\n}\n\nasync function showDialogThinkingPicker(\n\tctx: ExtensionCommandContext,\n\tprofile: AgentProfile,\n\toverride: SubagentProfileOverride | undefined,\n\tcurrentThinking: ThinkingLevel,\n): Promise<{ level: ThinkingLevel | undefined } | undefined> {\n\tconst choices = buildThinkingChoices({\n\t\tcurrentSessionModel: ctx.model,\n\t\tmodels: ctx.modelRegistry.getAvailable(),\n\t\toverride,\n\t\tcurrentThinking,\n\t});\n\tconst label = await ctx.ui.select(`Thinking — ${AGENT_PROFILE_LABELS[profile.name]}`, [...choices.keys()]);\n\treturn label === undefined ? undefined : { level: choices.get(label) };\n}\n\nasync function runDialogProfileSettings(\n\tctx: ExtensionCommandContext,\n\tprofile: AgentProfile,\n\tcurrentThinking: ThinkingLevel,\n): Promise<void> {\n\tconst agentDir = getAgentDir();\n\twhile (true) {\n\t\tconst config = await loadSubagentConfig(agentDir);\n\t\tconst override = config.profiles[profile.name];\n\t\tconst action = await showDialogSettingsMenu(ctx, profile, override, currentThinking);\n\t\tif (!action) return;\n\t\tif (action === \"model\") {\n\t\t\tconst chosen = await showDialogModelPicker(ctx, profile, override);\n\t\t\tif (!chosen) continue;\n\t\t\tawait persistOverride(ctx, profile, { model: chosen.modelId });\n\t\t} else {\n\t\t\tconst chosen = await showDialogThinkingPicker(ctx, profile, override, currentThinking);\n\t\t\tif (!chosen) continue;\n\t\t\tawait persistOverride(ctx, profile, { thinking: chosen.level });\n\t\t}\n\t}\n}\n\nexport async function showDialogAgentsCommand(\n\tctx: ExtensionCommandContext,\n\tcurrentThinking: ThinkingLevel,\n): Promise<void> {\n\twhile (true) {\n\t\tconst profile = await selectProfile(ctx);\n\t\tif (!profile) return;\n\t\tawait runDialogProfileSettings(ctx, profile, currentThinking);\n\t}\n}\n"]}