recoder-a2a-sdk 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. package/dist/audit-helpers.d.mts +209 -0
  2. package/dist/audit-helpers.d.ts +209 -0
  3. package/dist/audit-helpers.js +905 -0
  4. package/dist/audit-helpers.js.map +1 -0
  5. package/dist/audit-helpers.mjs +34 -0
  6. package/dist/audit-helpers.mjs.map +1 -0
  7. package/dist/chunk-7GY5FFBI.mjs +117 -0
  8. package/dist/chunk-7GY5FFBI.mjs.map +1 -0
  9. package/dist/chunk-AGD6G5N6.mjs +141 -0
  10. package/dist/chunk-AGD6G5N6.mjs.map +1 -0
  11. package/dist/chunk-BWCRJDUB.mjs +357 -0
  12. package/dist/chunk-BWCRJDUB.mjs.map +1 -0
  13. package/dist/chunk-DPFH2JIC.mjs +141 -0
  14. package/dist/chunk-DPFH2JIC.mjs.map +1 -0
  15. package/dist/chunk-EP2GHC3R.mjs +116 -0
  16. package/dist/chunk-EP2GHC3R.mjs.map +1 -0
  17. package/dist/chunk-JOZQDX7A.mjs +359 -0
  18. package/dist/chunk-JOZQDX7A.mjs.map +1 -0
  19. package/dist/chunk-MAA7JZ2Q.mjs +142 -0
  20. package/dist/chunk-MAA7JZ2Q.mjs.map +1 -0
  21. package/dist/chunk-QVOOBAUA.mjs +140 -0
  22. package/dist/chunk-QVOOBAUA.mjs.map +1 -0
  23. package/dist/chunk-T5GUBIFZ.mjs +358 -0
  24. package/dist/chunk-T5GUBIFZ.mjs.map +1 -0
  25. package/dist/chunk-WLNW7Y2H.mjs +636 -0
  26. package/dist/chunk-WLNW7Y2H.mjs.map +1 -0
  27. package/dist/chunk-XSELW6DU.mjs +356 -0
  28. package/dist/chunk-XSELW6DU.mjs.map +1 -0
  29. package/dist/envelope-builders.d.mts +189 -0
  30. package/dist/envelope-builders.d.ts +189 -0
  31. package/dist/envelope-builders.js +652 -0
  32. package/dist/envelope-builders.js.map +1 -0
  33. package/dist/envelope-builders.mjs +20 -0
  34. package/dist/envelope-builders.mjs.map +1 -0
  35. package/dist/error-mapping.d.mts +132 -0
  36. package/dist/error-mapping.d.ts +132 -0
  37. package/dist/error-mapping.js +642 -0
  38. package/dist/error-mapping.js.map +1 -0
  39. package/dist/error-mapping.mjs +16 -0
  40. package/dist/error-mapping.mjs.map +1 -0
  41. package/dist/index.d.mts +7 -0
  42. package/dist/index.d.ts +7 -0
  43. package/dist/index.js +1798 -0
  44. package/dist/index.js.map +1 -0
  45. package/dist/index.mjs +153 -0
  46. package/dist/index.mjs.map +1 -0
  47. package/dist/state-mapping.d.mts +139 -0
  48. package/dist/state-mapping.d.ts +139 -0
  49. package/dist/state-mapping.js +641 -0
  50. package/dist/state-mapping.js.map +1 -0
  51. package/dist/state-mapping.mjs +28 -0
  52. package/dist/state-mapping.mjs.map +1 -0
  53. package/dist/validation.d.mts +117 -0
  54. package/dist/validation.d.ts +117 -0
  55. package/dist/validation.js +850 -0
  56. package/dist/validation.js.map +1 -0
  57. package/dist/validation.mjs +22 -0
  58. package/dist/validation.mjs.map +1 -0
  59. package/package.json +18 -0
@@ -0,0 +1,142 @@
1
+ import {
2
+ TaskStateEnum,
3
+ isTerminalState,
4
+ isValidTransition
5
+ } from "./chunk-WLNW7Y2H.mjs";
6
+
7
+ // src/state-mapping.ts
8
+ var CODEX_TO_CANONICAL = {
9
+ queued: TaskStateEnum.Submitted,
10
+ running: TaskStateEnum.Working,
11
+ waiting_for_input: TaskStateEnum.InputRequired,
12
+ completed: TaskStateEnum.Completed,
13
+ failed: TaskStateEnum.Failed,
14
+ error: TaskStateEnum.Failed,
15
+ cancelled: TaskStateEnum.Cancelled,
16
+ timeout: TaskStateEnum.Failed
17
+ };
18
+ var CANONICAL_TO_CODEX = {
19
+ [TaskStateEnum.Submitted]: "queued",
20
+ [TaskStateEnum.Working]: "running",
21
+ [TaskStateEnum.InputRequired]: "waiting_for_input",
22
+ [TaskStateEnum.Completed]: "completed",
23
+ [TaskStateEnum.Failed]: "failed",
24
+ [TaskStateEnum.Cancelled]: "cancelled"
25
+ };
26
+ function mapCodexState(nativeState) {
27
+ return CODEX_TO_CANONICAL[nativeState];
28
+ }
29
+ function mapCodexStateStrict(nativeState) {
30
+ const mapped = mapCodexState(nativeState);
31
+ if (mapped === void 0) {
32
+ throw new Error(`Unknown Codex state: "${nativeState}"`);
33
+ }
34
+ return mapped;
35
+ }
36
+ function canonicalToCodexState(canonicalState) {
37
+ return CANONICAL_TO_CODEX[canonicalState];
38
+ }
39
+ var CLAUDE_TO_CANONICAL = {
40
+ pending: TaskStateEnum.Submitted,
41
+ streaming: TaskStateEnum.Working,
42
+ processing: TaskStateEnum.Working,
43
+ waiting_for_approval: TaskStateEnum.InputRequired,
44
+ waiting_for_input: TaskStateEnum.InputRequired,
45
+ done: TaskStateEnum.Completed,
46
+ completed: TaskStateEnum.Completed,
47
+ error: TaskStateEnum.Failed,
48
+ failed: TaskStateEnum.Failed,
49
+ aborted: TaskStateEnum.Cancelled,
50
+ cancelled: TaskStateEnum.Cancelled,
51
+ timeout: TaskStateEnum.Failed
52
+ };
53
+ var CANONICAL_TO_CLAUDE = {
54
+ [TaskStateEnum.Submitted]: "pending",
55
+ [TaskStateEnum.Working]: "streaming",
56
+ [TaskStateEnum.InputRequired]: "waiting_for_input",
57
+ [TaskStateEnum.Completed]: "done",
58
+ [TaskStateEnum.Failed]: "error",
59
+ [TaskStateEnum.Cancelled]: "aborted"
60
+ };
61
+ function mapClaudeState(nativeState) {
62
+ return CLAUDE_TO_CANONICAL[nativeState];
63
+ }
64
+ function mapClaudeStateStrict(nativeState) {
65
+ const mapped = mapClaudeState(nativeState);
66
+ if (mapped === void 0) {
67
+ throw new Error(`Unknown Claude Code state: "${nativeState}"`);
68
+ }
69
+ return mapped;
70
+ }
71
+ function canonicalToClaudeState(canonicalState) {
72
+ return CANONICAL_TO_CLAUDE[canonicalState];
73
+ }
74
+ function mapConnectorState(platform, nativeState) {
75
+ switch (platform) {
76
+ case "codex":
77
+ return mapCodexState(nativeState);
78
+ case "claude_code":
79
+ return mapClaudeState(nativeState);
80
+ default:
81
+ return void 0;
82
+ }
83
+ }
84
+ function mapConnectorStateStrict(platform, nativeState) {
85
+ const mapped = mapConnectorState(platform, nativeState);
86
+ if (mapped === void 0) {
87
+ throw new Error(
88
+ `Cannot map state "${nativeState}" for platform "${platform}"`
89
+ );
90
+ }
91
+ return mapped;
92
+ }
93
+ function canonicalToConnectorState(platform, canonicalState) {
94
+ switch (platform) {
95
+ case "codex":
96
+ return canonicalToCodexState(canonicalState);
97
+ case "claude_code":
98
+ return canonicalToClaudeState(canonicalState);
99
+ default:
100
+ return void 0;
101
+ }
102
+ }
103
+ function checkConnectorTransition(currentCanonical, platform, newNativeState) {
104
+ const mappedState = mapConnectorState(platform, newNativeState);
105
+ if (mappedState === void 0) {
106
+ return {
107
+ valid: false,
108
+ mappedState: void 0,
109
+ error: `Unknown ${platform} state: "${newNativeState}"`
110
+ };
111
+ }
112
+ if (mappedState === currentCanonical) {
113
+ return { valid: true, mappedState };
114
+ }
115
+ if (!isValidTransition(currentCanonical, mappedState)) {
116
+ return {
117
+ valid: false,
118
+ mappedState,
119
+ error: `Invalid transition: ${currentCanonical} -> ${mappedState} (from ${platform} state "${newNativeState}")`
120
+ };
121
+ }
122
+ return { valid: true, mappedState };
123
+ }
124
+ function isConnectorTerminalState(platform, nativeState) {
125
+ const mapped = mapConnectorState(platform, nativeState);
126
+ return mapped !== void 0 && isTerminalState(mapped);
127
+ }
128
+
129
+ export {
130
+ mapCodexState,
131
+ mapCodexStateStrict,
132
+ canonicalToCodexState,
133
+ mapClaudeState,
134
+ mapClaudeStateStrict,
135
+ canonicalToClaudeState,
136
+ mapConnectorState,
137
+ mapConnectorStateStrict,
138
+ canonicalToConnectorState,
139
+ checkConnectorTransition,
140
+ isConnectorTerminalState
141
+ };
142
+ //# sourceMappingURL=chunk-MAA7JZ2Q.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/state-mapping.ts"],"sourcesContent":["/**\n * @module state-mapping\n *\n * Task state mapping helpers for connector adapters.\n *\n * Each external connector (Codex, Claude Code, etc.) has its own native state\n * vocabulary. This module provides bidirectional mapping functions that\n * translate between connector-specific states and the canonical\n * `TaskState` enum defined in `@recoder/shared/a2a/schemas`.\n *\n * Adapter authors should use these mappers at the boundary where connector\n * events enter (or leave) the Recoder A2A control plane, ensuring that all\n * internal logic operates exclusively on canonical states.\n *\n * @example\n * ```ts\n * import { mapCodexState, mapClaudeState } from '@recoder/a2a-sdk/state-mapping';\n *\n * const canonical = mapCodexState('running'); // => 'working'\n * const claude = mapClaudeState('streaming'); // => 'working'\n * ```\n */\n\nimport {\n type TaskState,\n TaskStateEnum,\n isValidTransition,\n isTerminalState,\n} from '@recoder/shared/a2a/schemas';\n\n// ---------------------------------------------------------------------------\n// Connector platform identifier\n// ---------------------------------------------------------------------------\n\n/** Supported connector platforms for state mapping. */\nexport type ConnectorPlatform = 'codex' | 'claude_code';\n\n// ---------------------------------------------------------------------------\n// Codex state mapping\n// ---------------------------------------------------------------------------\n\n/**\n * Native states reported by the OpenAI Codex CLI / API adapter.\n * These are the raw status strings that appear in Codex task events.\n */\nexport type CodexNativeState =\n | 'queued'\n | 'running'\n | 'waiting_for_input'\n | 'completed'\n | 'failed'\n | 'error'\n | 'cancelled'\n | 'timeout';\n\n/**\n * Map from Codex native states to canonical TaskState values.\n * Every known Codex state must appear exactly once as a key.\n */\nconst CODEX_TO_CANONICAL: Readonly<Record<CodexNativeState, TaskState>> = {\n queued: TaskStateEnum.Submitted,\n running: TaskStateEnum.Working,\n waiting_for_input: TaskStateEnum.InputRequired,\n completed: TaskStateEnum.Completed,\n failed: TaskStateEnum.Failed,\n error: TaskStateEnum.Failed,\n cancelled: TaskStateEnum.Cancelled,\n timeout: TaskStateEnum.Failed,\n};\n\n/**\n * Reverse map from canonical TaskState to the \"primary\" Codex native state.\n * When multiple Codex states map to the same canonical state, the most\n * common / expected one is chosen as the primary reverse mapping.\n */\nconst CANONICAL_TO_CODEX: Readonly<Record<TaskState, CodexNativeState>> = {\n [TaskStateEnum.Submitted]: 'queued',\n [TaskStateEnum.Working]: 'running',\n [TaskStateEnum.InputRequired]: 'waiting_for_input',\n [TaskStateEnum.Completed]: 'completed',\n [TaskStateEnum.Failed]: 'failed',\n [TaskStateEnum.Cancelled]: 'cancelled',\n};\n\n/**\n * Map a Codex native state string to the canonical `TaskState`.\n *\n * @param nativeState - The raw state string from a Codex event.\n * @returns The canonical `TaskState`, or `undefined` if the state is unknown.\n */\nexport function mapCodexState(nativeState: string): TaskState | undefined {\n return CODEX_TO_CANONICAL[nativeState as CodexNativeState];\n}\n\n/**\n * Map a Codex native state to canonical, throwing if the state is unknown.\n *\n * @param nativeState - The raw state string from a Codex event.\n * @returns The canonical `TaskState`.\n * @throws {Error} If the state cannot be mapped.\n */\nexport function mapCodexStateStrict(nativeState: string): TaskState {\n const mapped = mapCodexState(nativeState);\n if (mapped === undefined) {\n throw new Error(`Unknown Codex state: \"${nativeState}\"`);\n }\n return mapped;\n}\n\n/**\n * Map a canonical `TaskState` back to the primary Codex native state.\n *\n * @param canonicalState - The canonical task state.\n * @returns The Codex native state string.\n */\nexport function canonicalToCodexState(canonicalState: TaskState): CodexNativeState {\n return CANONICAL_TO_CODEX[canonicalState];\n}\n\n// ---------------------------------------------------------------------------\n// Claude Code state mapping\n// ---------------------------------------------------------------------------\n\n/**\n * Native states reported by the Claude Code CLI / API adapter.\n * These are the raw status strings that appear in Claude Code events.\n */\nexport type ClaudeNativeState =\n | 'pending'\n | 'streaming'\n | 'processing'\n | 'waiting_for_approval'\n | 'waiting_for_input'\n | 'done'\n | 'completed'\n | 'error'\n | 'failed'\n | 'aborted'\n | 'cancelled'\n | 'timeout';\n\n/**\n * Map from Claude Code native states to canonical TaskState values.\n */\nconst CLAUDE_TO_CANONICAL: Readonly<Record<ClaudeNativeState, TaskState>> = {\n pending: TaskStateEnum.Submitted,\n streaming: TaskStateEnum.Working,\n processing: TaskStateEnum.Working,\n waiting_for_approval: TaskStateEnum.InputRequired,\n waiting_for_input: TaskStateEnum.InputRequired,\n done: TaskStateEnum.Completed,\n completed: TaskStateEnum.Completed,\n error: TaskStateEnum.Failed,\n failed: TaskStateEnum.Failed,\n aborted: TaskStateEnum.Cancelled,\n cancelled: TaskStateEnum.Cancelled,\n timeout: TaskStateEnum.Failed,\n};\n\n/**\n * Reverse map from canonical TaskState to the primary Claude Code native state.\n */\nconst CANONICAL_TO_CLAUDE: Readonly<Record<TaskState, ClaudeNativeState>> = {\n [TaskStateEnum.Submitted]: 'pending',\n [TaskStateEnum.Working]: 'streaming',\n [TaskStateEnum.InputRequired]: 'waiting_for_input',\n [TaskStateEnum.Completed]: 'done',\n [TaskStateEnum.Failed]: 'error',\n [TaskStateEnum.Cancelled]: 'aborted',\n};\n\n/**\n * Map a Claude Code native state string to the canonical `TaskState`.\n *\n * @param nativeState - The raw state string from a Claude Code event.\n * @returns The canonical `TaskState`, or `undefined` if the state is unknown.\n */\nexport function mapClaudeState(nativeState: string): TaskState | undefined {\n return CLAUDE_TO_CANONICAL[nativeState as ClaudeNativeState];\n}\n\n/**\n * Map a Claude Code native state to canonical, throwing if the state is unknown.\n *\n * @param nativeState - The raw state string from a Claude Code event.\n * @returns The canonical `TaskState`.\n * @throws {Error} If the state cannot be mapped.\n */\nexport function mapClaudeStateStrict(nativeState: string): TaskState {\n const mapped = mapClaudeState(nativeState);\n if (mapped === undefined) {\n throw new Error(`Unknown Claude Code state: \"${nativeState}\"`);\n }\n return mapped;\n}\n\n/**\n * Map a canonical `TaskState` back to the primary Claude Code native state.\n *\n * @param canonicalState - The canonical task state.\n * @returns The Claude Code native state string.\n */\nexport function canonicalToClaudeState(canonicalState: TaskState): ClaudeNativeState {\n return CANONICAL_TO_CLAUDE[canonicalState];\n}\n\n// ---------------------------------------------------------------------------\n// Generic / platform-agnostic mapping\n// ---------------------------------------------------------------------------\n\n/**\n * Map a native state from any supported connector to canonical `TaskState`.\n *\n * @param platform - The connector platform identifier.\n * @param nativeState - The raw state string from the connector.\n * @returns The canonical `TaskState`, or `undefined` if unmappable.\n */\nexport function mapConnectorState(\n platform: ConnectorPlatform,\n nativeState: string,\n): TaskState | undefined {\n switch (platform) {\n case 'codex':\n return mapCodexState(nativeState);\n case 'claude_code':\n return mapClaudeState(nativeState);\n default:\n return undefined;\n }\n}\n\n/**\n * Map a native state from any supported connector to canonical `TaskState`,\n * throwing if the mapping fails.\n *\n * @param platform - The connector platform identifier.\n * @param nativeState - The raw state string from the connector.\n * @returns The canonical `TaskState`.\n * @throws {Error} If the platform or state is unknown.\n */\nexport function mapConnectorStateStrict(\n platform: ConnectorPlatform,\n nativeState: string,\n): TaskState {\n const mapped = mapConnectorState(platform, nativeState);\n if (mapped === undefined) {\n throw new Error(\n `Cannot map state \"${nativeState}\" for platform \"${platform}\"`,\n );\n }\n return mapped;\n}\n\n/**\n * Map a canonical `TaskState` back to the primary native state for a given\n * connector platform.\n *\n * @param platform - The connector platform identifier.\n * @param canonicalState - The canonical task state.\n * @returns The native state string, or `undefined` if the platform is unknown.\n */\nexport function canonicalToConnectorState(\n platform: ConnectorPlatform,\n canonicalState: TaskState,\n): string | undefined {\n switch (platform) {\n case 'codex':\n return canonicalToCodexState(canonicalState);\n case 'claude_code':\n return canonicalToClaudeState(canonicalState);\n default:\n return undefined;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Transition safety helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Given the current canonical state and a new native state from a connector,\n * determine whether the implied transition is valid according to the\n * canonical lifecycle rules.\n *\n * This is the main \"guard\" function that adapters should call before\n * applying a state update from a connector event.\n *\n * @param currentCanonical - The current canonical task state.\n * @param platform - The connector platform identifier.\n * @param newNativeState - The new native state reported by the connector.\n * @returns An object indicating whether the transition is valid, the mapped\n * canonical state, and an error message if invalid.\n */\nexport function checkConnectorTransition(\n currentCanonical: TaskState,\n platform: ConnectorPlatform,\n newNativeState: string,\n): {\n valid: boolean;\n mappedState: TaskState | undefined;\n error?: string;\n} {\n const mappedState = mapConnectorState(platform, newNativeState);\n\n if (mappedState === undefined) {\n return {\n valid: false,\n mappedState: undefined,\n error: `Unknown ${platform} state: \"${newNativeState}\"`,\n };\n }\n\n // Same state is a no-op, always valid\n if (mappedState === currentCanonical) {\n return { valid: true, mappedState };\n }\n\n if (!isValidTransition(currentCanonical, mappedState)) {\n return {\n valid: false,\n mappedState,\n error: `Invalid transition: ${currentCanonical} -> ${mappedState} (from ${platform} state \"${newNativeState}\")`,\n };\n }\n\n return { valid: true, mappedState };\n}\n\n/**\n * Check whether a connector-reported native state maps to a terminal\n * canonical state.\n *\n * @param platform - The connector platform identifier.\n * @param nativeState - The native state to check.\n * @returns `true` if the mapped canonical state is terminal; `false` if\n * non-terminal or unmappable.\n */\nexport function isConnectorTerminalState(\n platform: ConnectorPlatform,\n nativeState: string,\n): boolean {\n const mapped = mapConnectorState(platform, nativeState);\n return mapped !== undefined && isTerminalState(mapped);\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,140 @@
1
+ // src/error-mapping.ts
2
+ import {
3
+ A2AErrorCodeEnum,
4
+ buildA2AError
5
+ } from "@recoder/shared/a2a/schemas";
6
+ var CODEX_ERROR_MAP = {
7
+ timeout: A2AErrorCodeEnum.ConnectorTimeout,
8
+ rate_limit: A2AErrorCodeEnum.RateLimitExceeded,
9
+ quota_exceeded: A2AErrorCodeEnum.QuotaExceeded,
10
+ auth_error: A2AErrorCodeEnum.AuthenticationFailed,
11
+ connection_error: A2AErrorCodeEnum.NetworkError,
12
+ invalid_request: A2AErrorCodeEnum.InvalidPayload,
13
+ execution_error: A2AErrorCodeEnum.TaskExecutionFailed,
14
+ model_error: A2AErrorCodeEnum.ConnectorError,
15
+ internal_error: A2AErrorCodeEnum.InternalError,
16
+ cancelled: A2AErrorCodeEnum.TaskCancelled
17
+ };
18
+ function mapCodexError(input) {
19
+ const code = CODEX_ERROR_MAP[input.type] ?? A2AErrorCodeEnum.ConnectorError;
20
+ return buildA2AError({
21
+ code,
22
+ message: input.message,
23
+ details: {
24
+ ...input.details,
25
+ connector_platform: "codex",
26
+ original_error_type: input.type,
27
+ ...input.statusCode !== void 0 ? { status_code: input.statusCode } : {}
28
+ },
29
+ trace_id: input.traceId
30
+ });
31
+ }
32
+ var CLAUDE_ERROR_MAP = {
33
+ overloaded: A2AErrorCodeEnum.ConnectorUnavailable,
34
+ rate_limit: A2AErrorCodeEnum.RateLimitExceeded,
35
+ authentication_error: A2AErrorCodeEnum.AuthenticationFailed,
36
+ permission_error: A2AErrorCodeEnum.AuthorizationDenied,
37
+ invalid_request: A2AErrorCodeEnum.InvalidPayload,
38
+ api_error: A2AErrorCodeEnum.ConnectorError,
39
+ timeout: A2AErrorCodeEnum.ConnectorTimeout,
40
+ connection_error: A2AErrorCodeEnum.NetworkError,
41
+ tool_execution_error: A2AErrorCodeEnum.TaskExecutionFailed,
42
+ context_length_exceeded: A2AErrorCodeEnum.QuotaExceeded,
43
+ cancelled: A2AErrorCodeEnum.TaskCancelled,
44
+ aborted: A2AErrorCodeEnum.TaskCancelled
45
+ };
46
+ function mapClaudeError(input) {
47
+ const code = CLAUDE_ERROR_MAP[input.type] ?? A2AErrorCodeEnum.ConnectorError;
48
+ return buildA2AError({
49
+ code,
50
+ message: input.message,
51
+ details: {
52
+ ...input.details,
53
+ connector_platform: "claude_code",
54
+ original_error_type: input.type,
55
+ ...input.statusCode !== void 0 ? { status_code: input.statusCode } : {}
56
+ },
57
+ trace_id: input.traceId
58
+ });
59
+ }
60
+ var HTTP_STATUS_MAP = {
61
+ 400: A2AErrorCodeEnum.InvalidPayload,
62
+ 401: A2AErrorCodeEnum.AuthenticationFailed,
63
+ 403: A2AErrorCodeEnum.AuthorizationDenied,
64
+ 404: A2AErrorCodeEnum.ConnectorNotFound,
65
+ 408: A2AErrorCodeEnum.ConnectorTimeout,
66
+ 409: A2AErrorCodeEnum.InvalidStateTransition,
67
+ 422: A2AErrorCodeEnum.InvalidEnvelope,
68
+ 429: A2AErrorCodeEnum.RateLimitExceeded,
69
+ 500: A2AErrorCodeEnum.InternalError,
70
+ 502: A2AErrorCodeEnum.NetworkError,
71
+ 503: A2AErrorCodeEnum.ConnectorUnavailable,
72
+ 504: A2AErrorCodeEnum.ConnectorTimeout
73
+ };
74
+ function mapHttpError(statusCode, message, options) {
75
+ const code = HTTP_STATUS_MAP[statusCode] ?? A2AErrorCodeEnum.UnexpectedStatus;
76
+ return buildA2AError({
77
+ code,
78
+ message,
79
+ details: {
80
+ ...options?.details,
81
+ http_status: statusCode,
82
+ ...options?.platform ? { connector_platform: options.platform } : {}
83
+ },
84
+ trace_id: options?.traceId
85
+ });
86
+ }
87
+ function mapConnectorError(input) {
88
+ switch (input.platform) {
89
+ case "codex":
90
+ return mapCodexError(input);
91
+ case "claude_code":
92
+ return mapClaudeError(input);
93
+ default:
94
+ if (input.statusCode !== void 0) {
95
+ return mapHttpError(input.statusCode, input.message, {
96
+ traceId: input.traceId,
97
+ details: { ...input.details, original_error_type: input.type },
98
+ platform: input.platform
99
+ });
100
+ }
101
+ return buildA2AError({
102
+ code: A2AErrorCodeEnum.ConnectorError,
103
+ message: input.message,
104
+ details: {
105
+ ...input.details,
106
+ connector_platform: input.platform,
107
+ original_error_type: input.type
108
+ },
109
+ trace_id: input.traceId
110
+ });
111
+ }
112
+ }
113
+ function wrapUnknownError(err, options) {
114
+ const message = err instanceof Error ? err.message : typeof err === "string" ? err : "Unknown error";
115
+ const details = {};
116
+ if (options?.platform) {
117
+ details.connector_platform = options.platform;
118
+ }
119
+ if (err instanceof Error) {
120
+ details.error_name = err.name;
121
+ if (err.stack) {
122
+ details.stack_preview = err.stack.split("\n").slice(0, 3).join("\n");
123
+ }
124
+ }
125
+ return buildA2AError({
126
+ code: A2AErrorCodeEnum.InternalError,
127
+ message,
128
+ details,
129
+ trace_id: options?.traceId
130
+ });
131
+ }
132
+
133
+ export {
134
+ mapCodexError,
135
+ mapClaudeError,
136
+ mapHttpError,
137
+ mapConnectorError,
138
+ wrapUnknownError
139
+ };
140
+ //# sourceMappingURL=chunk-QVOOBAUA.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/error-mapping.ts"],"sourcesContent":["/**\n * @module error-mapping\n *\n * Error mapping helpers for connector adapters.\n *\n * Each connector may report errors in its own format (HTTP status codes,\n * vendor-specific error objects, raw exceptions). This module provides\n * functions that normalize those heterogeneous error shapes into canonical\n * `A2AError` instances using the error taxonomy from\n * `@recoder/shared/a2a/schemas`.\n *\n * Adapter authors should call these mappers at the boundary where connector\n * errors are caught, so that all upstream logic can operate on a uniform\n * error type.\n *\n * @example\n * ```ts\n * import { mapCodexError, mapClaudeError, mapHttpError } from '@recoder/a2a-sdk/error-mapping';\n *\n * const a2aError = mapCodexError({ type: 'timeout', message: 'Codex timed out' });\n * const httpError = mapHttpError(503, 'Service Unavailable');\n * ```\n */\n\nimport {\n type A2AError,\n type A2AErrorCode,\n A2AErrorCodeEnum,\n buildA2AError,\n} from '@recoder/shared/a2a/schemas';\n\nimport type { ConnectorPlatform } from './state-mapping';\n\n// ---------------------------------------------------------------------------\n// Codex error mapping\n// ---------------------------------------------------------------------------\n\n/**\n * Shape of an error object emitted by the Codex adapter.\n * This is a normalized representation -- the actual wire format may vary,\n * and adapter code should transform the raw error into this shape before\n * calling `mapCodexError`.\n */\nexport interface CodexErrorInput {\n /** Codex-specific error type string. */\n type:\n | 'timeout'\n | 'rate_limit'\n | 'quota_exceeded'\n | 'auth_error'\n | 'connection_error'\n | 'invalid_request'\n | 'execution_error'\n | 'model_error'\n | 'internal_error'\n | 'cancelled'\n | string;\n /** Human-readable error message from Codex. */\n message: string;\n /** Optional HTTP status code (if the error originated from an HTTP call). */\n statusCode?: number;\n /** Optional raw details from the Codex API response. */\n details?: Record<string, unknown>;\n /** Optional trace ID for correlation. */\n traceId?: string;\n}\n\n/**\n * Map from Codex error type strings to canonical A2A error codes.\n */\nconst CODEX_ERROR_MAP: Readonly<Record<string, A2AErrorCode>> = {\n timeout: A2AErrorCodeEnum.ConnectorTimeout,\n rate_limit: A2AErrorCodeEnum.RateLimitExceeded,\n quota_exceeded: A2AErrorCodeEnum.QuotaExceeded,\n auth_error: A2AErrorCodeEnum.AuthenticationFailed,\n connection_error: A2AErrorCodeEnum.NetworkError,\n invalid_request: A2AErrorCodeEnum.InvalidPayload,\n execution_error: A2AErrorCodeEnum.TaskExecutionFailed,\n model_error: A2AErrorCodeEnum.ConnectorError,\n internal_error: A2AErrorCodeEnum.InternalError,\n cancelled: A2AErrorCodeEnum.TaskCancelled,\n};\n\n/**\n * Map a Codex adapter error to a canonical `A2AError`.\n *\n * @param input - The normalized Codex error.\n * @returns A canonical `A2AError`.\n */\nexport function mapCodexError(input: CodexErrorInput): A2AError {\n const code = CODEX_ERROR_MAP[input.type] ?? A2AErrorCodeEnum.ConnectorError;\n return buildA2AError({\n code,\n message: input.message,\n details: {\n ...input.details,\n connector_platform: 'codex' as const,\n original_error_type: input.type,\n ...(input.statusCode !== undefined ? { status_code: input.statusCode } : {}),\n },\n trace_id: input.traceId,\n });\n}\n\n// ---------------------------------------------------------------------------\n// Claude Code error mapping\n// ---------------------------------------------------------------------------\n\n/**\n * Shape of an error object emitted by the Claude Code adapter.\n */\nexport interface ClaudeErrorInput {\n /** Claude-specific error type string. */\n type:\n | 'overloaded'\n | 'rate_limit'\n | 'authentication_error'\n | 'permission_error'\n | 'invalid_request'\n | 'api_error'\n | 'timeout'\n | 'connection_error'\n | 'tool_execution_error'\n | 'context_length_exceeded'\n | 'cancelled'\n | 'aborted'\n | string;\n /** Human-readable error message from Claude. */\n message: string;\n /** Optional HTTP status code. */\n statusCode?: number;\n /** Optional raw details from the Claude API response. */\n details?: Record<string, unknown>;\n /** Optional trace ID for correlation. */\n traceId?: string;\n}\n\n/**\n * Map from Claude Code error type strings to canonical A2A error codes.\n */\nconst CLAUDE_ERROR_MAP: Readonly<Record<string, A2AErrorCode>> = {\n overloaded: A2AErrorCodeEnum.ConnectorUnavailable,\n rate_limit: A2AErrorCodeEnum.RateLimitExceeded,\n authentication_error: A2AErrorCodeEnum.AuthenticationFailed,\n permission_error: A2AErrorCodeEnum.AuthorizationDenied,\n invalid_request: A2AErrorCodeEnum.InvalidPayload,\n api_error: A2AErrorCodeEnum.ConnectorError,\n timeout: A2AErrorCodeEnum.ConnectorTimeout,\n connection_error: A2AErrorCodeEnum.NetworkError,\n tool_execution_error: A2AErrorCodeEnum.TaskExecutionFailed,\n context_length_exceeded: A2AErrorCodeEnum.QuotaExceeded,\n cancelled: A2AErrorCodeEnum.TaskCancelled,\n aborted: A2AErrorCodeEnum.TaskCancelled,\n};\n\n/**\n * Map a Claude Code adapter error to a canonical `A2AError`.\n *\n * @param input - The normalized Claude Code error.\n * @returns A canonical `A2AError`.\n */\nexport function mapClaudeError(input: ClaudeErrorInput): A2AError {\n const code = CLAUDE_ERROR_MAP[input.type] ?? A2AErrorCodeEnum.ConnectorError;\n return buildA2AError({\n code,\n message: input.message,\n details: {\n ...input.details,\n connector_platform: 'claude_code' as const,\n original_error_type: input.type,\n ...(input.statusCode !== undefined ? { status_code: input.statusCode } : {}),\n },\n trace_id: input.traceId,\n });\n}\n\n// ---------------------------------------------------------------------------\n// HTTP error mapping\n// ---------------------------------------------------------------------------\n\n/**\n * Map from common HTTP status codes to canonical A2A error codes.\n */\nconst HTTP_STATUS_MAP: Readonly<Record<number, A2AErrorCode>> = {\n 400: A2AErrorCodeEnum.InvalidPayload,\n 401: A2AErrorCodeEnum.AuthenticationFailed,\n 403: A2AErrorCodeEnum.AuthorizationDenied,\n 404: A2AErrorCodeEnum.ConnectorNotFound,\n 408: A2AErrorCodeEnum.ConnectorTimeout,\n 409: A2AErrorCodeEnum.InvalidStateTransition,\n 422: A2AErrorCodeEnum.InvalidEnvelope,\n 429: A2AErrorCodeEnum.RateLimitExceeded,\n 500: A2AErrorCodeEnum.InternalError,\n 502: A2AErrorCodeEnum.NetworkError,\n 503: A2AErrorCodeEnum.ConnectorUnavailable,\n 504: A2AErrorCodeEnum.ConnectorTimeout,\n};\n\n/**\n * Map an HTTP status code and message to a canonical `A2AError`.\n *\n * Useful for connector adapters that communicate with external services\n * over HTTP/REST and need to normalize HTTP error responses.\n *\n * @param statusCode - The HTTP response status code.\n * @param message - Human-readable error message (e.g. from the response body).\n * @param options - Optional trace ID and additional details.\n * @returns A canonical `A2AError`.\n */\nexport function mapHttpError(\n statusCode: number,\n message: string,\n options?: {\n traceId?: string;\n details?: Record<string, unknown>;\n platform?: ConnectorPlatform;\n },\n): A2AError {\n const code = HTTP_STATUS_MAP[statusCode] ?? A2AErrorCodeEnum.UnexpectedStatus;\n return buildA2AError({\n code,\n message,\n details: {\n ...options?.details,\n http_status: statusCode,\n ...(options?.platform ? { connector_platform: options.platform } : {}),\n },\n trace_id: options?.traceId,\n });\n}\n\n// ---------------------------------------------------------------------------\n// Generic connector error mapping\n// ---------------------------------------------------------------------------\n\n/**\n * Generic connector error input that works with any platform.\n */\nexport interface ConnectorErrorInput {\n /** The connector platform. */\n platform: ConnectorPlatform;\n /** Connector-specific error type string. */\n type: string;\n /** Human-readable error message. */\n message: string;\n /** Optional HTTP status code. */\n statusCode?: number;\n /** Optional raw details. */\n details?: Record<string, unknown>;\n /** Optional trace ID. */\n traceId?: string;\n}\n\n/**\n * Map a generic connector error to a canonical `A2AError`, dispatching\n * to the appropriate platform-specific mapper.\n *\n * @param input - The connector error input.\n * @returns A canonical `A2AError`.\n */\nexport function mapConnectorError(input: ConnectorErrorInput): A2AError {\n switch (input.platform) {\n case 'codex':\n return mapCodexError(input);\n case 'claude_code':\n return mapClaudeError(input);\n default:\n // Fallback: use the HTTP mapper if we have a status code, otherwise generic\n if (input.statusCode !== undefined) {\n return mapHttpError(input.statusCode, input.message, {\n traceId: input.traceId,\n details: { ...input.details, original_error_type: input.type },\n platform: input.platform,\n });\n }\n return buildA2AError({\n code: A2AErrorCodeEnum.ConnectorError,\n message: input.message,\n details: {\n ...input.details,\n connector_platform: input.platform,\n original_error_type: input.type,\n },\n trace_id: input.traceId,\n });\n }\n}\n\n// ---------------------------------------------------------------------------\n// Exception wrapping\n// ---------------------------------------------------------------------------\n\n/**\n * Wrap a caught JavaScript Error (or unknown) into a canonical `A2AError`.\n *\n * This is a last-resort mapper for unstructured exceptions that escape\n * the connector adapter. Prefer using the typed mappers above whenever\n * possible.\n *\n * @param err - The caught error.\n * @param options - Optional context: platform, trace ID.\n * @returns A canonical `A2AError`.\n */\nexport function wrapUnknownError(\n err: unknown,\n options?: {\n platform?: ConnectorPlatform;\n traceId?: string;\n },\n): A2AError {\n const message =\n err instanceof Error ? err.message : typeof err === 'string' ? err : 'Unknown error';\n\n const details: Record<string, unknown> = {};\n if (options?.platform) {\n details.connector_platform = options.platform;\n }\n if (err instanceof Error) {\n details.error_name = err.name;\n if (err.stack) {\n details.stack_preview = err.stack.split('\\n').slice(0, 3).join('\\n');\n }\n }\n\n return buildA2AError({\n code: A2AErrorCodeEnum.InternalError,\n message,\n details,\n trace_id: options?.traceId,\n });\n}\n"],"mappings":"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","names":[]}