@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.
- package/dist/bin.js +3574 -1910
- package/dist/child-process-worker.js +1440 -628
- package/dist/client/.vite/manifest.json +257 -257
- package/dist/client/assets/{AgentDetailView-CdoJDm2q.js → AgentDetailView-F_LCM2Fh.js} +1 -1
- package/dist/client/assets/{AgentPermissionPolicyEditor-vlsZ36BL.js → AgentPermissionPolicyEditor-Da7PHXMp.js} +1 -1
- package/dist/client/assets/{AgentsView-9EwgX1OK.js → AgentsView-nIFjsi9d.js} +3 -3
- package/dist/client/assets/{CommandCenter--BVLmh3G.js → CommandCenter-BDtrZ6JK.js} +1 -1
- package/dist/client/assets/{DevServerView-d1CVa_YB.js → DevServerView-CXE7Swoe.js} +1 -1
- package/dist/client/assets/{DirectoryPicker-_uNfzkVu.js → DirectoryPicker-CYI--LmS.js} +1 -1
- package/dist/client/assets/{DocumentsView-SHFZKBkK.js → DocumentsView-BUwtzdpV.js} +1 -1
- package/dist/client/assets/{EvalsView-CQMcojzl.js → EvalsView-0qtYh3sd.js} +1 -1
- package/dist/client/assets/{ExperimentalAgentOnboardingModal-BhwVl29h.js → ExperimentalAgentOnboardingModal-D3YNBI3S.js} +1 -1
- package/dist/client/assets/{GoalsView-Ju8PyHt8.js → GoalsView-C8M2Ufj6.js} +1 -1
- package/dist/client/assets/{InsightsView-BHoI4E2e.js → InsightsView-ByhApqco.js} +1 -1
- package/dist/client/assets/{MemoryView-Co-efjDQ.js → MemoryView-BG3vxXrX.js} +1 -1
- package/dist/client/assets/{PatchnodeView-CBJpVpFG.js → PatchnodeView-D4gg6xMq.js} +1 -1
- package/dist/client/assets/{PiExtensionsManager-DDk1a_Qy.js → PiExtensionsManager-CaadPnc-.js} +1 -1
- package/dist/client/assets/{PluginManager-DtGflOpe.js → PluginManager-BC9_Ajdd.js} +1 -1
- package/dist/client/assets/{PullRequestView-DwHock6V.js → PullRequestView-BfouYDOl.js} +1 -1
- package/dist/client/assets/{ReportModal-CJaxJ6ua.js → ReportModal-BDsen5Oh.js} +1 -1
- package/dist/client/assets/{ResearchView-ZD-2JxsH.js → ResearchView-vmH_K4of.js} +1 -1
- package/dist/client/assets/{SecretsView-Cz99j53t.js → SecretsView-BinJNcAF.js} +1 -1
- package/dist/client/assets/{SettingsModal-dmitxbA_.js → SettingsModal-Bffo4m2D.js} +4 -4
- package/dist/client/assets/{SettingsModal-BfiZ2-GY.js → SettingsModal-DdnLlKn8.js} +1 -1
- package/dist/client/assets/{SettingsTextareaRow-XyVN0ZEP.js → SettingsTextareaRow-CV1xXRhq.js} +1 -1
- package/dist/client/assets/{SetupWizardModal-mVUAy77v.js → SetupWizardModal-B2O0HOZR.js} +2 -2
- package/dist/client/assets/{SkillsView-DYL1ZeGi.js → SkillsView-CPE3Jkt7.js} +1 -1
- package/dist/client/assets/{WorkflowNodeEditor-E9sIzyMz.js → WorkflowNodeEditor-CTVfvX3A.js} +1 -1
- package/dist/client/assets/{agent-import-generation-DwUlR4qa.js → agent-import-generation-Bu2uCPd0.js} +1 -1
- package/dist/client/assets/{agentsOrgChartLayout-B5F8JGin.js → agentsOrgChartLayout-BGOBewpH.js} +1 -1
- package/dist/client/assets/app-AzX-7oMC.js +11 -0
- package/dist/client/assets/app-B5vKhbbZ.js +11 -0
- package/dist/client/assets/app-BZHD4Tdt.js +5 -0
- package/dist/client/assets/app-CWzmFjgT.js +11 -0
- package/dist/client/assets/app-C_yEgSaj.js +11 -0
- package/dist/client/assets/app-Crvy006P.js +11 -0
- package/dist/client/assets/{app-Dsv4VHMo.js → app-UI8thBW4.js} +1 -1
- package/dist/client/assets/{architectureDiagram-3BPJPVTR-BFirFbC8.js → architectureDiagram-3BPJPVTR-BDzTDKvR.js} +1 -1
- package/dist/client/assets/{blockDiagram-GPEHLZMM-CK-1Yktz.js → blockDiagram-GPEHLZMM-BbnxXgkY.js} +1 -1
- package/dist/client/assets/{c4Diagram-AAUBKEIU-C7uG_4cR.js → c4Diagram-AAUBKEIU-B_upVmlM.js} +1 -1
- package/dist/client/assets/channel-2BQ2i0n6.js +1 -0
- package/dist/client/assets/{chunk-2J33WTMH-BhPS_gnq.js → chunk-2J33WTMH-oH3mFmAA.js} +1 -1
- package/dist/client/assets/{chunk-4BX2VUAB-N_uAN5vN.js → chunk-4BX2VUAB-vezh3jfu.js} +1 -1
- package/dist/client/assets/{chunk-55IACEB6-CNYK0ezP.js → chunk-55IACEB6-BmGhY313.js} +1 -1
- package/dist/client/assets/{chunk-727SXJPM-C9EkXgMB.js → chunk-727SXJPM-ChDetrFZ.js} +1 -1
- package/dist/client/assets/{chunk-AQP2D5EJ-CYcOZI0r.js → chunk-AQP2D5EJ-BY329LM6.js} +1 -1
- package/dist/client/assets/{chunk-FMBD7UC4-D-oVdpAz.js → chunk-FMBD7UC4-zuiiPcMa.js} +1 -1
- package/dist/client/assets/{chunk-ND2GUHAM-79zqWauw.js → chunk-ND2GUHAM-CqF_-gMe.js} +1 -1
- package/dist/client/assets/{chunk-QZHKN3VN-T2WIzSUZ.js → chunk-QZHKN3VN-DtETgl8P.js} +1 -1
- package/dist/client/assets/classDiagram-4FO5ZUOK-CmoQsyhJ.js +1 -0
- package/dist/client/assets/classDiagram-v2-Q7XG4LA2-CmoQsyhJ.js +1 -0
- package/dist/client/assets/{cose-bilkent-S5V4N54A-DYcEyEdj.js → cose-bilkent-S5V4N54A-CB7l3IMd.js} +1 -1
- package/dist/client/assets/{dagre-BM42HDAG-CG6eBqe1.js → dagre-BM42HDAG-B-yrcude.js} +1 -1
- package/dist/client/assets/{dashboard-view-Cthbyplu.js → dashboard-view-BHUOC-dp.js} +1 -1
- package/dist/client/assets/{dashboard-view-CpfQSqFD.js → dashboard-view-C2e-lWkw.js} +1 -1
- package/dist/client/assets/{dashboard-view-C3jacppL.js → dashboard-view-DAkh7C8T.js} +1 -1
- package/dist/client/assets/{dashboard-view-BV97_KM2.js → dashboard-view-lR50LvCR.js} +1 -1
- package/dist/client/assets/{diagram-2AECGRRQ-CA-oSX6v.js → diagram-2AECGRRQ-cV9rcK7D.js} +1 -1
- package/dist/client/assets/{diagram-5GNKFQAL-7zlBlYUe.js → diagram-5GNKFQAL-COswZy2u.js} +1 -1
- package/dist/client/assets/{diagram-KO2AKTUF-kFIrOk6O.js → diagram-KO2AKTUF-CRYtHA-0.js} +1 -1
- package/dist/client/assets/{diagram-LMA3HP47-10NYAStZ.js → diagram-LMA3HP47-BSc2gwi-.js} +1 -1
- package/dist/client/assets/{diagram-OG6HWLK6-YUx0Utvh.js → diagram-OG6HWLK6-CkTvh_OG.js} +1 -1
- package/dist/client/assets/{erDiagram-TEJ5UH35-B9jMu7Zv.js → erDiagram-TEJ5UH35-IZxjOfAZ.js} +1 -1
- package/dist/client/assets/{flowDiagram-I6XJVG4X-C540twrl.js → flowDiagram-I6XJVG4X-DP1Krzf1.js} +1 -1
- package/dist/client/assets/{folder-open-Da5UOz-O.js → folder-open-3vwTBlrn.js} +1 -1
- package/dist/client/assets/{ganttDiagram-6RSMTGT7-BRTG1iq_.js → ganttDiagram-6RSMTGT7-DTrMtkeI.js} +1 -1
- package/dist/client/assets/{gitGraphDiagram-PVQCEYII-DGzLquoM.js → gitGraphDiagram-PVQCEYII-CZzumF1O.js} +1 -1
- package/dist/client/assets/index-BG6hrVhL.css +1 -0
- package/dist/client/assets/{index-B8Ei6RK_.js → index-jWzr0HgU.js} +343 -332
- package/dist/client/assets/{infoDiagram-5YYISTIA-DxDL2NPL.js → infoDiagram-5YYISTIA-DPToV-eq.js} +1 -1
- package/dist/client/assets/{ishikawaDiagram-YF4QCWOH-CugUocbL.js → ishikawaDiagram-YF4QCWOH-V9akKrsQ.js} +1 -1
- package/dist/client/assets/{journeyDiagram-JHISSGLW-4J1DbTfn.js → journeyDiagram-JHISSGLW-CMZmXLJq.js} +1 -1
- package/dist/client/assets/{kanban-definition-UN3LZRKU-3wWdkkqE.js → kanban-definition-UN3LZRKU-DT2oKh0N.js} +1 -1
- package/dist/client/assets/{mermaid.core-CdJo4vtY.js → mermaid.core-C9xSBL9K.js} +4 -4
- package/dist/client/assets/{mindmap-definition-RKZ34NQL-3ggmNH1R.js → mindmap-definition-RKZ34NQL-BKyCGR7J.js} +1 -1
- package/dist/client/assets/{pieDiagram-4H26LBE5-Br6qnYUo.js → pieDiagram-4H26LBE5-BcyGtqQ4.js} +1 -1
- package/dist/client/assets/{puzzle-COtNelRH.js → puzzle-acZM2rkn.js} +1 -1
- package/dist/client/assets/{quadrantDiagram-W4KKPZXB-q7eumSaG.js → quadrantDiagram-W4KKPZXB-C3FhvUs0.js} +1 -1
- package/dist/client/assets/{requirementDiagram-4Y6WPE33-CFQyk2vj.js → requirementDiagram-4Y6WPE33-gcTHwql9.js} +1 -1
- package/dist/client/assets/{sankeyDiagram-5OEKKPKP-BPRBSEnx.js → sankeyDiagram-5OEKKPKP-CvYBofJY.js} +1 -1
- package/dist/client/assets/{sequenceDiagram-3UESZ5HK-C3oaAZUP.js → sequenceDiagram-3UESZ5HK-D9v9NJKo.js} +1 -1
- package/dist/client/assets/{standing-instructions-template-_wMqEkKb.js → standing-instructions-template-B_qbkt6Q.js} +1 -1
- package/dist/client/assets/{stateDiagram-AJRCARHV-Gf3SuYgE.js → stateDiagram-AJRCARHV-Dq3-ZEwg.js} +1 -1
- package/dist/client/assets/{stateDiagram-v2-BHNVJYJU-Cuc4jpXw.js → stateDiagram-v2-BHNVJYJU-Dt4J-On6.js} +1 -1
- package/dist/client/assets/{timeline-definition-PNZ67QCA-D5sPA5Fn.js → timeline-definition-PNZ67QCA-BRP1zY5x.js} +1 -1
- package/dist/client/assets/{upload--LqDmM0k.js → upload-Bx4Vz2lr.js} +1 -1
- package/dist/client/assets/{users-C-TzkWjB.js → users-CCfOZK-x.js} +1 -1
- package/dist/client/assets/{vennDiagram-CIIHVFJN-BzsN4FbO.js → vennDiagram-CIIHVFJN-BqtShvFk.js} +1 -1
- package/dist/client/assets/{wardley-L42UT6IY-BJIIgfK4.js → wardley-L42UT6IY-D04-M_2p.js} +1 -1
- package/dist/client/assets/{wardleyDiagram-YWT4CUSO-DFwxRQ3d.js → wardleyDiagram-YWT4CUSO-BmkvFHY9.js} +1 -1
- package/dist/client/assets/{xychartDiagram-2RQKCTM6-Djbd80bq.js → xychartDiagram-2RQKCTM6-C1N68DRK.js} +1 -1
- package/dist/client/index.html +2 -2
- package/dist/client/version.json +1 -1
- package/dist/droid-cli/index.ts +19 -6
- package/dist/droid-cli/package.json +1 -1
- package/dist/droid-cli/src/__tests__/index.test.ts +10 -11
- package/dist/extension.js +2504 -1047
- package/dist/pi-claude-cli/index.ts +25 -18
- package/dist/pi-claude-cli/package.json +5 -5
- package/dist/pi-claude-cli/src/__tests__/acp-dispatch.test.ts +17 -0
- package/dist/pi-claude-cli/src/event-bridge.ts +2 -1
- package/dist/plugin-sdk/index.d.ts +23 -1
- package/dist/plugin-sdk/index.js +17 -3
- package/dist/plugins/fusion-plugin-acp-runtime/bundled.js +25 -11
- package/dist/plugins/fusion-plugin-acp-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-antigravity-runtime/bundled.js +20674 -0
- package/dist/plugins/fusion-plugin-antigravity-runtime/manifest.json +6 -0
- package/dist/plugins/fusion-plugin-antigravity-runtime/mcp-schema-server.cjs +155 -0
- package/dist/plugins/fusion-plugin-antigravity-runtime/package.json +11 -0
- package/dist/plugins/fusion-plugin-claude-runtime/bundled.js +25 -11
- package/dist/plugins/fusion-plugin-claude-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-cli-printing-press/bundled.js +17 -3
- package/dist/plugins/fusion-plugin-cli-printing-press/package.json +1 -1
- package/dist/plugins/fusion-plugin-compound-engineering/bundled.js +17 -3
- package/dist/plugins/fusion-plugin-compound-engineering/package.json +1 -1
- package/dist/plugins/fusion-plugin-cursor-runtime/bundled.js +17 -3
- package/dist/plugins/fusion-plugin-cursor-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-dependency-graph/bundled.js +17 -3
- package/dist/plugins/fusion-plugin-dependency-graph/package.json +1 -1
- package/dist/plugins/fusion-plugin-droid-runtime/bundled.js +44 -12
- package/dist/plugins/fusion-plugin-droid-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-grok-runtime/bundled.js +25 -11
- package/dist/plugins/fusion-plugin-grok-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-hermes-runtime/bundled.js +17 -3
- package/dist/plugins/fusion-plugin-hermes-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-linear-import/bundled.js +17 -3
- package/dist/plugins/fusion-plugin-linear-import/package.json +1 -1
- package/dist/plugins/fusion-plugin-omp-runtime/bundled.js +25 -11
- package/dist/plugins/fusion-plugin-omp-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-openclaw-runtime/bundled.js +17 -3
- package/dist/plugins/fusion-plugin-openclaw-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-paperclip-runtime/bundled.js +17 -3
- package/dist/plugins/fusion-plugin-paperclip-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-quality/bundled.js +17 -3
- package/dist/plugins/fusion-plugin-quality/package.json +1 -1
- package/dist/plugins/fusion-plugin-reports/bundled.js +17 -3
- package/dist/plugins/fusion-plugin-reports/package.json +1 -1
- package/dist/plugins/fusion-plugin-roadmap/bundled.js +17 -3
- package/dist/plugins/fusion-plugin-roadmap/package.json +1 -1
- package/dist/plugins/fusion-plugin-todos/bundled.js +17 -3
- package/dist/plugins/fusion-plugin-todos/package.json +1 -1
- package/dist/plugins/fusion-plugin-whatsapp-chat/bundled.js +17 -3
- package/dist/plugins/fusion-plugin-whatsapp-chat/package.json +1 -1
- package/package.json +3 -3
- package/skill/fusion/references/engine-tools.md +1 -1
- package/dist/client/assets/app-BHtkLolA.js +0 -9
- package/dist/client/assets/app-BNkvP9Zj.js +0 -9
- package/dist/client/assets/app-BaaOD_8W.js +0 -9
- package/dist/client/assets/app-CTDJyVYb.js +0 -9
- package/dist/client/assets/app-CYBEnq88.js +0 -9
- package/dist/client/assets/app-D_qEfmZH.js +0 -3
- package/dist/client/assets/channel-BcOi2QPy.js +0 -1
- package/dist/client/assets/classDiagram-4FO5ZUOK-Do_hlHfK.js +0 -1
- package/dist/client/assets/classDiagram-v2-Q7XG4LA2-Do_hlHfK.js +0 -1
- 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
|
|
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.
|
|
105
|
-
* `
|
|
106
|
-
*
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
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,
|
|
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,
|
|
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.
|
|
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.
|
|
17
|
-
"@earendil-works/pi-coding-agent": "0.
|
|
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.
|
|
24
|
-
"@earendil-works/pi-coding-agent": "0.
|
|
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
|
-
|
|
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;
|
package/dist/plugin-sdk/index.js
CHANGED
|
@@ -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
|
|
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,
|
|
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
|
|
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,
|
|
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):
|