@runfusion/fusion 0.47.0 → 0.48.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (109) hide show
  1. package/dist/bin.js +153 -85
  2. package/dist/client/.vite/manifest.json +242 -242
  3. package/dist/client/assets/{AgentDetailView-D9lYcdOS.js → AgentDetailView-CF6isJ51.js} +1 -1
  4. package/dist/client/assets/{AgentPermissionPolicyEditor-Bn_PEeQW.js → AgentPermissionPolicyEditor-DFldf6aS.js} +1 -1
  5. package/dist/client/assets/{AgentsView-BRbnFmv3.js → AgentsView-DiGseTuo.js} +3 -3
  6. package/dist/client/assets/{ChatView-Batci7-w.js → ChatView-BjQBbDyo.js} +1 -1
  7. package/dist/client/assets/{CommandCenter-DAUgvVMX.js → CommandCenter-DwpiADSX.js} +1 -1
  8. package/dist/client/assets/{DevServerView-HdEXR5UB.js → DevServerView-D6RFaGPU.js} +1 -1
  9. package/dist/client/assets/{DirectoryPicker-DrCiUJlF.js → DirectoryPicker-DNBB-viz.js} +1 -1
  10. package/dist/client/assets/{DocumentsView-C0KxPWex.js → DocumentsView-DXG-sctG.js} +1 -1
  11. package/dist/client/assets/{EvalsView-wCfi9Rkj.js → EvalsView-Ol6ECKz5.js} +1 -1
  12. package/dist/client/assets/{ExperimentalAgentOnboardingModal-Crck6eJe.js → ExperimentalAgentOnboardingModal-BQc3GaE_.js} +1 -1
  13. package/dist/client/assets/{GoalsView-sFGHX3Wt.js → GoalsView-C_m90anC.js} +1 -1
  14. package/dist/client/assets/{InsightsView-jl0cX1um.js → InsightsView-BbFgPsDH.js} +1 -1
  15. package/dist/client/assets/{MemoryView-Bwv99M_s.js → MemoryView-CRS7AjWK.js} +1 -1
  16. package/dist/client/assets/{PiExtensionsManager-BsA3tCZh.js → PiExtensionsManager-BEj5xu45.js} +1 -1
  17. package/dist/client/assets/{PluginManager-Bgd8Hj0a.js → PluginManager-CzCM3XUY.js} +1 -1
  18. package/dist/client/assets/{PullRequestView-CqO16SNt.js → PullRequestView-9yNYCunb.js} +1 -1
  19. package/dist/client/assets/{ResearchView-CfRsbJWS.js → ResearchView-BKdirpiw.js} +1 -1
  20. package/dist/client/assets/{SecretsView-CHomYGnm.js → SecretsView-qGjo-0Cp.js} +1 -1
  21. package/dist/client/assets/{SessionTerminal-DcYUuwbV.js → SessionTerminal-C7YlkdGJ.js} +1 -1
  22. package/dist/client/assets/{SettingsModal-CX5GLed_.js → SettingsModal-DihNd7g8.js} +1 -1
  23. package/dist/client/assets/{SettingsModal-ybSf6HDn.js → SettingsModal-DpaptT6t.js} +3 -3
  24. package/dist/client/assets/{SetupWizardModal-D2BQL0df.js → SetupWizardModal-MovTj5pY.js} +2 -2
  25. package/dist/client/assets/{ShadcnColorPicker-B-8x0Gci.js → ShadcnColorPicker-Bnf5n5R4.js} +1 -1
  26. package/dist/client/assets/{SkillsView-4iqYHf9N.js → SkillsView-Br2LkA3x.js} +1 -1
  27. package/dist/client/assets/{TodoView-BJsknVS6.js → TodoView-BEdk6FTU.js} +1 -1
  28. package/dist/client/assets/{WorkflowNodeEditor-QdwW4bY5.js → WorkflowNodeEditor-e-eR6yzw.js} +1 -1
  29. package/dist/client/assets/{agentSkills-CwR8s-gl.js → agentSkills-D5nDZPRY.js} +1 -1
  30. package/dist/client/assets/{app-BJGkp7Tt.js → app-BM6bAO0b.js} +1 -1
  31. package/dist/client/assets/{app-CZQ_fFNf.js → app-BglOELbc.js} +1 -1
  32. package/dist/client/assets/{app-BaoNC9zg.js → app-ChkCVQpq.js} +1 -1
  33. package/dist/client/assets/{app-DgezOJub.js → app-DMn7Jt9g.js} +1 -1
  34. package/dist/client/assets/{app-DAu3AzsS.js → app-D_IT9Buz.js} +1 -1
  35. package/dist/client/assets/{app-BKLUvvm8.js → app-S8fehQv8.js} +1 -1
  36. package/dist/client/assets/{architectureDiagram-3BPJPVTR-rav0thhm.js → architectureDiagram-3BPJPVTR-BbkXWBni.js} +1 -1
  37. package/dist/client/assets/{blockDiagram-GPEHLZMM-x9Opikul.js → blockDiagram-GPEHLZMM-DhaqpHqZ.js} +1 -1
  38. package/dist/client/assets/{c4Diagram-AAUBKEIU-BGrWtNPI.js → c4Diagram-AAUBKEIU-qC0WSHMZ.js} +1 -1
  39. package/dist/client/assets/channel-CCKvUami.js +1 -0
  40. package/dist/client/assets/{chunk-2J33WTMH-BMFvL-OW.js → chunk-2J33WTMH-Dah9zMeT.js} +1 -1
  41. package/dist/client/assets/{chunk-4BX2VUAB-CWTOrH7n.js → chunk-4BX2VUAB-epHwnUb_.js} +1 -1
  42. package/dist/client/assets/{chunk-55IACEB6-l48k3a4l.js → chunk-55IACEB6-DpYBy44g.js} +1 -1
  43. package/dist/client/assets/{chunk-727SXJPM-DeynG6ym.js → chunk-727SXJPM-B9b8698e.js} +1 -1
  44. package/dist/client/assets/{chunk-AQP2D5EJ-B9ndyq3h.js → chunk-AQP2D5EJ-DrM8nnhR.js} +1 -1
  45. package/dist/client/assets/{chunk-FMBD7UC4-DV2d1-q1.js → chunk-FMBD7UC4-jyT6Scwe.js} +1 -1
  46. package/dist/client/assets/{chunk-ND2GUHAM-D0Dl37Mc.js → chunk-ND2GUHAM-EoPfF-PK.js} +1 -1
  47. package/dist/client/assets/{chunk-QZHKN3VN-NGiOWxhM.js → chunk-QZHKN3VN-qMwLVfgJ.js} +1 -1
  48. package/dist/client/assets/classDiagram-4FO5ZUOK-C_HqY7AI.js +1 -0
  49. package/dist/client/assets/classDiagram-v2-Q7XG4LA2-C_HqY7AI.js +1 -0
  50. package/dist/client/assets/{cose-bilkent-S5V4N54A-2ojNpRS8.js → cose-bilkent-S5V4N54A-DmPFKoVD.js} +1 -1
  51. package/dist/client/assets/{dagre-BM42HDAG-BaIP71Bo.js → dagre-BM42HDAG-DeHxd-ej.js} +1 -1
  52. package/dist/client/assets/{dashboard-view-hB7ta6sK.js → dashboard-view-Cw5mMJay.js} +1 -1
  53. package/dist/client/assets/{dashboard-view-CC2QtNhx.js → dashboard-view-DXjNQ5IF.js} +1 -1
  54. package/dist/client/assets/{diagram-2AECGRRQ-DQfEScya.js → diagram-2AECGRRQ-C04A2mhr.js} +1 -1
  55. package/dist/client/assets/{diagram-5GNKFQAL-B5iw3WNT.js → diagram-5GNKFQAL-DqtOwADI.js} +1 -1
  56. package/dist/client/assets/{diagram-KO2AKTUF-C5mMn4JH.js → diagram-KO2AKTUF-CH0har-Z.js} +1 -1
  57. package/dist/client/assets/{diagram-LMA3HP47-CaMhdmPl.js → diagram-LMA3HP47-CxN-U-0W.js} +1 -1
  58. package/dist/client/assets/{diagram-OG6HWLK6-D2ed8-Fx.js → diagram-OG6HWLK6-42A7wpwF.js} +1 -1
  59. package/dist/client/assets/{erDiagram-TEJ5UH35-CZl07SyK.js → erDiagram-TEJ5UH35-CnZI5YlN.js} +1 -1
  60. package/dist/client/assets/{flowDiagram-I6XJVG4X-Dz7RLhaG.js → flowDiagram-I6XJVG4X-BKfQhMVF.js} +1 -1
  61. package/dist/client/assets/{folder-open-DCNfEqr1.js → folder-open-STXgbemw.js} +1 -1
  62. package/dist/client/assets/{ganttDiagram-6RSMTGT7-C3ny-S6Q.js → ganttDiagram-6RSMTGT7-BfA0pME8.js} +1 -1
  63. package/dist/client/assets/{gitGraphDiagram-PVQCEYII-BjHF5C7t.js → gitGraphDiagram-PVQCEYII-BgDFB7PS.js} +1 -1
  64. package/dist/client/assets/index-BnfnLXyO.css +1 -0
  65. package/dist/client/assets/index-CHy0WNjH.js +1301 -0
  66. package/dist/client/assets/{infoDiagram-5YYISTIA-BTYecWEx.js → infoDiagram-5YYISTIA-Bb5F155s.js} +1 -1
  67. package/dist/client/assets/{ishikawaDiagram-YF4QCWOH-BBNOAxJa.js → ishikawaDiagram-YF4QCWOH-8Oati7l_.js} +1 -1
  68. package/dist/client/assets/{journeyDiagram-JHISSGLW-DrjdbyT5.js → journeyDiagram-JHISSGLW-DhHTHXTM.js} +1 -1
  69. package/dist/client/assets/{kanban-definition-UN3LZRKU-CgTNTfT7.js → kanban-definition-UN3LZRKU-BWB9EtUX.js} +1 -1
  70. package/dist/client/assets/{mermaid.core-CyFmJxTj.js → mermaid.core-BD-L2gUQ.js} +4 -4
  71. package/dist/client/assets/{mindmap-definition-RKZ34NQL-C95r0KZv.js → mindmap-definition-RKZ34NQL-BSKGd7LE.js} +1 -1
  72. package/dist/client/assets/{pieDiagram-4H26LBE5-CmYuIsZ-.js → pieDiagram-4H26LBE5-BtBFPvSW.js} +1 -1
  73. package/dist/client/assets/{quadrantDiagram-W4KKPZXB-BFLFwHMa.js → quadrantDiagram-W4KKPZXB-aWQWYPto.js} +1 -1
  74. package/dist/client/assets/{requirementDiagram-4Y6WPE33-G0s0AfQq.js → requirementDiagram-4Y6WPE33-CprlEpIa.js} +1 -1
  75. package/dist/client/assets/{sankeyDiagram-5OEKKPKP-D8OLAFhm.js → sankeyDiagram-5OEKKPKP-Cw-AcRAV.js} +1 -1
  76. package/dist/client/assets/{sequenceDiagram-3UESZ5HK-6fDSosvV.js → sequenceDiagram-3UESZ5HK-BMW5slyv.js} +1 -1
  77. package/dist/client/assets/{shield-alert-CBAzSycj.js → shield-alert-Bzf8yNOc.js} +1 -1
  78. package/dist/client/assets/{stateDiagram-AJRCARHV-BfNs5lJU.js → stateDiagram-AJRCARHV-CcxvIVwM.js} +1 -1
  79. package/dist/client/assets/{stateDiagram-v2-BHNVJYJU-Bt0-CBqz.js → stateDiagram-v2-BHNVJYJU-awOfoFOB.js} +1 -1
  80. package/dist/client/assets/{timeline-definition-PNZ67QCA-DmKYLILn.js → timeline-definition-PNZ67QCA-DIEAc2YP.js} +1 -1
  81. package/dist/client/assets/{upload--9MWYfcA.js → upload-DuwyPTKe.js} +1 -1
  82. package/dist/client/assets/{users-vOsWas_i.js → users-D1Qhfyro.js} +1 -1
  83. package/dist/client/assets/{vennDiagram-CIIHVFJN-D3jx9PAk.js → vennDiagram-CIIHVFJN-DOkqg5Wi.js} +1 -1
  84. package/dist/client/assets/{wardley-L42UT6IY-BGRnyThw.js → wardley-L42UT6IY-DoPK1Q6d.js} +1 -1
  85. package/dist/client/assets/{wardleyDiagram-YWT4CUSO-pwLVIgII.js → wardleyDiagram-YWT4CUSO-l1vun-m2.js} +1 -1
  86. package/dist/client/assets/{xychartDiagram-2RQKCTM6-ltxtDdDp.js → xychartDiagram-2RQKCTM6-DcUOUKvl.js} +1 -1
  87. package/dist/client/index.html +2 -2
  88. package/dist/client/version.json +1 -1
  89. package/dist/droid-cli/package.json +1 -1
  90. package/dist/extension.js +104 -77
  91. package/dist/pi-claude-cli/package.json +1 -1
  92. package/dist/plugins/fusion-plugin-acp-runtime/package.json +1 -1
  93. package/dist/plugins/fusion-plugin-cli-printing-press/package.json +1 -1
  94. package/dist/plugins/fusion-plugin-compound-engineering/package.json +1 -1
  95. package/dist/plugins/fusion-plugin-cursor-runtime/package.json +1 -1
  96. package/dist/plugins/fusion-plugin-dependency-graph/package.json +1 -1
  97. package/dist/plugins/fusion-plugin-droid-runtime/package.json +1 -1
  98. package/dist/plugins/fusion-plugin-hermes-runtime/package.json +1 -1
  99. package/dist/plugins/fusion-plugin-openclaw-runtime/package.json +1 -1
  100. package/dist/plugins/fusion-plugin-paperclip-runtime/package.json +1 -1
  101. package/dist/plugins/fusion-plugin-reports/package.json +1 -1
  102. package/dist/plugins/fusion-plugin-roadmap/package.json +1 -1
  103. package/dist/plugins/fusion-plugin-whatsapp-chat/package.json +1 -1
  104. package/package.json +1 -1
  105. package/dist/client/assets/channel-BFVfY8Ks.js +0 -1
  106. package/dist/client/assets/classDiagram-4FO5ZUOK-pfX_P8V9.js +0 -1
  107. package/dist/client/assets/classDiagram-v2-Q7XG4LA2-pfX_P8V9.js +0 -1
  108. package/dist/client/assets/index-CUY6xXXv.js +0 -1292
  109. package/dist/client/assets/index-CXlzJfKU.css +0 -1
package/dist/extension.js CHANGED
@@ -71209,9 +71209,6 @@ function evaluateInterpreterCutoverReadiness(input) {
71209
71209
  if (!input.authoritativeFlagEnabled) {
71210
71210
  reasons.push("experimentalFeatures.workflowInterpreterAuthoritative is disabled");
71211
71211
  }
71212
- if (!input.dualObserveEnabled) {
71213
- reasons.push("experimentalFeatures.workflowInterpreterDualObserve is disabled");
71214
- }
71215
71212
  const paritySummary = input.paritySummary;
71216
71213
  if (!paritySummary) {
71217
71214
  reasons.push("workflow parity summary unavailable");
@@ -159238,7 +159235,6 @@ var init_workflow_authoritative_driver = __esm({
159238
159235
  "use strict";
159239
159236
  init_src();
159240
159237
  init_logger2();
159241
- init_workflow_parity_observer();
159242
159238
  init_workflow_graph_task_runner();
159243
159239
  AUTHORITATIVE_WORKFLOW_ID = "workflow-interpreter-authoritative";
159244
159240
  WorkflowAuthoritativeDriver = class {
@@ -159265,13 +159261,8 @@ var init_workflow_authoritative_driver = __esm({
159265
159261
  settings,
159266
159262
  WORKFLOW_INTERPRETER_AUTHORITATIVE_FLAG
159267
159263
  );
159268
- const dualObserveEnabled = isExperimentalFeatureEnabled(
159269
- settings,
159270
- WORKFLOW_INTERPRETER_DUAL_OBSERVE_FLAG
159271
- );
159272
159264
  const readiness = evaluateInterpreterCutoverReadiness({
159273
159265
  authoritativeFlagEnabled,
159274
- dualObserveEnabled,
159275
159266
  paritySummary,
159276
159267
  minimumObservedRuns: this.deps.minimumObservedRuns
159277
159268
  });
@@ -182053,10 +182044,6 @@ function persistThinking(sessionId, thinkingOutput) {
182053
182044
  if (!_aiSessionStore) return;
182054
182045
  _aiSessionStore.updateThinking(sessionId, thinkingOutput);
182055
182046
  }
182056
- function unpersistSession(sessionId) {
182057
- if (!_aiSessionStore) return;
182058
- _aiSessionStore.delete(sessionId);
182059
- }
182060
182047
  function buildSessionFromRow(row) {
182061
182048
  const payload = safeParseJson(
182062
182049
  row.inputPayload,
@@ -182289,8 +182276,8 @@ async function getFirstQuestionFromAgent(session, message) {
182289
182276
  }
182290
182277
  }
182291
182278
  if (!parsed) {
182292
- sessions.delete(session.id);
182293
- unpersistSession(session.id);
182279
+ const errorMessage = buildRetryableParseErrorMessage(lastError);
182280
+ setSessionError(session, errorMessage);
182294
182281
  try {
182295
182282
  await session.agent.session.dispose?.();
182296
182283
  } catch (disposeErr) {
@@ -182301,9 +182288,7 @@ async function getFirstQuestionFromAgent(session, message) {
182301
182288
  });
182302
182289
  }
182303
182290
  session.agent = void 0;
182304
- throw new Error(
182305
- `Failed to get first question from AI: ${lastError?.message || "Unknown error"}`
182306
- );
182291
+ throw new Error(`Failed to get first question from AI: ${errorMessage}`);
182307
182292
  }
182308
182293
  if (parsed.type === "complete") {
182309
182294
  const summary = parsed.data;
@@ -182434,6 +182419,10 @@ async function maybeNotifyPlanningAwaitingInput(session, question) {
182434
182419
  });
182435
182420
  }
182436
182421
  }
182422
+ function buildRetryableParseErrorMessage(error) {
182423
+ const baseMessage = (error?.message || "Failed to parse AI response").replace(/\s*Please try again\.?\s*$/i, "").trim();
182424
+ return `${baseMessage}. Retry this planning session or start a new one.`;
182425
+ }
182437
182426
  function setSessionError(session, message) {
182438
182427
  session.error = message;
182439
182428
  session.updatedAt = /* @__PURE__ */ new Date();
@@ -182566,18 +182555,12 @@ async function continueAgentConversation(session, message) {
182566
182555
  }
182567
182556
  }
182568
182557
  if (!parsed) {
182569
- const errorMsg = `${lastError?.message || "Failed to parse AI response"} You can try responding again or start a new planning session.`;
182558
+ const errorMsg = buildRetryableParseErrorMessage(lastError);
182570
182559
  diagnostics2.error(
182571
182560
  "All parse attempts exhausted for session",
182572
182561
  { sessionId: session.id, message: errorMsg, operation: "parse-exhausted" }
182573
182562
  );
182574
- session.error = errorMsg;
182575
- session.updatedAt = /* @__PURE__ */ new Date();
182576
- persistSession(session, "error", errorMsg);
182577
- planningStreamManager.broadcast(session.id, {
182578
- type: "error",
182579
- data: errorMsg
182580
- });
182563
+ setSessionError(session, errorMsg);
182581
182564
  return;
182582
182565
  }
182583
182566
  if (parsed.type === "question") {
@@ -182614,13 +182597,33 @@ async function continueAgentConversation(session, message) {
182614
182597
  setSessionError(session, errorMessage);
182615
182598
  }
182616
182599
  }
182600
+ function isPlanningResponseShape(parsed) {
182601
+ if (typeof parsed !== "object" || parsed === null || !("type" in parsed) || !("data" in parsed)) {
182602
+ return false;
182603
+ }
182604
+ const typed = parsed;
182605
+ return (typed.type === "question" || typed.type === "complete") && typed.data !== null && typed.data !== void 0;
182606
+ }
182607
+ function parseJsonCandidateForShape(candidate) {
182608
+ try {
182609
+ return JSON.parse(candidate);
182610
+ } catch {
182611
+ try {
182612
+ return JSON.parse(repairJson2(candidate));
182613
+ } catch {
182614
+ return void 0;
182615
+ }
182616
+ }
182617
+ }
182617
182618
  function extractJsonCandidate2(text) {
182618
182619
  if (!text || !text.trim()) return null;
182619
- const codeBlockMatch = text.match(/```(?:json)?\s*([\s\S]*?)\s*```/);
182620
- if (codeBlockMatch?.[1]) {
182621
- const candidate = codeBlockMatch[1].trim();
182622
- if (candidate.startsWith("{")) return candidate;
182623
- }
182620
+ const codeBlockMatches = [...text.matchAll(/```(?:json)?\s*([\s\S]*?)\s*```/g)];
182621
+ const codeBlockCandidates = codeBlockMatches.map((match) => match[1]?.trim()).filter((candidate) => Boolean(candidate?.startsWith("{")));
182622
+ const planningCodeBlock = codeBlockCandidates.find(
182623
+ (candidate) => isPlanningResponseShape(parseJsonCandidateForShape(candidate))
182624
+ );
182625
+ if (planningCodeBlock) return planningCodeBlock;
182626
+ if (codeBlockCandidates.length > 0) return codeBlockCandidates[0];
182624
182627
  const candidates = [];
182625
182628
  for (let i = 0; i < text.length; i++) {
182626
182629
  if (text[i] === "{") {
@@ -182646,19 +182649,18 @@ function extractJsonCandidate2(text) {
182646
182649
  if (ch === "}") depth--;
182647
182650
  if (depth === 0) {
182648
182651
  const candidate = text.slice(i, j2 + 1).trim();
182649
- try {
182650
- JSON.parse(candidate);
182651
- candidates.push({ start: i, end: j2, text: candidate });
182652
- } catch {
182653
- }
182652
+ candidates.push({ start: i, end: j2, text: candidate, parsed: parseJsonCandidateForShape(candidate) });
182654
182653
  break;
182655
182654
  }
182656
182655
  }
182657
182656
  }
182658
182657
  }
182659
- if (candidates.length > 0) {
182660
- candidates.sort((a, b2) => b2.text.length - a.text.length);
182661
- return candidates[0].text;
182658
+ const planningCandidate = candidates.find((candidate) => isPlanningResponseShape(candidate.parsed));
182659
+ if (planningCandidate) return planningCandidate.text;
182660
+ const validCandidates = candidates.filter((candidate) => candidate.parsed !== void 0);
182661
+ if (validCandidates.length > 0) {
182662
+ validCandidates.sort((a, b2) => b2.text.length - a.text.length || a.start - b2.start);
182663
+ return validCandidates[0].text;
182662
182664
  }
182663
182665
  const trimmed = text.trim();
182664
182666
  if (trimmed.startsWith("{")) return trimmed;
@@ -182743,11 +182745,8 @@ function parseAgentResponse2(text) {
182743
182745
  );
182744
182746
  }
182745
182747
  }
182746
- if (typeof parsed === "object" && parsed !== null && "type" in parsed && "data" in parsed) {
182747
- const typed = parsed;
182748
- if ((typed.type === "question" || typed.type === "complete") && typed.data !== null && typed.data !== void 0) {
182749
- return parsed;
182750
- }
182748
+ if (isPlanningResponseShape(parsed)) {
182749
+ return parsed;
182751
182750
  }
182752
182751
  diagnostics2.error("Invalid response structure from AI", { parsedSnippet: JSON.stringify(parsed).slice(0, 500), operation: "parse-validate" });
182753
182752
  throw new Error("AI returned an invalid response structure. Please try again.");
@@ -184736,6 +184735,13 @@ function parseIssueUrl(stdout) {
184736
184735
  url
184737
184736
  };
184738
184737
  }
184738
+ function requireNonEmptyPrBody(body) {
184739
+ const trimmed = body?.trim() ?? "";
184740
+ if (!trimmed) {
184741
+ throw new Error("PR body is required when creating a pull request");
184742
+ }
184743
+ return trimmed;
184744
+ }
184739
184745
  function normalizeCheckState(state) {
184740
184746
  switch ((state ?? "").toLowerCase()) {
184741
184747
  case "success":
@@ -185140,6 +185146,7 @@ var init_github = __esm({
185140
185146
  createPrWithGh(params) {
185141
185147
  const { owner: paramOwner, repo: paramRepo, title, body, head, base, draft, reviewers } = params;
185142
185148
  const { owner, repo } = this.resolveRepo(paramOwner, paramRepo);
185149
+ const prBody = requireNonEmptyPrBody(body);
185143
185150
  const args = [
185144
185151
  "pr",
185145
185152
  "create",
@@ -185148,11 +185155,10 @@ var init_github = __esm({
185148
185155
  "--title",
185149
185156
  title,
185150
185157
  "--head",
185151
- head
185158
+ head,
185159
+ "--body",
185160
+ prBody
185152
185161
  ];
185153
- if (body) {
185154
- args.push("--body", body);
185155
- }
185156
185162
  if (base) {
185157
185163
  args.push("--base", base);
185158
185164
  }
@@ -185182,6 +185188,7 @@ var init_github = __esm({
185182
185188
  async createPrWithApi(params) {
185183
185189
  const { owner: paramOwner, repo: paramRepo, title, body, head, base = "main", draft, reviewers } = params;
185184
185190
  const { owner, repo } = this.resolveRepo(paramOwner, paramRepo);
185191
+ const prBody = requireNonEmptyPrBody(body);
185185
185192
  const url = `${this.baseUrl}/repos/${encodeURIComponent(owner)}/${encodeURIComponent(repo)}/pulls`;
185186
185193
  const headers = this.buildHeaders();
185187
185194
  const response = await fetch(url, {
@@ -185189,7 +185196,7 @@ var init_github = __esm({
185189
185196
  headers,
185190
185197
  body: JSON.stringify({
185191
185198
  title,
185192
- body: body || "",
185199
+ body: prBody,
185193
185200
  head,
185194
185201
  base,
185195
185202
  draft: draft === true
@@ -188555,7 +188562,7 @@ import { promisify as promisify54 } from "node:util";
188555
188562
  import { exec as execCb } from "node:child_process";
188556
188563
  import { access as access8, readFile as readFile26 } from "node:fs/promises";
188557
188564
  import { join as join62 } from "node:path";
188558
- function buildFallback(task) {
188565
+ function buildFallbackPrMetadata(task) {
188559
188566
  return {
188560
188567
  title: task.title ?? task.id,
188561
188568
  body: [
@@ -188659,12 +188666,13 @@ Closes ${taskId}`.trim()]
188659
188666
  return out.join("\n");
188660
188667
  }
188661
188668
  async function runCommand(command, cwd, signal) {
188662
- const { stdout } = await execAsync36(command, {
188669
+ const commandPromise = execAsync36(command, {
188663
188670
  cwd,
188664
188671
  timeout: 15e3,
188665
188672
  maxBuffer: 10 * 1024 * 1024,
188666
188673
  signal
188667
188674
  });
188675
+ const { stdout } = signal ? await raceWithAbort(commandPromise, signal) : await commandPromise;
188668
188676
  return stdout.trim();
188669
188677
  }
188670
188678
  function createAbortError3() {
@@ -188678,19 +188686,41 @@ function throwIfAborted3(signal) {
188678
188686
  }
188679
188687
  throw signal.reason instanceof Error ? signal.reason : createAbortError3();
188680
188688
  }
188681
- function waitForAbort(signal) {
188682
- return new Promise((_2, reject) => {
188683
- if (signal.aborted) {
188684
- reject(signal.reason instanceof Error ? signal.reason : createAbortError3());
188685
- return;
188686
- }
188687
- signal.addEventListener(
188688
- "abort",
188689
- () => reject(signal.reason instanceof Error ? signal.reason : createAbortError3()),
188690
- { once: true }
188689
+ function getAbortReason(signal) {
188690
+ return signal.reason instanceof Error ? signal.reason : createAbortError3();
188691
+ }
188692
+ function raceWithAbort(operation, signal) {
188693
+ if (signal.aborted) {
188694
+ return Promise.reject(getAbortReason(signal));
188695
+ }
188696
+ return new Promise((resolve32, reject) => {
188697
+ const cleanup = () => signal.removeEventListener("abort", onAbort);
188698
+ const onAbort = () => {
188699
+ cleanup();
188700
+ reject(getAbortReason(signal));
188701
+ };
188702
+ signal.addEventListener("abort", onAbort, { once: true });
188703
+ Promise.resolve(operation).then(
188704
+ (value) => {
188705
+ cleanup();
188706
+ resolve32(value);
188707
+ },
188708
+ (error) => {
188709
+ cleanup();
188710
+ reject(error);
188711
+ }
188691
188712
  );
188692
188713
  });
188693
188714
  }
188715
+ function disposeSessionBestEffort(session) {
188716
+ try {
188717
+ const disposeResult = session.dispose?.();
188718
+ if (disposeResult && typeof disposeResult.catch === "function") {
188719
+ void disposeResult.catch(() => void 0);
188720
+ }
188721
+ } catch {
188722
+ }
188723
+ }
188694
188724
  function isAbortLikeError(error) {
188695
188725
  return Boolean(
188696
188726
  error && typeof error === "object" && ("name" in error ? error.name === "AbortError" : false)
@@ -188709,7 +188739,7 @@ async function resolveBaseBranch(task, repoRoot, signal) {
188709
188739
  }
188710
188740
  async function generatePrMetadata(input) {
188711
188741
  const { task, repoRoot, settings, signal, timeoutMs = PR_METADATA_TIMEOUT_MS } = input;
188712
- const fallback = buildFallback(task);
188742
+ const fallback = buildFallbackPrMetadata(task);
188713
188743
  const controller = new AbortController();
188714
188744
  const abortFromCaller = () => controller.abort(signal?.reason instanceof Error ? signal.reason : createAbortError3());
188715
188745
  const timeoutId = setTimeout(() => controller.abort(createAbortError3()), timeoutMs);
@@ -188724,24 +188754,24 @@ async function generatePrMetadata(input) {
188724
188754
  }
188725
188755
  try {
188726
188756
  throwIfAborted3(combinedSignal);
188727
- const baseBranch = await resolveBaseBranch(task, repoRoot, combinedSignal);
188728
- const [logOut, diffStatOut] = await Promise.all([
188757
+ const baseBranch = await raceWithAbort(resolveBaseBranch(task, repoRoot, combinedSignal), combinedSignal);
188758
+ const [logOut, diffStatOut] = await raceWithAbort(Promise.all([
188729
188759
  runCommand(`git log --no-merges ${baseBranch}..HEAD --format=%s%n%b`, repoRoot, combinedSignal).catch(() => ""),
188730
188760
  runCommand(`git diff --stat ${baseBranch}..HEAD`, repoRoot, combinedSignal).catch(() => "")
188731
- ]);
188761
+ ]), combinedSignal);
188732
188762
  let promptContent = "";
188733
188763
  try {
188734
188764
  const promptPath = join62(repoRoot, ".fusion", "tasks", task.id, "PROMPT.md");
188735
- promptContent = (await readFile26(promptPath, "utf8")).trim();
188765
+ promptContent = (await raceWithAbort(readFile26(promptPath, "utf8"), combinedSignal)).trim();
188736
188766
  } catch {
188737
188767
  promptContent = "";
188738
188768
  }
188739
188769
  const templatePath = join62(repoRoot, ".github", "pull_request_template.md");
188740
- const templateExists = await access8(templatePath).then(() => true).catch(() => false);
188741
- const template = templateExists ? await readFile26(templatePath, "utf8") : "";
188770
+ const templateExists = await raceWithAbort(access8(templatePath).then(() => true).catch(() => false), combinedSignal);
188771
+ const template = templateExists ? await raceWithAbort(readFile26(templatePath, "utf8"), combinedSignal) : "";
188742
188772
  const model = resolveTitleSummarizerSettingsModel(settings);
188743
188773
  let aiText = "";
188744
- const { session } = await createFnAgent2({
188774
+ const { session } = await raceWithAbort(createFnAgent2({
188745
188775
  cwd: repoRoot,
188746
188776
  tools: "readonly",
188747
188777
  defaultProvider: model.provider,
@@ -188754,7 +188784,7 @@ async function generatePrMetadata(input) {
188754
188784
  onText: (delta) => {
188755
188785
  aiText += delta;
188756
188786
  }
188757
- });
188787
+ }), combinedSignal);
188758
188788
  try {
188759
188789
  const contextPrompt = [
188760
188790
  `Task ID: ${task.id}`,
@@ -188769,15 +188799,12 @@ async function generatePrMetadata(input) {
188769
188799
  promptContent || "(none)"
188770
188800
  ].join("\n\n");
188771
188801
  throwIfAborted3(combinedSignal);
188772
- await Promise.race([
188802
+ await raceWithAbort(
188773
188803
  session.prompt(contextPrompt, { signal: combinedSignal }),
188774
- waitForAbort(combinedSignal)
188775
- ]);
188804
+ combinedSignal
188805
+ );
188776
188806
  } finally {
188777
- try {
188778
- session.dispose();
188779
- } catch {
188780
- }
188807
+ disposeSessionBestEffort(session);
188781
188808
  }
188782
188809
  const parsed = parseAiResult(aiText);
188783
188810
  if (!parsed) {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fusion/pi-claude-cli",
3
- "version": "0.47.0",
3
+ "version": "0.48.0",
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,
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fusion-plugin-examples/acp-runtime",
3
- "version": "0.1.10",
3
+ "version": "0.1.11",
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.27",
3
+ "version": "0.1.28",
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.10",
3
+ "version": "0.1.11",
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.29",
3
+ "version": "0.1.30",
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.41",
3
+ "version": "0.1.42",
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.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/hermes-runtime",
3
- "version": "0.2.60",
3
+ "version": "0.2.61",
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.60",
3
+ "version": "0.2.61",
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.60",
3
+ "version": "0.2.61",
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.29",
3
+ "version": "0.1.30",
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.29",
3
+ "version": "0.1.30",
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.29",
3
+ "version": "0.1.30",
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.47.0",
3
+ "version": "0.48.0",
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 +0,0 @@
1
- import{U as a,C as n}from"./mermaid.core-CyFmJxTj.js";const t=(r,o)=>a.lang.round(n.parse(r)[o]);export{t as c};
@@ -1 +0,0 @@
1
- import{s as a,c as s,a as t,C as e}from"./chunk-727SXJPM-DeynG6ym.js";import{_ as i}from"./mermaid.core-CyFmJxTj.js";import"./vendor-reactflow-Bg-Qjzh8.js";import"./chunk-FMBD7UC4-DV2d1-q1.js";import"./chunk-ND2GUHAM-D0Dl37Mc.js";import"./chunk-55IACEB6-l48k3a4l.js";import"./chunk-2J33WTMH-BMFvL-OW.js";import"./index-CUY6xXXv.js";import"./vendor-react-SZ_qB27O.js";import"./vendor-i18n-GF3RlKbq.js";import"./vendor-xterm-BNq00GSj.js";import"./vendor-codemirror-jBKmHyH0.js";import"./step-yuy0qJer.js";var k={parser:t,get db(){return new e},renderer:s,styles:a,init:i(r=>{r.class||(r.class={}),r.class.arrowMarkerAbsolute=r.arrowMarkerAbsolute},"init")};export{k as diagram};
@@ -1 +0,0 @@
1
- import{s as a,c as s,a as t,C as e}from"./chunk-727SXJPM-DeynG6ym.js";import{_ as i}from"./mermaid.core-CyFmJxTj.js";import"./vendor-reactflow-Bg-Qjzh8.js";import"./chunk-FMBD7UC4-DV2d1-q1.js";import"./chunk-ND2GUHAM-D0Dl37Mc.js";import"./chunk-55IACEB6-l48k3a4l.js";import"./chunk-2J33WTMH-BMFvL-OW.js";import"./index-CUY6xXXv.js";import"./vendor-react-SZ_qB27O.js";import"./vendor-i18n-GF3RlKbq.js";import"./vendor-xterm-BNq00GSj.js";import"./vendor-codemirror-jBKmHyH0.js";import"./step-yuy0qJer.js";var k={parser:t,get db(){return new e},renderer:s,styles:a,init:i(r=>{r.class||(r.class={}),r.class.arrowMarkerAbsolute=r.arrowMarkerAbsolute},"init")};export{k as diagram};