{"record":{"id":"8c7d173f4230f5a3","repo":"paperclipai/paperclip","slug":"action-already-consumed","errorCode":"action_already_consumed","errorMessage":"Tool action request was already consumed","messagePattern":"Tool action request was already consumed","errorType":"http","errorClass":"ToolGatewayHttpError","httpStatus":409,"severity":"error","filePath":"server/src/services/tool-gateway.ts","lineNumber":4318,"sourceCode":"        headers: mcpHttpRequestHeaders(requestHeaders),\n        signal: controller.signal,\n        body: JSON.stringify({\n          jsonrpc: \"2.0\",\n          id: requestId,\n          method: \"tools/call\",\n          params: {\n            name: entry.toolName,\n            arguments: parameters,\n          },\n        }),\n      };\n      let response = await dispatchRemote(endpoint, requestInit);\n      if (response.status === 401 && composioChild) {\n        composioSession = await composioSessions.ensureSession(connection.id, {\n          tools: [entry.toolName],\n          scopeRevision: composioScopeRevision,\n          force: true,\n        });\n        endpoint = composioSession.url;\n        credentialHeaders = composioSession.headers;\n        builtHeaders = buildRemoteHeaders({ session, connection, credentialHeaders, callerHeaders });\n        headers = builtHeaders.headers;\n        headerSummary = builtHeaders.summary;\n        const retryInit = { ...requestInit, headers: mcpHttpRequestHeaders(headers) };\n        response = await dispatchRemote(endpoint, retryInit);\n      }\n      const oauth = asRecord(asRecord(connection.config)?.oauth);\n      if (\n        response.status === 401\n        && connection.authKind === \"oauth\"\n        && connection.credentialSource === \"paperclip_vault\"\n        && isPaperclipCloudConnectorStrategy(oauth?.strategy)\n      ) {\n        credentialHeaders = {\n          ...projectedConnectionHeaders(connection),\n          ...await resolveCredentialHeaders(session, connection, grant, { forceRefresh: true }),","sourceCodeStart":4300,"sourceCodeEnd":4336,"githubUrl":"https://github.com/paperclipai/paperclip/blob/01ad8584922b5d85292b1723cae71fa0d9b07a19/server/src/services/tool-gateway.ts#L4300-L4336","documentation":"Idempotency guard in executeApprovedAgentInvocation: the compare-and-set from approved to executing matched no rows, meaning another executor already consumed this approval (or it was resolved otherwise) and the wait-for-settlement fallback also found it neither executed nor failed. The request was already consumed and cannot run twice.","triggerScenarios":"Thrown at server/src/services/tool-gateway.ts:4177 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["This action request was already consumed by a prior execution. Create a new approval request instead of reusing it."],"exampleFix":null,"handlingStrategy":"validation","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"01ad8584922b5d85292b1723cae71fa0d9b07a19","analyzedAt":"2026-08-18T22:49:45.177Z","contentChangedAt":"2026-08-18T22:49:45.177Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}