import { Data, Schema } from "effect"; import type { Option } from "effect"; import type { AuthToolFailureCode } from "@executor-js/sdk/core"; // HTTP status lives on the class declaration so HttpApiBuilder's error // encoder (which reads `ast.annotations` off the schema it stored on // `group.addError(...)`) finds it. Applying the annotation post-hoc // via `.annotate(...)` in group.ts produced a transform-wrapper AST // whose status was not picked up — the error then slipped the typed // channel and was captured as a 500 by the observability middleware, // spamming Sentry on user misconfig. export class OpenApiParseError extends Schema.TaggedErrorClass()( "OpenApiParseError", { message: Schema.String, }, { httpApiStatus: 400 }, ) {} export class OpenApiExtractionError extends Schema.TaggedErrorClass()( "OpenApiExtractionError", { message: Schema.String, }, { httpApiStatus: 400 }, ) {} export class OpenApiSpecOverrideError extends Schema.TaggedErrorClass()( "OpenApiSpecOverrideError", { operationIndex: Schema.Number, operation: Schema.String, path: Schema.String, message: Schema.String, }, { httpApiStatus: 400 }, ) {} export class OpenApiInvocationError extends Data.TaggedError("OpenApiInvocationError")<{ readonly message: string; readonly statusCode: Option.Option; readonly reason?: "response_headers_timeout" | "unknown_arguments"; readonly cause?: unknown; }> {} export class OpenApiOAuthError extends Schema.TaggedErrorClass()( "OpenApiOAuthError", { message: Schema.String, }, { httpApiStatus: 400 }, ) {} // --------------------------------------------------------------------------- // Auth required — v2 reframes this around the connection (owner/integration/ // name) that supplies the missing credential, not v1's source/slot/secret. // --------------------------------------------------------------------------- export class OpenApiAuthRequiredError extends Data.TaggedError("OpenApiAuthRequiredError")<{ readonly code: AuthToolFailureCode; readonly message: string; readonly owner: "org" | "user"; readonly integration: string; readonly connection: string; readonly credentialKind: "secret" | "oauth" | "upstream"; readonly credentialLabel?: string; readonly status?: number; readonly details?: unknown; readonly cause?: unknown; }> {}