Canvas open_canvas arguments corrupted by CLI — JSON-RPC serialization bug
まだ誰も着手していません。
- 主要言語
- Shell
- スター
- 11.2k
- フォーク
- 1.9k
- 平均マージ
- 14時間 16分
- マージ済み PR(30日)
- 6
説明
Describe the bug
The CLI corrupts JSON-RPC arguments when dispatching tool calls to canvas extensions. The model's parsed arguments are concatenated with a trailing }{} suffix, causing malformed JSON. For open_canvas, the truncation happens mid-value producing "Unexpected end of JSON input" errors. The extension never receives any request.
This is reproducible in every session, not just with canvas extensions — list_canvas_capabilities, extensions_manage, and other tools also receive corrupted arguments.
Affected version
GitHub Copilot CLI 1.0.82
Steps to reproduce the behavior
- Install any canvas extension (e.g.,
session-md-reader) in~/.copilot/extensions/ - Start a session and ask Copilot to open the canvas, or trigger any tool call that passes arguments with nested JSON (e.g.,
open_canvas) - Observe the tool call fails with "Unexpected end of JSON input" and
wasSyntaxError: true
Live reproduction in this session (CLI v1.0.82):
# open_canvas — arguments truncated mid-value:
The arguments for the tool call 'open_canvas' were not valid JSON.
Arguments: {"canvasId": "session-md-reader", "input": .
JSON parse error: Unexpected end of JSON input
# list_canvas_capabilities — trailing }{} appended:
The arguments for the tool call 'list_canvas_capabilities' were not valid JSON.
Arguments: {"canvasId": "session-md-reader"}{}.
JSON parse error: Unexpected non-whitespace character after JSON at position 33
# edit — trailing }{} appended:
The arguments for the tool call 'edit' were not valid JSON.
Arguments: {}{}.
JSON parse error: Unexpected non-whitespace character after JSON at position 2
# extensions_manage — trailing }{} appended:
The arguments for the tool call 'extensions_manage' were not valid JSON.
Arguments: {"operation": "inspect", "name": "session-md-reader"}{}.
JSON parse error: Unexpected non-whitespace character after JSON at position 53
Session events log evidence (session 96897afc-a61a-4dc0-8438-12630294f8bd):
| Turn | Tool | Result |
|---|---|---|
| 0 | open_canvas |
success: false, "Unexpected end of JSON input", wasSyntaxError: true |
| 1 | open_canvas (retry) |
Same error |
| 2 | list_canvas_capabilities |
✅ Success (no complex arguments needed) |
| 3 | open_canvas (with extra param) |
Same error |
The toolRequests in the assistant message shows "arguments":{} even though the model correctly outputs <parameter=input>{"sessionUuid": ...} in markdown. The CLI's markdown-to-JSON parser fails to extract the parameter values.
Expected behavior
Tool call arguments should be correctly serialized to valid JSON and dispatched to the extension via JSON-RPC. The extension should receive the full arguments object (e.g., {"canvasId": "session-md-reader", "instanceId": "session-md-reader-96897afc", "input": {"sessionUuid": "..."}}).
Additional context
- Extension logs: The extension shows only
=== ready ===— it never receives any requests because the CLI fails before dispatching. - Extension health: The extension is correctly implemented (valid
inputSchema,requestCanvasRenderer: true, properopenhandler returning{url, title, status}). Verified by/extensions manageshowing it as running. - Reproducibility: 100% reproducible. The bug affects all tools that pass arguments, not just canvas tools.
- Model used: mimo-v2.5 (tool calls output in markdown
<tool_call>format) - OS: Windows 11 (x86_64), PowerShell 7
- Terminal: Windows Terminal
コントリビューションガイド
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
調査の方向性
ネストされたJSONツール引数で障害を再現することから始め、toolRequestsの構築とJSON-RPCディスパッチを通してCLIのmarkdown-to-JSONパーサーを追跡します。解析された引数をモデルのmarkdown出力と比較し、open_canvas、edit、extensions_manageが完全で有効なJSONオブジェクト1つを伴って拡張機能に到達することを確認します。
索引モデルが issue の本文から書いたものです。
評価
- 技術スタック
- json, markdown, shell
- 領域
- api, cli
- issue の種類
- バグ
- 難易度
- 4/5
- 見積もり時間
- 3〜5日
- 活発さ
- 活発
- 明瞭さ
- おおむね明確
- 初心者へのやさしさ
- 48/100