@runfusion/fusion 0.43.0 → 0.43.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 (91) hide show
  1. package/dist/bin.js +167 -27
  2. package/dist/client/.vite/manifest.json +70 -70
  3. package/dist/client/assets/AgentDetailView-BGN03dyz.css +1 -0
  4. package/dist/client/assets/{AgentDetailView-FUKwQxBP.js → AgentDetailView-DKMz3r04.js} +1 -1
  5. package/dist/client/assets/{AgentPermissionPolicyEditor-DMDUhF1n.js → AgentPermissionPolicyEditor-BiY1a4KR.js} +1 -1
  6. package/dist/client/assets/{AgentsView-BrQLd-yI.js → AgentsView-Co-k4vjh.js} +3 -3
  7. package/dist/client/assets/{ChatView-Wz_0goif.js → ChatView-BkAG99bj.js} +1 -1
  8. package/dist/client/assets/{DevServerView-DRqQpHsc.js → DevServerView-C6DC0URX.js} +1 -1
  9. package/dist/client/assets/{DirectoryPicker-BFot4CVM.js → DirectoryPicker-CkcGjyv0.js} +1 -1
  10. package/dist/client/assets/{DocumentsView-hamhUcvL.js → DocumentsView-OCK1Vsw_.js} +1 -1
  11. package/dist/client/assets/{EvalsView-DAXqDqn2.js → EvalsView-CUfyj5GW.js} +1 -1
  12. package/dist/client/assets/{ExperimentalAgentOnboardingModal-B4aZ1y0n.js → ExperimentalAgentOnboardingModal-Dau9RTU_.js} +1 -1
  13. package/dist/client/assets/{GoalsView-2QOp9DA0.js → GoalsView-CNLTn0rX.js} +1 -1
  14. package/dist/client/assets/{InsightsView-D5fzFy-F.js → InsightsView-BQPxHxKI.js} +1 -1
  15. package/dist/client/assets/{MemoryView-B082KoR-.js → MemoryView-D3xQIFjj.js} +1 -1
  16. package/dist/client/assets/{NodesView-BA3pKMZu.js → NodesView-CSMvGwDU.js} +1 -1
  17. package/dist/client/assets/{PiExtensionsManager-C4I11iKm.js → PiExtensionsManager-BtqXF3fl.js} +1 -1
  18. package/dist/client/assets/{PluginManager-BzTzTMXZ.js → PluginManager-CSSDb3VO.js} +1 -1
  19. package/dist/client/assets/{PullRequestView-11xJ565q.js → PullRequestView-Bjyfffdu.js} +1 -1
  20. package/dist/client/assets/{ReliabilityView-CpELpGqw.js → ReliabilityView-QKMUDebT.js} +1 -1
  21. package/dist/client/assets/{ResearchView-BHiXfjzE.js → ResearchView-CRU_NPho.js} +1 -1
  22. package/dist/client/assets/{SecretsView-CC5OYoCn.js → SecretsView-Bs8ySyC5.js} +1 -1
  23. package/dist/client/assets/SecretsView-Djo1rahi.css +1 -0
  24. package/dist/client/assets/{SessionTerminal-G70Jwkzs.js → SessionTerminal-Dk1NgmN2.js} +1 -1
  25. package/dist/client/assets/{SettingsModal-C0M1CqOu.js → SettingsModal-JCaNvdAb.js} +3 -3
  26. package/dist/client/assets/{SettingsModal-BKEbtdqR.js → SettingsModal-Nw5cTKAK.js} +1 -1
  27. package/dist/client/assets/{SetupWizardModal-CBfItlP6.js → SetupWizardModal-CE79myEy.js} +1 -1
  28. package/dist/client/assets/{SkillsView-DbcW87-E.js → SkillsView-Dc8YskAX.js} +1 -1
  29. package/dist/client/assets/{StashRecoveryView-CH9RPtzX.js → StashRecoveryView-CqKOFiXT.js} +1 -1
  30. package/dist/client/assets/{TodoView-ToviJ0SV.js → TodoView-BqIRwcZw.js} +1 -1
  31. package/dist/client/assets/{WorkflowNodeEditor-BTu0D9c5.js → WorkflowNodeEditor-2jDuk2FR.js} +1 -1
  32. package/dist/client/assets/{dashboard-view-DtgLZ_LM.js → dashboard-view-BhbN8LPh.js} +1 -1
  33. package/dist/client/assets/{folder-open-BlPyIWyf.js → folder-open-Bw1mxVfa.js} +1 -1
  34. package/dist/client/assets/{index-bZCpHtGq.js → index-CpTBp1RG.js} +192 -192
  35. package/dist/client/assets/{upload-B-qmm1NH.js → upload-BCmd-1I0.js} +1 -1
  36. package/dist/client/assets/{users-D6C5TXf2.js → users-DO_t3V1p.js} +1 -1
  37. package/dist/client/index.html +1 -1
  38. package/dist/client/version.json +1 -1
  39. package/dist/droid-cli/package.json +1 -1
  40. package/dist/extension.js +166 -27
  41. package/dist/pi-claude-cli/package.json +1 -1
  42. package/dist/plugin-sdk/index.d.ts +2 -0
  43. package/dist/plugins/fusion-plugin-acp-runtime/package.json +1 -1
  44. package/dist/plugins/fusion-plugin-cli-printing-press/package.json +1 -1
  45. package/dist/plugins/fusion-plugin-compound-engineering/package.json +1 -1
  46. package/dist/plugins/fusion-plugin-cursor-runtime/package.json +1 -1
  47. package/dist/plugins/fusion-plugin-dependency-graph/package.json +1 -1
  48. package/dist/plugins/fusion-plugin-droid-runtime/package.json +1 -1
  49. package/dist/plugins/fusion-plugin-hermes-runtime/package.json +1 -1
  50. package/dist/plugins/fusion-plugin-openclaw-runtime/package.json +1 -1
  51. package/dist/plugins/fusion-plugin-paperclip-runtime/package.json +1 -1
  52. package/dist/plugins/fusion-plugin-reports/package.json +1 -1
  53. package/dist/plugins/fusion-plugin-roadmap/package.json +1 -1
  54. package/dist/plugins/fusion-plugin-whatsapp-chat/package.json +1 -1
  55. package/package.json +1 -1
  56. package/dist/automation-store-EKXXEE2S.js +0 -10
  57. package/dist/automation-store-PLNG3X72.js +0 -10
  58. package/dist/automation-store-RDDYZFUJ.js +0 -10
  59. package/dist/chunk-2JI3F6MG.js +0 -948
  60. package/dist/chunk-4L6CLWJC.js +0 -8345
  61. package/dist/chunk-4VNS5WPM.js +0 -42
  62. package/dist/chunk-5RGECGQL.js +0 -1139
  63. package/dist/chunk-6JDLN7IL.js +0 -409
  64. package/dist/chunk-AICJATVW.js +0 -948
  65. package/dist/chunk-AWKNRUOR.js +0 -1148
  66. package/dist/chunk-BHM3UYWS.js +0 -4651
  67. package/dist/chunk-BMUXDSBF.js +0 -4647
  68. package/dist/chunk-GETECT6V.js +0 -353
  69. package/dist/chunk-GUV4QQT3.js +0 -1143
  70. package/dist/chunk-JKQO7YYZ.js +0 -8369
  71. package/dist/chunk-LYZVU6UV.js +0 -409
  72. package/dist/chunk-MAN4WYHO.js +0 -353
  73. package/dist/chunk-MCUG2Z7M.js +0 -4651
  74. package/dist/chunk-PSDYB45U.js +0 -948
  75. package/dist/chunk-RR2HM46R.js +0 -8345
  76. package/dist/chunk-RXMQ5OMY.js +0 -9226
  77. package/dist/chunk-S2EVJUY3.js +0 -353
  78. package/dist/chunk-UXR5XZFZ.js +0 -409
  79. package/dist/client/assets/AgentDetailView-DiWELtb1.css +0 -1
  80. package/dist/client/assets/SecretsView-D5bHZ-wM.css +0 -1
  81. package/dist/extract-zip-WL55Z3AU.js +0 -2497
  82. package/dist/index.min-CHQ3ABYJ.js +0 -2926
  83. package/dist/memory-dreams-7USISKVE.js +0 -32
  84. package/dist/memory-dreams-PBPISUDD.js +0 -32
  85. package/dist/memory-dreams-XNO2B2QF.js +0 -32
  86. package/dist/migration-EH2YOCYQ.js +0 -15
  87. package/dist/migration-PLGTTKL5.js +0 -15
  88. package/dist/migration-WZEZK22R.js +0 -15
  89. package/dist/routine-store-GIJ6MXWY.js +0 -10
  90. package/dist/routine-store-HTVC2PUQ.js +0 -10
  91. package/dist/routine-store-KGHZBPDF.js +0 -10
@@ -1,4 +1,4 @@
1
- import{c as a}from"./index-bZCpHtGq.js";/**
1
+ import{c as a}from"./index-CpTBp1RG.js";/**
2
2
  * @license lucide-react v1.7.0 - ISC
3
3
  *
4
4
  * This source code is licensed under the ISC license.
@@ -1,4 +1,4 @@
1
- import{c as e}from"./index-bZCpHtGq.js";/**
1
+ import{c as e}from"./index-CpTBp1RG.js";/**
2
2
  * @license lucide-react v1.7.0 - ISC
3
3
  *
4
4
  * This source code is licensed under the ISC license.
@@ -207,7 +207,7 @@
207
207
  </script>
208
208
  <!-- fusion:view-preload -->
209
209
 
210
- <script type="module" crossorigin src="/assets/index-bZCpHtGq.js"></script>
210
+ <script type="module" crossorigin src="/assets/index-CpTBp1RG.js"></script>
211
211
  <link rel="modulepreload" crossorigin href="/assets/vendor-react-D37HfzIf.js">
212
212
  <link rel="modulepreload" crossorigin href="/assets/vendor-i18n-CV0mwX_-.js">
213
213
  <link rel="modulepreload" crossorigin href="/assets/vendor-reactflow-CRZcPCXF.js">
@@ -1 +1 @@
1
- {"version":"b14fad9c5-9aef59bd"}
1
+ {"version":"f7635faf3-7ebf82ef"}
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fusion/droid-cli",
3
- "version": "0.11.31",
3
+ "version": "0.11.32",
4
4
  "description": "First-party Fusion pi extension that routes LLM calls through the Droid CLI subprocess.",
5
5
  "license": "MIT",
6
6
  "private": true,
package/dist/extension.js CHANGED
@@ -2293,6 +2293,25 @@ var init_redact_secrets = __esm({
2293
2293
  }
2294
2294
  });
2295
2295
 
2296
+ // ../core/src/near-duplicate-canonical.ts
2297
+ function isActiveNearDuplicateColumn(column) {
2298
+ return column !== "archived" && column !== "done";
2299
+ }
2300
+ function isNearDuplicateCanonicalInactive(canonical) {
2301
+ if (!canonical) {
2302
+ return true;
2303
+ }
2304
+ if (canonical.deletedAt) {
2305
+ return true;
2306
+ }
2307
+ return !isActiveNearDuplicateColumn(canonical.column);
2308
+ }
2309
+ var init_near_duplicate_canonical = __esm({
2310
+ "../core/src/near-duplicate-canonical.ts"() {
2311
+ "use strict";
2312
+ }
2313
+ });
2314
+
2296
2315
  // ../core/src/frontend-ux-policy.ts
2297
2316
  function applyFrontendUxCriteria(promptMarkdown, fileScopePaths) {
2298
2317
  if (promptMarkdown.includes(FRONTEND_UX_HEADING)) {
@@ -48223,6 +48242,7 @@ var init_store = __esm({
48223
48242
  init_stalled_review_detector();
48224
48243
  init_retry_summary();
48225
48244
  init_duplicate_intake();
48245
+ init_near_duplicate_canonical();
48226
48246
  init_task_id_integrity();
48227
48247
  init_mesh_task_replication();
48228
48248
  init_step_parsers();
@@ -52543,6 +52563,65 @@ ${newTask.description}
52543
52563
  `).all(trimmedFingerprint, cutoffIso);
52544
52564
  return rows.map((row) => this.rowToTask(row));
52545
52565
  }
52566
+ /**
52567
+ * FNXC:NearDuplicateDetection 2026-06-14-12:00:
52568
+ * FN-6439 requires the store to reconcile persisted duplicate flags after a canonical becomes inactive.
52569
+ * sourceMetadataPatch only merges, so this reverse lookup performs a bounded read-modify-write that strips stale near-duplicate keys without pausing or failing the referencing tasks.
52570
+ */
52571
+ async clearNearDuplicateReferencesTo(canonicalId, inactiveState) {
52572
+ if (!isNearDuplicateCanonicalInactive(inactiveState)) {
52573
+ return [];
52574
+ }
52575
+ const selectClause = this.getTaskSelectClause(false, "t");
52576
+ const rows = this.db.prepare(`
52577
+ SELECT ${selectClause}
52578
+ FROM tasks t
52579
+ WHERE t."deletedAt" IS NULL
52580
+ AND t."column" != 'archived'
52581
+ AND t."column" != 'done'
52582
+ AND json_extract(t.sourceMetadata, '$.nearDuplicateOf') = ?
52583
+ ORDER BY t.createdAt ASC
52584
+ `).all(canonicalId);
52585
+ const updatedTasks = [];
52586
+ for (const row of rows) {
52587
+ const task = this.rowToTask(row);
52588
+ const nextSourceMetadata = { ...task.sourceMetadata ?? {} };
52589
+ delete nextSourceMetadata.nearDuplicateOf;
52590
+ delete nextSourceMetadata.nearDuplicateScore;
52591
+ delete nextSourceMetadata.nearDuplicateSharedTokens;
52592
+ delete nextSourceMetadata.nearDuplicateDismissed;
52593
+ task.sourceMetadata = Object.keys(nextSourceMetadata).length > 0 ? nextSourceMetadata : void 0;
52594
+ const updatedAt = (/* @__PURE__ */ new Date()).toISOString();
52595
+ task.updatedAt = updatedAt;
52596
+ task.log = [
52597
+ ...task.log ?? [],
52598
+ {
52599
+ timestamp: updatedAt,
52600
+ action: `Near-duplicate canonical ${canonicalId} is now inactive (${inactiveState.reason}); cleared duplicate flag (informational, no decision required)`
52601
+ }
52602
+ ];
52603
+ this.db.transactionImmediate(() => {
52604
+ this.upsertTaskWithFtsRecovery(task);
52605
+ this.db.bumpLastModified();
52606
+ });
52607
+ await this.writeTaskJsonFile(this.taskDir(task.id), task);
52608
+ if (this.isWatching) this.taskCache.set(task.id, { ...task });
52609
+ this.emit("task:updated", task);
52610
+ updatedTasks.push(task);
52611
+ }
52612
+ return updatedTasks;
52613
+ }
52614
+ async clearNearDuplicateReferencesToFailSoft(canonicalId, inactiveState) {
52615
+ try {
52616
+ await this.clearNearDuplicateReferencesTo(canonicalId, inactiveState);
52617
+ } catch (error) {
52618
+ storeLog.warn("Failed to clear stale near-duplicate references (degraded)", {
52619
+ taskId: canonicalId,
52620
+ reason: inactiveState.reason,
52621
+ error: error instanceof Error ? error.message : String(error)
52622
+ });
52623
+ }
52624
+ }
52546
52625
  async getTasksByAssignedAgent(agentId, options) {
52547
52626
  const whereClauses = ["assignedAgentId = ?", _TaskStore.ACTIVE_TASKS_WHERE];
52548
52627
  const params = [agentId];
@@ -52926,6 +53005,12 @@ ${newTask.description}
52926
53005
  if (this.isWatching) this.taskCache.set(id, { ...task });
52927
53006
  this.emit("task:updated", task);
52928
53007
  }
53008
+ if (toColumn === "done") {
53009
+ await this.clearNearDuplicateReferencesToFailSoft(id, {
53010
+ column: "done",
53011
+ reason: "done"
53012
+ });
53013
+ }
52929
53014
  return task;
52930
53015
  }
52931
53016
  const fromColumn = task.column;
@@ -53309,6 +53394,12 @@ ${newTask.description}
53309
53394
  if (fromColumn !== toColumn) {
53310
53395
  this.emit("task:moved", { task, from: fromColumn, to: toColumn, source: moveSource });
53311
53396
  }
53397
+ if (toColumn === "done") {
53398
+ await this.clearNearDuplicateReferencesToFailSoft(id, {
53399
+ column: "done",
53400
+ reason: "done"
53401
+ });
53402
+ }
53312
53403
  return task;
53313
53404
  }
53314
53405
  /**
@@ -55754,7 +55845,7 @@ ${newTask.description}
55754
55845
  * a no-op and does not re-emit task:deleted.
55755
55846
  */
55756
55847
  async deleteTask(id, options) {
55757
- return this.withTaskLock(id, async () => {
55848
+ const deletedTask = await this.withTaskLock(id, async () => {
55758
55849
  this.flushAgentLogBuffer();
55759
55850
  const task = this.readTaskFromDb(id, { includeDeleted: true });
55760
55851
  if (!task) {
@@ -55829,6 +55920,12 @@ ${newTask.description}
55829
55920
  this.emit("task:deleted", task, { githubIssueAction: options?.githubIssueAction ?? "auto" });
55830
55921
  return task;
55831
55922
  });
55923
+ await this.clearNearDuplicateReferencesToFailSoft(id, {
55924
+ column: "archived",
55925
+ deletedAt: deletedTask.deletedAt ?? (/* @__PURE__ */ new Date()).toISOString(),
55926
+ reason: "deleted"
55927
+ });
55928
+ return deletedTask;
55832
55929
  }
55833
55930
  deleteTaskById(taskId) {
55834
55931
  this.clearLinkedAgentTaskIds(taskId);
@@ -56287,7 +56384,7 @@ ${newTask.description}
56287
56384
  * or an options object that also allows removeLineageReferences.
56288
56385
  */
56289
56386
  async archiveTask(id, optionsOrCleanup = true) {
56290
- return this.withTaskLock(id, async () => {
56387
+ const archivedTask = await this.withTaskLock(id, async () => {
56291
56388
  const dir = this.taskDir(id);
56292
56389
  const task = await this.readTaskJson(dir);
56293
56390
  if (!task.log) {
@@ -56358,6 +56455,11 @@ ${newTask.description}
56358
56455
  this.emit("task:moved", { task, from: fromColumn, to: "archived", source: "engine" });
56359
56456
  return this.archiveEntryToTask(entry, false);
56360
56457
  });
56458
+ await this.clearNearDuplicateReferencesToFailSoft(id, {
56459
+ column: "archived",
56460
+ reason: "archived"
56461
+ });
56462
+ return archivedTask;
56361
56463
  }
56362
56464
  /**
56363
56465
  * Archive a task and immediately clean up its directory.
@@ -60411,6 +60513,7 @@ var init_near_duplicate = __esm({
60411
60513
  "../core/src/near-duplicate.ts"() {
60412
60514
  "use strict";
60413
60515
  init_duplicate_detection();
60516
+ init_near_duplicate_canonical();
60414
60517
  DEFAULT_WINDOW_MS3 = 7 * 24 * 60 * 60 * 1e3;
60415
60518
  DEFAULT_LIMIT2 = 5;
60416
60519
  DEFAULT_MIN_SHARED_TOKENS = 2;
@@ -82741,6 +82844,7 @@ __export(src_exports, {
82741
82844
  importSettings: () => importSettings,
82742
82845
  installQmd: () => installQmd,
82743
82846
  instanceNodeId: () => instanceNodeId,
82847
+ isActiveNearDuplicateColumn: () => isActiveNearDuplicateColumn,
82744
82848
  isAgentPermissionPolicyPresetId: () => isAgentPermissionPolicyPresetId,
82745
82849
  isApiTrigger: () => isApiTrigger,
82746
82850
  isBranchGroupComplete: () => isBranchGroupComplete,
@@ -82770,6 +82874,7 @@ __export(src_exports, {
82770
82874
  isMeshIntentState: () => isMeshIntentState,
82771
82875
  isMeshWriteClass: () => isMeshWriteClass,
82772
82876
  isMovedSettingsKey: () => isMovedSettingsKey,
82877
+ isNearDuplicateCanonicalInactive: () => isNearDuplicateCanonicalInactive,
82773
82878
  isPolicyBroaderThanDefault: () => isPolicyBroaderThanDefault,
82774
82879
  isPrBacked: () => isPrBacked,
82775
82880
  isPrEntityActionable: () => isPrEntityActionable,
@@ -83074,6 +83179,7 @@ var init_src = __esm({
83074
83179
  init_branch_assignment();
83075
83180
  init_custom_provider_key();
83076
83181
  init_redact_secrets();
83182
+ init_near_duplicate_canonical();
83077
83183
  init_frontend_ux_policy();
83078
83184
  init_mock_provider_constants();
83079
83185
  init_zai_provider();
@@ -119303,9 +119409,13 @@ var init_self_healing = __esm({
119303
119409
  * Terminal contract for stuck-loop exhaustion and no-progress churn:
119304
119410
  * - `STUCK_LOOP_EXHAUSTED`: increments the kill budget until exhausted. Once
119305
119411
  * exhausted, tasks with incomplete steps are moved back to `todo` with
119306
- * progress preserved and pause metadata reapplied for manual resume or
119412
+ * progress preserved, marked failed, and paused for manual resume or
119307
119413
  * decomposition; tasks with only terminal steps keep the legacy failed
119308
119414
  * `in-review` handoff path.
119415
+ *
119416
+ * FNXC:SelfHealing 2026-06-14-10:51:
119417
+ * Incomplete stuck-loop exhaustion must park work in a failed/paused state before moving columns, because a post-move patch failure must not leave the task scheduler-runnable.
119418
+ * Engine-owned recovery must not mutate `userPaused`; user intent stays authoritative across races.
119309
119419
  * - `STUCK_NO_PROGRESS_CHURN`: skips the budget entirely and terminalizes on
119310
119420
  * the first trigger with operator guidance to decompose or rescope.
119311
119421
  *
@@ -119392,8 +119502,25 @@ var init_self_healing = __esm({
119392
119502
  );
119393
119503
  return false;
119394
119504
  }
119395
- log22.warn(`${taskId} exceeded stuck kill budget (${newCount}/${maxKills}, reason=${reason}) with incomplete steps \u2014 re-queueing in todo with progress preserved`);
119396
- await this.store.updateTask(taskId, { stuckKillCount: newCount });
119505
+ log22.warn(`${taskId} exceeded stuck kill budget (${newCount}/${maxKills}, reason=${reason}) with incomplete steps \u2014 parking in todo with progress preserved`);
119506
+ const exhaustedError2 = `STUCK_LOOP_EXHAUSTED: incomplete task exhausted stuck kill budget (${newCount}/${maxKills}) after last reason=${reason}. Progress was preserved; manually retry, decompose, or rescope before execution resumes.`;
119507
+ const parkUpdate = {
119508
+ stuckKillCount: newCount,
119509
+ status: "failed",
119510
+ error: exhaustedError2,
119511
+ paused: true,
119512
+ pausedReason: "stuck-loop-exhausted-manual-intervention-required",
119513
+ pausedByAgentId: "self-healing",
119514
+ assignedAgentId: null,
119515
+ checkedOutBy: null,
119516
+ checkedOutAt: null,
119517
+ checkoutNodeId: null,
119518
+ checkoutRunId: null,
119519
+ checkoutLeaseRenewedAt: null,
119520
+ checkoutLeaseEpoch: 0,
119521
+ nextRecoveryAt: null
119522
+ };
119523
+ await this.store.updateTask(taskId, parkUpdate);
119397
119524
  try {
119398
119525
  await this.store.moveTask(taskId, "todo", {
119399
119526
  preserveProgress: true,
@@ -119404,33 +119531,43 @@ var init_self_healing = __esm({
119404
119531
  });
119405
119532
  } catch (moveErr) {
119406
119533
  const moveErrMessage = moveErr instanceof Error ? moveErr.message : String(moveErr);
119407
- log22.warn(`${taskId} moveTask(todo) failed (${moveErrMessage}) after incomplete STUCK_LOOP_EXHAUSTED terminalization \u2014 falling back to executor stuck-kill requeue`);
119534
+ log22.warn(`${taskId} moveTask(todo) failed (${moveErrMessage}) after incomplete STUCK_LOOP_EXHAUSTED terminalization \u2014 marking failed/paused in place`);
119535
+ try {
119536
+ await this.store.updateTask(taskId, parkUpdate);
119537
+ } catch (patchErr) {
119538
+ const patchErrMessage = patchErr instanceof Error ? patchErr.message : String(patchErr);
119539
+ log22.warn(`${taskId} in-place park patch failed after moveTask(todo) failure during incomplete STUCK_LOOP_EXHAUSTED terminalization: ${patchErrMessage}`);
119540
+ await this.store.logEntry(
119541
+ taskId,
119542
+ `STUCK_LOOP_EXHAUSTED: incomplete task failed to move to todo (${moveErrMessage}), and the in-place park patch also failed (${patchErrMessage}); pre-move park metadata was already applied, but operator verification is required before retry.`
119543
+ );
119544
+ return false;
119545
+ }
119546
+ try {
119547
+ await this.store.logEntry(
119548
+ taskId,
119549
+ `STUCK_LOOP_EXHAUSTED: incomplete task exhausted stuck kill budget (${newCount}/${maxKills}), last reason=${reason}. Failed to move task to todo (${moveErrMessage}); task was marked failed/paused in place and will not be automatically retried.`
119550
+ );
119551
+ } catch (logErr) {
119552
+ const logErrMessage = logErr instanceof Error ? logErr.message : String(logErr);
119553
+ log22.warn(`${taskId} failed to log in-place stuck-loop park success after moveTask(todo) failure: ${logErrMessage}`);
119554
+ }
119555
+ return false;
119556
+ }
119557
+ try {
119558
+ await this.store.updateTask(taskId, parkUpdate);
119408
119559
  await this.store.logEntry(
119409
119560
  taskId,
119410
- `STUCK_LOOP_EXHAUSTED: incomplete task exhausted stuck kill budget (${newCount}/${maxKills}), last reason=${reason}. Failed to move task to todo (${moveErrMessage}); falling back to executor stuck-kill requeue.`
119561
+ `STUCK_LOOP_EXHAUSTED: incomplete task exhausted stuck kill budget (${newCount}/${maxKills}), last reason=${reason}. Parked in todo with progress preserved; no further automatic retries will run until an operator manually retries, decomposes, or rescopes the task.`
119411
119562
  );
119412
- return true;
119413
- }
119414
- const requeueUpdate = {
119415
- stuckKillCount: newCount,
119416
- paused: false,
119417
- pausedReason: null,
119418
- status: "queued"
119419
- };
119420
- try {
119421
- await this.store.updateTask(taskId, requeueUpdate);
119422
119563
  } catch (patchErr) {
119423
119564
  const patchErrMessage = patchErr instanceof Error ? patchErr.message : String(patchErr);
119424
- log22.warn(`${taskId} post-move requeue patch failed after incomplete STUCK_LOOP_EXHAUSTED terminalization: ${patchErrMessage}`);
119565
+ log22.warn(`${taskId} post-move park patch failed after incomplete STUCK_LOOP_EXHAUSTED terminalization: ${patchErrMessage}`);
119425
119566
  await this.store.logEntry(
119426
119567
  taskId,
119427
- `STUCK_LOOP_EXHAUSTED: incomplete task moved to todo with progress preserved, but post-move requeue patch failed (${patchErrMessage}); scheduler retry may wait for the next state repair pass.`
119568
+ `STUCK_LOOP_EXHAUSTED: incomplete task moved to todo with progress preserved, but post-move park patch failed (${patchErrMessage}); operator repair is required before retry.`
119428
119569
  );
119429
119570
  }
119430
- await this.store.logEntry(
119431
- taskId,
119432
- `STUCK_LOOP_EXHAUSTED: incomplete task exhausted stuck kill budget (${newCount}/${maxKills}), last reason=${reason}. Re-queued in todo with progress preserved; scheduler may retry without manual unpause.`
119433
- );
119434
119571
  return false;
119435
119572
  }
119436
119573
  log22.warn(`${taskId} exceeded stuck kill budget (${newCount}/${maxKills}, reason=${reason}) \u2014 marking failed`);
@@ -128714,6 +128851,10 @@ Take a completely different approach to writing this specification. Do NOT repea
128714
128851
  if (!canonicalTask) {
128715
128852
  return;
128716
128853
  }
128854
+ if (isNearDuplicateCanonicalInactive(canonicalTask)) {
128855
+ planLog.log(`${task.id}: near-duplicate candidate ${canonical.id} is inactive; skipping near-duplicate flag`);
128856
+ return;
128857
+ }
128717
128858
  if (isStrictlyOlderOrTieCanonical(canonicalTask)) {
128718
128859
  await this.store.updateTask(task.id, {
128719
128860
  sourceMetadataPatch: {
@@ -172642,15 +172783,13 @@ async function submitResponse(sessionId, responses, rootDir, promptOverrides, st
172642
172783
  thinkingOutput: session.lastGeneratedThinking || ""
172643
172784
  };
172644
172785
  session.error = void 0;
172786
+ session.history.push(historyEntry);
172645
172787
  persistSession(session, "generating");
172646
172788
  if (!session.agent) {
172647
- await ensureSessionAgent(session, rootDir, session.history, promptOverrides, store);
172789
+ await ensureSessionAgent(session, rootDir, session.history.slice(0, -1), promptOverrides, store);
172648
172790
  }
172649
172791
  const message = formatResponseForAgent(currentQuestion, responses);
172650
172792
  await continueAgentConversation(session, message);
172651
- if (!session.error) {
172652
- session.history.push(historyEntry);
172653
- }
172654
172793
  }
172655
172794
  if (session.summary) {
172656
172795
  return { type: "complete", data: session.summary };
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fusion/pi-claude-cli",
3
- "version": "0.43.0",
3
+ "version": "0.43.1",
4
4
  "description": "Fusion vendored fork: pi coding-agent extension that routes LLM calls through the Claude Code CLI. Forked from rchern/pi-claude-cli (MIT). See UPSTREAM.md.",
5
5
  "license": "MIT",
6
6
  "private": true,
@@ -5202,6 +5202,8 @@ declare class TaskStore extends EventEmitter<TaskStoreEvents> {
5202
5202
  windowMs?: number;
5203
5203
  includeArchived?: boolean;
5204
5204
  }): Promise<Task[]>;
5205
+ private clearNearDuplicateReferencesTo;
5206
+ private clearNearDuplicateReferencesToFailSoft;
5205
5207
  getTasksByAssignedAgent(agentId: string, options?: {
5206
5208
  pausedOnly?: boolean;
5207
5209
  excludeArchived?: boolean;
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fusion-plugin-examples/acp-runtime",
3
- "version": "0.1.5",
3
+ "version": "0.1.6",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fusion-plugin-examples/cli-printing-press",
3
- "version": "0.1.22",
3
+ "version": "0.1.23",
4
4
  "type": "module",
5
5
  "description": "CLI Printing Press plugin package for Fusion",
6
6
  "private": true,
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fusion-plugin-examples/compound-engineering",
3
- "version": "0.1.5",
3
+ "version": "0.1.6",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fusion-plugin-examples/cursor-runtime",
3
- "version": "0.1.24",
3
+ "version": "0.1.25",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fusion-plugin-examples/dependency-graph",
3
- "version": "0.1.36",
3
+ "version": "0.1.37",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fusion-plugin-examples/droid-runtime",
3
- "version": "0.1.31",
3
+ "version": "0.1.32",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fusion-plugin-examples/hermes-runtime",
3
- "version": "0.2.55",
3
+ "version": "0.2.56",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fusion-plugin-examples/openclaw-runtime",
3
- "version": "0.2.55",
3
+ "version": "0.2.56",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fusion-plugin-examples/paperclip-runtime",
3
- "version": "0.2.55",
3
+ "version": "0.2.56",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fusion-plugin-examples/reports",
3
- "version": "0.1.24",
3
+ "version": "0.1.25",
4
4
  "type": "module",
5
5
  "description": "Reports plugin for Fusion",
6
6
  "private": true,
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fusion-plugin-examples/roadmap",
3
- "version": "0.1.24",
3
+ "version": "0.1.25",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fusion-plugin-examples/whatsapp-chat",
3
- "version": "0.1.24",
3
+ "version": "0.1.25",
4
4
  "type": "module",
5
5
  "description": "WhatsApp Web (Baileys) chat bridge for Fusion agents",
6
6
  "keywords": [
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@runfusion/fusion",
3
- "version": "0.43.0",
3
+ "version": "0.43.1",
4
4
  "license": "MIT",
5
5
  "description": "Fusion CLI: HTTP API server, daemon, dashboard launcher, and task tooling for the Fusion AI coding agent.",
6
6
  "homepage": "https://github.com/Runfusion/Fusion#readme",
@@ -1,10 +0,0 @@
1
- import {
2
- AutomationStore
3
- } from "./chunk-GETECT6V.js";
4
- import "./chunk-RXMQ5OMY.js";
5
- import "./chunk-MCUG2Z7M.js";
6
- import "./chunk-GUV4QQT3.js";
7
- import "./chunk-4VNS5WPM.js";
8
- export {
9
- AutomationStore
10
- };
@@ -1,10 +0,0 @@
1
- import {
2
- AutomationStore
3
- } from "./chunk-MAN4WYHO.js";
4
- import "./chunk-RXMQ5OMY.js";
5
- import "./chunk-BMUXDSBF.js";
6
- import "./chunk-5RGECGQL.js";
7
- import "./chunk-4VNS5WPM.js";
8
- export {
9
- AutomationStore
10
- };
@@ -1,10 +0,0 @@
1
- import {
2
- AutomationStore
3
- } from "./chunk-S2EVJUY3.js";
4
- import "./chunk-RXMQ5OMY.js";
5
- import "./chunk-BHM3UYWS.js";
6
- import "./chunk-AWKNRUOR.js";
7
- import "./chunk-4VNS5WPM.js";
8
- export {
9
- AutomationStore
10
- };