Files
PaperClipAI/packages/adapter-utils/src/connection-failure.ts
T
Devin FoleyandPaperclip 3d0e74e743 Keep proven external connection failures out of Sentry (#15590)
Apply the reviewed change for Keep proven external connection failures out of Sentry.

Validation: local typecheck/build and focused regression tests, passing exact-head CI, Greptile 5/5, and independent source review. The PR records full-suite evidence and any local environment limitations.

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-10-08 10:19:40 -07:00

59 lines
2.6 KiB
TypeScript

/**
* A bounded producer-owned explanation of an external connection failure.
* This changes error reporting only: it never proves remote acceptance,
* authorizes a retry, or turns a failed run into a success.
*/
const gitReasons = [
"authentication_failed", "repository_unavailable", "invalid_remote",
"dns_failure", "connection_refused", "network_unreachable", "connection_reset",
"connection_timeout", "tls_failure", "rate_limited", "remote_unavailable",
] as const;
const hermesConfigurationReasons = [
"endpoint_missing", "endpoint_invalid", "insecure_transport", "credentials_missing",
] as const;
const hermesRequestReasons = [
"authentication_failed", "endpoint_not_found", "rate_limited", "remote_unavailable",
"connection_refused", "dns_failure", "network_unreachable", "connection_reset",
"connection_timeout", "tls_failure",
] as const;
export type GitConnectionFailure = {
schemaVersion: 1;
provider: "git";
operation: "clone";
reason: typeof gitReasons[number];
};
export type ConnectionFailure = GitConnectionFailure | {
schemaVersion: 1;
provider: "hermes_gateway";
} & ({
operation: "configuration";
reason: typeof hermesConfigurationReasons[number];
} | {
operation: "create_run";
reason: typeof hermesRequestReasons[number];
}) | {
schemaVersion: 1;
provider: "mcp_http";
operation: "discover_tools";
reason: typeof hermesRequestReasons[number];
};
/** Unknown versions, combinations and extra payload fields remain reportable. */
export function readConnectionFailure(value: unknown): ConnectionFailure | null {
if (!value || typeof value !== "object" || Array.isArray(value)) return null;
const record = value as Record<string, unknown>;
const keys = Object.keys(record);
if (keys.length !== 4 || !keys.every((key) => ["schemaVersion", "provider", "operation", "reason"].includes(key)) ||
record.schemaVersion !== 1 || typeof record.reason !== "string") return null;
let reasons: readonly string[];
if (record.provider === "git" && record.operation === "clone") reasons = gitReasons;
else if (record.provider === "hermes_gateway" && record.operation === "configuration") reasons = hermesConfigurationReasons;
else if (record.provider === "hermes_gateway" && record.operation === "create_run") reasons = hermesRequestReasons;
else if (record.provider === "mcp_http" && record.operation === "discover_tools") reasons = hermesRequestReasons;
else return null;
if (!reasons.includes(record.reason)) return null;
return { schemaVersion: 1, provider: record.provider, operation: record.operation, reason: record.reason } as ConnectionFailure;
}