@runfusion/fusion 0.74.0-beta.8 → 0.74.0-beta.9

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 (96) hide show
  1. package/dist/bin.js +28 -12
  2. package/dist/child-process-worker.js +28 -12
  3. package/dist/client/.vite/manifest.json +257 -257
  4. package/dist/client/assets/{AgentDetailView-CnzGIxqj.js → AgentDetailView-DC3B06sE.js} +1 -1
  5. package/dist/client/assets/{AgentPermissionPolicyEditor-DMnyR96M.js → AgentPermissionPolicyEditor-BtKWfG2h.js} +1 -1
  6. package/dist/client/assets/{AgentsView-CzFtICwM.js → AgentsView-4DiJ2Htx.js} +3 -3
  7. package/dist/client/assets/{ChatView-Cs6B3fNf.js → ChatView-1nqZiDRk.js} +1 -1
  8. package/dist/client/assets/{CommandCenter-DADvho3z.js → CommandCenter-BHZN2tf0.js} +1 -1
  9. package/dist/client/assets/{DevServerView-Bzrzfs8Z.js → DevServerView-BwPjQxR_.js} +1 -1
  10. package/dist/client/assets/{DirectoryPicker-rmip5GcI.js → DirectoryPicker-40vH29Sy.js} +1 -1
  11. package/dist/client/assets/{DocumentsView-BEM4nmJT.js → DocumentsView-DI2mQkGF.js} +1 -1
  12. package/dist/client/assets/{EvalsView-Du7NaYMJ.js → EvalsView-CTSt1-CF.js} +1 -1
  13. package/dist/client/assets/{ExperimentalAgentOnboardingModal-BpIMiZOi.js → ExperimentalAgentOnboardingModal-Z1DJ2xFw.js} +1 -1
  14. package/dist/client/assets/{GoalsView-BxKRyXM3.js → GoalsView-BNyoKq27.js} +1 -1
  15. package/dist/client/assets/{InsightsView-Dauq6b3M.js → InsightsView-zSwsbTfk.js} +1 -1
  16. package/dist/client/assets/{MemoryView-DRD9Xvwx.js → MemoryView-e7R4rcQY.js} +1 -1
  17. package/dist/client/assets/{PiExtensionsManager-DJKE1iAX.js → PiExtensionsManager-DuZzMGuy.js} +1 -1
  18. package/dist/client/assets/{PluginManager-CScwY-Ib.js → PluginManager--lgPTCei.js} +1 -1
  19. package/dist/client/assets/{PullRequestView-uAu5_4__.js → PullRequestView-C9KOlfV-.js} +1 -1
  20. package/dist/client/assets/ReportModal-BiXAfHbg.js +21 -0
  21. package/dist/client/assets/ReportModal-M3uh98sc.css +1 -0
  22. package/dist/client/assets/{ResearchView-BX1kGbWP.js → ResearchView-N4N7-_7C.js} +1 -1
  23. package/dist/client/assets/{SecretsView-U_itETHx.js → SecretsView-GPt8Mw9d.js} +1 -1
  24. package/dist/client/assets/{SessionTerminal-_b15vcd9.js → SessionTerminal-D2bnTrLK.js} +1 -1
  25. package/dist/client/assets/{SettingsModal-DpbYR3Co.js → SettingsModal-D42Cph4Z.js} +3 -3
  26. package/dist/client/assets/{SettingsModal-DkpUKf4k.js → SettingsModal-DLKu3CYU.js} +1 -1
  27. package/dist/client/assets/{SettingsTextareaRow-Dbv-oqsF.js → SettingsTextareaRow-terwvp1e.js} +1 -1
  28. package/dist/client/assets/{SetupWizardModal-n_kcJfIP.js → SetupWizardModal-C-ApHZiL.js} +2 -2
  29. package/dist/client/assets/{SkillsView-Bv2uqBre.js → SkillsView-GYBeq0B-.js} +1 -1
  30. package/dist/client/assets/{TodoView-y11oUvjw.js → TodoView-_1AmNwaZ.js} +1 -1
  31. package/dist/client/assets/{WorkflowNodeEditor-DwY4XzNB.js → WorkflowNodeEditor-CYf2R0ap.js} +1 -1
  32. package/dist/client/assets/{agent-import-generation-B_UNOAWY.js → agent-import-generation-BZPb1nmV.js} +1 -1
  33. package/dist/client/assets/{architectureDiagram-3BPJPVTR-BpA9_eoq.js → architectureDiagram-3BPJPVTR-C_wwNBnV.js} +1 -1
  34. package/dist/client/assets/{blockDiagram-GPEHLZMM-DFFA8tCG.js → blockDiagram-GPEHLZMM-C7URdbgi.js} +1 -1
  35. package/dist/client/assets/{c4Diagram-AAUBKEIU-Fzhn0dG7.js → c4Diagram-AAUBKEIU-BBc8CXBz.js} +1 -1
  36. package/dist/client/assets/channel-M95yBImf.js +1 -0
  37. package/dist/client/assets/{chunk-2J33WTMH-Bi3oPWBJ.js → chunk-2J33WTMH-KfVf5U4u.js} +1 -1
  38. package/dist/client/assets/{chunk-4BX2VUAB-UmeI_To2.js → chunk-4BX2VUAB-BYzFvVsE.js} +1 -1
  39. package/dist/client/assets/{chunk-55IACEB6-BvNWeThd.js → chunk-55IACEB6-B-sxSeny.js} +1 -1
  40. package/dist/client/assets/{chunk-727SXJPM-OHmjSQwz.js → chunk-727SXJPM-B0xJsLsd.js} +1 -1
  41. package/dist/client/assets/{chunk-AQP2D5EJ-DCi9eQaE.js → chunk-AQP2D5EJ-BQ9rJQCA.js} +1 -1
  42. package/dist/client/assets/{chunk-FMBD7UC4-CelGyE3R.js → chunk-FMBD7UC4-DR-KABew.js} +1 -1
  43. package/dist/client/assets/{chunk-ND2GUHAM-DespM-6E.js → chunk-ND2GUHAM-C6ZnAzm4.js} +1 -1
  44. package/dist/client/assets/{chunk-QZHKN3VN-DLkr_Pz0.js → chunk-QZHKN3VN-zs4tZGnv.js} +1 -1
  45. package/dist/client/assets/classDiagram-4FO5ZUOK-DU8poSst.js +1 -0
  46. package/dist/client/assets/classDiagram-v2-Q7XG4LA2-DU8poSst.js +1 -0
  47. package/dist/client/assets/{cose-bilkent-S5V4N54A-I7MlbwDq.js → cose-bilkent-S5V4N54A-DnljjIm-.js} +1 -1
  48. package/dist/client/assets/{dagre-BM42HDAG-DRwLRj5m.js → dagre-BM42HDAG-CEX8DHCo.js} +1 -1
  49. package/dist/client/assets/{dashboard-view-CSxVzmpI.js → dashboard-view-Chxgvuq4.js} +1 -1
  50. package/dist/client/assets/{dashboard-view-Gb436HIO.js → dashboard-view-DPCI6MD3.js} +1 -1
  51. package/dist/client/assets/{dashboard-view-CIwO3ODB.js → dashboard-view-D_xtIayp.js} +1 -1
  52. package/dist/client/assets/{diagram-2AECGRRQ-BuWGDbh_.js → diagram-2AECGRRQ-Dl9VFNxu.js} +1 -1
  53. package/dist/client/assets/{diagram-5GNKFQAL-hG6N6ArX.js → diagram-5GNKFQAL-BPvDRIKP.js} +1 -1
  54. package/dist/client/assets/{diagram-KO2AKTUF-BSXKqQJA.js → diagram-KO2AKTUF-c1v9YI9G.js} +1 -1
  55. package/dist/client/assets/{diagram-LMA3HP47-wNefeM2W.js → diagram-LMA3HP47-ChVDgN1K.js} +1 -1
  56. package/dist/client/assets/{diagram-OG6HWLK6-nA8v_k_H.js → diagram-OG6HWLK6-Cns2RBoA.js} +1 -1
  57. package/dist/client/assets/{erDiagram-TEJ5UH35-Dwnvvp2x.js → erDiagram-TEJ5UH35-D33nn5Lx.js} +1 -1
  58. package/dist/client/assets/{flowDiagram-I6XJVG4X-FS4W3U0O.js → flowDiagram-I6XJVG4X-BluS50at.js} +1 -1
  59. package/dist/client/assets/{folder-open-C3GXrzUo.js → folder-open-oeYf8Ijc.js} +1 -1
  60. package/dist/client/assets/{ganttDiagram-6RSMTGT7-D95bgKFE.js → ganttDiagram-6RSMTGT7-D78LznXX.js} +1 -1
  61. package/dist/client/assets/{gitGraphDiagram-PVQCEYII-zqFbK6on.js → gitGraphDiagram-PVQCEYII-Cz-VVeuo.js} +1 -1
  62. package/dist/client/assets/index-Clr90mLV.js +2675 -0
  63. package/dist/client/assets/{infoDiagram-5YYISTIA-BBELQBNE.js → infoDiagram-5YYISTIA-DW64QGM7.js} +1 -1
  64. package/dist/client/assets/{ishikawaDiagram-YF4QCWOH-bSZkIXd-.js → ishikawaDiagram-YF4QCWOH-zB3QANvt.js} +1 -1
  65. package/dist/client/assets/{journeyDiagram-JHISSGLW-8wIimXRT.js → journeyDiagram-JHISSGLW-nVRvkAiF.js} +1 -1
  66. package/dist/client/assets/{kanban-definition-UN3LZRKU-DMj6kFc5.js → kanban-definition-UN3LZRKU-DIsRSNcB.js} +1 -1
  67. package/dist/client/assets/{mermaid.core-UDKENpfo.js → mermaid.core-ByWbtMdM.js} +4 -4
  68. package/dist/client/assets/{mindmap-definition-RKZ34NQL-CJGH0VYQ.js → mindmap-definition-RKZ34NQL-BbZZGyk5.js} +1 -1
  69. package/dist/client/assets/{pieDiagram-4H26LBE5-B3cZLcOe.js → pieDiagram-4H26LBE5-xEuGzir-.js} +1 -1
  70. package/dist/client/assets/{puzzle-D85LM19g.js → puzzle-DfKZ6p_i.js} +1 -1
  71. package/dist/client/assets/{quadrantDiagram-W4KKPZXB-bR1CBrVi.js → quadrantDiagram-W4KKPZXB-CXU0exeD.js} +1 -1
  72. package/dist/client/assets/{requirementDiagram-4Y6WPE33-DnyJ74cE.js → requirementDiagram-4Y6WPE33-xrqjvySl.js} +1 -1
  73. package/dist/client/assets/{sankeyDiagram-5OEKKPKP-ttv4kq0z.js → sankeyDiagram-5OEKKPKP-B_XL-dlB.js} +1 -1
  74. package/dist/client/assets/{sequenceDiagram-3UESZ5HK-FiUBFoWw.js → sequenceDiagram-3UESZ5HK-yPNpJSyq.js} +1 -1
  75. package/dist/client/assets/{shield-alert-D3IVOJV1.js → shield-alert-C0mvrTVY.js} +1 -1
  76. package/dist/client/assets/{standing-instructions-template-CWY_pFh6.js → standing-instructions-template-BA-Y897i.js} +1 -1
  77. package/dist/client/assets/{stateDiagram-AJRCARHV-BcsYRB77.js → stateDiagram-AJRCARHV-B3WacriB.js} +1 -1
  78. package/dist/client/assets/{stateDiagram-v2-BHNVJYJU-DsBPFwnG.js → stateDiagram-v2-BHNVJYJU-C2J3lqDw.js} +1 -1
  79. package/dist/client/assets/{timeline-definition-PNZ67QCA-B8rOOxEj.js → timeline-definition-PNZ67QCA-BMDzGW-H.js} +1 -1
  80. package/dist/client/assets/{upload-WqSaqC__.js → upload-BcE2JLKs.js} +1 -1
  81. package/dist/client/assets/{users-CPP-3wxQ.js → users-CG9A3bIX.js} +1 -1
  82. package/dist/client/assets/{vennDiagram-CIIHVFJN-CO0LSFj2.js → vennDiagram-CIIHVFJN-C7ZUUi6G.js} +1 -1
  83. package/dist/client/assets/{wardley-L42UT6IY-QHbclXGi.js → wardley-L42UT6IY-zpz98dmH.js} +1 -1
  84. package/dist/client/assets/{wardleyDiagram-YWT4CUSO-DAsnTuM9.js → wardleyDiagram-YWT4CUSO-D4TOrUW4.js} +1 -1
  85. package/dist/client/assets/{xychartDiagram-2RQKCTM6-BmG5EEoO.js → xychartDiagram-2RQKCTM6-CDfiiyNj.js} +1 -1
  86. package/dist/client/index.html +3 -2
  87. package/dist/client/theme-data.css +85 -1
  88. package/dist/client/version.json +1 -1
  89. package/dist/extension.js +28 -12
  90. package/package.json +1 -1
  91. package/dist/client/assets/ReportModal-Bg-XvWay.css +0 -1
  92. package/dist/client/assets/ReportModal-nNUcGxYj.js +0 -21
  93. package/dist/client/assets/channel-C9C9Rxgn.js +0 -1
  94. package/dist/client/assets/classDiagram-4FO5ZUOK-BGVE_u03.js +0 -1
  95. package/dist/client/assets/classDiagram-v2-Q7XG4LA2-BGVE_u03.js +0 -1
  96. package/dist/client/assets/index-BWRNl9tu.js +0 -2675
package/dist/bin.js CHANGED
@@ -867,6 +867,11 @@ var init_execution_and_ui = __esm({
867
867
  "dawn",
868
868
  // FNXC:DashboardTheming 2026-07-31-21:28: Sage must stay order-synchronized across core, selector metadata, and both first-paint validators so saved preferences survive pre-hydration validation.
869
869
  "sage",
870
+ /*
871
+ FNXC:MidnightTheme 2026-08-03-02:05:
872
+ Midnight is a persisted selectable dashboard theme. Keep its id and order synchronized with selector metadata and both web/Electron first-paint validators so saved choices survive before hydration, while shadcn-ember remains the unset default.
873
+ */
874
+ "midnight",
870
875
  // FNXC:DashboardTheming 2026-07-31-20:39: Factory Dark must stay order-synchronized across core, selector metadata, and both first-paint validators so saved preferences survive pre-hydration validation.
871
876
  "factory-dark",
872
877
  // FNXC:DashboardTheming 2026-07-31-23:51: Factory Light must stay order-synchronized across core, selector metadata, and both first-paint validators so saved preferences survive pre-hydration validation.
@@ -96698,15 +96703,20 @@ async function updateTaskUnlockedImpl(store, id, updates, runContext) {
96698
96703
  task.workspaceWorktrees = updates.workspaceWorktrees;
96699
96704
  }
96700
96705
  let movedToTriage = false;
96706
+ let respecifyFromColumn;
96707
+ let respecifyMoveLanes;
96701
96708
  if (updates.dependencies !== void 0) {
96702
96709
  const oldDeps = new Set((task.dependencies ?? []).map((dependency) => dependency.trim()).filter(Boolean));
96703
96710
  const normalizedDependencies = updates.dependencies.map((dependency) => dependency.trim()).filter(Boolean);
96704
96711
  const hasNewDeps = normalizedDependencies.some((d) => !oldDeps.has(d));
96705
96712
  task.dependencies = normalizedDependencies;
96706
- const depLanes = hasNewDeps ? await resolveTaskLifecycleColumns(store, id).catch(() => void 0) : void 0;
96713
+ const respecifyIr = hasNewDeps ? await resolveWorkflowIrForTask(store, id).catch(() => void 0) : void 0;
96714
+ respecifyMoveLanes = toTaskMoveLanes(respecifyIr);
96715
+ const depLanes = respecifyIr ? resolveLifecycleColumns(respecifyIr) : void 0;
96707
96716
  const holdLane = depLanes === void 0 ? "todo" : depLanes.hold;
96708
96717
  if (hasNewDeps && holdLane !== void 0 && task.column === holdLane) {
96709
96718
  const intakeLane = depLanes?.intake;
96719
+ respecifyFromColumn = task.column;
96710
96720
  const relocating = intakeLane !== void 0 && intakeLane !== task.column;
96711
96721
  if (relocating) {
96712
96722
  task.column = intakeLane;
@@ -97384,10 +97394,15 @@ async function updateTaskUnlockedImpl(store, id, updates, runContext) {
97384
97394
  storeLog.warn(`[task-detail] failed to sync PROMPT.md heading for ${task.id}: ${err instanceof Error ? err.message : String(err)}`);
97385
97395
  }
97386
97396
  }
97387
- if (movedToTriage) {
97388
- const lanes = toTaskMoveLanes(await resolveWorkflowIrForTask(store, id).catch(() => void 0));
97389
- store.laneCache.set(task.id, lanes);
97390
- store.emit("task:moved", { task, from: "todo", to: "triage", source: "engine", lanes });
97397
+ if (movedToTriage && respecifyFromColumn !== void 0 && respecifyFromColumn !== task.column && respecifyMoveLanes) {
97398
+ store.laneCache.set(task.id, respecifyMoveLanes);
97399
+ store.emit("task:moved", {
97400
+ task,
97401
+ from: respecifyFromColumn,
97402
+ to: task.column,
97403
+ source: "engine",
97404
+ lanes: respecifyMoveLanes
97405
+ });
97391
97406
  }
97392
97407
  store.emitTaskLifecycleEventSafely("task:updated", [task]);
97393
97408
  return task;
@@ -97399,7 +97414,6 @@ var init_task_update = __esm({
97399
97414
  init_store();
97400
97415
  init_workflow_lifecycle_traits();
97401
97416
  init_workflow_ir_resolver();
97402
- init_workflow_lifecycle_traits();
97403
97417
  init_errors3();
97404
97418
  init_task_fields();
97405
97419
  init_builtin_traits();
@@ -205606,6 +205620,7 @@ var init_self_healing = __esm({
205606
205620
  }
205607
205621
  async reclaimStaleActiveBranches() {
205608
205622
  const reclaimArchivedColumns = await resolveProjectColumnsForRoles(this.store, ["archived"]);
205623
+ const reclaimCompleteColumns = await resolveProjectColumnsForRoles(this.store, ["complete"]);
205609
205624
  try {
205610
205625
  const settings = await this.store.getSettings();
205611
205626
  if (settings.globalPause || settings.enginePaused) return 0;
@@ -205703,10 +205718,12 @@ var init_self_healing = __esm({
205703
205718
  if (task.worktree && await isUsableTaskWorktree(this.options.rootDir, task.worktree)) continue;
205704
205719
  const inspection = await this.inspectOrphanedBranch(branch);
205705
205720
  if (!inspection) continue;
205706
- if (inspection.uniqueCommitCount > 0) {
205721
+ const isCompleteColumn2 = reclaimCompleteColumns.has(task.column);
205722
+ if (inspection.uniqueCommitCount > 0 && !isCompleteColumn2) {
205707
205723
  log33.warn(`[recovery] stale-active-branch-rescue-needed ${task.id} branch=${branch} unique=${inspection.uniqueCommitCount} tip=${inspection.tipSha.slice(0, 12)}`);
205708
205724
  continue;
205709
205725
  }
205726
+ const reclaimReason = inspection.uniqueCommitCount > 0 ? "complete-column-unique-commits-force" : "zero-unique-commits-no-worktree";
205710
205727
  await execAsync18(`git branch -D ${JSON.stringify(branch)}`, {
205711
205728
  cwd: this.options.rootDir,
205712
205729
  timeout: 12e4,
@@ -205724,7 +205741,7 @@ var init_self_healing = __esm({
205724
205741
  });
205725
205742
  await this.store.logEntry(
205726
205743
  task.id,
205727
- `[recovery] stale-active-branch-reclaim ${task.id} branch=${branch} reason=zero-unique-commits-no-worktree`
205744
+ `[recovery] stale-active-branch-reclaim ${task.id} branch=${branch} reason=${reclaimReason}`
205728
205745
  );
205729
205746
  try {
205730
205747
  const auditor = createRunAuditor(this.store, {
@@ -205742,7 +205759,7 @@ var init_self_healing = __esm({
205742
205759
  branch,
205743
205760
  tipSha: inspection.tipSha,
205744
205761
  uniqueCommitCount: inspection.uniqueCommitCount,
205745
- reason: "zero-unique-commits-no-worktree"
205762
+ reason: reclaimReason
205746
205763
  }
205747
205764
  });
205748
205765
  } catch (auditErr) {
@@ -205789,10 +205806,9 @@ var init_self_healing = __esm({
205789
205806
  const baseBranch = task.baseBranch || await resolveIntegrationBranch(this.options.rootDir, void 0);
205790
205807
  const comparison = await listUniqueBranchCommits(this.options.rootDir, baseBranch, branchName);
205791
205808
  if (comparison.commits.length > 0) {
205792
- log33.warn(
205793
- `[self-healing] reconcileCompletedTask ${task.id}: branch ${branchName} has ${comparison.commits.length} unique commit(s) vs ${comparison.mainRef}; skip deletion`
205809
+ log33.log(
205810
+ `[self-healing] reconcileCompletedTask ${task.id}: branch ${branchName} has ${comparison.commits.length} unique commit(s) vs ${comparison.mainRef}; force-deleting post-completion (squash-safe)`
205794
205811
  );
205795
- return false;
205796
205812
  }
205797
205813
  try {
205798
205814
  await execAsync18(`git branch -D ${shellQuote2(branchName)}`, {
@@ -865,6 +865,11 @@ var init_execution_and_ui = __esm({
865
865
  "dawn",
866
866
  // FNXC:DashboardTheming 2026-07-31-21:28: Sage must stay order-synchronized across core, selector metadata, and both first-paint validators so saved preferences survive pre-hydration validation.
867
867
  "sage",
868
+ /*
869
+ FNXC:MidnightTheme 2026-08-03-02:05:
870
+ Midnight is a persisted selectable dashboard theme. Keep its id and order synchronized with selector metadata and both web/Electron first-paint validators so saved choices survive before hydration, while shadcn-ember remains the unset default.
871
+ */
872
+ "midnight",
868
873
  // FNXC:DashboardTheming 2026-07-31-20:39: Factory Dark must stay order-synchronized across core, selector metadata, and both first-paint validators so saved preferences survive pre-hydration validation.
869
874
  "factory-dark",
870
875
  // FNXC:DashboardTheming 2026-07-31-23:51: Factory Light must stay order-synchronized across core, selector metadata, and both first-paint validators so saved preferences survive pre-hydration validation.
@@ -96696,15 +96701,20 @@ async function updateTaskUnlockedImpl(store, id, updates, runContext) {
96696
96701
  task.workspaceWorktrees = updates.workspaceWorktrees;
96697
96702
  }
96698
96703
  let movedToTriage = false;
96704
+ let respecifyFromColumn;
96705
+ let respecifyMoveLanes;
96699
96706
  if (updates.dependencies !== void 0) {
96700
96707
  const oldDeps = new Set((task.dependencies ?? []).map((dependency) => dependency.trim()).filter(Boolean));
96701
96708
  const normalizedDependencies = updates.dependencies.map((dependency) => dependency.trim()).filter(Boolean);
96702
96709
  const hasNewDeps = normalizedDependencies.some((d) => !oldDeps.has(d));
96703
96710
  task.dependencies = normalizedDependencies;
96704
- const depLanes = hasNewDeps ? await resolveTaskLifecycleColumns(store, id).catch(() => void 0) : void 0;
96711
+ const respecifyIr = hasNewDeps ? await resolveWorkflowIrForTask(store, id).catch(() => void 0) : void 0;
96712
+ respecifyMoveLanes = toTaskMoveLanes(respecifyIr);
96713
+ const depLanes = respecifyIr ? resolveLifecycleColumns(respecifyIr) : void 0;
96705
96714
  const holdLane = depLanes === void 0 ? "todo" : depLanes.hold;
96706
96715
  if (hasNewDeps && holdLane !== void 0 && task.column === holdLane) {
96707
96716
  const intakeLane = depLanes?.intake;
96717
+ respecifyFromColumn = task.column;
96708
96718
  const relocating = intakeLane !== void 0 && intakeLane !== task.column;
96709
96719
  if (relocating) {
96710
96720
  task.column = intakeLane;
@@ -97382,10 +97392,15 @@ async function updateTaskUnlockedImpl(store, id, updates, runContext) {
97382
97392
  storeLog.warn(`[task-detail] failed to sync PROMPT.md heading for ${task.id}: ${err instanceof Error ? err.message : String(err)}`);
97383
97393
  }
97384
97394
  }
97385
- if (movedToTriage) {
97386
- const lanes = toTaskMoveLanes(await resolveWorkflowIrForTask(store, id).catch(() => void 0));
97387
- store.laneCache.set(task.id, lanes);
97388
- store.emit("task:moved", { task, from: "todo", to: "triage", source: "engine", lanes });
97395
+ if (movedToTriage && respecifyFromColumn !== void 0 && respecifyFromColumn !== task.column && respecifyMoveLanes) {
97396
+ store.laneCache.set(task.id, respecifyMoveLanes);
97397
+ store.emit("task:moved", {
97398
+ task,
97399
+ from: respecifyFromColumn,
97400
+ to: task.column,
97401
+ source: "engine",
97402
+ lanes: respecifyMoveLanes
97403
+ });
97389
97404
  }
97390
97405
  store.emitTaskLifecycleEventSafely("task:updated", [task]);
97391
97406
  return task;
@@ -97397,7 +97412,6 @@ var init_task_update = __esm({
97397
97412
  init_store();
97398
97413
  init_workflow_lifecycle_traits();
97399
97414
  init_workflow_ir_resolver();
97400
- init_workflow_lifecycle_traits();
97401
97415
  init_errors3();
97402
97416
  init_task_fields();
97403
97417
  init_builtin_traits();
@@ -209848,6 +209862,7 @@ var SelfHealingManager = class _SelfHealingManager extends SelfHealingGitEvidenc
209848
209862
  }
209849
209863
  async reclaimStaleActiveBranches() {
209850
209864
  const reclaimArchivedColumns = await resolveProjectColumnsForRoles(this.store, ["archived"]);
209865
+ const reclaimCompleteColumns = await resolveProjectColumnsForRoles(this.store, ["complete"]);
209851
209866
  try {
209852
209867
  const settings = await this.store.getSettings();
209853
209868
  if (settings.globalPause || settings.enginePaused) return 0;
@@ -209945,10 +209960,12 @@ var SelfHealingManager = class _SelfHealingManager extends SelfHealingGitEvidenc
209945
209960
  if (task.worktree && await isUsableTaskWorktree(this.options.rootDir, task.worktree)) continue;
209946
209961
  const inspection = await this.inspectOrphanedBranch(branch);
209947
209962
  if (!inspection) continue;
209948
- if (inspection.uniqueCommitCount > 0) {
209963
+ const isCompleteColumn2 = reclaimCompleteColumns.has(task.column);
209964
+ if (inspection.uniqueCommitCount > 0 && !isCompleteColumn2) {
209949
209965
  log34.warn(`[recovery] stale-active-branch-rescue-needed ${task.id} branch=${branch} unique=${inspection.uniqueCommitCount} tip=${inspection.tipSha.slice(0, 12)}`);
209950
209966
  continue;
209951
209967
  }
209968
+ const reclaimReason = inspection.uniqueCommitCount > 0 ? "complete-column-unique-commits-force" : "zero-unique-commits-no-worktree";
209952
209969
  await execAsync33(`git branch -D ${JSON.stringify(branch)}`, {
209953
209970
  cwd: this.options.rootDir,
209954
209971
  timeout: 12e4,
@@ -209966,7 +209983,7 @@ var SelfHealingManager = class _SelfHealingManager extends SelfHealingGitEvidenc
209966
209983
  });
209967
209984
  await this.store.logEntry(
209968
209985
  task.id,
209969
- `[recovery] stale-active-branch-reclaim ${task.id} branch=${branch} reason=zero-unique-commits-no-worktree`
209986
+ `[recovery] stale-active-branch-reclaim ${task.id} branch=${branch} reason=${reclaimReason}`
209970
209987
  );
209971
209988
  try {
209972
209989
  const auditor = createRunAuditor(this.store, {
@@ -209984,7 +210001,7 @@ var SelfHealingManager = class _SelfHealingManager extends SelfHealingGitEvidenc
209984
210001
  branch,
209985
210002
  tipSha: inspection.tipSha,
209986
210003
  uniqueCommitCount: inspection.uniqueCommitCount,
209987
- reason: "zero-unique-commits-no-worktree"
210004
+ reason: reclaimReason
209988
210005
  }
209989
210006
  });
209990
210007
  } catch (auditErr) {
@@ -210031,10 +210048,9 @@ var SelfHealingManager = class _SelfHealingManager extends SelfHealingGitEvidenc
210031
210048
  const baseBranch = task.baseBranch || await resolveIntegrationBranch(this.options.rootDir, void 0);
210032
210049
  const comparison = await listUniqueBranchCommits(this.options.rootDir, baseBranch, branchName);
210033
210050
  if (comparison.commits.length > 0) {
210034
- log34.warn(
210035
- `[self-healing] reconcileCompletedTask ${task.id}: branch ${branchName} has ${comparison.commits.length} unique commit(s) vs ${comparison.mainRef}; skip deletion`
210051
+ log34.log(
210052
+ `[self-healing] reconcileCompletedTask ${task.id}: branch ${branchName} has ${comparison.commits.length} unique commit(s) vs ${comparison.mainRef}; force-deleting post-completion (squash-safe)`
210036
210053
  );
210037
- return false;
210038
210054
  }
210039
210055
  try {
210040
210056
  await execAsync33(`git branch -D ${shellQuote2(branchName)}`, {