titan-agent 6.2.1 → 6.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agent/goalDriver.js +154 -4
- package/dist/agent/goalDriver.js.map +1 -1
- package/dist/agent/orchestrator.js +9 -10
- package/dist/agent/orchestrator.js.map +1 -1
- package/dist/agent/planner.js +42 -10
- package/dist/agent/planner.js.map +1 -1
- package/dist/agent/systemPromptParts.js +13 -16
- package/dist/agent/systemPromptParts.js.map +1 -1
- package/dist/gateway/routes/update.js +100 -0
- package/dist/gateway/routes/update.js.map +1 -0
- package/dist/gateway/server.js +2 -65
- package/dist/gateway/server.js.map +1 -1
- package/dist/utils/constants.js +1 -1
- package/dist/utils/constants.js.map +1 -1
- package/package.json +1 -1
- package/ui/dist/assets/{AuditPanel-DuxwAH5U.js → AuditPanel-BmFAKA7p.js} +1 -1
- package/ui/dist/assets/{AutonomyPanel-VWBgurnv.js → AutonomyPanel-BzuCEsiG.js} +1 -1
- package/ui/dist/assets/{AutopilotPanel-Dw8MYOtj.js → AutopilotPanel-DA1vFEl4.js} +1 -1
- package/ui/dist/assets/{AutoresearchPanel-CpEX0Zub.js → AutoresearchPanel-BeUCXYtX.js} +1 -1
- package/ui/dist/assets/{BackupPanel-n41_6i6x.js → BackupPanel-B6N1pfMT.js} +1 -1
- package/ui/dist/assets/{BrowserPanel-DEBTIt6h.js → BrowserPanel-BGHaPi3O.js} +1 -1
- package/ui/dist/assets/{CPActivity-em82PTiQ.js → CPActivity-BUSwjFj2.js} +1 -1
- package/ui/dist/assets/{CPAgentDetail-Bd8lKqcL.js → CPAgentDetail-DlUEVujH.js} +1 -1
- package/ui/dist/assets/{CPAgents-GRBrDd6c.js → CPAgents-CnRmsSMo.js} +1 -1
- package/ui/dist/assets/{CPApprovals-DdLaCgJZ.js → CPApprovals-CXdkzebd.js} +1 -1
- package/ui/dist/assets/{CPCosts-Cm8Hv9fv.js → CPCosts-CfcyIUZg.js} +1 -1
- package/ui/dist/assets/{CPDashboard-Dm9vUKLu.js → CPDashboard-DHlfE1mT.js} +1 -1
- package/ui/dist/assets/{CPFiles-DxMn1x2m.js → CPFiles-DyV9vsjE.js} +1 -1
- package/ui/dist/assets/{CPGoals-Wr1tCn6y.js → CPGoals-C17G2F0e.js} +1 -1
- package/ui/dist/assets/{CPInbox-CGYpK1rG.js → CPInbox-D5A3ja_Q.js} +1 -1
- package/ui/dist/assets/{CPIssueDetail-dTU59sgQ.js → CPIssueDetail-CoPv27Ll.js} +1 -1
- package/ui/dist/assets/{CPIssues-wgjI2eqS.js → CPIssues-C9EdfW1J.js} +1 -1
- package/ui/dist/assets/CPLayout-CHrlktMs.js +2 -0
- package/ui/dist/assets/{CPOrg-eT6LNmyy.js → CPOrg-DzoVDLKI.js} +1 -1
- package/ui/dist/assets/{CPRuns-B3sdo5g2.js → CPRuns-BHAyFv0K.js} +1 -1
- package/ui/dist/assets/{CPSocial-B99Mfee_.js → CPSocial-CjHD8dKM.js} +1 -1
- package/ui/dist/assets/{CPVoice-D4J6yFWu.js → CPVoice-aybMotU5.js} +1 -1
- package/ui/dist/assets/{ChannelsPanel--lhZqYLD.js → ChannelsPanel-8KfvAEYM.js} +1 -1
- package/ui/dist/assets/{CheckpointsPanel-DaOIUcEi.js → CheckpointsPanel-BCyLRLcg.js} +1 -1
- package/ui/dist/assets/{CommandPostHub-Pq9lQMW5.js → CommandPostHub-Ce-mWsu2.js} +3 -3
- package/ui/dist/assets/{CronPanel-CywjWM7O.js → CronPanel-A9JHvU_O.js} +1 -1
- package/ui/dist/assets/{DataTable-Bt0cxehB.js → DataTable-ol6IZMRj.js} +1 -1
- package/ui/dist/assets/{DreamPanel-Ct7MuLzD.js → DreamPanel-ZiOF8ybh.js} +1 -1
- package/ui/dist/assets/{EmptyState-iLOrbdU7.js → EmptyState-B1i1ZK0x.js} +1 -1
- package/ui/dist/assets/{EvalHarnessPanel-7KKDzeXw.js → EvalHarnessPanel-DRGc1zbp.js} +1 -1
- package/ui/dist/assets/{EvalPanel-70LzkLDO.js → EvalPanel-B_fiFImG.js} +1 -1
- package/ui/dist/assets/{FileViewer-h6A7YYTm.js → FileViewer-D14G6MQq.js} +1 -1
- package/ui/dist/assets/{FilesPanel-l8qC6eLD.js → FilesPanel-BIsMoSfg.js} +1 -1
- package/ui/dist/assets/{FleetPanel-Z3ResHIb.js → FleetPanel-CSjOOsbX.js} +1 -1
- package/ui/dist/assets/{HomelabPanel-9QhrXzo1.js → HomelabPanel-XHMxqiHu.js} +1 -1
- package/ui/dist/assets/InfraView-DNYgRXkB.js +2 -0
- package/ui/dist/assets/{InlineEditableField-DsVfGRH2.js → InlineEditableField-AOS-LBh_.js} +1 -1
- package/ui/dist/assets/{Input-Bzh0-cXU.js → Input-CTK9oH9g.js} +1 -1
- package/ui/dist/assets/{IntegrationsPanel-DBOdLYJ8.js → IntegrationsPanel-BKuC_5El.js} +1 -1
- package/ui/dist/assets/IntelligenceView-BUKpVpDQ.js +2 -0
- package/ui/dist/assets/{LearningPanel-CiSLVxUX.js → LearningPanel-RpDaPvCj.js} +1 -1
- package/ui/dist/assets/{LogsPanel-CPAAItsq.js → LogsPanel-9zIJP1Xv.js} +1 -1
- package/ui/dist/assets/{McpPanel-MYWE2Zqs.js → McpPanel-CNE7MhDu.js} +1 -1
- package/ui/dist/assets/{MemoryGraphPanel-BFr51D_1.js → MemoryGraphPanel-9DEsbOZF.js} +1 -1
- package/ui/dist/assets/{MemoryWikiPanel-BA7GUxhg.js → MemoryWikiPanel-CqNen9A6.js} +1 -1
- package/ui/dist/assets/{MeshPanel-5BDbwBVR.js → MeshPanel-Bq3pHHIT.js} +1 -1
- package/ui/dist/assets/{MissionCanvas-CrDZIQX6.js → MissionCanvas-Ci0hbAF0.js} +1 -1
- package/ui/dist/assets/{MissionChat-BDTWMQjj.js → MissionChat-BDqlCplQ.js} +1 -1
- package/ui/dist/assets/{MissionLibrary-DEPH2eEu.js → MissionLibrary-9SMdJnfa.js} +1 -1
- package/ui/dist/assets/{MissionStart-COLFZLHB.js → MissionStart-Cm7C3kyo.js} +1 -1
- package/ui/dist/assets/{Modal-nvni-LGR.js → Modal-B9KCAwCK.js} +1 -1
- package/ui/dist/assets/{NvidiaPanel-BCgVrdWt.js → NvidiaPanel-CpGBj1sn.js} +1 -1
- package/ui/dist/assets/{OrganismPanel-Cab4MV9i.js → OrganismPanel-DBHyylxC.js} +1 -1
- package/ui/dist/assets/{OverviewPanel-isNUxBki.js → OverviewPanel-DII4H_R7.js} +1 -1
- package/ui/dist/assets/{PageHeader-BJ1jHtOy.js → PageHeader-Bzb_WXw0.js} +1 -1
- package/ui/dist/assets/{PersonaProfilesPanel-BGiDuDPj.js → PersonaProfilesPanel-CXZTZhjo.js} +1 -1
- package/ui/dist/assets/{PersonasPanel-4-USk8fm.js → PersonasPanel-BYbD8XiV.js} +1 -1
- package/ui/dist/assets/{PhoneDeskPanel-CUz5YVUY.js → PhoneDeskPanel-Bol7fCCN.js} +1 -1
- package/ui/dist/assets/{RecipesPanel-DJd6Otdy.js → RecipesPanel-BRbXRcEn.js} +1 -1
- package/ui/dist/assets/{SecurityPanel-CKqTnhNY.js → SecurityPanel-BR3BT7Rb.js} +1 -1
- package/ui/dist/assets/{SelfImprovePanel-BiCjKpTM.js → SelfImprovePanel-BX9xYBxl.js} +1 -1
- package/ui/dist/assets/{SelfProposalsPanel-BQCwEHdF.js → SelfProposalsPanel-BOoDEAYp.js} +1 -1
- package/ui/dist/assets/{SessionsPanel-MTMSODP7.js → SessionsPanel-BICnNmn0.js} +1 -1
- package/ui/dist/assets/{SessionsTab-CEFFZWMK.js → SessionsTab-X10FeDWA.js} +1 -1
- package/ui/dist/assets/{SettingsPanel-CniESkQQ.js → SettingsPanel-MuC32AXw.js} +1 -1
- package/ui/dist/assets/SettingsView-Cv9IZqiU.js +2 -0
- package/ui/dist/assets/{SkeletonLoader-IpWkLmoy.js → SkeletonLoader-fwI4Z-f0.js} +1 -1
- package/ui/dist/assets/{SkillsPanel-CCP-gCR4.js → SkillsPanel-CKFndekU.js} +1 -1
- package/ui/dist/assets/{SomaView-BK_thK9H.js → SomaView-Ch7WlmBy.js} +1 -1
- package/ui/dist/assets/{StatCard-I0fVw2CH.js → StatCard-Bj2Q_4WS.js} +1 -1
- package/ui/dist/assets/{StatusBadge-e3tFf05B.js → StatusBadge-NtdTQ8_L.js} +1 -1
- package/ui/dist/assets/{Tabs-vGpPiBzr.js → Tabs-CC9aTVuL.js} +1 -1
- package/ui/dist/assets/{TeamsPanel-AFIQBzRK.js → TeamsPanel-DjFcLsdR.js} +1 -1
- package/ui/dist/assets/{TelemetryPanel-DKZGVmcp.js → TelemetryPanel-k7gJbZyS.js} +1 -1
- package/ui/dist/assets/{TitanCanvas-CqvuuIjd.js → TitanCanvas-MzLkpZhp.js} +25 -25
- package/ui/dist/assets/{ToolsView-DnIkrUvP.js → ToolsView-DcxwuM2l.js} +2 -2
- package/ui/dist/assets/{Tooltip-DNc5AWi0.js → Tooltip-CFYHfpgQ.js} +1 -1
- package/ui/dist/assets/{TraceViewer-MD9YRFVc.js → TraceViewer-BfLO9vwI.js} +1 -1
- package/ui/dist/assets/{TrainingPanel-BfXoR7_N.js → TrainingPanel-DUl6qChY.js} +1 -1
- package/ui/dist/assets/{VoiceOverlay-Bl81c4yf.js → VoiceOverlay-Dj_cR5_Y.js} +1 -1
- package/ui/dist/assets/{VramPanel-Ba8H8Qs2.js → VramPanel-th0_Eo8o.js} +1 -1
- package/ui/dist/assets/{WatchView-CoLHPGd7.js → WatchView-DyGhpKbv.js} +1 -1
- package/ui/dist/assets/{WorkTab-UppfR_AF.js → WorkTab-BG5VBljJ.js} +1 -1
- package/ui/dist/assets/{WorkflowsPanel-CdN7Epxr.js → WorkflowsPanel-C1hVHqAc.js} +1 -1
- package/ui/dist/assets/{archive-DWgNklp0.js → archive-C2_hAJXj.js} +1 -1
- package/ui/dist/assets/{arrow-left-CW5NV7E0.js → arrow-left-DFCBXvKS.js} +1 -1
- package/ui/dist/assets/{book-open-DRI_Y6cW.js → book-open-BgDKDGcH.js} +1 -1
- package/ui/dist/assets/{bot-DSGZRM5O.js → bot-C4ICYImG.js} +1 -1
- package/ui/dist/assets/{chart-column-D6yK9tts.js → chart-column-BIFJOG_f.js} +1 -1
- package/ui/dist/assets/{check-Cxp-6q4k.js → check-CmCL8yzl.js} +1 -1
- package/ui/dist/assets/{chevron-right-DkIMxdwH.js → chevron-right-U0Ujye5i.js} +1 -1
- package/ui/dist/assets/{chevron-up-BbDu8x1d.js → chevron-up-B6uSBxbj.js} +1 -1
- package/ui/dist/assets/{circle-check-big-DnJPBAGU.js → circle-check-big-BFw1nom4.js} +1 -1
- package/ui/dist/assets/{circle-stop-DOe0OacY.js → circle-stop-DbtGpdaw.js} +1 -1
- package/ui/dist/assets/{clipboard-list-Dj5RQbT8.js → clipboard-list-Dd3_U8cK.js} +1 -1
- package/ui/dist/assets/{clock-BS8fh7Rt.js → clock-DpJIc30t.js} +1 -1
- package/ui/dist/assets/{dollar-sign-DMXBeaTj.js → dollar-sign-DlrOHVzA.js} +1 -1
- package/ui/dist/assets/{download-BykARpbG.js → download-CZ5kTONh.js} +1 -1
- package/ui/dist/assets/{external-link-BfXhMi9L.js → external-link-CX-GvMky.js} +1 -1
- package/ui/dist/assets/{file-text-CUkSytWL.js → file-text-BtTsNJbB.js} +1 -1
- package/ui/dist/assets/{flask-conical-BS4cuENu.js → flask-conical-BaPYppKH.js} +1 -1
- package/ui/dist/assets/{folder-BDwoUobN.js → folder-BOnpha2-.js} +1 -1
- package/ui/dist/assets/{funnel-xr6Dd1ub.js → funnel-DaNi6kwp.js} +1 -1
- package/ui/dist/assets/{git-branch-C0Qk52W8.js → git-branch-gs6g9dSe.js} +1 -1
- package/ui/dist/assets/{index-CmaGnHzR.js → index-Dbv5oKsp.js} +2 -2
- package/ui/dist/assets/{layers-DPHYdeRk.js → layers-BKZz8iD1.js} +1 -1
- package/ui/dist/assets/{legacy-DzagVk5C.js → legacy-DbwFsW2A.js} +1 -1
- package/ui/dist/assets/{lightbulb-Bj6cj6Xl.js → lightbulb-DX6YLtPe.js} +1 -1
- package/ui/dist/assets/{list-todo-Cm4jNFHV.js → list-todo-qdMNm4-Q.js} +1 -1
- package/ui/dist/assets/{message-square-BrWLAovN.js → message-square-Cwo5FOho.js} +1 -1
- package/ui/dist/assets/{mic-BXNK4d7X.js → mic-BzvwK4IS.js} +1 -1
- package/ui/dist/assets/{missions-DEjMYSre.js → missions-CYlXuJED.js} +1 -1
- package/ui/dist/assets/{network-CrQn1GKv.js → network-Dt-RBtO_.js} +1 -1
- package/ui/dist/assets/{pause-DS5xgDMT.js → pause-Do3XNLtx.js} +1 -1
- package/ui/dist/assets/{pencil-DAI6FtFQ.js → pencil-DAGs9RFs.js} +1 -1
- package/ui/dist/assets/{play-DxBy837b.js → play-CNElkzEq.js} +1 -1
- package/ui/dist/assets/{plug-D0Bstfm0.js → plug-DCgrVnB8.js} +1 -1
- package/ui/dist/assets/{plus-DxgNIt8h.js → plus-BnsXhqXc.js} +1 -1
- package/ui/dist/assets/{proxy-KYomRnLW.js → proxy-BXHdgwrk.js} +1 -1
- package/ui/dist/assets/{radio-2vniRFTO.js → radio-BPz7sHXW.js} +1 -1
- package/ui/dist/assets/{refresh-cw-BFBnnWj8.js → refresh-cw-Cs4oDMNE.js} +1 -1
- package/ui/dist/assets/{rotate-ccw-B9wWlKRc.js → rotate-ccw-DSpsA3Wr.js} +1 -1
- package/ui/dist/assets/{save--wCYre_u.js → save-BhGg2pZh.js} +1 -1
- package/ui/dist/assets/{search-DOD1aOm8.js → search-BtxlIgqN.js} +1 -1
- package/ui/dist/assets/{send-Bb57UxT7.js → send-BzKTXI3q.js} +1 -1
- package/ui/dist/assets/{server-CBsCfofY.js → server-B1gIgixS.js} +1 -1
- package/ui/dist/assets/{shield-check-B24N03VU.js → shield-check-C39B-Wi3.js} +1 -1
- package/ui/dist/assets/{terminal-CZ77Swtc.js → terminal-CubaeYlJ.js} +1 -1
- package/ui/dist/assets/{test-tube-CkkvIu5j.js → test-tube-CYYLfFIz.js} +1 -1
- package/ui/dist/assets/{toggle-right-DgphAedS.js → toggle-right-BQ3iDgLG.js} +1 -1
- package/ui/dist/assets/{trash-2-C5KNXS-O.js → trash-2-CSxfLiVB.js} +1 -1
- package/ui/dist/assets/{trending-up-B3H8xrGD.js → trending-up-DXxKT18Q.js} +1 -1
- package/ui/dist/assets/{trophy-C-xSgHD2.js → trophy-osEOm2Vi.js} +1 -1
- package/ui/dist/assets/{volume-2-BXwRjeve.js → volume-2-C1OkTurz.js} +1 -1
- package/ui/dist/assets/{wifi-off-DOm__Zn6.js → wifi-off-DAhvsjnD.js} +1 -1
- package/ui/dist/index.html +1 -1
- package/ui/dist/sw.js +1 -1
- package/ui/dist/assets/CPLayout-CBtGEYSs.js +0 -2
- package/ui/dist/assets/InfraView-G1q6vF0Q.js +0 -2
- package/ui/dist/assets/IntelligenceView-J8Nbh4zs.js +0 -2
- package/ui/dist/assets/SettingsView-2AwXqlvc.js +0 -2
package/dist/agent/goalDriver.js
CHANGED
|
@@ -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
|
|
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 >=
|
|
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
|
-
|
|
1072
|
+
ready.push(sub);
|
|
924
1073
|
}
|
|
925
|
-
return
|
|
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,
|