@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.
- package/dist/bin.js +153 -85
- package/dist/client/.vite/manifest.json +242 -242
- package/dist/client/assets/{AgentDetailView-D9lYcdOS.js → AgentDetailView-CF6isJ51.js} +1 -1
- package/dist/client/assets/{AgentPermissionPolicyEditor-Bn_PEeQW.js → AgentPermissionPolicyEditor-DFldf6aS.js} +1 -1
- package/dist/client/assets/{AgentsView-BRbnFmv3.js → AgentsView-DiGseTuo.js} +3 -3
- package/dist/client/assets/{ChatView-Batci7-w.js → ChatView-BjQBbDyo.js} +1 -1
- package/dist/client/assets/{CommandCenter-DAUgvVMX.js → CommandCenter-DwpiADSX.js} +1 -1
- package/dist/client/assets/{DevServerView-HdEXR5UB.js → DevServerView-D6RFaGPU.js} +1 -1
- package/dist/client/assets/{DirectoryPicker-DrCiUJlF.js → DirectoryPicker-DNBB-viz.js} +1 -1
- package/dist/client/assets/{DocumentsView-C0KxPWex.js → DocumentsView-DXG-sctG.js} +1 -1
- package/dist/client/assets/{EvalsView-wCfi9Rkj.js → EvalsView-Ol6ECKz5.js} +1 -1
- package/dist/client/assets/{ExperimentalAgentOnboardingModal-Crck6eJe.js → ExperimentalAgentOnboardingModal-BQc3GaE_.js} +1 -1
- package/dist/client/assets/{GoalsView-sFGHX3Wt.js → GoalsView-C_m90anC.js} +1 -1
- package/dist/client/assets/{InsightsView-jl0cX1um.js → InsightsView-BbFgPsDH.js} +1 -1
- package/dist/client/assets/{MemoryView-Bwv99M_s.js → MemoryView-CRS7AjWK.js} +1 -1
- package/dist/client/assets/{PiExtensionsManager-BsA3tCZh.js → PiExtensionsManager-BEj5xu45.js} +1 -1
- package/dist/client/assets/{PluginManager-Bgd8Hj0a.js → PluginManager-CzCM3XUY.js} +1 -1
- package/dist/client/assets/{PullRequestView-CqO16SNt.js → PullRequestView-9yNYCunb.js} +1 -1
- package/dist/client/assets/{ResearchView-CfRsbJWS.js → ResearchView-BKdirpiw.js} +1 -1
- package/dist/client/assets/{SecretsView-CHomYGnm.js → SecretsView-qGjo-0Cp.js} +1 -1
- package/dist/client/assets/{SessionTerminal-DcYUuwbV.js → SessionTerminal-C7YlkdGJ.js} +1 -1
- package/dist/client/assets/{SettingsModal-CX5GLed_.js → SettingsModal-DihNd7g8.js} +1 -1
- package/dist/client/assets/{SettingsModal-ybSf6HDn.js → SettingsModal-DpaptT6t.js} +3 -3
- package/dist/client/assets/{SetupWizardModal-D2BQL0df.js → SetupWizardModal-MovTj5pY.js} +2 -2
- package/dist/client/assets/{ShadcnColorPicker-B-8x0Gci.js → ShadcnColorPicker-Bnf5n5R4.js} +1 -1
- package/dist/client/assets/{SkillsView-4iqYHf9N.js → SkillsView-Br2LkA3x.js} +1 -1
- package/dist/client/assets/{TodoView-BJsknVS6.js → TodoView-BEdk6FTU.js} +1 -1
- package/dist/client/assets/{WorkflowNodeEditor-QdwW4bY5.js → WorkflowNodeEditor-e-eR6yzw.js} +1 -1
- package/dist/client/assets/{agentSkills-CwR8s-gl.js → agentSkills-D5nDZPRY.js} +1 -1
- package/dist/client/assets/{app-BJGkp7Tt.js → app-BM6bAO0b.js} +1 -1
- package/dist/client/assets/{app-CZQ_fFNf.js → app-BglOELbc.js} +1 -1
- package/dist/client/assets/{app-BaoNC9zg.js → app-ChkCVQpq.js} +1 -1
- package/dist/client/assets/{app-DgezOJub.js → app-DMn7Jt9g.js} +1 -1
- package/dist/client/assets/{app-DAu3AzsS.js → app-D_IT9Buz.js} +1 -1
- package/dist/client/assets/{app-BKLUvvm8.js → app-S8fehQv8.js} +1 -1
- package/dist/client/assets/{architectureDiagram-3BPJPVTR-rav0thhm.js → architectureDiagram-3BPJPVTR-BbkXWBni.js} +1 -1
- package/dist/client/assets/{blockDiagram-GPEHLZMM-x9Opikul.js → blockDiagram-GPEHLZMM-DhaqpHqZ.js} +1 -1
- package/dist/client/assets/{c4Diagram-AAUBKEIU-BGrWtNPI.js → c4Diagram-AAUBKEIU-qC0WSHMZ.js} +1 -1
- package/dist/client/assets/channel-CCKvUami.js +1 -0
- package/dist/client/assets/{chunk-2J33WTMH-BMFvL-OW.js → chunk-2J33WTMH-Dah9zMeT.js} +1 -1
- package/dist/client/assets/{chunk-4BX2VUAB-CWTOrH7n.js → chunk-4BX2VUAB-epHwnUb_.js} +1 -1
- package/dist/client/assets/{chunk-55IACEB6-l48k3a4l.js → chunk-55IACEB6-DpYBy44g.js} +1 -1
- package/dist/client/assets/{chunk-727SXJPM-DeynG6ym.js → chunk-727SXJPM-B9b8698e.js} +1 -1
- package/dist/client/assets/{chunk-AQP2D5EJ-B9ndyq3h.js → chunk-AQP2D5EJ-DrM8nnhR.js} +1 -1
- package/dist/client/assets/{chunk-FMBD7UC4-DV2d1-q1.js → chunk-FMBD7UC4-jyT6Scwe.js} +1 -1
- package/dist/client/assets/{chunk-ND2GUHAM-D0Dl37Mc.js → chunk-ND2GUHAM-EoPfF-PK.js} +1 -1
- package/dist/client/assets/{chunk-QZHKN3VN-NGiOWxhM.js → chunk-QZHKN3VN-qMwLVfgJ.js} +1 -1
- package/dist/client/assets/classDiagram-4FO5ZUOK-C_HqY7AI.js +1 -0
- package/dist/client/assets/classDiagram-v2-Q7XG4LA2-C_HqY7AI.js +1 -0
- package/dist/client/assets/{cose-bilkent-S5V4N54A-2ojNpRS8.js → cose-bilkent-S5V4N54A-DmPFKoVD.js} +1 -1
- package/dist/client/assets/{dagre-BM42HDAG-BaIP71Bo.js → dagre-BM42HDAG-DeHxd-ej.js} +1 -1
- package/dist/client/assets/{dashboard-view-hB7ta6sK.js → dashboard-view-Cw5mMJay.js} +1 -1
- package/dist/client/assets/{dashboard-view-CC2QtNhx.js → dashboard-view-DXjNQ5IF.js} +1 -1
- package/dist/client/assets/{diagram-2AECGRRQ-DQfEScya.js → diagram-2AECGRRQ-C04A2mhr.js} +1 -1
- package/dist/client/assets/{diagram-5GNKFQAL-B5iw3WNT.js → diagram-5GNKFQAL-DqtOwADI.js} +1 -1
- package/dist/client/assets/{diagram-KO2AKTUF-C5mMn4JH.js → diagram-KO2AKTUF-CH0har-Z.js} +1 -1
- package/dist/client/assets/{diagram-LMA3HP47-CaMhdmPl.js → diagram-LMA3HP47-CxN-U-0W.js} +1 -1
- package/dist/client/assets/{diagram-OG6HWLK6-D2ed8-Fx.js → diagram-OG6HWLK6-42A7wpwF.js} +1 -1
- package/dist/client/assets/{erDiagram-TEJ5UH35-CZl07SyK.js → erDiagram-TEJ5UH35-CnZI5YlN.js} +1 -1
- package/dist/client/assets/{flowDiagram-I6XJVG4X-Dz7RLhaG.js → flowDiagram-I6XJVG4X-BKfQhMVF.js} +1 -1
- package/dist/client/assets/{folder-open-DCNfEqr1.js → folder-open-STXgbemw.js} +1 -1
- package/dist/client/assets/{ganttDiagram-6RSMTGT7-C3ny-S6Q.js → ganttDiagram-6RSMTGT7-BfA0pME8.js} +1 -1
- package/dist/client/assets/{gitGraphDiagram-PVQCEYII-BjHF5C7t.js → gitGraphDiagram-PVQCEYII-BgDFB7PS.js} +1 -1
- package/dist/client/assets/index-BnfnLXyO.css +1 -0
- package/dist/client/assets/index-CHy0WNjH.js +1301 -0
- package/dist/client/assets/{infoDiagram-5YYISTIA-BTYecWEx.js → infoDiagram-5YYISTIA-Bb5F155s.js} +1 -1
- package/dist/client/assets/{ishikawaDiagram-YF4QCWOH-BBNOAxJa.js → ishikawaDiagram-YF4QCWOH-8Oati7l_.js} +1 -1
- package/dist/client/assets/{journeyDiagram-JHISSGLW-DrjdbyT5.js → journeyDiagram-JHISSGLW-DhHTHXTM.js} +1 -1
- package/dist/client/assets/{kanban-definition-UN3LZRKU-CgTNTfT7.js → kanban-definition-UN3LZRKU-BWB9EtUX.js} +1 -1
- package/dist/client/assets/{mermaid.core-CyFmJxTj.js → mermaid.core-BD-L2gUQ.js} +4 -4
- package/dist/client/assets/{mindmap-definition-RKZ34NQL-C95r0KZv.js → mindmap-definition-RKZ34NQL-BSKGd7LE.js} +1 -1
- package/dist/client/assets/{pieDiagram-4H26LBE5-CmYuIsZ-.js → pieDiagram-4H26LBE5-BtBFPvSW.js} +1 -1
- package/dist/client/assets/{quadrantDiagram-W4KKPZXB-BFLFwHMa.js → quadrantDiagram-W4KKPZXB-aWQWYPto.js} +1 -1
- package/dist/client/assets/{requirementDiagram-4Y6WPE33-G0s0AfQq.js → requirementDiagram-4Y6WPE33-CprlEpIa.js} +1 -1
- package/dist/client/assets/{sankeyDiagram-5OEKKPKP-D8OLAFhm.js → sankeyDiagram-5OEKKPKP-Cw-AcRAV.js} +1 -1
- package/dist/client/assets/{sequenceDiagram-3UESZ5HK-6fDSosvV.js → sequenceDiagram-3UESZ5HK-BMW5slyv.js} +1 -1
- package/dist/client/assets/{shield-alert-CBAzSycj.js → shield-alert-Bzf8yNOc.js} +1 -1
- package/dist/client/assets/{stateDiagram-AJRCARHV-BfNs5lJU.js → stateDiagram-AJRCARHV-CcxvIVwM.js} +1 -1
- package/dist/client/assets/{stateDiagram-v2-BHNVJYJU-Bt0-CBqz.js → stateDiagram-v2-BHNVJYJU-awOfoFOB.js} +1 -1
- package/dist/client/assets/{timeline-definition-PNZ67QCA-DmKYLILn.js → timeline-definition-PNZ67QCA-DIEAc2YP.js} +1 -1
- package/dist/client/assets/{upload--9MWYfcA.js → upload-DuwyPTKe.js} +1 -1
- package/dist/client/assets/{users-vOsWas_i.js → users-D1Qhfyro.js} +1 -1
- package/dist/client/assets/{vennDiagram-CIIHVFJN-D3jx9PAk.js → vennDiagram-CIIHVFJN-DOkqg5Wi.js} +1 -1
- package/dist/client/assets/{wardley-L42UT6IY-BGRnyThw.js → wardley-L42UT6IY-DoPK1Q6d.js} +1 -1
- package/dist/client/assets/{wardleyDiagram-YWT4CUSO-pwLVIgII.js → wardleyDiagram-YWT4CUSO-l1vun-m2.js} +1 -1
- package/dist/client/assets/{xychartDiagram-2RQKCTM6-ltxtDdDp.js → xychartDiagram-2RQKCTM6-DcUOUKvl.js} +1 -1
- package/dist/client/index.html +2 -2
- package/dist/client/version.json +1 -1
- package/dist/droid-cli/package.json +1 -1
- package/dist/extension.js +104 -77
- package/dist/pi-claude-cli/package.json +1 -1
- 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/client/assets/channel-BFVfY8Ks.js +0 -1
- package/dist/client/assets/classDiagram-4FO5ZUOK-pfX_P8V9.js +0 -1
- package/dist/client/assets/classDiagram-v2-Q7XG4LA2-pfX_P8V9.js +0 -1
- package/dist/client/assets/index-CUY6xXXv.js +0 -1292
- 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
|
-
|
|
182293
|
-
|
|
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 =
|
|
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
|
|
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
|
|
182620
|
-
|
|
182621
|
-
|
|
182622
|
-
|
|
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
|
-
|
|
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
|
-
|
|
182660
|
-
|
|
182661
|
-
|
|
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 (
|
|
182747
|
-
|
|
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:
|
|
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
|
|
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
|
|
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
|
|
188682
|
-
return
|
|
188683
|
-
|
|
188684
|
-
|
|
188685
|
-
|
|
188686
|
-
|
|
188687
|
-
|
|
188688
|
-
|
|
188689
|
-
|
|
188690
|
-
|
|
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 =
|
|
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
|
|
188802
|
+
await raceWithAbort(
|
|
188773
188803
|
session.prompt(contextPrompt, { signal: combinedSignal }),
|
|
188774
|
-
|
|
188775
|
-
|
|
188804
|
+
combinedSignal
|
|
188805
|
+
);
|
|
188776
188806
|
} finally {
|
|
188777
|
-
|
|
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.
|
|
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,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@runfusion/fusion",
|
|
3
|
-
"version": "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};
|