@runfusion/fusion 0.42.0 → 0.43.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 +2287 -1591
- package/dist/client/.vite/manifest.json +71 -71
- package/dist/client/assets/{AgentDetailView-C5Lb3fd3.js → AgentDetailView-FUKwQxBP.js} +1 -1
- package/dist/client/assets/{AgentPermissionPolicyEditor-DtRcvE6M.js → AgentPermissionPolicyEditor-DMDUhF1n.js} +2 -2
- package/dist/client/assets/{AgentsView-BVW-NOYD.js → AgentsView-BrQLd-yI.js} +3 -3
- package/dist/client/assets/ChatView-Wz_0goif.js +6 -0
- package/dist/client/assets/{DevServerView-DLsFSP4s.js → DevServerView-DRqQpHsc.js} +1 -1
- package/dist/client/assets/{DirectoryPicker-_QawX-uL.js → DirectoryPicker-BFot4CVM.js} +1 -1
- package/dist/client/assets/{DocumentsView-DierUJsj.js → DocumentsView-hamhUcvL.js} +1 -1
- package/dist/client/assets/{EvalsView-B83lYKQl.js → EvalsView-DAXqDqn2.js} +1 -1
- package/dist/client/assets/{ExperimentalAgentOnboardingModal-CTctYTPU.js → ExperimentalAgentOnboardingModal-B4aZ1y0n.js} +1 -1
- package/dist/client/assets/{GoalsView-CKn8i0i0.js → GoalsView-2QOp9DA0.js} +1 -1
- package/dist/client/assets/{InsightsView-EpRHCD8G.js → InsightsView-D5fzFy-F.js} +1 -1
- package/dist/client/assets/{MemoryView-Df_ocTc5.js → MemoryView-B082KoR-.js} +1 -1
- package/dist/client/assets/{NodesView-DF7xJ_3z.js → NodesView-BA3pKMZu.js} +1 -1
- package/dist/client/assets/{PiExtensionsManager-BOooOEDx.js → PiExtensionsManager-C4I11iKm.js} +1 -1
- package/dist/client/assets/{PluginManager-CHrDAzK6.js → PluginManager-BzTzTMXZ.js} +1 -1
- package/dist/client/assets/{PullRequestView-CJU21OZ6.js → PullRequestView-11xJ565q.js} +1 -1
- package/dist/client/assets/{ReliabilityView-uHkW1Qeu.js → ReliabilityView-CpELpGqw.js} +1 -1
- package/dist/client/assets/{ResearchView-oZ2-vbjL.js → ResearchView-BHiXfjzE.js} +1 -1
- package/dist/client/assets/{SecretsView-BpkqSV_E.js → SecretsView-CC5OYoCn.js} +1 -1
- package/dist/client/assets/{SessionTerminal-D9IW4cDj.js → SessionTerminal-G70Jwkzs.js} +1 -1
- package/dist/client/assets/{SettingsModal-BmB5l2bA.js → SettingsModal-BKEbtdqR.js} +1 -1
- package/dist/client/assets/{SettingsModal-C8gsAazm.js → SettingsModal-C0M1CqOu.js} +6 -6
- package/dist/client/assets/SettingsModal-DpAxDq6M.css +1 -0
- package/dist/client/assets/{SetupWizardModal-BYLEU_7o.js → SetupWizardModal-CBfItlP6.js} +1 -1
- package/dist/client/assets/{SkillsView-8GgQ8Z_Z.js → SkillsView-DbcW87-E.js} +1 -1
- package/dist/client/assets/{StashRecoveryView-CT1t1Uf2.js → StashRecoveryView-CH9RPtzX.js} +1 -1
- package/dist/client/assets/{TodoView-BUj6ITAb.js → TodoView-ToviJ0SV.js} +1 -1
- package/dist/client/assets/{WorkflowNodeEditor-CN7GPmvV.js → WorkflowNodeEditor-BTu0D9c5.js} +1 -1
- package/dist/client/assets/WorkflowNodeEditor-BokhW3de.css +1 -0
- package/dist/client/assets/{app-DCot4oXA.js → app-CUu1sm3x.js} +2 -2
- package/dist/client/assets/{dashboard-view-CrYwb0oQ.js → dashboard-view-DtgLZ_LM.js} +1 -1
- package/dist/client/assets/{folder-open-CREXTATY.js → folder-open-BlPyIWyf.js} +1 -1
- package/dist/client/assets/index-DqhCiU35.css +1 -0
- package/dist/client/assets/index-bZCpHtGq.js +793 -0
- package/dist/client/assets/{upload-BvLUlwaH.js → upload-B-qmm1NH.js} +1 -1
- package/dist/client/assets/{users-CjhbU-sF.js → users-D6C5TXf2.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 +1726 -1080
- package/dist/pi-claude-cli/package.json +1 -1
- package/dist/plugin-sdk/index.d.ts +6258 -86
- 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/bundled.js +177 -18
- 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 -9
- package/dist/client/assets/ChatView-Dy-oIkrK.js +0 -6
- package/dist/client/assets/SettingsModal-bJvc9aHl.css +0 -1
- package/dist/client/assets/WorkflowNodeEditor-aPj8cv81.css +0 -1
- package/dist/client/assets/index-2kYpdJrx.js +0 -793
- package/dist/client/assets/index-CJUfvGdC.css +0 -1
|
@@ -65,6 +65,30 @@ var COMPOUND_ENGINEERING_SKILLS = [
|
|
|
65
65
|
skillFiles: ["skills/ce-compound/SKILL.md"],
|
|
66
66
|
enabled: true,
|
|
67
67
|
triggerPatterns: ["compound this", "document this learning", "capture this solution"]
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
skillId: "ce-commit",
|
|
71
|
+
name: "ce-commit",
|
|
72
|
+
description: "Create a git commit with a clear, value-communicating message following repo conventions.",
|
|
73
|
+
skillFiles: ["skills/ce-commit/SKILL.md"],
|
|
74
|
+
enabled: true,
|
|
75
|
+
triggerPatterns: ["commit", "commit this", "save my changes", "create a commit"]
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
skillId: "ce-commit-push-pr",
|
|
79
|
+
name: "ce-commit-push-pr",
|
|
80
|
+
description: "Commit, push, and open a PR with an adaptive, value-first description that scales with the change.",
|
|
81
|
+
skillFiles: ["skills/ce-commit-push-pr/SKILL.md"],
|
|
82
|
+
enabled: true,
|
|
83
|
+
triggerPatterns: ["commit and PR", "ship this", "create a PR", "open a pull request"]
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
skillId: "ce-resolve-pr-feedback",
|
|
87
|
+
name: "ce-resolve-pr-feedback",
|
|
88
|
+
description: "Resolve PR review feedback by evaluating validity and fixing issues in parallel.",
|
|
89
|
+
skillFiles: ["skills/ce-resolve-pr-feedback/SKILL.md"],
|
|
90
|
+
enabled: true,
|
|
91
|
+
triggerPatterns: ["resolve PR feedback", "address review comments", "fix review feedback"]
|
|
68
92
|
}
|
|
69
93
|
];
|
|
70
94
|
|
|
@@ -138,6 +162,72 @@ function isPluginLocalPath(p) {
|
|
|
138
162
|
return isAbsolute(p) && !GLOBAL_SKILL_DIR_PATTERN.test(resolve(p) + sep);
|
|
139
163
|
}
|
|
140
164
|
|
|
165
|
+
// ../../plugins/fusion-plugin-compound-engineering/src/agent-installation.ts
|
|
166
|
+
import { cpSync as cpSync2, existsSync as existsSync2, mkdirSync as mkdirSync2, readdirSync, readFileSync as readFileSync2 } from "node:fs";
|
|
167
|
+
import { dirname as dirname2, isAbsolute as isAbsolute2, join as join2, resolve as resolve2, sep as sep2 } from "node:path";
|
|
168
|
+
import { fileURLToPath as fileURLToPath2 } from "node:url";
|
|
169
|
+
function resolveBundledAgentsRoot() {
|
|
170
|
+
const here = fileURLToPath2(import.meta.url);
|
|
171
|
+
const dir = dirname2(here);
|
|
172
|
+
const local = resolve2(dir, "agents");
|
|
173
|
+
if (existsSync2(local)) return local;
|
|
174
|
+
return resolve2(dir, "..", "src", "agents");
|
|
175
|
+
}
|
|
176
|
+
function resolveDefaultAgentsInstallTargetRoot() {
|
|
177
|
+
const here = fileURLToPath2(import.meta.url);
|
|
178
|
+
return resolve2(dirname2(here), "..", ".fusion-ce-agents");
|
|
179
|
+
}
|
|
180
|
+
var GLOBAL_AGENT_DIR_PATTERN = /[\\/]\.(claude|codex|gemini)[\\/]agents([\\/]|$)/;
|
|
181
|
+
function assertPluginLocalAgentsTarget(targetRoot) {
|
|
182
|
+
const normalized = resolve2(targetRoot);
|
|
183
|
+
if (GLOBAL_AGENT_DIR_PATTERN.test(normalized + sep2)) {
|
|
184
|
+
throw new Error(
|
|
185
|
+
`Refusing to install Compound Engineering agents into a global client agents directory: ${normalized}. Install target MUST be plugin-local (never <home>/.claude|.codex|.gemini/agents).`
|
|
186
|
+
);
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
function assertValidAgentSource(agentId, sourceFile) {
|
|
190
|
+
if (!existsSync2(sourceFile)) {
|
|
191
|
+
throw new Error(`Bundled agent def missing for '${agentId}': ${sourceFile}`);
|
|
192
|
+
}
|
|
193
|
+
const content = readFileSync2(sourceFile, "utf-8");
|
|
194
|
+
if (!/^---[\s\S]*?\bname\s*:\s*\S/m.test(content)) {
|
|
195
|
+
throw new Error(`Bundled agent def '${agentId}' at ${sourceFile} is missing a frontmatter 'name:' field`);
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
function installBundledCeAgents(options = {}) {
|
|
199
|
+
const targetRoot = options.targetRoot ? resolve2(options.targetRoot) : resolveDefaultAgentsInstallTargetRoot();
|
|
200
|
+
assertPluginLocalAgentsTarget(targetRoot);
|
|
201
|
+
const sourceRoot = options.sourceRoot ? resolve2(options.sourceRoot) : resolveBundledAgentsRoot();
|
|
202
|
+
const sourceFiles = existsSync2(sourceRoot) ? readdirSync(sourceRoot).filter((f) => f.endsWith(".md")) : [];
|
|
203
|
+
const results = sourceFiles.map((file) => {
|
|
204
|
+
const agentId = file.replace(/\.md$/, "");
|
|
205
|
+
const sourceFile = join2(sourceRoot, file);
|
|
206
|
+
const targetFile = join2(targetRoot, file);
|
|
207
|
+
try {
|
|
208
|
+
assertValidAgentSource(agentId, sourceFile);
|
|
209
|
+
if (existsSync2(targetFile)) {
|
|
210
|
+
return { agentId, sourceFile, targetFile, outcome: "skipped", reason: "existing install preserved" };
|
|
211
|
+
}
|
|
212
|
+
mkdirSync2(targetRoot, { recursive: true });
|
|
213
|
+
cpSync2(sourceFile, targetFile);
|
|
214
|
+
return { agentId, sourceFile, targetFile, outcome: "installed" };
|
|
215
|
+
} catch (error) {
|
|
216
|
+
return {
|
|
217
|
+
agentId,
|
|
218
|
+
sourceFile,
|
|
219
|
+
targetFile,
|
|
220
|
+
outcome: "error",
|
|
221
|
+
reason: error instanceof Error ? error.message : String(error)
|
|
222
|
+
};
|
|
223
|
+
}
|
|
224
|
+
});
|
|
225
|
+
return { targetRoot, results };
|
|
226
|
+
}
|
|
227
|
+
function isPluginLocalAgentsPath(p) {
|
|
228
|
+
return isAbsolute2(p) && !GLOBAL_AGENT_DIR_PATTERN.test(resolve2(p) + sep2);
|
|
229
|
+
}
|
|
230
|
+
|
|
141
231
|
// ../../plugins/fusion-plugin-compound-engineering/src/schema.ts
|
|
142
232
|
function ensureCeSchema(db) {
|
|
143
233
|
db.exec(`
|
|
@@ -216,8 +306,8 @@ function ensureCeSchema(db) {
|
|
|
216
306
|
}
|
|
217
307
|
|
|
218
308
|
// ../../plugins/fusion-plugin-compound-engineering/src/session/orchestrator.ts
|
|
219
|
-
import { mkdirSync as
|
|
220
|
-
import { dirname as
|
|
309
|
+
import { mkdirSync as mkdirSync3, writeFileSync } from "node:fs";
|
|
310
|
+
import { dirname as dirname3, isAbsolute as isAbsolute3, join as join3 } from "node:path";
|
|
221
311
|
|
|
222
312
|
// ../../plugins/fusion-plugin-compound-engineering/src/sync/pipeline-store.ts
|
|
223
313
|
import { randomUUID } from "node:crypto";
|
|
@@ -1328,9 +1418,9 @@ var CeOrchestrator = class {
|
|
|
1328
1418
|
const stage = getStage(session.stage);
|
|
1329
1419
|
const location = stage?.artifactLocation ?? `docs/ce/${session.stage}/`;
|
|
1330
1420
|
const content = this.extractArtifactContent(data);
|
|
1331
|
-
const target = location.endsWith("/") ?
|
|
1332
|
-
const abs =
|
|
1333
|
-
|
|
1421
|
+
const target = location.endsWith("/") ? join3(location, `${session.stage}-${session.id}.md`) : location;
|
|
1422
|
+
const abs = isAbsolute3(target) ? target : join3(this.projectRoot, target);
|
|
1423
|
+
mkdirSync3(dirname3(abs), { recursive: true });
|
|
1334
1424
|
writeFileSync(abs, content, "utf-8");
|
|
1335
1425
|
return abs;
|
|
1336
1426
|
}
|
|
@@ -1362,6 +1452,35 @@ var CeOrchestrator = class {
|
|
|
1362
1452
|
}
|
|
1363
1453
|
};
|
|
1364
1454
|
|
|
1455
|
+
// ../../plugins/fusion-plugin-compound-engineering/src/session/session-recovery.ts
|
|
1456
|
+
var DEFAULT_RECOVERY_SCAN_TTL_MS = 12e4;
|
|
1457
|
+
var lastRecoveryScanAt = /* @__PURE__ */ new WeakMap();
|
|
1458
|
+
function recoverStaleSessionsForContext(ctx, options) {
|
|
1459
|
+
const key = ctx.taskStore;
|
|
1460
|
+
const now = options.now ?? Date.now();
|
|
1461
|
+
const ttlMs = options.ttlMs ?? DEFAULT_RECOVERY_SCAN_TTL_MS;
|
|
1462
|
+
if (!options.force) {
|
|
1463
|
+
const last = lastRecoveryScanAt.get(key) ?? 0;
|
|
1464
|
+
if (now - last < ttlMs) return [];
|
|
1465
|
+
}
|
|
1466
|
+
lastRecoveryScanAt.set(key, now);
|
|
1467
|
+
try {
|
|
1468
|
+
const recovered = getCeSessionStore(ctx).recoverStaleSessions(now);
|
|
1469
|
+
if (recovered.length > 0) {
|
|
1470
|
+
ctx.logger.info(`Compound Engineering recovered stale session(s) during ${options.reason}: ${recovered.join(", ")}`);
|
|
1471
|
+
if (options.emitEvent) {
|
|
1472
|
+
ctx.emitEvent("compound-engineering:sessions-recovered", { sessionIds: recovered, reason: options.reason });
|
|
1473
|
+
}
|
|
1474
|
+
}
|
|
1475
|
+
return recovered;
|
|
1476
|
+
} catch (err) {
|
|
1477
|
+
ctx.logger.warn(
|
|
1478
|
+
`Compound Engineering stale-session recovery skipped during ${options.reason}: ${err instanceof Error ? err.message : String(err)}`
|
|
1479
|
+
);
|
|
1480
|
+
return [];
|
|
1481
|
+
}
|
|
1482
|
+
}
|
|
1483
|
+
|
|
1365
1484
|
// ../../plugins/fusion-plugin-compound-engineering/src/routes/route-helpers.ts
|
|
1366
1485
|
function asString2(v) {
|
|
1367
1486
|
return typeof v === "string" && v.length > 0 ? v : void 0;
|
|
@@ -1458,6 +1577,7 @@ function createSessionRoutes() {
|
|
|
1458
1577
|
description: "Get current session state, including in-flight working output (liveActivity).",
|
|
1459
1578
|
handler: async (req, ctx) => {
|
|
1460
1579
|
const id = req.params.id;
|
|
1580
|
+
recoverStaleSessionsForContext(ctx, { reason: "route" });
|
|
1461
1581
|
const session = getCeSessionStore(ctx).get(id);
|
|
1462
1582
|
if (!session) return { status: 404, body: { error: `Session ${id} not found` } };
|
|
1463
1583
|
const liveActivity = getOrchestrator(ctx).getLiveActivity(id);
|
|
@@ -1472,6 +1592,7 @@ function createSessionRoutes() {
|
|
|
1472
1592
|
path: "/sessions",
|
|
1473
1593
|
description: "List CE sessions (optionally filtered by status/stage).",
|
|
1474
1594
|
handler: async (req, ctx) => {
|
|
1595
|
+
recoverStaleSessionsForContext(ctx, { reason: "route" });
|
|
1475
1596
|
const query = req.query ?? {};
|
|
1476
1597
|
const status = asCeSessionStatus(typeof query.status === "string" ? query.status : void 0);
|
|
1477
1598
|
const stage = typeof query.stage === "string" ? query.stage : void 0;
|
|
@@ -1507,8 +1628,8 @@ function createSessionRoutes() {
|
|
|
1507
1628
|
}
|
|
1508
1629
|
|
|
1509
1630
|
// ../../plugins/fusion-plugin-compound-engineering/src/artifacts/discovery.ts
|
|
1510
|
-
import { accessSync, constants, readdirSync, readFileSync as
|
|
1511
|
-
import { isAbsolute as
|
|
1631
|
+
import { accessSync, constants, readdirSync as readdirSync2, readFileSync as readFileSync3, statSync } from "node:fs";
|
|
1632
|
+
import { isAbsolute as isAbsolute4, join as join4, relative, sep as sep3 } from "node:path";
|
|
1512
1633
|
var CONVENTIONAL_LOCATIONS = [
|
|
1513
1634
|
{ stage: "strategy", label: "Strategy", path: "STRATEGY.md", kind: "file" },
|
|
1514
1635
|
{ stage: "ideation", label: "Ideation", path: "docs/ideation", kind: "directory" },
|
|
@@ -1519,13 +1640,13 @@ var CONVENTIONAL_LOCATIONS = [
|
|
|
1519
1640
|
];
|
|
1520
1641
|
var MAX_ARTIFACT_BYTES = 2e6;
|
|
1521
1642
|
function toPosix(p) {
|
|
1522
|
-
return p.split(
|
|
1643
|
+
return p.split(sep3).join("/");
|
|
1523
1644
|
}
|
|
1524
1645
|
function isWithin(root, locationAbs, candidate) {
|
|
1525
1646
|
const relToLocation = relative(locationAbs, candidate);
|
|
1526
|
-
if (relToLocation.startsWith("..") ||
|
|
1647
|
+
if (relToLocation.startsWith("..") || isAbsolute4(relToLocation)) return false;
|
|
1527
1648
|
const relToRoot = relative(root, candidate);
|
|
1528
|
-
if (relToRoot.startsWith("..") ||
|
|
1649
|
+
if (relToRoot.startsWith("..") || isAbsolute4(relToRoot)) return false;
|
|
1529
1650
|
return true;
|
|
1530
1651
|
}
|
|
1531
1652
|
function makeId(stage, relPath) {
|
|
@@ -1573,7 +1694,7 @@ function sortEntries(entries) {
|
|
|
1573
1694
|
});
|
|
1574
1695
|
}
|
|
1575
1696
|
function discoverLocation(root, loc) {
|
|
1576
|
-
const locationAbs =
|
|
1697
|
+
const locationAbs = join4(root, loc.path);
|
|
1577
1698
|
const entries = [];
|
|
1578
1699
|
let present = false;
|
|
1579
1700
|
let st;
|
|
@@ -1609,7 +1730,7 @@ function discoverLocation(root, loc) {
|
|
|
1609
1730
|
);
|
|
1610
1731
|
return { stage: loc.stage, label: loc.label, present, entries: sortEntries(entries) };
|
|
1611
1732
|
}
|
|
1612
|
-
names =
|
|
1733
|
+
names = readdirSync2(locationAbs);
|
|
1613
1734
|
} catch (err) {
|
|
1614
1735
|
entries.push(makeError(loc.stage, toPosix(loc.path), err instanceof Error ? err.message : String(err)));
|
|
1615
1736
|
return { stage: loc.stage, label: loc.label, present, entries: sortEntries(entries) };
|
|
@@ -1617,8 +1738,8 @@ function discoverLocation(root, loc) {
|
|
|
1617
1738
|
for (const childName of names) {
|
|
1618
1739
|
if (childName.startsWith(".")) continue;
|
|
1619
1740
|
if (!childName.toLowerCase().endsWith(".md")) continue;
|
|
1620
|
-
const abs =
|
|
1621
|
-
const relPath = toPosix(
|
|
1741
|
+
const abs = join4(locationAbs, childName);
|
|
1742
|
+
const relPath = toPosix(join4(loc.path, childName));
|
|
1622
1743
|
let childStat;
|
|
1623
1744
|
try {
|
|
1624
1745
|
childStat = statSync(abs);
|
|
@@ -1651,8 +1772,8 @@ function readArtifactById(projectRoot, id) {
|
|
|
1651
1772
|
const relPath = id.slice(sepIdx + 1);
|
|
1652
1773
|
const loc = CONVENTIONAL_LOCATIONS.find((l) => l.stage === stage);
|
|
1653
1774
|
if (!loc) return void 0;
|
|
1654
|
-
const locationAbs =
|
|
1655
|
-
const abs =
|
|
1775
|
+
const locationAbs = join4(projectRoot, loc.path);
|
|
1776
|
+
const abs = join4(projectRoot, relPath);
|
|
1656
1777
|
if (loc.kind === "file") {
|
|
1657
1778
|
if (toPosix(relPath) !== toPosix(loc.path)) return void 0;
|
|
1658
1779
|
} else if (!isWithin(projectRoot, locationAbs, abs)) {
|
|
@@ -1660,7 +1781,7 @@ function readArtifactById(projectRoot, id) {
|
|
|
1660
1781
|
}
|
|
1661
1782
|
if (loc.kind === "directory") {
|
|
1662
1783
|
const rel = relative(locationAbs, abs);
|
|
1663
|
-
if (rel.includes(
|
|
1784
|
+
if (rel.includes(sep3) || rel.startsWith("..") || !rel.toLowerCase().endsWith(".md")) {
|
|
1664
1785
|
return void 0;
|
|
1665
1786
|
}
|
|
1666
1787
|
}
|
|
@@ -1678,7 +1799,7 @@ function readArtifactById(projectRoot, id) {
|
|
|
1678
1799
|
return { error: err instanceof Error ? err.message : String(err) };
|
|
1679
1800
|
}
|
|
1680
1801
|
try {
|
|
1681
|
-
content =
|
|
1802
|
+
content = readFileSync3(abs, "utf8");
|
|
1682
1803
|
} catch (err) {
|
|
1683
1804
|
return { error: err instanceof Error ? err.message : String(err) };
|
|
1684
1805
|
}
|
|
@@ -1990,8 +2111,42 @@ var plugin = definePlugin({
|
|
|
1990
2111
|
const message = error instanceof Error ? error.message : String(error);
|
|
1991
2112
|
ctx.logger.error(`Compound Engineering skill install failed: ${message}`);
|
|
1992
2113
|
}
|
|
2114
|
+
try {
|
|
2115
|
+
const { targetRoot, results } = installBundledCeAgents();
|
|
2116
|
+
const installed = results.filter((r) => r.outcome === "installed").length;
|
|
2117
|
+
const errored = results.filter((r) => r.outcome === "error");
|
|
2118
|
+
if (errored.length > 0) {
|
|
2119
|
+
ctx.logger.warn(
|
|
2120
|
+
`Compound Engineering: ${errored.length} agent def(s) failed to install: ${errored.map((e) => `${e.agentId} (${e.reason})`).join(", ")}`
|
|
2121
|
+
);
|
|
2122
|
+
}
|
|
2123
|
+
ctx.logger.info(
|
|
2124
|
+
`Compound Engineering agent personas ready \u2014 installed=${installed} target=${targetRoot}`
|
|
2125
|
+
);
|
|
2126
|
+
ctx.emitEvent("compound-engineering:agents-installed", { targetRoot, results });
|
|
2127
|
+
} catch (error) {
|
|
2128
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
2129
|
+
ctx.logger.error(`Compound Engineering agent install failed: ${message}`);
|
|
2130
|
+
}
|
|
2131
|
+
recoverStaleSessionsForContext(ctx, { reason: "load", force: true, emitEvent: true });
|
|
1993
2132
|
}
|
|
1994
2133
|
},
|
|
2134
|
+
// Expose the plugin-local ce-* persona-definition directory to executor /
|
|
2135
|
+
// workflow-step sessions via FUSION_CE_AGENTS_DIR. The CE skills read a persona
|
|
2136
|
+
// def from here and pass its body to fn_spawn_agent's systemPromptOverride —
|
|
2137
|
+
// the lightweight subagent path (no plugin agent-contribution channel exists).
|
|
2138
|
+
// Defs are installed in onLoad.
|
|
2139
|
+
executorRuntimeEnv: () => ({
|
|
2140
|
+
env: {
|
|
2141
|
+
FUSION_CE_AGENTS_DIR: resolveDefaultAgentsInstallTargetRoot(),
|
|
2142
|
+
// Step sessions run with cwd=projectRoot, so a CE skill can't reach its
|
|
2143
|
+
// bundled scripts via a relative `scripts/...` path. Expose the installed
|
|
2144
|
+
// skills root so skill docs can invoke scripts by absolute path
|
|
2145
|
+
// (`"$FUSION_CE_SKILLS_DIR/<skill-id>/scripts/<name>"`).
|
|
2146
|
+
FUSION_CE_SKILLS_DIR: resolveDefaultInstallTargetRoot()
|
|
2147
|
+
},
|
|
2148
|
+
description: "compound-engineering ce-* persona definitions and bundled skills directories"
|
|
2149
|
+
}),
|
|
1995
2150
|
routes: [...createSessionRoutes(), ...createArtifactRoutes()],
|
|
1996
2151
|
dashboardViews: [
|
|
1997
2152
|
{
|
|
@@ -2024,12 +2179,16 @@ export {
|
|
|
2024
2179
|
getReconcileIntervalMinutes,
|
|
2025
2180
|
getReconcileOnHooks,
|
|
2026
2181
|
getStage,
|
|
2182
|
+
installBundledCeAgents,
|
|
2027
2183
|
installBundledCeSkills,
|
|
2184
|
+
isPluginLocalAgentsPath,
|
|
2028
2185
|
isPluginLocalPath,
|
|
2029
2186
|
listStages,
|
|
2030
2187
|
reconcileCePipelines,
|
|
2031
2188
|
registerStage,
|
|
2189
|
+
resolveBundledAgentsRoot,
|
|
2032
2190
|
resolveBundledSkillsRoot,
|
|
2191
|
+
resolveDefaultAgentsInstallTargetRoot,
|
|
2033
2192
|
resolveDefaultInstallTargetRoot,
|
|
2034
2193
|
settingsSchema
|
|
2035
2194
|
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@runfusion/fusion",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.43.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",
|
|
@@ -57,17 +57,9 @@
|
|
|
57
57
|
"ws": "^8.18.0"
|
|
58
58
|
},
|
|
59
59
|
"peerDependencies": {
|
|
60
|
-
"@earendil-works/pi-ai": "*",
|
|
61
|
-
"@earendil-works/pi-coding-agent": "*",
|
|
62
60
|
"typebox": "*"
|
|
63
61
|
},
|
|
64
62
|
"peerDependenciesMeta": {
|
|
65
|
-
"@earendil-works/pi-ai": {
|
|
66
|
-
"optional": true
|
|
67
|
-
},
|
|
68
|
-
"@earendil-works/pi-coding-agent": {
|
|
69
|
-
"optional": true
|
|
70
|
-
},
|
|
71
63
|
"typebox": {
|
|
72
64
|
"optional": true
|
|
73
65
|
}
|