{"record":{"id":"b3969e62380a5f6d","repo":"github/copilot-sdk","slug":"32603-b3969e","errorCode":"-32603","errorMessage":"err.message (dynamic CanvasError message)","messagePattern":"err\\.message \\(dynamic CanvasError message\\)","errorType":"error_code","errorClass":"JsonRpcError","httpStatus":null,"severity":"error","filePath":"python/copilot/session.py","lineNumber":1509,"sourceCode":"    max_prompt_tokens: int\n    max_context_window_tokens: int\n    max_output_tokens: int\n    # Optional capability overrides for the synthesized model.\n    capabilities: ModelCapabilitiesOverride\n\n\nSessionEventHandler = Callable[[SessionEvent], None]\n\n\nclass _CanvasHandlerAdapter:\n    def __init__(self, handler: CanvasHandler) -> None:\n        self._handler = handler\n\n    async def open(self, params: CanvasProviderOpenRequest) -> CanvasProviderOpenResult:\n        try:\n            return await self._handler.on_open(params)\n        except CanvasError as err:\n            raise JsonRpcError(-32603, err.message, data=err.to_envelope()) from err\n        except Exception as err:\n            raise _canvas_handler_error(err) from err\n\n    async def close(self, params: CanvasProviderCloseRequest) -> None:\n        try:\n            await self._handler.on_close(params)\n        except CanvasError as err:\n            raise JsonRpcError(-32603, err.message, data=err.to_envelope()) from err\n        except Exception as err:\n            raise _canvas_handler_error(err) from err\n\n    async def invoke(self, params: CanvasProviderInvokeActionRequest) -> Any:\n        try:\n            return await self._handler.on_action(params)\n        except CanvasError as err:\n            raise JsonRpcError(-32603, err.message, data=err.to_envelope()) from err\n        except Exception as err:\n            raise _canvas_handler_error(err) from err","sourceCodeStart":1491,"sourceCodeEnd":1527,"githubUrl":"https://github.com/github/copilot-sdk/blob/cd8cf15dc3f9e762615790aaed0a771a0f392755/python/copilot/session.py#L1491-L1527","documentation":"CanvasProvider.open() delegates to the user-supplied handler's on_open() and translates a CanvasError into a JSON-RPC error with code -32603 (internal error), carrying the error's message and its to_envelope() data. The displayed message is dynamic: whatever message the CanvasError subclass was raised with. Other exceptions are wrapped via _canvas_handler_error.","triggerScenarios":"The registered canvas handler's on_open() raises CanvasError (or a subclass) — e.g. the provider rejects the open request because the resource is unavailable, invalid params, or provider-specific failure conditions.","commonSituations":"Custom Canvas providers raising CanvasError('canvas not found') or similar when the client opens a non-existent canvas; provider-side validation failures surfaced over the session's JSON-RPC bridge.","solutions":["Read the JsonRpcError message/data envelope to see the underlying CanvasError and fix the provider or request accordingly.","In your handler's on_open, raise CanvasError subclasses with descriptive messages and structured envelope data.","Validate open params (canvas id, view state) before calling open() to avoid provider-side errors."],"exampleFix":"// before\nraise CanvasError(\"something went wrong\")\n\n// after\nraise CanvasError(\n    f\"canvas {params.canvas_id!r} not found\",\n)  # message surfaces verbatim as the JSON-RPC -32603 message","handlingStrategy":"try-catch","validationCode":"if not canvas_exists(params.canvas_id):\n    raise ValueError(\"canvas does not exist; refusing to open\")","typeGuard":"def is_canvas_error(err: BaseException) -> TypeGuard[CanvasError]:\n    return isinstance(err, CanvasError)","tryCatchPattern":"try:\n    result = await provider.open(params)\nexcept JsonRpcError as e:\n    if e.code == -32603:\n        handle_canvas_error(e.message, e.data)  # envelope from CanvasError.to_envelope()\n    else:\n        raise","preventionTips":["Validate open params (canvas id, view state) before calling open().","Raise CanvasError subclasses with precise messages and envelope data in handlers.","Catch JsonRpcError with code -32603 at the session boundary and inspect data."],"tags":["json-rpc","canvas","error-mapping","python","copilot"],"backgroundTag":"api-error-response","analyzedSha":"cd8cf15dc3f9e762615790aaed0a771a0f392755","analyzedAt":"2026-09-09T18:32:31.973Z","contentChangedAt":"2026-09-09T18:32:31.973Z","schemaVersion":2},"datasetVersion":"2026-09-15T23:17:13.987Z"}