@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.
- package/dist/bin.js +167 -27
- package/dist/client/.vite/manifest.json +70 -70
- package/dist/client/assets/AgentDetailView-BGN03dyz.css +1 -0
- package/dist/client/assets/{AgentDetailView-FUKwQxBP.js → AgentDetailView-DKMz3r04.js} +1 -1
- package/dist/client/assets/{AgentPermissionPolicyEditor-DMDUhF1n.js → AgentPermissionPolicyEditor-BiY1a4KR.js} +1 -1
- package/dist/client/assets/{AgentsView-BrQLd-yI.js → AgentsView-Co-k4vjh.js} +3 -3
- package/dist/client/assets/{ChatView-Wz_0goif.js → ChatView-BkAG99bj.js} +1 -1
- package/dist/client/assets/{DevServerView-DRqQpHsc.js → DevServerView-C6DC0URX.js} +1 -1
- package/dist/client/assets/{DirectoryPicker-BFot4CVM.js → DirectoryPicker-CkcGjyv0.js} +1 -1
- package/dist/client/assets/{DocumentsView-hamhUcvL.js → DocumentsView-OCK1Vsw_.js} +1 -1
- package/dist/client/assets/{EvalsView-DAXqDqn2.js → EvalsView-CUfyj5GW.js} +1 -1
- package/dist/client/assets/{ExperimentalAgentOnboardingModal-B4aZ1y0n.js → ExperimentalAgentOnboardingModal-Dau9RTU_.js} +1 -1
- package/dist/client/assets/{GoalsView-2QOp9DA0.js → GoalsView-CNLTn0rX.js} +1 -1
- package/dist/client/assets/{InsightsView-D5fzFy-F.js → InsightsView-BQPxHxKI.js} +1 -1
- package/dist/client/assets/{MemoryView-B082KoR-.js → MemoryView-D3xQIFjj.js} +1 -1
- package/dist/client/assets/{NodesView-BA3pKMZu.js → NodesView-CSMvGwDU.js} +1 -1
- package/dist/client/assets/{PiExtensionsManager-C4I11iKm.js → PiExtensionsManager-BtqXF3fl.js} +1 -1
- package/dist/client/assets/{PluginManager-BzTzTMXZ.js → PluginManager-CSSDb3VO.js} +1 -1
- package/dist/client/assets/{PullRequestView-11xJ565q.js → PullRequestView-Bjyfffdu.js} +1 -1
- package/dist/client/assets/{ReliabilityView-CpELpGqw.js → ReliabilityView-QKMUDebT.js} +1 -1
- package/dist/client/assets/{ResearchView-BHiXfjzE.js → ResearchView-CRU_NPho.js} +1 -1
- package/dist/client/assets/{SecretsView-CC5OYoCn.js → SecretsView-Bs8ySyC5.js} +1 -1
- package/dist/client/assets/SecretsView-Djo1rahi.css +1 -0
- package/dist/client/assets/{SessionTerminal-G70Jwkzs.js → SessionTerminal-Dk1NgmN2.js} +1 -1
- package/dist/client/assets/{SettingsModal-C0M1CqOu.js → SettingsModal-JCaNvdAb.js} +3 -3
- package/dist/client/assets/{SettingsModal-BKEbtdqR.js → SettingsModal-Nw5cTKAK.js} +1 -1
- package/dist/client/assets/{SetupWizardModal-CBfItlP6.js → SetupWizardModal-CE79myEy.js} +1 -1
- package/dist/client/assets/{SkillsView-DbcW87-E.js → SkillsView-Dc8YskAX.js} +1 -1
- package/dist/client/assets/{StashRecoveryView-CH9RPtzX.js → StashRecoveryView-CqKOFiXT.js} +1 -1
- package/dist/client/assets/{TodoView-ToviJ0SV.js → TodoView-BqIRwcZw.js} +1 -1
- package/dist/client/assets/{WorkflowNodeEditor-BTu0D9c5.js → WorkflowNodeEditor-2jDuk2FR.js} +1 -1
- package/dist/client/assets/{dashboard-view-DtgLZ_LM.js → dashboard-view-BhbN8LPh.js} +1 -1
- package/dist/client/assets/{folder-open-BlPyIWyf.js → folder-open-Bw1mxVfa.js} +1 -1
- package/dist/client/assets/{index-bZCpHtGq.js → index-CpTBp1RG.js} +192 -192
- package/dist/client/assets/{upload-B-qmm1NH.js → upload-BCmd-1I0.js} +1 -1
- package/dist/client/assets/{users-D6C5TXf2.js → users-DO_t3V1p.js} +1 -1
- package/dist/client/index.html +1 -1
- package/dist/client/version.json +1 -1
- package/dist/droid-cli/package.json +1 -1
- package/dist/extension.js +166 -27
- package/dist/pi-claude-cli/package.json +1 -1
- package/dist/plugin-sdk/index.d.ts +2 -0
- package/dist/plugins/fusion-plugin-acp-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-cli-printing-press/package.json +1 -1
- package/dist/plugins/fusion-plugin-compound-engineering/package.json +1 -1
- package/dist/plugins/fusion-plugin-cursor-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-dependency-graph/package.json +1 -1
- package/dist/plugins/fusion-plugin-droid-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-hermes-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-openclaw-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-paperclip-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-reports/package.json +1 -1
- package/dist/plugins/fusion-plugin-roadmap/package.json +1 -1
- package/dist/plugins/fusion-plugin-whatsapp-chat/package.json +1 -1
- package/package.json +1 -1
- package/dist/automation-store-EKXXEE2S.js +0 -10
- package/dist/automation-store-PLNG3X72.js +0 -10
- package/dist/automation-store-RDDYZFUJ.js +0 -10
- package/dist/chunk-2JI3F6MG.js +0 -948
- package/dist/chunk-4L6CLWJC.js +0 -8345
- package/dist/chunk-4VNS5WPM.js +0 -42
- package/dist/chunk-5RGECGQL.js +0 -1139
- package/dist/chunk-6JDLN7IL.js +0 -409
- package/dist/chunk-AICJATVW.js +0 -948
- package/dist/chunk-AWKNRUOR.js +0 -1148
- package/dist/chunk-BHM3UYWS.js +0 -4651
- package/dist/chunk-BMUXDSBF.js +0 -4647
- package/dist/chunk-GETECT6V.js +0 -353
- package/dist/chunk-GUV4QQT3.js +0 -1143
- package/dist/chunk-JKQO7YYZ.js +0 -8369
- package/dist/chunk-LYZVU6UV.js +0 -409
- package/dist/chunk-MAN4WYHO.js +0 -353
- package/dist/chunk-MCUG2Z7M.js +0 -4651
- package/dist/chunk-PSDYB45U.js +0 -948
- package/dist/chunk-RR2HM46R.js +0 -8345
- package/dist/chunk-RXMQ5OMY.js +0 -9226
- package/dist/chunk-S2EVJUY3.js +0 -353
- package/dist/chunk-UXR5XZFZ.js +0 -409
- package/dist/client/assets/AgentDetailView-DiWELtb1.css +0 -1
- package/dist/client/assets/SecretsView-D5bHZ-wM.css +0 -1
- package/dist/extract-zip-WL55Z3AU.js +0 -2497
- package/dist/index.min-CHQ3ABYJ.js +0 -2926
- package/dist/memory-dreams-7USISKVE.js +0 -32
- package/dist/memory-dreams-PBPISUDD.js +0 -32
- package/dist/memory-dreams-XNO2B2QF.js +0 -32
- package/dist/migration-EH2YOCYQ.js +0 -15
- package/dist/migration-PLGTTKL5.js +0 -15
- package/dist/migration-WZEZK22R.js +0 -15
- package/dist/routine-store-GIJ6MXWY.js +0 -10
- package/dist/routine-store-HTVC2PUQ.js +0 -10
- package/dist/routine-store-KGHZBPDF.js +0 -10
package/dist/client/index.html
CHANGED
|
@@ -207,7 +207,7 @@
|
|
|
207
207
|
</script>
|
|
208
208
|
<!-- fusion:view-preload -->
|
|
209
209
|
|
|
210
|
-
<script type="module" crossorigin src="/assets/index-
|
|
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">
|
package/dist/client/version.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":"
|
|
1
|
+
{"version":"f7635faf3-7ebf82ef"}
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
119396
|
-
|
|
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
|
|
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}.
|
|
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
|
|
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
|
|
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.
|
|
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;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@runfusion/fusion",
|
|
3
|
-
"version": "0.43.
|
|
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",
|