{"record":{"id":"6103614e1b1eb4c4","repo":"github/copilot-sdk","slug":"unknown-error","errorCode":null,"errorMessage":"unknown error","messagePattern":"unknown error","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"go/session.go","lineNumber":1846,"sourceCode":"//\n// Example:\n//\n//\t// Clean up when done — session can still be resumed later\n//\tif err := session.Disconnect(); err != nil {\n//\t    log.Printf(\"Failed to disconnect session: %v\", err)\n//\t}\nfunc (s *Session) Disconnect() error {\n\ts.cancelPendingExternalTools()\n\tresult, err := s.client.Request(context.Background(), \"session.detach\", sessionDetachRequest{SessionID: s.SessionID})\n\tif err == nil {\n\t\tvar response sessionDetachResponse\n\t\tif decodeErr := json.Unmarshal(result, &response); decodeErr != nil {\n\t\t\terr = fmt.Errorf(\"failed to decode session detach response: %w\", decodeErr)\n\t\t} else if !response.Success {\n\t\t\tif response.Error == \"\" {\n\t\t\t\tresponse.Error = \"unknown error\"\n\t\t\t}\n\t\t\terr = errors.New(response.Error)\n\t\t}\n\t}\n\n\t// Local cleanup always runs, even if the detach RPC failed, so callers\n\t// don't leak in-memory resources (event goroutines, registered\n\t// providers/handlers) just because the runtime couldn't be reached.\n\ts.stopEventProcessing()\n\ts.releaseGitHubTokenProviderRegistration()\n\n\t// Clear handlers\n\ts.handlerMutex.Lock()\n\ts.handlers = nil\n\ts.handlerMutex.Unlock()\n\n\ts.toolHandlersM.Lock()\n\ts.toolHandlers = nil\n\ts.toolHandlersM.Unlock()\n","sourceCodeStart":1828,"sourceCodeEnd":1864,"githubUrl":"https://github.com/github/copilot-sdk/blob/cd8cf15dc3f9e762615790aaed0a771a0f392755/go/session.go#L1828-L1864","documentation":"This error is returned when a session detach RPC completes but the runtime reports failure without including an error message in its response. The SDK substitutes the placeholder string \"unknown error\" because the remote side did not populate the Error field. It surfaces from Session.OnClose or Session.OnAction handlers when the underlying detach/canvas operation fails server-side with no detail.","triggerScenarios":"Calling a CanvasHandler OnClose or OnAction whose underlying session detach RPC returns success=false with an empty response.Error string.","commonSituations":"Runtime process crashed mid-request; server returned a malformed or empty error field; protocol version mismatch causing the error detail to be dropped.","solutions":["Inspect runtime/server logs to find the real failure cause, since the SDK could not extract an error message.","Retry the operation to rule out a transient runtime failure.","Verify runtime and SDK versions are compatible.","If persistent, report to the runtime maintainers that the error field is unpopulated."],"exampleFix":"// before\nerr := handler.OnClose(ctx, req) // yields 'unknown error'\n// after\nif err != nil && err.Error() == \"unknown error\" {\n    log.Printf(\"detach failed with no server detail; check runtime logs\")\n}","handlingStrategy":"try-catch","validationCode":"if resp.Success == false && resp.Error == \"\" { log.Printf(\"server failed with no detail\") }","typeGuard":null,"tryCatchPattern":"if err != nil { if err.Error() == \"unknown error\" { /* inspect server logs, retry */ } }","preventionTips":["Log full RPC responses to capture missing error detail","Monitor runtime health before operations","Pin compatible SDK/runtime versions"],"tags":["go","rpc","session"],"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"}