{"record":{"id":"e51eb5ad7f573b39","repo":"paperclipai/paperclip","slug":"prp-codex-transport-does-not-expose-provider-metho","errorCode":null,"errorMessage":"PRP Codex transport does not expose provider method ${method}","messagePattern":"PRP Codex transport does not expose provider method (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"packages/paperclip-runner/src/live/runnerd-codex-transport.ts","lineNumber":3511,"sourceCode":"        !this.#checkpointProviderIdentityConfirmed\n      ) {\n        const snapshot = await this.#commandResult(\"session.snapshot\", {});\n        this.#confirmCheckpointProviderIdentity(\n          snapshot,\n          \"authenticated session.snapshot\",\n        );\n      }\n      return {\n        thread: {\n          id: this.#threadId,\n          sessionId: this.#sessionId,\n          ...(this.#providerIdentity === null\n            ? {}\n            : { providerIdentity: structuredClone(this.#providerIdentity) }),\n        },\n      };\n    }\n    throw new Error(\n      `PRP Codex transport does not expose provider method ${method}`,\n    );\n  }\n\n  notify(_method: string, _params?: Record<string, unknown>): void {}\n\n  notifications(): AsyncIterable<CodexRpcNotification> {\n    return this.#queue;\n  }\n\n  setServerRequestHandler(handler: CodexServerRequestHandler): void {\n    this.#handler = handler;\n  }\n\n  async #awaitWarmRunAttachmentReady(): Promise<void> {\n    // Remote runner ingress already has a bounded reconnect budget. Reuse the\n    // same budget here so a transient tunnel reconnect cannot trip the shorter\n    // generic command timeout and replace an otherwise healthy warm runner.","sourceCodeStart":3493,"sourceCodeEnd":3529,"githubUrl":"https://github.com/paperclipai/paperclip/blob/01ad8584922b5d85292b1723cae71fa0d9b07a19/packages/paperclip-runner/src/live/runnerd-codex-transport.ts#L3493-L3529","documentation":"The PRP Codex transport implements a fixed allowlist of provider JSON-RPC methods. When a caller requests a method outside that allowlist, the transport refuses with this message naming the unsupported method. It guards against silently forwarding unimplemented requests to the Codex runner.","triggerScenarios":"Calling the transport's provider request entry point (the method whose switch ends at line 3511) with a method string not handled by the allowlist, e.g. a custom/experimental Codex method or a typo like 'codex.turnFoo'.","commonSituations":"Upgrading or downgrading Codex so new methods exist that this pinned transport version does not know; typos in method names; plugins invoking provider methods directly that only the runner core supports.","solutions":["Check the method name for typos against the allowlist in the switch statement above line 3511","Upgrade @paperclip/runner (and paperclip-runner) to a version whose Codex transport supports the requested method","Route the call through the runner core command queue instead of the provider-method entry point","If the method is genuinely needed, extend the transport's allowlist to handle it explicitly"],"exampleFix":"// before\nawait transport.request('codex/newExperimentalMethod', params);\n// after\nconst supported = ['codex/turn', 'codex/attach', 'codex/cancel'];\nif (!supported.includes(method)) throw new Error(`unsupported method: ${method}`);\nawait transport.request(method, params);","handlingStrategy":"validation","validationCode":"const SUPPORTED_PROVIDER_METHODS = new Set(['codex/turn','codex/attach','codex/cancel']);\nfunction assertSupported(method) {\n  if (!SUPPORTED_PROVIDER_METHODS.has(method)) throw new Error(`unsupported provider method: ${method}`);\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Keep a central list of provider methods your code calls and diff it against the transport's allowlist on upgrades","Wrap provider method calls in a helper that validates the method name first","Pin transport and Codex versions together and re-check the allowlist when bumping either"],"tags":["codex","unsupported-method","provider-transport"],"backgroundTag":"unsupported-operation","analyzedSha":"01ad8584922b5d85292b1723cae71fa0d9b07a19","analyzedAt":"2026-09-10T03:14:50.855Z","contentChangedAt":"2026-09-10T03:14:50.855Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}