paperclipai/paperclip · error
Unsupported Paperclip operation
Error message
Unsupported Paperclip operation ${tool} What it means
Unsupported-operation guard in the Codex ACPX driver's tool bridge: a Paperclip tool invocation arrived whose tool name is not among the operations the Codex ACPX session can bridge, so the session rejects it instead of dispatching blindly. Generic validation helper — the input at fault is the unknown/unregistered tool name in the incoming call, typically after a runner/adapter version mismatch or a typo'd tool registration.
Solutions
- Check the tool name in the message against the operations the CodexAcpxSession registers in its bridge.
- Align runner and adapter versions so both sides advertise the same tool set.
- Register an implementation for the missing tool or remove it from the caller's advertised capabilities.
Defensive patterns
Strategy: validation
When it happens
Trigger: Thrown at packages/paperclip-runner/src/drivers/acpx/codex-acpx-driver.ts:1121 when the library encounters an invalid state.
Common situations: See trigger scenarios.
AI-assisted analysis of paperclipai/paperclip@3f1d897a7c (2026-09-18).
Data as JSON: /api/errors/4e456cb8da61025a.
Report an issue: GitHub.
Appendix: source
Thrown at packages/paperclip-runner/src/drivers/acpx/codex-acpx-driver.ts:1121
// provider turn completes successfully. A failed or interrupted
// retry must leave the last completed owner recoverable.
this.#pendingSemanticTransfer = {
result: structuredClone(validation.result),
fingerprint,
callId: call.callId,
turnId,
};
} else {
this.#semanticResult = structuredClone(validation.result);
this.#semanticFingerprint = fingerprint;
this.#semanticCallId = call.callId;
this.#semanticTurnId = turnId;
}
}
return { accepted: true, feedback };
}
if (!this.#dynamicToolHandler) {
throw new Error(`Unsupported Paperclip operation ${tool}`);
}
return await this.#dynamicToolHandler({
tool,
callId: call.callId,
providerSessionId: this.#host.identity().agentSessionId,
turnId,
arguments: structuredClone(call.arguments),
signal: call.signal,
});
}
async read(): Promise<Record<string, unknown>> {
return {
identity: this.#host.identity(),
binding: this.#host.binding(),
status: await this.#host.status(),
};
}View on GitHub (pinned to 3f1d897a7c)