{"record":{"id":"a99001c9577b86a9","repo":"router-for-me/CLIProxyAPI","slug":"codex-live-remote-tcp-proxy-does-not-support-cance","errorCode":null,"errorMessage":"Codex live remote TCP proxy does not support cancellation","messagePattern":"Codex live remote TCP proxy does not support cancellation","errorType":"http","errorClass":null,"httpStatus":502,"severity":"error","filePath":"internal/client/codex/live/media.go","lineNumber":276,"sourceCode":"}\n\nfunc (r *pionMediaRelay) NewSession(ctx context.Context, clientOffer string, route mediaSessionRoute) (mediaRelaySession, string, error) {\n\tif r == nil || r.downstreamAPI == nil || r.upstreamAPI == nil || r.proxyUpstreamAPI == nil || r.limiter == nil {\n\t\treturn nil, \"\", errors.New(\"Codex live media relay unavailable\")\n\t}\n\tif errContext := ctx.Err(); errContext != nil {\n\t\treturn nil, \"\", errContext\n\t}\n\tbuiltProxyDialer, proxyMode, errProxy := proxyutil.BuildDialer(route.proxyURL)\n\tif errProxy != nil {\n\t\treturn nil, \"\", fmt.Errorf(\"configure Codex live remote TCP proxy: %w\", errProxy)\n\t}\n\tproxied := proxyMode == proxyutil.ModeProxy\n\tvar proxyDialer proxy.ContextDialer\n\tif proxied {\n\t\tcontextDialer, ok := builtProxyDialer.(proxy.ContextDialer)\n\t\tif !ok {\n\t\t\treturn nil, \"\", errors.New(\"Codex live remote TCP proxy does not support cancellation\")\n\t\t}\n\t\tproxyDialer = contextDialer\n\t}\n\tif !r.limiter.acquire() {\n\t\treturn nil, \"\", errors.New(\"Codex live media relay capacity exhausted\")\n\t}\n\treleaseSlot := r.limiter.release\n\tdownstream, errDownstream := r.downstreamAPI.NewPeerConnection(r.configuration)\n\tif errDownstream != nil {\n\t\treleaseSlot()\n\t\treturn nil, \"\", fmt.Errorf(\"create downstream PeerConnection: %w\", errDownstream)\n\t}\n\tupstreamAPI := r.upstreamAPI\n\tupstreamConfiguration := r.configuration\n\tif proxied {\n\t\tupstreamAPI = r.proxyUpstreamAPI\n\t\tupstreamConfiguration.ICEServers = nil\n\t}","sourceCodeStart":258,"sourceCodeEnd":294,"githubUrl":"https://github.com/router-for-me/CLIProxyAPI/blob/78f0c4079e3e6273d65d03b5549cffc898703264/internal/client/codex/live/media.go#L258-L294","documentation":"The plugin initialized successfully but reported an abi_version that differs from the host's pluginHostABIVersion. The host supports exactly one ABI version, so any mismatch (older or newer) is rejected and the plugin is shut down. This protects the C function-table layout from silent memory misinterpretation.","triggerScenarios":"Loading a plugin compiled against an older or newer CLIProxyAPI SDK than the running host binary; mixing plugin artifacts across host versions after an upgrade.","commonSituations":"Upgrading CLIProxyAPI without rebuilding deployed plugins; CI building plugins from a stale SDK checkout; manually downgrading the host.","solutions":["Rebuild all native plugins against the same SDK version as the host (match go.mod module version).","After upgrading the host, redeploy freshly built plugins — do not reuse old .so files.","Pin host and plugin to identical versions in CI and deployment manifests."],"exampleFix":"# after upgrading the host, rebuild plugins from the same tag\ngit checkout v7.x.y   # same version as host\ngo build -buildmode=c-shared -o plugin.so ./plugin","handlingStrategy":"validation","validationCode":"# preflight: compare plugin ABI constant with the host version's pluginHostABIVersion before deploy\ngrep -R \"pluginHostABIVersion\" host-repo/internal/pluginhost/abi.go","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Build plugins from the same SDK tag as the host, in the same CI job.","Redeploy fresh plugin artifacts with every host upgrade.","Treat host and plugin versions as one deployable unit; never mix generations."],"tags":["pluginhost","native","abi","versioning"],"backgroundTag":null,"analyzedSha":"78f0c4079e3e6273d65d03b5549cffc898703264","analyzedAt":"2026-08-15T12:26:37.444Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}