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.
- 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/utils/constants.js +1 -1
- package/dist/utils/constants.js.map +1 -1
- package/package.json +1 -1
- package/ui/dist/assets/{AuditPanel-BmFAKA7p.js → AuditPanel-TdDAyJUQ.js} +1 -1
- package/ui/dist/assets/{AutonomyPanel-BzuCEsiG.js → AutonomyPanel-B6EIpuFt.js} +1 -1
- package/ui/dist/assets/{AutopilotPanel-DA1vFEl4.js → AutopilotPanel-CLe14-eq.js} +1 -1
- package/ui/dist/assets/{AutoresearchPanel-BeUCXYtX.js → AutoresearchPanel-C14q_kh7.js} +1 -1
- package/ui/dist/assets/{BackupPanel-B6N1pfMT.js → BackupPanel-CoEbryip.js} +1 -1
- package/ui/dist/assets/{BrowserPanel-BGHaPi3O.js → BrowserPanel-CRTJOXQV.js} +1 -1
- package/ui/dist/assets/{CPActivity-BUSwjFj2.js → CPActivity-DjT8p5Dn.js} +1 -1
- package/ui/dist/assets/{CPAgentDetail-DlUEVujH.js → CPAgentDetail-CR1ciISN.js} +1 -1
- package/ui/dist/assets/{CPAgents-CnRmsSMo.js → CPAgents-DIYCdpQR.js} +1 -1
- package/ui/dist/assets/{CPApprovals-CXdkzebd.js → CPApprovals-DAKmaSkN.js} +1 -1
- package/ui/dist/assets/{CPCosts-CfcyIUZg.js → CPCosts-CCCh_VY0.js} +1 -1
- package/ui/dist/assets/{CPDashboard-DHlfE1mT.js → CPDashboard-CyKZGlHB.js} +1 -1
- package/ui/dist/assets/{CPFiles-DyV9vsjE.js → CPFiles-CI252ucO.js} +1 -1
- package/ui/dist/assets/{CPGoals-C17G2F0e.js → CPGoals-BtcgDUY5.js} +1 -1
- package/ui/dist/assets/{CPInbox-D5A3ja_Q.js → CPInbox-igQoKOuB.js} +1 -1
- package/ui/dist/assets/{CPIssueDetail-CoPv27Ll.js → CPIssueDetail-DD5iL5mT.js} +1 -1
- package/ui/dist/assets/{CPIssues-C9EdfW1J.js → CPIssues-C1XUjgdv.js} +1 -1
- package/ui/dist/assets/CPLayout-VXhuxAHd.js +2 -0
- package/ui/dist/assets/{CPOrg-DzoVDLKI.js → CPOrg-JyXp44DB.js} +1 -1
- package/ui/dist/assets/{CPRuns-BHAyFv0K.js → CPRuns-C-gZX28e.js} +1 -1
- package/ui/dist/assets/{CPSocial-CjHD8dKM.js → CPSocial-sMl4vqmX.js} +1 -1
- package/ui/dist/assets/{CPVoice-aybMotU5.js → CPVoice-BXTY3vl7.js} +1 -1
- package/ui/dist/assets/{ChannelsPanel-8KfvAEYM.js → ChannelsPanel-rF_yHmYD.js} +1 -1
- package/ui/dist/assets/{CheckpointsPanel-BCyLRLcg.js → CheckpointsPanel-DO0QSjuz.js} +1 -1
- package/ui/dist/assets/{CommandPostHub-Ce-mWsu2.js → CommandPostHub-BLnNTvBO.js} +3 -3
- package/ui/dist/assets/{CronPanel-A9JHvU_O.js → CronPanel-DELTcCV-.js} +1 -1
- package/ui/dist/assets/{DataTable-ol6IZMRj.js → DataTable-BmbYppBc.js} +1 -1
- package/ui/dist/assets/{DreamPanel-ZiOF8ybh.js → DreamPanel-B28qIraZ.js} +1 -1
- package/ui/dist/assets/{EmptyState-B1i1ZK0x.js → EmptyState-CxJGUl_w.js} +1 -1
- package/ui/dist/assets/{EvalHarnessPanel-DRGc1zbp.js → EvalHarnessPanel-DvI-dsqQ.js} +1 -1
- package/ui/dist/assets/{EvalPanel-B_fiFImG.js → EvalPanel-DKdn69V8.js} +1 -1
- package/ui/dist/assets/{FileViewer-D14G6MQq.js → FileViewer-Deg5Z7ng.js} +1 -1
- package/ui/dist/assets/{FilesPanel-BIsMoSfg.js → FilesPanel-DDRjQukY.js} +1 -1
- package/ui/dist/assets/{FleetPanel-CSjOOsbX.js → FleetPanel-eEudyOkP.js} +1 -1
- package/ui/dist/assets/{HomelabPanel-XHMxqiHu.js → HomelabPanel-Dov1f68P.js} +1 -1
- package/ui/dist/assets/InfraView-DgasEqoR.js +2 -0
- package/ui/dist/assets/{InlineEditableField-AOS-LBh_.js → InlineEditableField-4ZA-KEfv.js} +1 -1
- package/ui/dist/assets/{Input-CTK9oH9g.js → Input-C7lzcGqx.js} +1 -1
- package/ui/dist/assets/{IntegrationsPanel-BKuC_5El.js → IntegrationsPanel-BmnWsnvF.js} +1 -1
- package/ui/dist/assets/IntelligenceView-DXYSyS1a.js +2 -0
- package/ui/dist/assets/{LearningPanel-RpDaPvCj.js → LearningPanel-BsKhgbeS.js} +1 -1
- package/ui/dist/assets/{LogsPanel-9zIJP1Xv.js → LogsPanel-C-H_axtp.js} +1 -1
- package/ui/dist/assets/{McpPanel-CNE7MhDu.js → McpPanel-BizAlt2h.js} +1 -1
- package/ui/dist/assets/{MemoryGraphPanel-9DEsbOZF.js → MemoryGraphPanel-Qle7Bodz.js} +1 -1
- package/ui/dist/assets/{MemoryWikiPanel-CqNen9A6.js → MemoryWikiPanel-CKY4HY4k.js} +1 -1
- package/ui/dist/assets/{MeshPanel-Bq3pHHIT.js → MeshPanel-D35hLDX4.js} +1 -1
- package/ui/dist/assets/MissionCanvas-BU6dvWdk.js +72 -0
- package/ui/dist/assets/{MissionChat-BDqlCplQ.js → MissionChat-BCxqk708.js} +1 -1
- package/ui/dist/assets/{MissionLibrary-9SMdJnfa.js → MissionLibrary-DtovbHf7.js} +1 -1
- package/ui/dist/assets/{MissionStart-Cm7C3kyo.js → MissionStart-DQCW6cLo.js} +1 -1
- package/ui/dist/assets/{Modal-B9KCAwCK.js → Modal-CpcFi-Gm.js} +1 -1
- package/ui/dist/assets/{NvidiaPanel-CpGBj1sn.js → NvidiaPanel-Dwvf8UD2.js} +1 -1
- package/ui/dist/assets/{OrganismPanel-DBHyylxC.js → OrganismPanel-mhCf2syl.js} +1 -1
- package/ui/dist/assets/{OverviewPanel-DII4H_R7.js → OverviewPanel-DiOrl6LB.js} +1 -1
- package/ui/dist/assets/{PageHeader-Bzb_WXw0.js → PageHeader-CPfyiZIM.js} +1 -1
- package/ui/dist/assets/{PersonaProfilesPanel-CXZTZhjo.js → PersonaProfilesPanel-BvQlozzS.js} +1 -1
- package/ui/dist/assets/{PersonasPanel-BYbD8XiV.js → PersonasPanel-G5Jz55AB.js} +1 -1
- package/ui/dist/assets/{PhoneDeskPanel-Bol7fCCN.js → PhoneDeskPanel-Cx4wlgRT.js} +1 -1
- package/ui/dist/assets/{RecipesPanel-BRbXRcEn.js → RecipesPanel-DB6Kuo1a.js} +1 -1
- package/ui/dist/assets/{SecurityPanel-BR3BT7Rb.js → SecurityPanel-BcnpsElV.js} +1 -1
- package/ui/dist/assets/{SelfImprovePanel-BX9xYBxl.js → SelfImprovePanel-do5xDzc8.js} +1 -1
- package/ui/dist/assets/{SelfProposalsPanel-BOoDEAYp.js → SelfProposalsPanel-DM4B-HLa.js} +1 -1
- package/ui/dist/assets/{SessionsPanel-BICnNmn0.js → SessionsPanel-Bl8h6Bfu.js} +1 -1
- package/ui/dist/assets/{SessionsTab-X10FeDWA.js → SessionsTab-hihe8Dc7.js} +1 -1
- package/ui/dist/assets/{SettingsPanel-MuC32AXw.js → SettingsPanel-Cp8decIS.js} +1 -1
- package/ui/dist/assets/SettingsView-BZIgBz0P.js +2 -0
- package/ui/dist/assets/{SkeletonLoader-fwI4Z-f0.js → SkeletonLoader-DLzSaIMH.js} +1 -1
- package/ui/dist/assets/{SkillsPanel-CKFndekU.js → SkillsPanel-B0VL9cO1.js} +1 -1
- package/ui/dist/assets/{SomaView-Ch7WlmBy.js → SomaView-BejcfdMM.js} +1 -1
- package/ui/dist/assets/{StatCard-Bj2Q_4WS.js → StatCard-Bt-57DK2.js} +1 -1
- package/ui/dist/assets/{StatusBadge-NtdTQ8_L.js → StatusBadge-BE0SQNPu.js} +1 -1
- package/ui/dist/assets/{Tabs-CC9aTVuL.js → Tabs-dEteLxhl.js} +1 -1
- package/ui/dist/assets/{TeamsPanel-DjFcLsdR.js → TeamsPanel-7UwGxnbj.js} +1 -1
- package/ui/dist/assets/{TelemetryPanel-k7gJbZyS.js → TelemetryPanel-CqbkTW3V.js} +1 -1
- package/ui/dist/assets/{TitanCanvas-MzLkpZhp.js → TitanCanvas-RVuBEoV1.js} +4 -4
- package/ui/dist/assets/{ToolsView-DcxwuM2l.js → ToolsView-C97QnPeY.js} +2 -2
- package/ui/dist/assets/{Tooltip-CFYHfpgQ.js → Tooltip-BGe4ZrLD.js} +1 -1
- package/ui/dist/assets/{TraceViewer-BfLO9vwI.js → TraceViewer-CSj_fZou.js} +1 -1
- package/ui/dist/assets/{TrainingPanel-DUl6qChY.js → TrainingPanel-43gDnkVS.js} +1 -1
- package/ui/dist/assets/{VoiceOverlay-Dj_cR5_Y.js → VoiceOverlay-CvZcewVV.js} +1 -1
- package/ui/dist/assets/{VramPanel-th0_Eo8o.js → VramPanel-nadiVKRZ.js} +1 -1
- package/ui/dist/assets/{WatchView-DyGhpKbv.js → WatchView-CUGArdWk.js} +1 -1
- package/ui/dist/assets/{WorkTab-BG5VBljJ.js → WorkTab-iCDNyX60.js} +1 -1
- package/ui/dist/assets/{WorkflowsPanel-C1hVHqAc.js → WorkflowsPanel-Do5EOPQ-.js} +1 -1
- package/ui/dist/assets/{archive-C2_hAJXj.js → archive-96Jj-QYz.js} +1 -1
- package/ui/dist/assets/{arrow-left-DFCBXvKS.js → arrow-left-DvmiAV7y.js} +1 -1
- package/ui/dist/assets/{book-open-BgDKDGcH.js → book-open-DvAaokKW.js} +1 -1
- package/ui/dist/assets/{bot-C4ICYImG.js → bot-DFsTWhzD.js} +1 -1
- package/ui/dist/assets/{chart-column-BIFJOG_f.js → chart-column-BWW8khga.js} +1 -1
- package/ui/dist/assets/{check-CmCL8yzl.js → check-4bqUIREX.js} +1 -1
- package/ui/dist/assets/{chevron-right-U0Ujye5i.js → chevron-right-DhAaVOkv.js} +1 -1
- package/ui/dist/assets/{chevron-up-B6uSBxbj.js → chevron-up-DhONR6eV.js} +1 -1
- package/ui/dist/assets/{circle-check-big-BFw1nom4.js → circle-check-big-CrrpTfnZ.js} +1 -1
- package/ui/dist/assets/{circle-stop-DbtGpdaw.js → circle-stop-BOU58Urf.js} +1 -1
- package/ui/dist/assets/{clipboard-list-Dd3_U8cK.js → clipboard-list-GcIgVrYh.js} +1 -1
- package/ui/dist/assets/{clock-DpJIc30t.js → clock-D5MlrzQb.js} +1 -1
- package/ui/dist/assets/{dollar-sign-DlrOHVzA.js → dollar-sign-B9t2KmrG.js} +1 -1
- package/ui/dist/assets/{download-CZ5kTONh.js → download-DzgUP-io.js} +1 -1
- package/ui/dist/assets/{external-link-CX-GvMky.js → external-link--90_rW_r.js} +1 -1
- package/ui/dist/assets/{file-text-BtTsNJbB.js → file-text-C-9as3zm.js} +1 -1
- package/ui/dist/assets/{flask-conical-BaPYppKH.js → flask-conical-BJnD20AK.js} +1 -1
- package/ui/dist/assets/{folder-BOnpha2-.js → folder-BXotS0h-.js} +1 -1
- package/ui/dist/assets/{funnel-DaNi6kwp.js → funnel-BkW9zcis.js} +1 -1
- package/ui/dist/assets/{git-branch-gs6g9dSe.js → git-branch-D7pbvkyu.js} +1 -1
- package/ui/dist/assets/{index-Dbv5oKsp.js → index-DczEfArU.js} +2 -2
- package/ui/dist/assets/index-DmgXt1oB.css +1 -0
- package/ui/dist/assets/{layers-BKZz8iD1.js → layers-BgUh-m00.js} +1 -1
- package/ui/dist/assets/{legacy-DbwFsW2A.js → legacy-Wbf7An22.js} +1 -1
- package/ui/dist/assets/{lightbulb-DX6YLtPe.js → lightbulb-4Yox7P7Z.js} +1 -1
- package/ui/dist/assets/{list-todo-qdMNm4-Q.js → list-todo-JeleiL5r.js} +1 -1
- package/ui/dist/assets/{message-square-Cwo5FOho.js → message-square-C9bK5TAD.js} +1 -1
- package/ui/dist/assets/{mic-BzvwK4IS.js → mic-DwEnBcFd.js} +1 -1
- package/ui/dist/assets/{missions-CYlXuJED.js → missions-Jbe_PHaT.js} +1 -1
- package/ui/dist/assets/{network-Dt-RBtO_.js → network-BjQmrmO8.js} +1 -1
- package/ui/dist/assets/{pause-Do3XNLtx.js → pause-9vYiD-5Y.js} +1 -1
- package/ui/dist/assets/{pencil-DAGs9RFs.js → pencil-CygyIvE1.js} +1 -1
- package/ui/dist/assets/{play-CNElkzEq.js → play-7ImYx-M6.js} +1 -1
- package/ui/dist/assets/{plug-DCgrVnB8.js → plug-DXmJpsfC.js} +1 -1
- package/ui/dist/assets/{plus-BnsXhqXc.js → plus-LIrhsu2s.js} +1 -1
- package/ui/dist/assets/{proxy-BXHdgwrk.js → proxy-B72L9I2p.js} +1 -1
- package/ui/dist/assets/{radio-BPz7sHXW.js → radio-DN9FsrLZ.js} +1 -1
- package/ui/dist/assets/{refresh-cw-Cs4oDMNE.js → refresh-cw-DyPWslHB.js} +1 -1
- package/ui/dist/assets/{rotate-ccw-DSpsA3Wr.js → rotate-ccw-C7z7lzst.js} +1 -1
- package/ui/dist/assets/{save-BhGg2pZh.js → save-Bl0vY0Ur.js} +1 -1
- package/ui/dist/assets/{search-BtxlIgqN.js → search-DLl1kVch.js} +1 -1
- package/ui/dist/assets/{send-BzKTXI3q.js → send-BqZ0Qzz-.js} +1 -1
- package/ui/dist/assets/{server-B1gIgixS.js → server-DvPKxeOK.js} +1 -1
- package/ui/dist/assets/{shield-check-C39B-Wi3.js → shield-check-DMM8OpD5.js} +1 -1
- package/ui/dist/assets/{terminal-CubaeYlJ.js → terminal-DD6OAIa2.js} +1 -1
- package/ui/dist/assets/{test-tube-CYYLfFIz.js → test-tube-BoC1tTKm.js} +1 -1
- package/ui/dist/assets/{toggle-right-BQ3iDgLG.js → toggle-right-CrEdx-9K.js} +1 -1
- package/ui/dist/assets/{trash-2-CSxfLiVB.js → trash-2-Co50XYSn.js} +1 -1
- package/ui/dist/assets/{trending-up-DXxKT18Q.js → trending-up-SFD19agk.js} +1 -1
- package/ui/dist/assets/{trophy-osEOm2Vi.js → trophy-DLTd-oCR.js} +1 -1
- package/ui/dist/assets/{volume-2-C1OkTurz.js → volume-2-vQvjPYVu.js} +1 -1
- package/ui/dist/assets/{wifi-off-DAhvsjnD.js → wifi-off-DVwDeeLz.js} +1 -1
- package/ui/dist/index.html +2 -2
- package/ui/dist/sw.js +1 -1
- package/ui/dist/assets/CPLayout-CHrlktMs.js +0 -2
- package/ui/dist/assets/InfraView-DNYgRXkB.js +0 -2
- package/ui/dist/assets/IntelligenceView-BUKpVpDQ.js +0 -2
- package/ui/dist/assets/MissionCanvas-Ci0hbAF0.js +0 -69
- package/ui/dist/assets/SettingsView-Cv9IZqiU.js +0 -2
- package/ui/dist/assets/index-OZm1iJy9.css +0 -1
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,
|