paperclipai/paperclip · error · Error

Native provider is not available through the local runnerd t

Error message

Native provider is not available through the local runnerd transport

What it means

transportDriverIdentity's switch has cases only for codex, opencode, claude_managed, aws_agentcore, and acpx provider kinds. Any other provider.kind (including an unknown or unset one, hitting the default branch) throws a plain Error: that native provider kind cannot be served through the local runnerd transport backed by CodexAppServerDriver.

Source

Thrown at packages/paperclip-runner/src/backends/codex-native-backend.ts:95

    case "aws_agentcore":
      return {
        kind: "aws_agentcore_harness_api",
        displayName: "AWS AgentCore Harness",
        version: input.provider.agentCoreProfile.qualificationRevision,
      };
    case "acpx":
      if (input.provider.agent === "pi") {
        throw new Error(
          "Native ACPX backend for pi is unavailable until descriptor-confined verified launch is implemented",
        );
      }
      return {
        kind: "acpx_runtime",
        displayName: `${input.provider.agent === "claude" ? "Claude" : "Codex"} via ACPX`,
        version: "0.13.1",
      };
    default:
      throw new Error(
        "Native provider is not available through the local runnerd transport",
      );
  }
}

function createTransportBackedNativeSessionBackend(
  input: NativeExecutionInput,
  options: CodexNativeSessionBackendOptions,
): NativeSessionBackend {
  if (
    options.workingDirectoryAuthority === "remote_runner" &&
    !options.transportFactory
  ) {
    throw new Error(
      "Remote runner workspace authority requires a runnerd transport",
    );
  }
  const driverIdentity = transportDriverIdentity(input);

View on GitHub (pinned to 01ad858492)

Solutions

  1. Set provider.kind to one of the supported values: 'codex', 'opencode', 'claude_managed', 'aws_agentcore', or 'acpx'.
  2. Fix the provider descriptor source so kind is populated and spelled exactly as in the discriminated union (case-sensitive).
  3. If a new provider kind must be supported, add a case to transportDriverIdentity in codex-native-backend.ts returning its driver identity.
  4. Validate/parse the provider input against the NativeExecutionInput contract before invoking the native backend factory to catch bad kinds early.

Example fix

// before
const input = { provider: { kind: undefined, model: "x" } }; // hits default branch, throws
// after
const input = { provider: { kind: "codex", model: "x" } }; // supported kind
Defensive patterns

Strategy: type-guard

Validate before calling

const SUPPORTED_KINDS = ["codex", "opencode", "claude_managed", "aws_agentcore", "acpx"];
function isSupportedNativeKind(provider) {
  return SUPPORTED_KINDS.includes(provider?.kind);
}
// before calling:
if (!isSupportedNativeKind(input.provider)) {
  throw new Error(`provider.kind must be one of ${SUPPORTED_KINDS.join(", ")}, got ${JSON.stringify(input.provider?.kind)}`);
}

Type guard

function isNativeExecutionProvider(p) {
  return p !== null && typeof p === "object"
    && ["codex", "opencode", "claude_managed", "aws_agentcore", "acpx"].includes(p.kind);
}

Try / catch

try {
  const backend = createTransportBackedNativeSessionBackend(input, options);
} catch (err) {
  if (/not available through the local runnerd transport/.test(err.message)) {
    console.error(`Unsupported provider.kind=${JSON.stringify(input.provider?.kind)}; supported: codex, opencode, claude_managed, aws_agentcore, acpx.`);
    return null;
  }
  throw err;
}

Prevention

When it happens

Trigger: Calling createTransportBackedNativeSessionBackend (or driverIdentity) with input.provider.kind outside the five supported values — e.g. kind is undefined/null, a typo like 'codex-native' or 'Codex', or a newly added provider kind that codex-native-backend has not been extended to handle.

Common situations: A missing or malformed provider descriptor so kind falls through as undefined; a new provider kind added to the type union but not to this switch; case-sensitivity mistakes in serialized config; passing a generic/legacy provider object into the native backend factory.


AI-assisted analysis of paperclipai/paperclip@01ad858492 (2026-09-02). Data as JSON: /api/errors/e74e22978e3adab6. Report an issue: GitHub.