{"record":{"id":"060b7c9aa558770d","repo":"nexu-io/open-design","slug":"the-host-cannot-publish-the-confirmed-brief","errorCode":null,"errorMessage":"The host cannot publish the confirmed brief.","messagePattern":"The host cannot publish the confirmed brief\\.","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"apps/daemon/src/mcp-apps/brief-resource.ts","lineNumber":416,"sourceCode":"          // text instead of a context-only turn rendered as \"(No content)\".\n          if (window.openai && typeof window.openai.sendFollowUpMessage === \"function\") {\n            await window.openai.sendFollowUpMessage({ prompt, scrollToBottom: true });\n            return clearModelContext();\n          }\n          if (standardBridgeReady && hostSupports(\"message\")) {\n            if (hostSupports(\"updateModelContext\")) {\n              await request(\"ui/update-model-context\", {\n                content: [{ type: \"text\", text: payload.summary }],\n                structuredContent: payload,\n              });\n            }\n            await request(\"ui/message\", {\n              role: \"user\",\n              content: [{ type: \"text\", text: prompt }],\n            });\n            return clearModelContext();\n          }\n          throw new Error(copy().publishUnavailable);\n        }\n\n        async function clearModelContext() {\n          if (!standardBridgeReady) {\n            const initialized = standardBridgeInitialization\n              ? await standardBridgeInitialization\n              : false;\n            if (!initialized) return false;\n          }\n          if (!hostSupports(\"updateModelContext\")) {\n            return true;\n          }\n          try {\n            await request(\"ui/update-model-context\", {});\n            return true;\n          } catch {\n            return false;\n          }","sourceCodeStart":398,"sourceCodeEnd":434,"githubUrl":"https://github.com/nexu-io/open-design/blob/5be4028344c2eb4c667c5a97bda8f750c5597ef7/apps/daemon/src/mcp-apps/brief-resource.ts#L398-L434","documentation":"Browser-side error from publishConfirmation() in the MCP Apps brief UI. After the brief is confirmed, the UI tries to push the result back into the host conversation so the model can continue. It first tries `window.openai.sendFollowUpMessage`, then the standard bridge (requires standardBridgeReady AND host capability 'message'). If neither is available, it throws because there is no channel to deliver the confirmed brief to the model.","triggerScenarios":"Host supports confirm_brief (so confirmation succeeded) but does not expose either the openai follow-up bridge or the 'message' capability. The UI can confirm but cannot publish — an asymmetric host configuration.","commonSituations":"A host implements serverTools (confirm works) but not ui/message or sendFollowUpMessage; partial MCP Apps implementation; host version mismatch where confirm was added but publish was not.","solutions":["Run the brief inside a host that implements both sides of the bridge (Open Design's bundled MCP server does).","If you maintain the host, declare the 'message' capability and handle ui/message requests, or expose window.openai.sendFollowUpMessage.","As a fallback, the UI already exposes a 'Continue' button on the confirmed_publish_failed phase — instruct the user to copy the summary into the chat manually.","Upgrade the host runtime to a version that supports the full brief publish contract."],"exampleFix":null,"handlingStrategy":"fallback","validationCode":"function canPublishBrief(): boolean {\n  return (typeof window !== 'undefined' && !!window.openai && typeof window.openai.sendFollowUpMessage === 'function')\n    || (standardBridgeReady && hostSupports('message'));\n}\n\nif (!canPublishBrief()) {\n  // Pre-warn the user that publishing will not be available after confirm.\n}","typeGuard":null,"tryCatchPattern":"// In-source: publishConfirmation() throws; the submit handler catches and moves to 'confirmed_publish_failed',\n// exposing a Continue button so the user can deliver the summary manually.\ntry {\n  await publishConfirmation(confirmedPayload);\n} catch {\n  applyPhase('confirmed_publish_failed');\n}","preventionTips":["Use a host that implements both confirm and publish (the Open Design bundled host does).","If you maintain a host, declare the 'message' capability or expose window.openai.sendFollowUpMessage.","Surface the post-failure Continue button to users so they can recover manually."],"tags":["mcp-apps","brief","browser","bridge","host-capability","publish"],"backgroundTag":null,"analyzedSha":"5be4028344c2eb4c667c5a97bda8f750c5597ef7","analyzedAt":"2026-08-12T12:03:58.812Z","schemaVersion":2},"datasetVersion":"2026-08-12T18:17:37.767Z"}