Harden chat source links across streaming providers while improving new-tab behavior and visual contrast. - Preserve source-link metadata through streamed delta and event bridges. - Open chat source links safely in new tabs across desktop and mobile surfaces. - Improve source-link contrast and add regression coverage plus user-facing guidance. Files changed: .changeset/fn-040-chat-source-links.md | 7 +++ docs/dashboard-guide.md | 3 + .../ui-bugs/chat-streamed-source-link-integrity.md | 53 ++++++++++++++++ packages/dashboard/app/components/ChatView.css | 24 ++++++++ .../app/components/StandardChatSurface.tsx | 8 ++- .../components/__tests__/ChatView.core.test.tsx | 38 ++++++++++++ .../components/__tests__/ChatView.mobile.test.tsx | 70 ++++++++++++++++++++-- .../__tests__/ChatView.sessions-rooms.test.tsx | 49 +++++++++++++++ ...andardChatSurface.nativeStructureEmbed.test.tsx | 52 +++++++++++++++- .../__tests__/TaskPlannerChatTab.test.tsx | 48 +++++++++++++++ .../engine/src/__tests__/streaming-delta.test.ts | 36 +++++++++++ packages/engine/src/execution/streaming-delta.ts | 17 +++++- .../src/__tests__/event-bridge.test.ts | 30 +++++++++- packages/pi-claude-cli/src/event-bridge.ts | 14 +++-- .../src/__tests__/event-bridge.test.ts | 42 +++++++++++++ .../fusion-plugin-acp-runtime/src/event-bridge.ts | 8 ++- .../src/__tests__/provider.test.ts | 34 +++++++++++ .../src/acp/event-bridge.ts | 8 ++- .../src/__tests__/event-bridge.test.ts | 28 +++++++++ .../src/event-bridge.ts | 14 +++-- .../src/__tests__/provider.test.ts | 34 +++++++++++ .../src/acp/event-bridge.ts | 8 ++- .../src/__tests__/runtime-adapter.test.ts | 34 +++++++++++ .../src/acp/event-bridge.ts | 8 ++- 24 files changed, 642 insertions(+), 25 deletions(-) Fusion-Task-Id: FN-040 Fusion-Task-Lineage: 364ad678-df3e-4fb2-b19c-29eb44d8a429 Co-authored-by: Fusion <noreply@runfusion.ai>
pi-claude-cli
A pi extension that routes LLM calls through the Claude Code CLI as a subprocess. Use your Claude Pro/Max subscription as the LLM backend — no API key, no separate billing.
How it works
The extension registers as a custom pi provider exposing all Claude models. Each request spawns a claude -p subprocess using the stream-json wire protocol, with --resume on follow-up turns to reuse the CLI's session state instead of replaying full history. Claude proposes tool calls, pi executes them natively. Custom pi tools are exposed to Claude via a schema-only MCP server.
Requirements
- Claude Code CLI installed and authenticated (
claudeon PATH) - A Claude Pro or Max subscription
- pi or GSD
Installation
Add to ~/.gsd/agent/settings.json:
{
"packages": ["npm:pi-claude-cli"]
}
Then select a Claude model via /model in the interactive UI. All Claude models appear under the pi-claude-cli provider.
Features
- Streams text, thinking, and tool call tokens in real-time
- Maps tool names and arguments bidirectionally between Claude and pi
- Exposes custom pi tools to Claude via MCP (schema-only, no execution)
- Break-early pattern prevents Claude CLI from auto-executing tools
- Session resume via
--resumeeliminates history replay on follow-up turns - Configurable thinking effort with elevated budgets for Opus models
- Cross-platform subprocess management (Windows, macOS, Linux)
- Inactivity timeout and process registry for cleanup
License
MIT