@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.
Files changed (63) hide show
  1. package/dist/bin.js +2287 -1591
  2. package/dist/client/.vite/manifest.json +71 -71
  3. package/dist/client/assets/{AgentDetailView-C5Lb3fd3.js → AgentDetailView-FUKwQxBP.js} +1 -1
  4. package/dist/client/assets/{AgentPermissionPolicyEditor-DtRcvE6M.js → AgentPermissionPolicyEditor-DMDUhF1n.js} +2 -2
  5. package/dist/client/assets/{AgentsView-BVW-NOYD.js → AgentsView-BrQLd-yI.js} +3 -3
  6. package/dist/client/assets/ChatView-Wz_0goif.js +6 -0
  7. package/dist/client/assets/{DevServerView-DLsFSP4s.js → DevServerView-DRqQpHsc.js} +1 -1
  8. package/dist/client/assets/{DirectoryPicker-_QawX-uL.js → DirectoryPicker-BFot4CVM.js} +1 -1
  9. package/dist/client/assets/{DocumentsView-DierUJsj.js → DocumentsView-hamhUcvL.js} +1 -1
  10. package/dist/client/assets/{EvalsView-B83lYKQl.js → EvalsView-DAXqDqn2.js} +1 -1
  11. package/dist/client/assets/{ExperimentalAgentOnboardingModal-CTctYTPU.js → ExperimentalAgentOnboardingModal-B4aZ1y0n.js} +1 -1
  12. package/dist/client/assets/{GoalsView-CKn8i0i0.js → GoalsView-2QOp9DA0.js} +1 -1
  13. package/dist/client/assets/{InsightsView-EpRHCD8G.js → InsightsView-D5fzFy-F.js} +1 -1
  14. package/dist/client/assets/{MemoryView-Df_ocTc5.js → MemoryView-B082KoR-.js} +1 -1
  15. package/dist/client/assets/{NodesView-DF7xJ_3z.js → NodesView-BA3pKMZu.js} +1 -1
  16. package/dist/client/assets/{PiExtensionsManager-BOooOEDx.js → PiExtensionsManager-C4I11iKm.js} +1 -1
  17. package/dist/client/assets/{PluginManager-CHrDAzK6.js → PluginManager-BzTzTMXZ.js} +1 -1
  18. package/dist/client/assets/{PullRequestView-CJU21OZ6.js → PullRequestView-11xJ565q.js} +1 -1
  19. package/dist/client/assets/{ReliabilityView-uHkW1Qeu.js → ReliabilityView-CpELpGqw.js} +1 -1
  20. package/dist/client/assets/{ResearchView-oZ2-vbjL.js → ResearchView-BHiXfjzE.js} +1 -1
  21. package/dist/client/assets/{SecretsView-BpkqSV_E.js → SecretsView-CC5OYoCn.js} +1 -1
  22. package/dist/client/assets/{SessionTerminal-D9IW4cDj.js → SessionTerminal-G70Jwkzs.js} +1 -1
  23. package/dist/client/assets/{SettingsModal-BmB5l2bA.js → SettingsModal-BKEbtdqR.js} +1 -1
  24. package/dist/client/assets/{SettingsModal-C8gsAazm.js → SettingsModal-C0M1CqOu.js} +6 -6
  25. package/dist/client/assets/SettingsModal-DpAxDq6M.css +1 -0
  26. package/dist/client/assets/{SetupWizardModal-BYLEU_7o.js → SetupWizardModal-CBfItlP6.js} +1 -1
  27. package/dist/client/assets/{SkillsView-8GgQ8Z_Z.js → SkillsView-DbcW87-E.js} +1 -1
  28. package/dist/client/assets/{StashRecoveryView-CT1t1Uf2.js → StashRecoveryView-CH9RPtzX.js} +1 -1
  29. package/dist/client/assets/{TodoView-BUj6ITAb.js → TodoView-ToviJ0SV.js} +1 -1
  30. package/dist/client/assets/{WorkflowNodeEditor-CN7GPmvV.js → WorkflowNodeEditor-BTu0D9c5.js} +1 -1
  31. package/dist/client/assets/WorkflowNodeEditor-BokhW3de.css +1 -0
  32. package/dist/client/assets/{app-DCot4oXA.js → app-CUu1sm3x.js} +2 -2
  33. package/dist/client/assets/{dashboard-view-CrYwb0oQ.js → dashboard-view-DtgLZ_LM.js} +1 -1
  34. package/dist/client/assets/{folder-open-CREXTATY.js → folder-open-BlPyIWyf.js} +1 -1
  35. package/dist/client/assets/index-DqhCiU35.css +1 -0
  36. package/dist/client/assets/index-bZCpHtGq.js +793 -0
  37. package/dist/client/assets/{upload-BvLUlwaH.js → upload-B-qmm1NH.js} +1 -1
  38. package/dist/client/assets/{users-CjhbU-sF.js → users-D6C5TXf2.js} +1 -1
  39. package/dist/client/index.html +2 -2
  40. package/dist/client/version.json +1 -1
  41. package/dist/droid-cli/package.json +1 -1
  42. package/dist/extension.js +1726 -1080
  43. package/dist/pi-claude-cli/package.json +1 -1
  44. package/dist/plugin-sdk/index.d.ts +6258 -86
  45. package/dist/plugins/fusion-plugin-acp-runtime/package.json +1 -1
  46. package/dist/plugins/fusion-plugin-cli-printing-press/package.json +1 -1
  47. package/dist/plugins/fusion-plugin-compound-engineering/bundled.js +177 -18
  48. package/dist/plugins/fusion-plugin-compound-engineering/package.json +1 -1
  49. package/dist/plugins/fusion-plugin-cursor-runtime/package.json +1 -1
  50. package/dist/plugins/fusion-plugin-dependency-graph/package.json +1 -1
  51. package/dist/plugins/fusion-plugin-droid-runtime/package.json +1 -1
  52. package/dist/plugins/fusion-plugin-hermes-runtime/package.json +1 -1
  53. package/dist/plugins/fusion-plugin-openclaw-runtime/package.json +1 -1
  54. package/dist/plugins/fusion-plugin-paperclip-runtime/package.json +1 -1
  55. package/dist/plugins/fusion-plugin-reports/package.json +1 -1
  56. package/dist/plugins/fusion-plugin-roadmap/package.json +1 -1
  57. package/dist/plugins/fusion-plugin-whatsapp-chat/package.json +1 -1
  58. package/package.json +1 -9
  59. package/dist/client/assets/ChatView-Dy-oIkrK.js +0 -6
  60. package/dist/client/assets/SettingsModal-bJvc9aHl.css +0 -1
  61. package/dist/client/assets/WorkflowNodeEditor-aPj8cv81.css +0 -1
  62. package/dist/client/assets/index-2kYpdJrx.js +0 -793
  63. package/dist/client/assets/index-CJUfvGdC.css +0 -1
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fusion-plugin-examples/acp-runtime",
3
- "version": "0.1.4",
3
+ "version": "0.1.5",
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.21",
3
+ "version": "0.1.22",
4
4
  "type": "module",
5
5
  "description": "CLI Printing Press plugin package for Fusion",
6
6
  "private": true,
@@ -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 mkdirSync2, writeFileSync } from "node:fs";
220
- import { dirname as dirname2, isAbsolute as isAbsolute2, join as join2 } from "node:path";
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("/") ? join2(location, `${session.stage}-${session.id}.md`) : location;
1332
- const abs = isAbsolute2(target) ? target : join2(this.projectRoot, target);
1333
- mkdirSync2(dirname2(abs), { recursive: true });
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 readFileSync2, statSync } from "node:fs";
1511
- import { isAbsolute as isAbsolute3, join as join3, relative, sep as sep2 } from "node:path";
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(sep2).join("/");
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("..") || isAbsolute3(relToLocation)) return false;
1647
+ if (relToLocation.startsWith("..") || isAbsolute4(relToLocation)) return false;
1527
1648
  const relToRoot = relative(root, candidate);
1528
- if (relToRoot.startsWith("..") || isAbsolute3(relToRoot)) return false;
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 = join3(root, loc.path);
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 = readdirSync(locationAbs);
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 = join3(locationAbs, childName);
1621
- const relPath = toPosix(join3(loc.path, childName));
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 = join3(projectRoot, loc.path);
1655
- const abs = join3(projectRoot, relPath);
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(sep2) || rel.startsWith("..") || !rel.toLowerCase().endsWith(".md")) {
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 = readFileSync2(abs, "utf8");
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
  };
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fusion-plugin-examples/compound-engineering",
3
- "version": "0.1.4",
3
+ "version": "0.1.5",
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.23",
3
+ "version": "0.1.24",
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.35",
3
+ "version": "0.1.36",
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.30",
3
+ "version": "0.1.31",
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.54",
3
+ "version": "0.2.55",
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.54",
3
+ "version": "0.2.55",
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.54",
3
+ "version": "0.2.55",
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.23",
3
+ "version": "0.1.24",
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.23",
3
+ "version": "0.1.24",
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.23",
3
+ "version": "0.1.24",
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.42.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
  }