paperclipai/paperclip · error · ToolGatewayHttpError

action_execution_in_progress

action_execution_in_progress

Error message

Approved tool action is still executing

What it means

waitForActionRequestExecution polled the executing action request for ~500x25ms without it leaving the executing state (or the row disappeared). The thrown gateway error signals that an approved tool action is stuck executing — the worker may have died mid-execution; investigate the invocation/execution rather than blindly re-approving.

Solutions

  1. The approved action is already executing; wait for its completion instead of re-triggering.
Defensive patterns

Strategy: retry

When it happens

Trigger: Thrown at server/src/services/tool-gateway.ts:4052 when the library encounters an invalid state.

Common situations: See trigger scenarios.


AI-assisted analysis of paperclipai/paperclip@3f1d897a7c (2026-08-18). Data as JSON: /api/errors/a2a7941457813b64. Report an issue: GitHub.

Appendix: source

Thrown at server/src/services/tool-gateway.ts:5713

    if (!Array.isArray(content)) throw malformedRemoteMcpResponse();
    return content
      .map((item) => {
        const record = asRecord(item);
        if (!record || typeof record.type !== "string")
          throw malformedRemoteMcpResponse();
        if (record.type === "text") {
          if (typeof record.text !== "string")
            throw malformedRemoteMcpResponse();
          return record.text;
        }
        return JSON.stringify(record);
      })
      .join("\n");
  }

  function normalizeMcpToolResult(
    result: unknown,
    transport: "mcp_http" | "local_stdio" = "mcp_http",
    spawnedLocalProcess = false,
    sourceTemplateKey?: string | null,
  ) {
    const record = asRecord(result);
    if (!record) throw malformedRemoteMcpResponse();
    const providerContent = normalizeMcpContent(record.content);
    const googleWorkspacePermissionDenied =
      record.isError === true &&
      (sourceTemplateKey === "gmail" ||
        sourceTemplateKey?.startsWith("google-") === true) &&
      /caller does not have permission/i.test(providerContent);
    const content = googleWorkspacePermissionDenied
      ? "Google rejected this call. Google Workspace MCP is a Developer Preview: enroll the signed-in Workspace account and this OAuth client's Google Cloud project in Google's Developer Preview Program, wait for Google's registration confirmation, then reconnect and try again."
      : providerContent;
    return {
      content,
      data: {
        content: record.content,

View on GitHub (pinned to 3f1d897a7c)