titan-agent 6.2.2 → 6.3.1

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 (155) hide show
  1. package/dist/agent/goalDriver.js +154 -4
  2. package/dist/agent/goalDriver.js.map +1 -1
  3. package/dist/agent/orchestrator.js +9 -10
  4. package/dist/agent/orchestrator.js.map +1 -1
  5. package/dist/agent/planner.js +42 -10
  6. package/dist/agent/planner.js.map +1 -1
  7. package/dist/agent/systemPromptParts.js +13 -16
  8. package/dist/agent/systemPromptParts.js.map +1 -1
  9. package/dist/utils/constants.js +1 -1
  10. package/dist/utils/constants.js.map +1 -1
  11. package/package.json +1 -1
  12. package/ui/dist/assets/{AuditPanel-BmFAKA7p.js → AuditPanel-TdDAyJUQ.js} +1 -1
  13. package/ui/dist/assets/{AutonomyPanel-BzuCEsiG.js → AutonomyPanel-B6EIpuFt.js} +1 -1
  14. package/ui/dist/assets/{AutopilotPanel-DA1vFEl4.js → AutopilotPanel-CLe14-eq.js} +1 -1
  15. package/ui/dist/assets/{AutoresearchPanel-BeUCXYtX.js → AutoresearchPanel-C14q_kh7.js} +1 -1
  16. package/ui/dist/assets/{BackupPanel-B6N1pfMT.js → BackupPanel-CoEbryip.js} +1 -1
  17. package/ui/dist/assets/{BrowserPanel-BGHaPi3O.js → BrowserPanel-CRTJOXQV.js} +1 -1
  18. package/ui/dist/assets/{CPActivity-BUSwjFj2.js → CPActivity-DjT8p5Dn.js} +1 -1
  19. package/ui/dist/assets/{CPAgentDetail-DlUEVujH.js → CPAgentDetail-CR1ciISN.js} +1 -1
  20. package/ui/dist/assets/{CPAgents-CnRmsSMo.js → CPAgents-DIYCdpQR.js} +1 -1
  21. package/ui/dist/assets/{CPApprovals-CXdkzebd.js → CPApprovals-DAKmaSkN.js} +1 -1
  22. package/ui/dist/assets/{CPCosts-CfcyIUZg.js → CPCosts-CCCh_VY0.js} +1 -1
  23. package/ui/dist/assets/{CPDashboard-DHlfE1mT.js → CPDashboard-CyKZGlHB.js} +1 -1
  24. package/ui/dist/assets/{CPFiles-DyV9vsjE.js → CPFiles-CI252ucO.js} +1 -1
  25. package/ui/dist/assets/{CPGoals-C17G2F0e.js → CPGoals-BtcgDUY5.js} +1 -1
  26. package/ui/dist/assets/{CPInbox-D5A3ja_Q.js → CPInbox-igQoKOuB.js} +1 -1
  27. package/ui/dist/assets/{CPIssueDetail-CoPv27Ll.js → CPIssueDetail-DD5iL5mT.js} +1 -1
  28. package/ui/dist/assets/{CPIssues-C9EdfW1J.js → CPIssues-C1XUjgdv.js} +1 -1
  29. package/ui/dist/assets/CPLayout-VXhuxAHd.js +2 -0
  30. package/ui/dist/assets/{CPOrg-DzoVDLKI.js → CPOrg-JyXp44DB.js} +1 -1
  31. package/ui/dist/assets/{CPRuns-BHAyFv0K.js → CPRuns-C-gZX28e.js} +1 -1
  32. package/ui/dist/assets/{CPSocial-CjHD8dKM.js → CPSocial-sMl4vqmX.js} +1 -1
  33. package/ui/dist/assets/{CPVoice-aybMotU5.js → CPVoice-BXTY3vl7.js} +1 -1
  34. package/ui/dist/assets/{ChannelsPanel-8KfvAEYM.js → ChannelsPanel-rF_yHmYD.js} +1 -1
  35. package/ui/dist/assets/{CheckpointsPanel-BCyLRLcg.js → CheckpointsPanel-DO0QSjuz.js} +1 -1
  36. package/ui/dist/assets/{CommandPostHub-Ce-mWsu2.js → CommandPostHub-BLnNTvBO.js} +3 -3
  37. package/ui/dist/assets/{CronPanel-A9JHvU_O.js → CronPanel-DELTcCV-.js} +1 -1
  38. package/ui/dist/assets/{DataTable-ol6IZMRj.js → DataTable-BmbYppBc.js} +1 -1
  39. package/ui/dist/assets/{DreamPanel-ZiOF8ybh.js → DreamPanel-B28qIraZ.js} +1 -1
  40. package/ui/dist/assets/{EmptyState-B1i1ZK0x.js → EmptyState-CxJGUl_w.js} +1 -1
  41. package/ui/dist/assets/{EvalHarnessPanel-DRGc1zbp.js → EvalHarnessPanel-DvI-dsqQ.js} +1 -1
  42. package/ui/dist/assets/{EvalPanel-B_fiFImG.js → EvalPanel-DKdn69V8.js} +1 -1
  43. package/ui/dist/assets/{FileViewer-D14G6MQq.js → FileViewer-Deg5Z7ng.js} +1 -1
  44. package/ui/dist/assets/{FilesPanel-BIsMoSfg.js → FilesPanel-DDRjQukY.js} +1 -1
  45. package/ui/dist/assets/{FleetPanel-CSjOOsbX.js → FleetPanel-eEudyOkP.js} +1 -1
  46. package/ui/dist/assets/{HomelabPanel-XHMxqiHu.js → HomelabPanel-Dov1f68P.js} +1 -1
  47. package/ui/dist/assets/InfraView-DgasEqoR.js +2 -0
  48. package/ui/dist/assets/{InlineEditableField-AOS-LBh_.js → InlineEditableField-4ZA-KEfv.js} +1 -1
  49. package/ui/dist/assets/{Input-CTK9oH9g.js → Input-C7lzcGqx.js} +1 -1
  50. package/ui/dist/assets/{IntegrationsPanel-BKuC_5El.js → IntegrationsPanel-BmnWsnvF.js} +1 -1
  51. package/ui/dist/assets/IntelligenceView-DXYSyS1a.js +2 -0
  52. package/ui/dist/assets/{LearningPanel-RpDaPvCj.js → LearningPanel-BsKhgbeS.js} +1 -1
  53. package/ui/dist/assets/{LogsPanel-9zIJP1Xv.js → LogsPanel-C-H_axtp.js} +1 -1
  54. package/ui/dist/assets/{McpPanel-CNE7MhDu.js → McpPanel-BizAlt2h.js} +1 -1
  55. package/ui/dist/assets/{MemoryGraphPanel-9DEsbOZF.js → MemoryGraphPanel-Qle7Bodz.js} +1 -1
  56. package/ui/dist/assets/{MemoryWikiPanel-CqNen9A6.js → MemoryWikiPanel-CKY4HY4k.js} +1 -1
  57. package/ui/dist/assets/{MeshPanel-Bq3pHHIT.js → MeshPanel-D35hLDX4.js} +1 -1
  58. package/ui/dist/assets/MissionCanvas-BU6dvWdk.js +72 -0
  59. package/ui/dist/assets/{MissionChat-BDqlCplQ.js → MissionChat-BCxqk708.js} +1 -1
  60. package/ui/dist/assets/{MissionLibrary-9SMdJnfa.js → MissionLibrary-DtovbHf7.js} +1 -1
  61. package/ui/dist/assets/{MissionStart-Cm7C3kyo.js → MissionStart-DQCW6cLo.js} +1 -1
  62. package/ui/dist/assets/{Modal-B9KCAwCK.js → Modal-CpcFi-Gm.js} +1 -1
  63. package/ui/dist/assets/{NvidiaPanel-CpGBj1sn.js → NvidiaPanel-Dwvf8UD2.js} +1 -1
  64. package/ui/dist/assets/{OrganismPanel-DBHyylxC.js → OrganismPanel-mhCf2syl.js} +1 -1
  65. package/ui/dist/assets/{OverviewPanel-DII4H_R7.js → OverviewPanel-DiOrl6LB.js} +1 -1
  66. package/ui/dist/assets/{PageHeader-Bzb_WXw0.js → PageHeader-CPfyiZIM.js} +1 -1
  67. package/ui/dist/assets/{PersonaProfilesPanel-CXZTZhjo.js → PersonaProfilesPanel-BvQlozzS.js} +1 -1
  68. package/ui/dist/assets/{PersonasPanel-BYbD8XiV.js → PersonasPanel-G5Jz55AB.js} +1 -1
  69. package/ui/dist/assets/{PhoneDeskPanel-Bol7fCCN.js → PhoneDeskPanel-Cx4wlgRT.js} +1 -1
  70. package/ui/dist/assets/{RecipesPanel-BRbXRcEn.js → RecipesPanel-DB6Kuo1a.js} +1 -1
  71. package/ui/dist/assets/{SecurityPanel-BR3BT7Rb.js → SecurityPanel-BcnpsElV.js} +1 -1
  72. package/ui/dist/assets/{SelfImprovePanel-BX9xYBxl.js → SelfImprovePanel-do5xDzc8.js} +1 -1
  73. package/ui/dist/assets/{SelfProposalsPanel-BOoDEAYp.js → SelfProposalsPanel-DM4B-HLa.js} +1 -1
  74. package/ui/dist/assets/{SessionsPanel-BICnNmn0.js → SessionsPanel-Bl8h6Bfu.js} +1 -1
  75. package/ui/dist/assets/{SessionsTab-X10FeDWA.js → SessionsTab-hihe8Dc7.js} +1 -1
  76. package/ui/dist/assets/{SettingsPanel-MuC32AXw.js → SettingsPanel-Cp8decIS.js} +1 -1
  77. package/ui/dist/assets/SettingsView-BZIgBz0P.js +2 -0
  78. package/ui/dist/assets/{SkeletonLoader-fwI4Z-f0.js → SkeletonLoader-DLzSaIMH.js} +1 -1
  79. package/ui/dist/assets/{SkillsPanel-CKFndekU.js → SkillsPanel-B0VL9cO1.js} +1 -1
  80. package/ui/dist/assets/{SomaView-Ch7WlmBy.js → SomaView-BejcfdMM.js} +1 -1
  81. package/ui/dist/assets/{StatCard-Bj2Q_4WS.js → StatCard-Bt-57DK2.js} +1 -1
  82. package/ui/dist/assets/{StatusBadge-NtdTQ8_L.js → StatusBadge-BE0SQNPu.js} +1 -1
  83. package/ui/dist/assets/{Tabs-CC9aTVuL.js → Tabs-dEteLxhl.js} +1 -1
  84. package/ui/dist/assets/{TeamsPanel-DjFcLsdR.js → TeamsPanel-7UwGxnbj.js} +1 -1
  85. package/ui/dist/assets/{TelemetryPanel-k7gJbZyS.js → TelemetryPanel-CqbkTW3V.js} +1 -1
  86. package/ui/dist/assets/{TitanCanvas-MzLkpZhp.js → TitanCanvas-RVuBEoV1.js} +4 -4
  87. package/ui/dist/assets/{ToolsView-DcxwuM2l.js → ToolsView-C97QnPeY.js} +2 -2
  88. package/ui/dist/assets/{Tooltip-CFYHfpgQ.js → Tooltip-BGe4ZrLD.js} +1 -1
  89. package/ui/dist/assets/{TraceViewer-BfLO9vwI.js → TraceViewer-CSj_fZou.js} +1 -1
  90. package/ui/dist/assets/{TrainingPanel-DUl6qChY.js → TrainingPanel-43gDnkVS.js} +1 -1
  91. package/ui/dist/assets/{VoiceOverlay-Dj_cR5_Y.js → VoiceOverlay-CvZcewVV.js} +1 -1
  92. package/ui/dist/assets/{VramPanel-th0_Eo8o.js → VramPanel-nadiVKRZ.js} +1 -1
  93. package/ui/dist/assets/{WatchView-DyGhpKbv.js → WatchView-CUGArdWk.js} +1 -1
  94. package/ui/dist/assets/{WorkTab-BG5VBljJ.js → WorkTab-iCDNyX60.js} +1 -1
  95. package/ui/dist/assets/{WorkflowsPanel-C1hVHqAc.js → WorkflowsPanel-Do5EOPQ-.js} +1 -1
  96. package/ui/dist/assets/{archive-C2_hAJXj.js → archive-96Jj-QYz.js} +1 -1
  97. package/ui/dist/assets/{arrow-left-DFCBXvKS.js → arrow-left-DvmiAV7y.js} +1 -1
  98. package/ui/dist/assets/{book-open-BgDKDGcH.js → book-open-DvAaokKW.js} +1 -1
  99. package/ui/dist/assets/{bot-C4ICYImG.js → bot-DFsTWhzD.js} +1 -1
  100. package/ui/dist/assets/{chart-column-BIFJOG_f.js → chart-column-BWW8khga.js} +1 -1
  101. package/ui/dist/assets/{check-CmCL8yzl.js → check-4bqUIREX.js} +1 -1
  102. package/ui/dist/assets/{chevron-right-U0Ujye5i.js → chevron-right-DhAaVOkv.js} +1 -1
  103. package/ui/dist/assets/{chevron-up-B6uSBxbj.js → chevron-up-DhONR6eV.js} +1 -1
  104. package/ui/dist/assets/{circle-check-big-BFw1nom4.js → circle-check-big-CrrpTfnZ.js} +1 -1
  105. package/ui/dist/assets/{circle-stop-DbtGpdaw.js → circle-stop-BOU58Urf.js} +1 -1
  106. package/ui/dist/assets/{clipboard-list-Dd3_U8cK.js → clipboard-list-GcIgVrYh.js} +1 -1
  107. package/ui/dist/assets/{clock-DpJIc30t.js → clock-D5MlrzQb.js} +1 -1
  108. package/ui/dist/assets/{dollar-sign-DlrOHVzA.js → dollar-sign-B9t2KmrG.js} +1 -1
  109. package/ui/dist/assets/{download-CZ5kTONh.js → download-DzgUP-io.js} +1 -1
  110. package/ui/dist/assets/{external-link-CX-GvMky.js → external-link--90_rW_r.js} +1 -1
  111. package/ui/dist/assets/{file-text-BtTsNJbB.js → file-text-C-9as3zm.js} +1 -1
  112. package/ui/dist/assets/{flask-conical-BaPYppKH.js → flask-conical-BJnD20AK.js} +1 -1
  113. package/ui/dist/assets/{folder-BOnpha2-.js → folder-BXotS0h-.js} +1 -1
  114. package/ui/dist/assets/{funnel-DaNi6kwp.js → funnel-BkW9zcis.js} +1 -1
  115. package/ui/dist/assets/{git-branch-gs6g9dSe.js → git-branch-D7pbvkyu.js} +1 -1
  116. package/ui/dist/assets/{index-Dbv5oKsp.js → index-DczEfArU.js} +2 -2
  117. package/ui/dist/assets/index-DmgXt1oB.css +1 -0
  118. package/ui/dist/assets/{layers-BKZz8iD1.js → layers-BgUh-m00.js} +1 -1
  119. package/ui/dist/assets/{legacy-DbwFsW2A.js → legacy-Wbf7An22.js} +1 -1
  120. package/ui/dist/assets/{lightbulb-DX6YLtPe.js → lightbulb-4Yox7P7Z.js} +1 -1
  121. package/ui/dist/assets/{list-todo-qdMNm4-Q.js → list-todo-JeleiL5r.js} +1 -1
  122. package/ui/dist/assets/{message-square-Cwo5FOho.js → message-square-C9bK5TAD.js} +1 -1
  123. package/ui/dist/assets/{mic-BzvwK4IS.js → mic-DwEnBcFd.js} +1 -1
  124. package/ui/dist/assets/{missions-CYlXuJED.js → missions-Jbe_PHaT.js} +1 -1
  125. package/ui/dist/assets/{network-Dt-RBtO_.js → network-BjQmrmO8.js} +1 -1
  126. package/ui/dist/assets/{pause-Do3XNLtx.js → pause-9vYiD-5Y.js} +1 -1
  127. package/ui/dist/assets/{pencil-DAGs9RFs.js → pencil-CygyIvE1.js} +1 -1
  128. package/ui/dist/assets/{play-CNElkzEq.js → play-7ImYx-M6.js} +1 -1
  129. package/ui/dist/assets/{plug-DCgrVnB8.js → plug-DXmJpsfC.js} +1 -1
  130. package/ui/dist/assets/{plus-BnsXhqXc.js → plus-LIrhsu2s.js} +1 -1
  131. package/ui/dist/assets/{proxy-BXHdgwrk.js → proxy-B72L9I2p.js} +1 -1
  132. package/ui/dist/assets/{radio-BPz7sHXW.js → radio-DN9FsrLZ.js} +1 -1
  133. package/ui/dist/assets/{refresh-cw-Cs4oDMNE.js → refresh-cw-DyPWslHB.js} +1 -1
  134. package/ui/dist/assets/{rotate-ccw-DSpsA3Wr.js → rotate-ccw-C7z7lzst.js} +1 -1
  135. package/ui/dist/assets/{save-BhGg2pZh.js → save-Bl0vY0Ur.js} +1 -1
  136. package/ui/dist/assets/{search-BtxlIgqN.js → search-DLl1kVch.js} +1 -1
  137. package/ui/dist/assets/{send-BzKTXI3q.js → send-BqZ0Qzz-.js} +1 -1
  138. package/ui/dist/assets/{server-B1gIgixS.js → server-DvPKxeOK.js} +1 -1
  139. package/ui/dist/assets/{shield-check-C39B-Wi3.js → shield-check-DMM8OpD5.js} +1 -1
  140. package/ui/dist/assets/{terminal-CubaeYlJ.js → terminal-DD6OAIa2.js} +1 -1
  141. package/ui/dist/assets/{test-tube-CYYLfFIz.js → test-tube-BoC1tTKm.js} +1 -1
  142. package/ui/dist/assets/{toggle-right-BQ3iDgLG.js → toggle-right-CrEdx-9K.js} +1 -1
  143. package/ui/dist/assets/{trash-2-CSxfLiVB.js → trash-2-Co50XYSn.js} +1 -1
  144. package/ui/dist/assets/{trending-up-DXxKT18Q.js → trending-up-SFD19agk.js} +1 -1
  145. package/ui/dist/assets/{trophy-osEOm2Vi.js → trophy-DLTd-oCR.js} +1 -1
  146. package/ui/dist/assets/{volume-2-C1OkTurz.js → volume-2-vQvjPYVu.js} +1 -1
  147. package/ui/dist/assets/{wifi-off-DAhvsjnD.js → wifi-off-DVwDeeLz.js} +1 -1
  148. package/ui/dist/index.html +2 -2
  149. package/ui/dist/sw.js +1 -1
  150. package/ui/dist/assets/CPLayout-CHrlktMs.js +0 -2
  151. package/ui/dist/assets/InfraView-DNYgRXkB.js +0 -2
  152. package/ui/dist/assets/IntelligenceView-BUKpVpDQ.js +0 -2
  153. package/ui/dist/assets/MissionCanvas-Ci0hbAF0.js +0 -69
  154. package/ui/dist/assets/SettingsView-Cv9IZqiU.js +0 -2
  155. package/ui/dist/assets/index-OZm1iJy9.css +0 -1
@@ -200,7 +200,149 @@ async function tickPlanning(goal, state) {
200
200
  state.phase = "delegating";
201
201
  appendHistory(state, "delegating", `Planned: ${Object.keys(state.subtaskStates).length} subtasks classified`);
202
202
  }
203
+ const MAX_BURST_PARALLEL = 4;
204
+ async function tryBurstDispatch(goal, state) {
205
+ const ready = await pickAllReadySubtasks(goal, state, MAX_BURST_PARALLEL);
206
+ if (ready.length < 2) return "fallthrough";
207
+ const validated = [];
208
+ for (const sub of ready) {
209
+ const subState = state.subtaskStates[sub.id];
210
+ if (!subState) continue;
211
+ const cap = subState.maxAttempts ?? 5;
212
+ if (subState.attempts + 1 > cap) continue;
213
+ const strategy = nextFallback(subState.kind, subState.attempts, subState.lastError, cap);
214
+ if (!strategy) continue;
215
+ validated.push({ subtask: sub, subState, strategy });
216
+ }
217
+ if (validated.length < 2) return "fallthrough";
218
+ const batchStartedAt = (/* @__PURE__ */ new Date()).toISOString();
219
+ state.parallelBatch = {
220
+ ids: validated.map((v) => v.subtask.id),
221
+ startedAt: batchStartedAt
222
+ };
223
+ for (const v of validated) {
224
+ v.subState.attempts += 1;
225
+ v.subState.specialist = v.strategy.specialist;
226
+ v.subState.pendingSpawn = {
227
+ attemptedAt: batchStartedAt,
228
+ specialist: v.strategy.specialist
229
+ };
230
+ try {
231
+ emitAgentEvent({
232
+ type: "agent_spawn",
233
+ agentId: v.strategy.specialist,
234
+ agentName: v.strategy.specialist,
235
+ timestamp: Date.now(),
236
+ data: {
237
+ goalId: goal.id,
238
+ subtaskId: v.subtask.id,
239
+ subtaskTitle: v.subtask.title,
240
+ subtaskKind: v.subState.kind,
241
+ attempt: v.subState.attempts,
242
+ burst: true,
243
+ burstSize: validated.length
244
+ }
245
+ });
246
+ } catch {
247
+ }
248
+ }
249
+ appendHistory(
250
+ state,
251
+ "observing",
252
+ `Burst dispatch: ${validated.length} subtasks in parallel (${validated.map((v) => v.subtask.title.slice(0, 32)).join(" | ")})`
253
+ );
254
+ state.phase = "observing";
255
+ const burstStartMs = Date.now();
256
+ const settled = await Promise.allSettled(
257
+ validated.map((v) => structuredSpawn({
258
+ specialistId: v.strategy.specialist,
259
+ task: `${v.subtask.title}
260
+
261
+ ${v.subtask.description}${v.strategy.promptAdjustment ?? ""}`,
262
+ modelOverride: v.strategy.modelOverride,
263
+ toolAllowlist: routeForKind(v.subState.kind).toolAllowlist,
264
+ maxRounds: v.strategy.maxRounds,
265
+ goalId: goal.id
266
+ }))
267
+ );
268
+ const burstDurationMs = Date.now() - burstStartMs;
269
+ let happyCount = 0;
270
+ for (let i = 0; i < validated.length; i++) {
271
+ const v = validated[i];
272
+ const outcome = settled[i];
273
+ v.subState.pendingSpawn = void 0;
274
+ if (outcome.status === "rejected") {
275
+ v.subState.lastError = outcome.reason?.message ?? String(outcome.reason);
276
+ appendHistory(state, "iterating", `Burst spawn threw for ${v.subtask.id}: ${v.subState.lastError.slice(0, 100)}`);
277
+ continue;
278
+ }
279
+ const result = outcome.value;
280
+ recordSpend(state, {
281
+ elapsedMs: burstDurationMs / validated.length,
282
+ // amortized; the wall-clock saving is the point
283
+ tokens: result.tokensUsed ?? 0,
284
+ costUsd: result.costUsd ?? 0
285
+ });
286
+ v.subState.artifacts = [.../* @__PURE__ */ new Set([
287
+ ...v.subState.artifacts,
288
+ ...result.artifacts.map((a) => a.ref)
289
+ ])];
290
+ try {
291
+ emitAgentEvent({
292
+ type: "agent_done",
293
+ agentId: v.strategy.specialist,
294
+ agentName: v.strategy.specialist,
295
+ timestamp: Date.now(),
296
+ data: {
297
+ goalId: goal.id,
298
+ subtaskId: v.subtask.id,
299
+ subtaskTitle: v.subtask.title,
300
+ status: result.status,
301
+ reasoning: result.reasoning,
302
+ artifactCount: result.artifacts.length,
303
+ artifacts: result.artifacts.map((a) => ({ ref: a.ref, type: a.type })),
304
+ toolsUsed: result.toolsUsed ?? [],
305
+ tokensUsed: result.tokensUsed ?? 0,
306
+ costUsd: result.costUsd ?? 0,
307
+ durationMs: burstDurationMs,
308
+ model: v.strategy.modelOverride ?? v.strategy.specialist,
309
+ burst: true
310
+ }
311
+ });
312
+ } catch {
313
+ }
314
+ if (result.status === "done") {
315
+ v.subState.consecutiveNeedsInfoCount = 0;
316
+ v.subState.lastSpawnResult = result;
317
+ try {
318
+ const { completeSubtask } = await import("./goals.js");
319
+ completeSubtask(goal.id, v.subtask.id, result.reasoning || "completed via burst");
320
+ } catch (err) {
321
+ v.subState.lastError = `Burst completion persist failed: ${err.message}`;
322
+ continue;
323
+ }
324
+ happyCount++;
325
+ } else if (result.status === "failed") {
326
+ v.subState.lastError = result.reasoning || "failed";
327
+ v.subState.consecutiveNeedsInfoCount = 0;
328
+ } else {
329
+ v.subState.lastError = result.reasoning || `Burst returned ${result.status}; deferring to single-path retry.`;
330
+ }
331
+ }
332
+ state.parallelBatch = void 0;
333
+ appendHistory(
334
+ state,
335
+ "delegating",
336
+ `Burst complete: ${happyCount}/${validated.length} succeeded in ${burstDurationMs}ms (parallel)`
337
+ );
338
+ state.phase = "delegating";
339
+ return "handled";
340
+ }
203
341
  async function tickDelegating(goal, state) {
342
+ if (!state.parallelBatch) {
343
+ const burst = await tryBurstDispatch(goal, state);
344
+ if (burst === "handled") return;
345
+ }
204
346
  const next = await pickNextReadySubtask(goal, state);
205
347
  if (!next) {
206
348
  let freshGoal = goal;
@@ -900,12 +1042,19 @@ async function tickCancelled(goal, state) {
900
1042
  appendHistory(state, "cancelled", "Cancelled by user");
901
1043
  }
902
1044
  async function pickNextReadySubtask(goal, state) {
903
- const cap = (id) => state.subtaskStates[id]?.maxAttempts ?? 5;
1045
+ const ready = await pickAllReadySubtasks(goal, state, 1);
1046
+ return ready[0] ?? null;
1047
+ }
1048
+ async function pickAllReadySubtasks(goal, state, cap) {
1049
+ if (cap < 1) return [];
1050
+ const attemptCap = (id) => state.subtaskStates[id]?.maxAttempts ?? 5;
1051
+ const ready = [];
904
1052
  for (const sub of goal.subtasks || []) {
1053
+ if (ready.length >= cap) break;
905
1054
  if (sub.status !== "pending") continue;
906
1055
  const subState = state.subtaskStates[sub.id];
907
1056
  if (!subState) continue;
908
- const exhaustedAttempts = subState.attempts >= cap(sub.id) || subState.attempts >= state.budgetCaps.maxRetries;
1057
+ const exhaustedAttempts = subState.attempts >= attemptCap(sub.id) || subState.attempts >= state.budgetCaps.maxRetries;
909
1058
  if (subState.verificationResult?.passed === false && exhaustedAttempts) {
910
1059
  try {
911
1060
  const { failSubtask } = await import("./goals.js");
@@ -920,9 +1069,9 @@ async function pickNextReadySubtask(goal, state) {
920
1069
  return dep?.status === "done";
921
1070
  });
922
1071
  if (!depsSatisfied) continue;
923
- return sub;
1072
+ ready.push(sub);
924
1073
  }
925
- return null;
1074
+ return ready;
926
1075
  }
927
1076
  function slugForGoal(title) {
928
1077
  return title.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "").slice(0, 40) || "report";
@@ -1229,6 +1378,7 @@ export {
1229
1378
  listActiveDrivers,
1230
1379
  listAllDrivers,
1231
1380
  pauseDriver,
1381
+ pickAllReadySubtasks,
1232
1382
  reprioritizeDriver,
1233
1383
  resumeDriverControl,
1234
1384
  shouldAutoCancelOnRecurringBlock,