@runfusion/fusion 0.78.0-beta.5 → 0.78.0-beta.6

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 (155) hide show
  1. package/dist/bin.js +3574 -1910
  2. package/dist/child-process-worker.js +1440 -628
  3. package/dist/client/.vite/manifest.json +257 -257
  4. package/dist/client/assets/{AgentDetailView-CdoJDm2q.js → AgentDetailView-F_LCM2Fh.js} +1 -1
  5. package/dist/client/assets/{AgentPermissionPolicyEditor-vlsZ36BL.js → AgentPermissionPolicyEditor-Da7PHXMp.js} +1 -1
  6. package/dist/client/assets/{AgentsView-9EwgX1OK.js → AgentsView-nIFjsi9d.js} +3 -3
  7. package/dist/client/assets/{CommandCenter--BVLmh3G.js → CommandCenter-BDtrZ6JK.js} +1 -1
  8. package/dist/client/assets/{DevServerView-d1CVa_YB.js → DevServerView-CXE7Swoe.js} +1 -1
  9. package/dist/client/assets/{DirectoryPicker-_uNfzkVu.js → DirectoryPicker-CYI--LmS.js} +1 -1
  10. package/dist/client/assets/{DocumentsView-SHFZKBkK.js → DocumentsView-BUwtzdpV.js} +1 -1
  11. package/dist/client/assets/{EvalsView-CQMcojzl.js → EvalsView-0qtYh3sd.js} +1 -1
  12. package/dist/client/assets/{ExperimentalAgentOnboardingModal-BhwVl29h.js → ExperimentalAgentOnboardingModal-D3YNBI3S.js} +1 -1
  13. package/dist/client/assets/{GoalsView-Ju8PyHt8.js → GoalsView-C8M2Ufj6.js} +1 -1
  14. package/dist/client/assets/{InsightsView-BHoI4E2e.js → InsightsView-ByhApqco.js} +1 -1
  15. package/dist/client/assets/{MemoryView-Co-efjDQ.js → MemoryView-BG3vxXrX.js} +1 -1
  16. package/dist/client/assets/{PatchnodeView-CBJpVpFG.js → PatchnodeView-D4gg6xMq.js} +1 -1
  17. package/dist/client/assets/{PiExtensionsManager-DDk1a_Qy.js → PiExtensionsManager-CaadPnc-.js} +1 -1
  18. package/dist/client/assets/{PluginManager-DtGflOpe.js → PluginManager-BC9_Ajdd.js} +1 -1
  19. package/dist/client/assets/{PullRequestView-DwHock6V.js → PullRequestView-BfouYDOl.js} +1 -1
  20. package/dist/client/assets/{ReportModal-CJaxJ6ua.js → ReportModal-BDsen5Oh.js} +1 -1
  21. package/dist/client/assets/{ResearchView-ZD-2JxsH.js → ResearchView-vmH_K4of.js} +1 -1
  22. package/dist/client/assets/{SecretsView-Cz99j53t.js → SecretsView-BinJNcAF.js} +1 -1
  23. package/dist/client/assets/{SettingsModal-dmitxbA_.js → SettingsModal-Bffo4m2D.js} +4 -4
  24. package/dist/client/assets/{SettingsModal-BfiZ2-GY.js → SettingsModal-DdnLlKn8.js} +1 -1
  25. package/dist/client/assets/{SettingsTextareaRow-XyVN0ZEP.js → SettingsTextareaRow-CV1xXRhq.js} +1 -1
  26. package/dist/client/assets/{SetupWizardModal-mVUAy77v.js → SetupWizardModal-B2O0HOZR.js} +2 -2
  27. package/dist/client/assets/{SkillsView-DYL1ZeGi.js → SkillsView-CPE3Jkt7.js} +1 -1
  28. package/dist/client/assets/{WorkflowNodeEditor-E9sIzyMz.js → WorkflowNodeEditor-CTVfvX3A.js} +1 -1
  29. package/dist/client/assets/{agent-import-generation-DwUlR4qa.js → agent-import-generation-Bu2uCPd0.js} +1 -1
  30. package/dist/client/assets/{agentsOrgChartLayout-B5F8JGin.js → agentsOrgChartLayout-BGOBewpH.js} +1 -1
  31. package/dist/client/assets/app-AzX-7oMC.js +11 -0
  32. package/dist/client/assets/app-B5vKhbbZ.js +11 -0
  33. package/dist/client/assets/app-BZHD4Tdt.js +5 -0
  34. package/dist/client/assets/app-CWzmFjgT.js +11 -0
  35. package/dist/client/assets/app-C_yEgSaj.js +11 -0
  36. package/dist/client/assets/app-Crvy006P.js +11 -0
  37. package/dist/client/assets/{app-Dsv4VHMo.js → app-UI8thBW4.js} +1 -1
  38. package/dist/client/assets/{architectureDiagram-3BPJPVTR-BFirFbC8.js → architectureDiagram-3BPJPVTR-BDzTDKvR.js} +1 -1
  39. package/dist/client/assets/{blockDiagram-GPEHLZMM-CK-1Yktz.js → blockDiagram-GPEHLZMM-BbnxXgkY.js} +1 -1
  40. package/dist/client/assets/{c4Diagram-AAUBKEIU-C7uG_4cR.js → c4Diagram-AAUBKEIU-B_upVmlM.js} +1 -1
  41. package/dist/client/assets/channel-2BQ2i0n6.js +1 -0
  42. package/dist/client/assets/{chunk-2J33WTMH-BhPS_gnq.js → chunk-2J33WTMH-oH3mFmAA.js} +1 -1
  43. package/dist/client/assets/{chunk-4BX2VUAB-N_uAN5vN.js → chunk-4BX2VUAB-vezh3jfu.js} +1 -1
  44. package/dist/client/assets/{chunk-55IACEB6-CNYK0ezP.js → chunk-55IACEB6-BmGhY313.js} +1 -1
  45. package/dist/client/assets/{chunk-727SXJPM-C9EkXgMB.js → chunk-727SXJPM-ChDetrFZ.js} +1 -1
  46. package/dist/client/assets/{chunk-AQP2D5EJ-CYcOZI0r.js → chunk-AQP2D5EJ-BY329LM6.js} +1 -1
  47. package/dist/client/assets/{chunk-FMBD7UC4-D-oVdpAz.js → chunk-FMBD7UC4-zuiiPcMa.js} +1 -1
  48. package/dist/client/assets/{chunk-ND2GUHAM-79zqWauw.js → chunk-ND2GUHAM-CqF_-gMe.js} +1 -1
  49. package/dist/client/assets/{chunk-QZHKN3VN-T2WIzSUZ.js → chunk-QZHKN3VN-DtETgl8P.js} +1 -1
  50. package/dist/client/assets/classDiagram-4FO5ZUOK-CmoQsyhJ.js +1 -0
  51. package/dist/client/assets/classDiagram-v2-Q7XG4LA2-CmoQsyhJ.js +1 -0
  52. package/dist/client/assets/{cose-bilkent-S5V4N54A-DYcEyEdj.js → cose-bilkent-S5V4N54A-CB7l3IMd.js} +1 -1
  53. package/dist/client/assets/{dagre-BM42HDAG-CG6eBqe1.js → dagre-BM42HDAG-B-yrcude.js} +1 -1
  54. package/dist/client/assets/{dashboard-view-Cthbyplu.js → dashboard-view-BHUOC-dp.js} +1 -1
  55. package/dist/client/assets/{dashboard-view-CpfQSqFD.js → dashboard-view-C2e-lWkw.js} +1 -1
  56. package/dist/client/assets/{dashboard-view-C3jacppL.js → dashboard-view-DAkh7C8T.js} +1 -1
  57. package/dist/client/assets/{dashboard-view-BV97_KM2.js → dashboard-view-lR50LvCR.js} +1 -1
  58. package/dist/client/assets/{diagram-2AECGRRQ-CA-oSX6v.js → diagram-2AECGRRQ-cV9rcK7D.js} +1 -1
  59. package/dist/client/assets/{diagram-5GNKFQAL-7zlBlYUe.js → diagram-5GNKFQAL-COswZy2u.js} +1 -1
  60. package/dist/client/assets/{diagram-KO2AKTUF-kFIrOk6O.js → diagram-KO2AKTUF-CRYtHA-0.js} +1 -1
  61. package/dist/client/assets/{diagram-LMA3HP47-10NYAStZ.js → diagram-LMA3HP47-BSc2gwi-.js} +1 -1
  62. package/dist/client/assets/{diagram-OG6HWLK6-YUx0Utvh.js → diagram-OG6HWLK6-CkTvh_OG.js} +1 -1
  63. package/dist/client/assets/{erDiagram-TEJ5UH35-B9jMu7Zv.js → erDiagram-TEJ5UH35-IZxjOfAZ.js} +1 -1
  64. package/dist/client/assets/{flowDiagram-I6XJVG4X-C540twrl.js → flowDiagram-I6XJVG4X-DP1Krzf1.js} +1 -1
  65. package/dist/client/assets/{folder-open-Da5UOz-O.js → folder-open-3vwTBlrn.js} +1 -1
  66. package/dist/client/assets/{ganttDiagram-6RSMTGT7-BRTG1iq_.js → ganttDiagram-6RSMTGT7-DTrMtkeI.js} +1 -1
  67. package/dist/client/assets/{gitGraphDiagram-PVQCEYII-DGzLquoM.js → gitGraphDiagram-PVQCEYII-CZzumF1O.js} +1 -1
  68. package/dist/client/assets/index-BG6hrVhL.css +1 -0
  69. package/dist/client/assets/{index-B8Ei6RK_.js → index-jWzr0HgU.js} +343 -332
  70. package/dist/client/assets/{infoDiagram-5YYISTIA-DxDL2NPL.js → infoDiagram-5YYISTIA-DPToV-eq.js} +1 -1
  71. package/dist/client/assets/{ishikawaDiagram-YF4QCWOH-CugUocbL.js → ishikawaDiagram-YF4QCWOH-V9akKrsQ.js} +1 -1
  72. package/dist/client/assets/{journeyDiagram-JHISSGLW-4J1DbTfn.js → journeyDiagram-JHISSGLW-CMZmXLJq.js} +1 -1
  73. package/dist/client/assets/{kanban-definition-UN3LZRKU-3wWdkkqE.js → kanban-definition-UN3LZRKU-DT2oKh0N.js} +1 -1
  74. package/dist/client/assets/{mermaid.core-CdJo4vtY.js → mermaid.core-C9xSBL9K.js} +4 -4
  75. package/dist/client/assets/{mindmap-definition-RKZ34NQL-3ggmNH1R.js → mindmap-definition-RKZ34NQL-BKyCGR7J.js} +1 -1
  76. package/dist/client/assets/{pieDiagram-4H26LBE5-Br6qnYUo.js → pieDiagram-4H26LBE5-BcyGtqQ4.js} +1 -1
  77. package/dist/client/assets/{puzzle-COtNelRH.js → puzzle-acZM2rkn.js} +1 -1
  78. package/dist/client/assets/{quadrantDiagram-W4KKPZXB-q7eumSaG.js → quadrantDiagram-W4KKPZXB-C3FhvUs0.js} +1 -1
  79. package/dist/client/assets/{requirementDiagram-4Y6WPE33-CFQyk2vj.js → requirementDiagram-4Y6WPE33-gcTHwql9.js} +1 -1
  80. package/dist/client/assets/{sankeyDiagram-5OEKKPKP-BPRBSEnx.js → sankeyDiagram-5OEKKPKP-CvYBofJY.js} +1 -1
  81. package/dist/client/assets/{sequenceDiagram-3UESZ5HK-C3oaAZUP.js → sequenceDiagram-3UESZ5HK-D9v9NJKo.js} +1 -1
  82. package/dist/client/assets/{standing-instructions-template-_wMqEkKb.js → standing-instructions-template-B_qbkt6Q.js} +1 -1
  83. package/dist/client/assets/{stateDiagram-AJRCARHV-Gf3SuYgE.js → stateDiagram-AJRCARHV-Dq3-ZEwg.js} +1 -1
  84. package/dist/client/assets/{stateDiagram-v2-BHNVJYJU-Cuc4jpXw.js → stateDiagram-v2-BHNVJYJU-Dt4J-On6.js} +1 -1
  85. package/dist/client/assets/{timeline-definition-PNZ67QCA-D5sPA5Fn.js → timeline-definition-PNZ67QCA-BRP1zY5x.js} +1 -1
  86. package/dist/client/assets/{upload--LqDmM0k.js → upload-Bx4Vz2lr.js} +1 -1
  87. package/dist/client/assets/{users-C-TzkWjB.js → users-CCfOZK-x.js} +1 -1
  88. package/dist/client/assets/{vennDiagram-CIIHVFJN-BzsN4FbO.js → vennDiagram-CIIHVFJN-BqtShvFk.js} +1 -1
  89. package/dist/client/assets/{wardley-L42UT6IY-BJIIgfK4.js → wardley-L42UT6IY-D04-M_2p.js} +1 -1
  90. package/dist/client/assets/{wardleyDiagram-YWT4CUSO-DFwxRQ3d.js → wardleyDiagram-YWT4CUSO-BmkvFHY9.js} +1 -1
  91. package/dist/client/assets/{xychartDiagram-2RQKCTM6-Djbd80bq.js → xychartDiagram-2RQKCTM6-C1N68DRK.js} +1 -1
  92. package/dist/client/index.html +2 -2
  93. package/dist/client/version.json +1 -1
  94. package/dist/droid-cli/index.ts +19 -6
  95. package/dist/droid-cli/package.json +1 -1
  96. package/dist/droid-cli/src/__tests__/index.test.ts +10 -11
  97. package/dist/extension.js +2504 -1047
  98. package/dist/pi-claude-cli/index.ts +25 -18
  99. package/dist/pi-claude-cli/package.json +5 -5
  100. package/dist/pi-claude-cli/src/__tests__/acp-dispatch.test.ts +17 -0
  101. package/dist/pi-claude-cli/src/event-bridge.ts +2 -1
  102. package/dist/plugin-sdk/index.d.ts +23 -1
  103. package/dist/plugin-sdk/index.js +17 -3
  104. package/dist/plugins/fusion-plugin-acp-runtime/bundled.js +25 -11
  105. package/dist/plugins/fusion-plugin-acp-runtime/package.json +1 -1
  106. package/dist/plugins/fusion-plugin-antigravity-runtime/bundled.js +20674 -0
  107. package/dist/plugins/fusion-plugin-antigravity-runtime/manifest.json +6 -0
  108. package/dist/plugins/fusion-plugin-antigravity-runtime/mcp-schema-server.cjs +155 -0
  109. package/dist/plugins/fusion-plugin-antigravity-runtime/package.json +11 -0
  110. package/dist/plugins/fusion-plugin-claude-runtime/bundled.js +25 -11
  111. package/dist/plugins/fusion-plugin-claude-runtime/package.json +1 -1
  112. package/dist/plugins/fusion-plugin-cli-printing-press/bundled.js +17 -3
  113. package/dist/plugins/fusion-plugin-cli-printing-press/package.json +1 -1
  114. package/dist/plugins/fusion-plugin-compound-engineering/bundled.js +17 -3
  115. package/dist/plugins/fusion-plugin-compound-engineering/package.json +1 -1
  116. package/dist/plugins/fusion-plugin-cursor-runtime/bundled.js +17 -3
  117. package/dist/plugins/fusion-plugin-cursor-runtime/package.json +1 -1
  118. package/dist/plugins/fusion-plugin-dependency-graph/bundled.js +17 -3
  119. package/dist/plugins/fusion-plugin-dependency-graph/package.json +1 -1
  120. package/dist/plugins/fusion-plugin-droid-runtime/bundled.js +44 -12
  121. package/dist/plugins/fusion-plugin-droid-runtime/package.json +1 -1
  122. package/dist/plugins/fusion-plugin-grok-runtime/bundled.js +25 -11
  123. package/dist/plugins/fusion-plugin-grok-runtime/package.json +1 -1
  124. package/dist/plugins/fusion-plugin-hermes-runtime/bundled.js +17 -3
  125. package/dist/plugins/fusion-plugin-hermes-runtime/package.json +1 -1
  126. package/dist/plugins/fusion-plugin-linear-import/bundled.js +17 -3
  127. package/dist/plugins/fusion-plugin-linear-import/package.json +1 -1
  128. package/dist/plugins/fusion-plugin-omp-runtime/bundled.js +25 -11
  129. package/dist/plugins/fusion-plugin-omp-runtime/package.json +1 -1
  130. package/dist/plugins/fusion-plugin-openclaw-runtime/bundled.js +17 -3
  131. package/dist/plugins/fusion-plugin-openclaw-runtime/package.json +1 -1
  132. package/dist/plugins/fusion-plugin-paperclip-runtime/bundled.js +17 -3
  133. package/dist/plugins/fusion-plugin-paperclip-runtime/package.json +1 -1
  134. package/dist/plugins/fusion-plugin-quality/bundled.js +17 -3
  135. package/dist/plugins/fusion-plugin-quality/package.json +1 -1
  136. package/dist/plugins/fusion-plugin-reports/bundled.js +17 -3
  137. package/dist/plugins/fusion-plugin-reports/package.json +1 -1
  138. package/dist/plugins/fusion-plugin-roadmap/bundled.js +17 -3
  139. package/dist/plugins/fusion-plugin-roadmap/package.json +1 -1
  140. package/dist/plugins/fusion-plugin-todos/bundled.js +17 -3
  141. package/dist/plugins/fusion-plugin-todos/package.json +1 -1
  142. package/dist/plugins/fusion-plugin-whatsapp-chat/bundled.js +17 -3
  143. package/dist/plugins/fusion-plugin-whatsapp-chat/package.json +1 -1
  144. package/package.json +3 -3
  145. package/skill/fusion/references/engine-tools.md +1 -1
  146. package/dist/client/assets/app-BHtkLolA.js +0 -9
  147. package/dist/client/assets/app-BNkvP9Zj.js +0 -9
  148. package/dist/client/assets/app-BaaOD_8W.js +0 -9
  149. package/dist/client/assets/app-CTDJyVYb.js +0 -9
  150. package/dist/client/assets/app-CYBEnq88.js +0 -9
  151. package/dist/client/assets/app-D_qEfmZH.js +0 -3
  152. package/dist/client/assets/channel-BcOi2QPy.js +0 -1
  153. package/dist/client/assets/classDiagram-4FO5ZUOK-Do_hlHfK.js +0 -1
  154. package/dist/client/assets/classDiagram-v2-Q7XG4LA2-Do_hlHfK.js +0 -1
  155. package/dist/client/assets/index-D-BMoPtn.css +0 -1
@@ -15,6 +15,7 @@
15
15
  * version and the ExtensionAPI stream types stay compatible.
16
16
  */
17
17
  import { getBuiltinModels } from "@earendil-works/pi-ai/providers/all";
18
+ import { getCurrentSystemPrompt, getCurrentTools } from "@earendil-works/pi-ai/utils/transcript";
18
19
  import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
19
20
  import { streamViaCli } from "./src/provider.js";
20
21
  import { streamViaAcp } from "./src/acp-driver.js";
@@ -46,9 +47,17 @@ function resolveAcpBridgePath(): string | undefined {
46
47
  }
47
48
 
48
49
  /** Resolve custom tool defs the same way ensureMcpConfig does (context → registry). */
50
+ function normalizeTranscriptTools(tools: ReturnType<typeof getCurrentTools>): Array<{ name: string; description: string; parameters: Record<string, unknown> }> {
51
+ return tools.map((tool) => ({
52
+ name: tool.name,
53
+ description: tool.description ?? "",
54
+ parameters: Object.fromEntries(Object.entries(tool.parameters)),
55
+ }));
56
+ }
57
+
49
58
  function resolveToolDefs(
50
59
  pi: ExtensionAPI,
51
- contextTools?: ReadonlyArray<{ name: string; description: string; parameters: Record<string, unknown> }>,
60
+ contextTools: ReadonlyArray<{ name: string; description: string; parameters: Record<string, unknown> }>,
52
61
  ): McpToolDef[] {
53
62
  let toolDefs = toolsFromContext(contextTools);
54
63
  if (toolDefs.length === 0 && Array.isArray(pi.getAllTools())) toolDefs = getCustomToolDefs(pi);
@@ -101,12 +110,9 @@ function getUserMcpServers(options: unknown): UserMcpServerSpec[] {
101
110
  * the set of custom tools changes.
102
111
  *
103
112
  * Source of truth (in order of preference):
104
- * 1. `context.tools` — the per-session tool list pi-ai actually hands to
105
- * `streamSimple`. This is what the session is asking the model to see, so
106
- * it includes session-scoped registrations (e.g. `fn_review_spec` and
107
- * `fn_spawn_agent` injected by the engine's triage/executor sessions).
108
- * 2. `pi.getAllTools()` — fallback for older callers that don't supply
109
- * `context.tools`.
113
+ * 1. Pi 0.86 transcript tool declarations, replayed through
114
+ * `getCurrentTools(context.messages)` so mid-conversation updates survive.
115
+ * 2. `pi.getAllTools()` — fallback when the current transcript has no tools.
110
116
  *
111
117
  * Why not a single once-and-lock cache:
112
118
  * - The engine spawns triage/executor sessions with session-scoped tools.
@@ -121,7 +127,7 @@ function getUserMcpServers(options: unknown): UserMcpServerSpec[] {
121
127
  */
122
128
  function ensureMcpConfig(
123
129
  pi: ExtensionAPI,
124
- contextTools?: ReadonlyArray<{
130
+ contextTools: ReadonlyArray<{
125
131
  name: string;
126
132
  description: string;
127
133
  parameters: Record<string, unknown>;
@@ -132,12 +138,11 @@ function ensureMcpConfig(
132
138
  let toolDefs: McpToolDef[] = toolsFromContext(contextTools);
133
139
  if (contextTools && contextTools.length > 0) {
134
140
  debugMcp(
135
- `MCP config from context.tools: ${contextTools.map((tool) => tool.name).join(", ")}`,
141
+ `MCP config from current transcript: ${contextTools.map((tool) => tool.name).join(", ")}`,
136
142
  );
137
143
  }
138
144
 
139
- // Fallback to the pi runtime registry if the context didn't carry tools.
140
- // (Older agent-loop versions don't populate Context.tools for streamSimple.)
145
+ // Fallback to the pi runtime registry when the transcript has no current tools.
141
146
  if (toolDefs.length === 0) {
142
147
  const allTools = pi.getAllTools();
143
148
  if (!Array.isArray(allTools)) {
@@ -308,11 +313,13 @@ export default function (pi: ExtensionAPI) {
308
313
  api: "pi-claude-cli",
309
314
  models,
310
315
  streamSimple: (model, context, options) => {
311
- const contextTools = (context as { tools?: ReadonlyArray<{
312
- name: string;
313
- description: string;
314
- parameters: Record<string, unknown>;
315
- }> }).tools;
316
+ /*
317
+ FNXC:PiTranscriptBridge 2026-09-20-16:20:
318
+ Pi 0.86 replaces the retired Context.tools field with transcript system-message deltas. Replay the current prompt and tool declarations before building either local CLI bridge so resumed and branched sessions retain their latest instructions and MCP schemas.
319
+ */
320
+ const contextTools = normalizeTranscriptTools(getCurrentTools(context.messages));
321
+ // FNXC:PiTranscriptBridge 2026-09-20-17:02: Prompt adapters still consume Context.tools for MCP tool-name instructions, so forward Pi's normalized current transcript tools after replacing its retired source field.
322
+ const cliContext = { ...context, systemPrompt: getCurrentSystemPrompt(context.messages), tools: contextTools };
316
323
 
317
324
  // FNXC:pi-claude-cli 2026-06-27-06:39: Route A drives Claude through the ACP bridge only when the kill-switch is on AND a bridge path is injected. OFF by default → `-p` path below.
318
325
  const bridgePath = resolveAcpBridgePath();
@@ -320,7 +327,7 @@ export default function (pi: ExtensionAPI) {
320
327
  const toolDefs = resolveToolDefs(pi, contextTools);
321
328
  const userMcpServers = getUserMcpServers(options);
322
329
  const hash = createHash("sha1").update(JSON.stringify({ toolDefs, userMcpServerNames: userMcpServers.map((server) => server.name) })).digest("hex").slice(0, 12);
323
- return streamViaAcp(model, context, {
330
+ return streamViaAcp(model, cliContext as never, {
324
331
  ...options,
325
332
  bridgePath,
326
333
  mcpServers: buildAcpMcpServers(toolDefs, hash, userMcpServers),
@@ -330,7 +337,7 @@ export default function (pi: ExtensionAPI) {
330
337
  }
331
338
 
332
339
  const configPath = ensureMcpConfig(pi, contextTools, getUserMcpServers(options));
333
- return streamViaCli(model, context, {
340
+ return streamViaCli(model, cliContext as never, {
334
341
  ...options,
335
342
  mcpConfigPath: configPath,
336
343
  });
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fusion/pi-claude-cli",
3
- "version": "0.78.0-beta.5",
3
+ "version": "0.78.0-beta.6",
4
4
  "type": "module",
5
5
  "private": true,
6
6
  "main": "index.ts",
@@ -13,14 +13,14 @@
13
13
  "@agentclientprotocol/sdk": "0.24.0"
14
14
  },
15
15
  "devDependencies": {
16
- "@earendil-works/pi-ai": "0.84.4",
17
- "@earendil-works/pi-coding-agent": "0.84.4",
16
+ "@earendil-works/pi-ai": "0.86.1",
17
+ "@earendil-works/pi-coding-agent": "0.86.1",
18
18
  "@types/node": "^22.0.0",
19
19
  "typescript": "^5.7.0",
20
20
  "vitest": "^4.1.10"
21
21
  },
22
22
  "peerDependencies": {
23
- "@earendil-works/pi-ai": "0.84.4",
24
- "@earendil-works/pi-coding-agent": "0.84.4"
23
+ "@earendil-works/pi-ai": "0.86.1",
24
+ "@earendil-works/pi-coding-agent": "0.86.1"
25
25
  }
26
26
  }
@@ -65,6 +65,23 @@ describe("streamSimple kill-switch dispatch (U11/R9/R14)", () => {
65
65
  expect(streamViaAcp).not.toHaveBeenCalled();
66
66
  });
67
67
 
68
+ it("forwards current transcript tools to the CLI prompt adapter", () => {
69
+ delete process.env.FUSION_CLAUDE_ACP;
70
+ const tools = [{
71
+ name: "fn_web_fetch",
72
+ description: "Fetch a URL",
73
+ parameters: { type: "object", properties: { url: { type: "string" } } },
74
+ }];
75
+ const streamSimple = registerAndGetStreamSimple();
76
+ streamSimple(MODEL, { messages: [{ role: "system", content: "Use Fusion tools", toolsAdded: tools }] } as never, {});
77
+
78
+ expect(streamViaCli).toHaveBeenCalledWith(
79
+ MODEL,
80
+ expect.objectContaining({ systemPrompt: "Use Fusion tools", tools }),
81
+ expect.any(Object),
82
+ );
83
+ });
84
+
68
85
  it("dispatches to the ACP bridge when the flag AND a bridge path are set", () => {
69
86
  process.env.FUSION_CLAUDE_ACP = "1";
70
87
  process.env.FUSION_CLAUDE_ACP_BRIDGE = "/abs/claude-code-cli-acp";
@@ -321,7 +321,8 @@ export function createEventBridge(
321
321
  // Try to parse accumulated JSON -- on success update args, on failure keep previous
322
322
  try {
323
323
  block.arguments = JSON.parse(block.partialJson);
324
- (output.content[idx] as ToolCall).arguments = block.arguments as Record<string, unknown>;
324
+ // FNXC:PiTranscriptBridge 2026-09-20-16:20: Pi 0.86 accepts only JSON-compatible tool-call arguments; JSON.parse supplies that boundary.
325
+ (output.content[idx] as ToolCall).arguments = block.arguments as ToolCall["arguments"];
325
326
  } catch {
326
327
  // Partial JSON not yet parseable -- keep previous arguments
327
328
  }
@@ -122,6 +122,7 @@ interface TransactionOptions {
122
122
  }
123
123
  interface AsyncDataLayer {
124
124
  readonly db: DrizzleDb;
125
+ readonly healthDb: DrizzleDb;
125
126
  readonly projectId?: string;
126
127
  readonly backend?: ResolvedBackend;
127
128
  transaction<T>(fn: (tx: DbTransaction) => Promise<T>, options?: TransactionOptions): Promise<T>;
@@ -1094,6 +1095,7 @@ interface WorkflowWorkItemUpsertInput {
1094
1095
  workflowRole?: "triage" | "executor" | "reviewer" | "merger" | null;
1095
1096
  authorityKind?: "task-assignee" | "review-node-override" | "column-binding" | "role-pool" | null;
1096
1097
  nodeInstanceId?: string | null;
1098
+ onlyIfNoActiveTaskContinuation?: boolean;
1097
1099
  now?: string;
1098
1100
  }
1099
1101
  interface WorkflowWorkItemTransitionPatch {
@@ -6124,9 +6126,13 @@ declare class TaskStore extends EventEmitter<TaskStoreEvents> {
6124
6126
  }): Promise<WorkflowWorkItem>;
6125
6127
  seedWorkspaceCodeReviewContinuationIfIdle(input: WorkflowWorkItemUpsertInput & {
6126
6128
  kind: "task";
6129
+ expectedWorkflowSelection?: {
6130
+ workflowId: string;
6131
+ stepIds: string[];
6132
+ } | null;
6127
6133
  }): Promise<{
6128
6134
  seeded: boolean;
6129
- reason?: "active-continuation";
6135
+ reason?: "active-continuation" | "workflow-selection-changed";
6130
6136
  workItemId?: string;
6131
6137
  }>;
6132
6138
  seedStrandedPlanReviewContinuation(input: WorkflowWorkItemUpsertInput & {
@@ -7583,6 +7589,12 @@ interface GoalCitationFilter {
7583
7589
  }
7584
7590
 
7585
7591
  type TaskExternalBlockOrigin = "host-environment" | "model-provider" | "credentials" | "network" | "third-party-service";
7592
+ interface TaskExternalBlockReport {
7593
+ verifiedCondition: string;
7594
+ stopReason: string;
7595
+ unimplementedWork: string;
7596
+ unblockCondition: string;
7597
+ }
7586
7598
  interface TaskExternalBlock {
7587
7599
  origin: TaskExternalBlockOrigin;
7588
7600
  code: string;
@@ -7596,6 +7608,7 @@ interface TaskExternalBlock {
7596
7608
  worktree?: string;
7597
7609
  branch?: string;
7598
7610
  };
7611
+ report?: TaskExternalBlockReport;
7599
7612
  }
7600
7613
 
7601
7614
  type TaskPlanningFailureState = {
@@ -7613,6 +7626,12 @@ type TaskPlanningFailureState = {
7613
7626
  };
7614
7627
  };
7615
7628
  interface MergeDetails {
7629
+ mergeBoundaryRecovery?: {
7630
+ signature: string;
7631
+ attempt: number;
7632
+ nextCheckAt: string | null;
7633
+ heldAt?: string;
7634
+ };
7616
7635
  commitSha?: string;
7617
7636
  landedBranchTipSha?: string;
7618
7637
  rebaseBaseSha?: string;
@@ -8606,6 +8625,8 @@ interface GlobalSettings {
8606
8625
  cursorCliBinaryPath?: string;
8607
8626
  useGrokCli?: boolean;
8608
8627
  grokCliBinaryPath?: string;
8628
+ useAntigravityCli?: boolean;
8629
+ antigravityCliBinaryPath?: string;
8609
8630
  useOmpCli?: boolean;
8610
8631
  ompCliBinaryPath?: string;
8611
8632
  executionGlobalProvider?: string;
@@ -9338,6 +9359,7 @@ interface ArchivedTaskEntry {
9338
9359
  comments?: TaskComment[];
9339
9360
  review?: TaskReview;
9340
9361
  reviewState?: TaskReviewState;
9362
+ recommendations?: TaskRecommendation[];
9341
9363
  prompt?: string;
9342
9364
  agentLogMode?: ArchiveAgentLogMode;
9343
9365
  agentLogSummary?: string;
@@ -8988,7 +8988,7 @@ var PLAN_REVIEW_PROMPT = `You are a senior plan reviewer. Review the task's PROM
8988
8988
  5. **Risk callouts** \u2014 migrations, data-loss paths, external integrations, secrets, or plugin/runtime dependencies that need explicit handling.
8989
8989
 
8990
8990
  ## Environment feasibility
8991
- When the supplied \`## Environment Capabilities\` block lists a runtime as unavailable, REVISE only if a blocking acceptance/completion criterion requires that runtime and the plan provides no runnable substitute. APPROVE when the plan specifies a runnable substitute or records the ideal check under an explicitly non-blocking \`## Environment Constraints\` section (use APPROVE_WITH_NOTES only for a genuine P2 note). Never REVISE merely because a desirable check is unavailable when the plan already marks it non-blocking.
8991
+ When the supplied \`## Environment Capabilities\` block confirms a runtime unavailable without an applicable confirmed wrapper, REVISE only if a blocking acceptance/completion criterion requires it and the plan provides no runnable substitute. A documented or configured command using a confirmed wrapper remains binding even when its inner executable is absent from the host PATH. APPROVE a correctly scoped non-blocking \`## Environment Constraints\` substitute (use APPROVE_WITH_NOTES only for a genuine P2 note); unlisted commands are UNKNOWN, never absent.
8992
8992
 
8993
8993
  ${PLAN_REVIEW_COMPLETENESS_POLICY}
8994
8994
 
@@ -9312,6 +9312,9 @@ var DEFAULT_GLOBAL_SETTINGS = {
9312
9312
  Grok CLI binary overrides are global operator settings because executable locations are machine-local. Blank/undefined preserves PATH auto-detection through grok.
9313
9313
  */
9314
9314
  grokCliBinaryPath: void 0,
9315
+ // FNXC:AntigravityProvider 2026-09-20-18:32: Default disabled and preserve PATH auto-detection until an operator enables a verified agy binary.
9316
+ useAntigravityCli: void 0,
9317
+ antigravityCliBinaryPath: void 0,
9315
9318
  /*
9316
9319
  FNXC:OmpAcp 2026-07-13-22:50:
9317
9320
  Oh My Pi (omp) CLI enable + binary override are global operator settings (machine-local), mirroring Grok/Cursor.
@@ -13235,7 +13238,7 @@ The quality of your spec directly determines execution quality, review churn, an
13235
13238
  - Access to the project's files so you can understand context
13236
13239
 
13237
13240
  ## Environment feasibility
13238
- When an \`## Environment Capabilities\` section is supplied, no acceptance criterion, completion criterion, or required verification command may depend on a runtime listed unavailable. Specify a runnable substitute instead and record the ideal-but-impossible check under an \`## Environment Constraints\` heading marked explicitly non-blocking. Never state that a plan is blocked because a runtime is missing.
13241
+ When an \`## Environment Capabilities\` section is supplied, require a runnable substitute only for a runtime confirmed unavailable without an applicable confirmed wrapper. A documented or configured command using a confirmed wrapper remains binding even when its inner executable is absent from the host PATH. Commands not listed are UNKNOWN, never absent; never state that a plan is blocked because a runtime is missing.
13239
13242
 
13240
13243
  ## What you produce
13241
13244
  Write a complete PROMPT.md specification to the given path using the write tool.
@@ -14406,6 +14409,9 @@ var CODE_REVIEW_NAME = "Code Review";
14406
14409
  var CODE_REVIEW_DESCRIPTION = "Diff-review the task's changes for correctness bugs, regressions, and intent mismatches that tests miss";
14407
14410
  var CODE_REVIEW_PROMPT = `You are a senior code reviewer. Review the task's diff for the correctness value automated tests do NOT catch.
14408
14411
 
14412
+ ## Review stage
14413
+ This is a pre-merge review. Evidence that can exist only after landing (for example a push-to-main CI run) belongs to an enabled, blocking post-merge verification gate. Verify that the workflow preserves that requirement before allowing merge; if the gate or its evidence contract is missing, request that concrete configuration fix. Do not request the future run itself as a pre-merge implementation fix, or claim its evidence already exists. Pre-merge correctness and verification requirements still apply.
14414
+
14409
14415
  ## Step 1: Read the change
14410
14416
  1. Read the full diff against the base branch: \`git diff <base>...HEAD\` (or \`git diff <base>\`). Determine the base from the task context / merge target.
14411
14417
  2. Read the changed files in full where the diff is non-trivial, so you see the surrounding code paths the change touches \u2014 not just the hunks.
@@ -14483,9 +14489,17 @@ var POST_MERGE_VERIFICATION_PROMPT = `You are a post-merge verification reviewer
14483
14489
  2. Check the final merged diff and task summary for obvious mismatches, missing verification evidence, or integration-only regressions.
14484
14490
  3. If configured test/build commands are available in the task context, inspect their latest result or explain why no post-merge command was applicable.
14485
14491
 
14492
+ ## Required post-landing Full Suite evidence
14493
+ This enabled gate requires post-landing Full Suite evidence. Do NOT approve until its delivery record names all of the following:
14494
+ 1. The landed SHA and the first Full Suite push-to-main run at or after that SHA, including the run ID and run SHA.
14495
+ 2. A conclusion for every Test shard: 1/4, 2/4, 3/4, and 4/4.
14496
+ 3. All four timing artifacts: test-timings-shard-1, test-timings-shard-2, test-timings-shard-3, and test-timings-shard-4.
14497
+
14498
+ Pre-landing, unrelated-main, or partial evidence does not satisfy this contract. If the required run or any required evidence is unavailable, return REVISE and state that final completion remains blocked pending the post-landing evidence. Record verified evidence in the task delivery record before approving.
14499
+
14486
14500
  ## Output Requirements
14487
14501
  - APPROVE: post-merge verification is acceptable.
14488
- - APPROVE_WITH_NOTES: completion may proceed with non-blocking notes.
14502
+ - APPROVE_WITH_NOTES: completion may proceed with non-blocking notes only when every post-landing evidence item above is recorded.
14489
14503
  - REVISE: completion should be blocked; include the concrete post-merge issue and the needed follow-up.
14490
14504
  - \`notes\` MUST contain one to three non-empty sentences naming what was checked and why the verdict was reached. An empty \`notes\` string is a protocol violation.
14491
14505
  - Final output: output exactly one trailing JSON object on the final line (no markdown fences, no surrounding prose):
@@ -8888,6 +8888,14 @@ function createLogger(prefix) {
8888
8888
  // ../core/src/types/merge/merge-policy.ts
8889
8889
  var severityAuditLog = createLogger("core-merge-policy");
8890
8890
 
8891
+ // ../core/src/secrets/redact-secrets.ts
8892
+ function redactSecrets(text2) {
8893
+ return text2.replace(/(authorization\s*[:=]\s*)(bearer\s+)?[^\s,;"']+/gi, "$1$2[REDACTED]").replace(/\b(bearer)\s+[A-Za-z0-9._\-+/=]+/gi, "$1 [REDACTED]").replace(
8894
+ /\b((?:api[_-]?key|key|token|secret|password|passwd|pwd|access[_-]?token|refresh[_-]?token|client[_-]?secret)\s*[:=]\s*)("?)[^\s,;"']+\2/gi,
8895
+ "$1$2[REDACTED]$2"
8896
+ ).replace(/\b(sk-|ghp_|gho_|github_pat_|xox[abpr]-|AKIA)[A-Za-z0-9_-]{8,}/g, "[REDACTED]").replace(/\b[A-Za-z0-9+/]{40,}={0,2}\b/g, "[REDACTED]").replace(/\b[0-9a-fA-F]{32,}\b/g, "[REDACTED]");
8897
+ }
8898
+
8891
8899
  // ../core/src/types/task/task-core.ts
8892
8900
  var CheckoutConflictError = class extends Error {
8893
8901
  constructor(taskId, currentHolderId, requestedById) {
@@ -8987,7 +8995,7 @@ var PLAN_REVIEW_PROMPT = `You are a senior plan reviewer. Review the task's PROM
8987
8995
  5. **Risk callouts** \u2014 migrations, data-loss paths, external integrations, secrets, or plugin/runtime dependencies that need explicit handling.
8988
8996
 
8989
8997
  ## Environment feasibility
8990
- When the supplied \`## Environment Capabilities\` block lists a runtime as unavailable, REVISE only if a blocking acceptance/completion criterion requires that runtime and the plan provides no runnable substitute. APPROVE when the plan specifies a runnable substitute or records the ideal check under an explicitly non-blocking \`## Environment Constraints\` section (use APPROVE_WITH_NOTES only for a genuine P2 note). Never REVISE merely because a desirable check is unavailable when the plan already marks it non-blocking.
8998
+ When the supplied \`## Environment Capabilities\` block confirms a runtime unavailable without an applicable confirmed wrapper, REVISE only if a blocking acceptance/completion criterion requires it and the plan provides no runnable substitute. A documented or configured command using a confirmed wrapper remains binding even when its inner executable is absent from the host PATH. APPROVE a correctly scoped non-blocking \`## Environment Constraints\` substitute (use APPROVE_WITH_NOTES only for a genuine P2 note); unlisted commands are UNKNOWN, never absent.
8991
8999
 
8992
9000
  ${PLAN_REVIEW_COMPLETENESS_POLICY}
8993
9001
 
@@ -9311,6 +9319,9 @@ var DEFAULT_GLOBAL_SETTINGS = {
9311
9319
  Grok CLI binary overrides are global operator settings because executable locations are machine-local. Blank/undefined preserves PATH auto-detection through grok.
9312
9320
  */
9313
9321
  grokCliBinaryPath: void 0,
9322
+ // FNXC:AntigravityProvider 2026-09-20-18:32: Default disabled and preserve PATH auto-detection until an operator enables a verified agy binary.
9323
+ useAntigravityCli: void 0,
9324
+ antigravityCliBinaryPath: void 0,
9314
9325
  /*
9315
9326
  FNXC:OmpAcp 2026-07-13-22:50:
9316
9327
  Oh My Pi (omp) CLI enable + binary override are global operator settings (machine-local), mirroring Grok/Cursor.
@@ -10334,14 +10345,6 @@ function completionSummaryNode(column) {
10334
10345
  };
10335
10346
  }
10336
10347
 
10337
- // ../core/src/secrets/redact-secrets.ts
10338
- function redactSecrets(text2) {
10339
- return text2.replace(/(authorization\s*[:=]\s*)(bearer\s+)?[^\s,;"']+/gi, "$1$2[REDACTED]").replace(/\b(bearer)\s+[A-Za-z0-9._\-+/=]+/gi, "$1 [REDACTED]").replace(
10340
- /\b((?:api[_-]?key|key|token|secret|password|passwd|pwd|access[_-]?token|refresh[_-]?token|client[_-]?secret)\s*[:=]\s*)("?)[^\s,;"']+\2/gi,
10341
- "$1$2[REDACTED]$2"
10342
- ).replace(/\b(sk-|ghp_|gho_|github_pat_|xox[abpr]-|AKIA)[A-Za-z0-9_-]{8,}/g, "[REDACTED]").replace(/\b[A-Za-z0-9+/]{40,}={0,2}\b/g, "[REDACTED]").replace(/\b[0-9a-fA-F]{32,}\b/g, "[REDACTED]");
10343
- }
10344
-
10345
10348
  // ../core/src/missions/mission-types.ts
10346
10349
  var VALIDATION_INFLIGHT_STALE_MAX_AGE_MS = 6 * 60 * 60 * 1e3;
10347
10350
 
@@ -13243,7 +13246,7 @@ The quality of your spec directly determines execution quality, review churn, an
13243
13246
  - Access to the project's files so you can understand context
13244
13247
 
13245
13248
  ## Environment feasibility
13246
- When an \`## Environment Capabilities\` section is supplied, no acceptance criterion, completion criterion, or required verification command may depend on a runtime listed unavailable. Specify a runnable substitute instead and record the ideal-but-impossible check under an \`## Environment Constraints\` heading marked explicitly non-blocking. Never state that a plan is blocked because a runtime is missing.
13249
+ When an \`## Environment Capabilities\` section is supplied, require a runnable substitute only for a runtime confirmed unavailable without an applicable confirmed wrapper. A documented or configured command using a confirmed wrapper remains binding even when its inner executable is absent from the host PATH. Commands not listed are UNKNOWN, never absent; never state that a plan is blocked because a runtime is missing.
13247
13250
 
13248
13251
  ## What you produce
13249
13252
  Write a complete PROMPT.md specification to the given path using the write tool.
@@ -14414,6 +14417,9 @@ var CODE_REVIEW_NAME = "Code Review";
14414
14417
  var CODE_REVIEW_DESCRIPTION = "Diff-review the task's changes for correctness bugs, regressions, and intent mismatches that tests miss";
14415
14418
  var CODE_REVIEW_PROMPT = `You are a senior code reviewer. Review the task's diff for the correctness value automated tests do NOT catch.
14416
14419
 
14420
+ ## Review stage
14421
+ This is a pre-merge review. Evidence that can exist only after landing (for example a push-to-main CI run) belongs to an enabled, blocking post-merge verification gate. Verify that the workflow preserves that requirement before allowing merge; if the gate or its evidence contract is missing, request that concrete configuration fix. Do not request the future run itself as a pre-merge implementation fix, or claim its evidence already exists. Pre-merge correctness and verification requirements still apply.
14422
+
14417
14423
  ## Step 1: Read the change
14418
14424
  1. Read the full diff against the base branch: \`git diff <base>...HEAD\` (or \`git diff <base>\`). Determine the base from the task context / merge target.
14419
14425
  2. Read the changed files in full where the diff is non-trivial, so you see the surrounding code paths the change touches \u2014 not just the hunks.
@@ -14491,9 +14497,17 @@ var POST_MERGE_VERIFICATION_PROMPT = `You are a post-merge verification reviewer
14491
14497
  2. Check the final merged diff and task summary for obvious mismatches, missing verification evidence, or integration-only regressions.
14492
14498
  3. If configured test/build commands are available in the task context, inspect their latest result or explain why no post-merge command was applicable.
14493
14499
 
14500
+ ## Required post-landing Full Suite evidence
14501
+ This enabled gate requires post-landing Full Suite evidence. Do NOT approve until its delivery record names all of the following:
14502
+ 1. The landed SHA and the first Full Suite push-to-main run at or after that SHA, including the run ID and run SHA.
14503
+ 2. A conclusion for every Test shard: 1/4, 2/4, 3/4, and 4/4.
14504
+ 3. All four timing artifacts: test-timings-shard-1, test-timings-shard-2, test-timings-shard-3, and test-timings-shard-4.
14505
+
14506
+ Pre-landing, unrelated-main, or partial evidence does not satisfy this contract. If the required run or any required evidence is unavailable, return REVISE and state that final completion remains blocked pending the post-landing evidence. Record verified evidence in the task delivery record before approving.
14507
+
14494
14508
  ## Output Requirements
14495
14509
  - APPROVE: post-merge verification is acceptable.
14496
- - APPROVE_WITH_NOTES: completion may proceed with non-blocking notes.
14510
+ - APPROVE_WITH_NOTES: completion may proceed with non-blocking notes only when every post-landing evidence item above is recorded.
14497
14511
  - REVISE: completion should be blocked; include the concrete post-merge issue and the needed follow-up.
14498
14512
  - \`notes\` MUST contain one to three non-empty sentences naming what was checked and why the verdict was reached. An empty \`notes\` string is a protocol violation.
14499
14513
  - Final output: output exactly one trailing JSON object on the final line (no markdown fences, no surrounding prose):
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fusion-plugin-examples/acp-runtime",
3
- "version": "0.1.37-beta.5",
3
+ "version": "0.1.37-beta.6",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": {