easyeda-mcp-pro 0.3.2 → 0.5.2

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 (173) hide show
  1. package/README.md +369 -52
  2. package/dist/bom-quality/adapter.d.ts +90 -0
  3. package/dist/bom-quality/adapter.js +295 -0
  4. package/dist/bom-quality/adapter.js.map +1 -0
  5. package/dist/bom-quality/index.d.ts +10 -0
  6. package/dist/bom-quality/index.js +9 -0
  7. package/dist/bom-quality/index.js.map +1 -0
  8. package/dist/bom-quality/quality.d.ts +28 -0
  9. package/dist/bom-quality/quality.js +179 -0
  10. package/dist/bom-quality/quality.js.map +1 -0
  11. package/dist/bom-quality/types.d.ts +94 -0
  12. package/dist/bom-quality/types.js +12 -0
  13. package/dist/bom-quality/types.js.map +1 -0
  14. package/dist/bridge/manager.d.ts +41 -0
  15. package/dist/bridge/manager.js +334 -47
  16. package/dist/bridge/manager.js.map +1 -1
  17. package/dist/bridge/protocol.d.ts +48 -1
  18. package/dist/bridge/protocol.js +43 -1
  19. package/dist/bridge/protocol.js.map +1 -1
  20. package/dist/bridge/types.d.ts +6 -0
  21. package/dist/bridge/types.js +6 -0
  22. package/dist/bridge/types.js.map +1 -1
  23. package/dist/catalog/errors.d.ts +49 -0
  24. package/dist/catalog/errors.js +60 -0
  25. package/dist/catalog/errors.js.map +1 -0
  26. package/dist/catalog/index.d.ts +15 -0
  27. package/dist/catalog/index.js +17 -0
  28. package/dist/catalog/index.js.map +1 -0
  29. package/dist/catalog/schema.d.ts +268 -0
  30. package/dist/catalog/schema.js +245 -0
  31. package/dist/catalog/schema.js.map +1 -0
  32. package/dist/catalog/starter.d.ts +159 -0
  33. package/dist/catalog/starter.js +579 -0
  34. package/dist/catalog/starter.js.map +1 -0
  35. package/dist/catalog/validation.d.ts +48 -0
  36. package/dist/catalog/validation.js +263 -0
  37. package/dist/catalog/validation.js.map +1 -0
  38. package/dist/circuit/circuit-ir.d.ts +460 -0
  39. package/dist/circuit/circuit-ir.js +292 -0
  40. package/dist/circuit/circuit-ir.js.map +1 -0
  41. package/dist/circuit/compiler.d.ts +55 -0
  42. package/dist/circuit/compiler.js +197 -0
  43. package/dist/circuit/compiler.js.map +1 -0
  44. package/dist/circuit/design-intent.d.ts +94 -0
  45. package/dist/circuit/design-intent.js +118 -0
  46. package/dist/circuit/design-intent.js.map +1 -0
  47. package/dist/circuit/errors.d.ts +50 -0
  48. package/dist/circuit/errors.js +61 -0
  49. package/dist/circuit/errors.js.map +1 -0
  50. package/dist/circuit/index.d.ts +17 -0
  51. package/dist/circuit/index.js +18 -0
  52. package/dist/circuit/index.js.map +1 -0
  53. package/dist/circuit/types.d.ts +186 -0
  54. package/dist/circuit/types.js +123 -0
  55. package/dist/circuit/types.js.map +1 -0
  56. package/dist/cli/auto-setup.d.ts +5 -0
  57. package/dist/cli/auto-setup.js +355 -0
  58. package/dist/cli/auto-setup.js.map +1 -0
  59. package/dist/cli/client-definitions.d.ts +34 -0
  60. package/dist/cli/client-definitions.js +194 -0
  61. package/dist/cli/client-definitions.js.map +1 -0
  62. package/dist/cli/local-setup.d.ts +5 -1
  63. package/dist/cli/local-setup.js +40 -6
  64. package/dist/cli/local-setup.js.map +1 -1
  65. package/dist/config/env.d.ts +6 -1
  66. package/dist/config/env.js +93 -5
  67. package/dist/config/env.js.map +1 -1
  68. package/dist/config/profiles.js +4 -4
  69. package/dist/config/version.d.ts +1 -1
  70. package/dist/config/version.js +1 -1
  71. package/dist/export-manifest/errors.d.ts +55 -0
  72. package/dist/export-manifest/errors.js +69 -0
  73. package/dist/export-manifest/errors.js.map +1 -0
  74. package/dist/export-manifest/index.d.ts +10 -0
  75. package/dist/export-manifest/index.js +9 -0
  76. package/dist/export-manifest/index.js.map +1 -0
  77. package/dist/export-manifest/types.d.ts +170 -0
  78. package/dist/export-manifest/types.js +36 -0
  79. package/dist/export-manifest/types.js.map +1 -0
  80. package/dist/export-manifest/validation.d.ts +39 -0
  81. package/dist/export-manifest/validation.js +298 -0
  82. package/dist/export-manifest/validation.js.map +1 -0
  83. package/dist/index.js +20 -0
  84. package/dist/index.js.map +1 -1
  85. package/dist/net-validation/errors.d.ts +89 -0
  86. package/dist/net-validation/errors.js +69 -0
  87. package/dist/net-validation/errors.js.map +1 -0
  88. package/dist/net-validation/fixtures.d.ts +38 -0
  89. package/dist/net-validation/fixtures.js +215 -0
  90. package/dist/net-validation/fixtures.js.map +1 -0
  91. package/dist/net-validation/index.d.ts +10 -0
  92. package/dist/net-validation/index.js +9 -0
  93. package/dist/net-validation/index.js.map +1 -0
  94. package/dist/net-validation/schema.d.ts +118 -0
  95. package/dist/net-validation/schema.js +140 -0
  96. package/dist/net-validation/schema.js.map +1 -0
  97. package/dist/net-validation/validation.d.ts +45 -0
  98. package/dist/net-validation/validation.js +369 -0
  99. package/dist/net-validation/validation.js.map +1 -0
  100. package/dist/pcb-constraints/errors.d.ts +39 -0
  101. package/dist/pcb-constraints/errors.js +133 -0
  102. package/dist/pcb-constraints/errors.js.map +1 -0
  103. package/dist/pcb-constraints/index.d.ts +9 -0
  104. package/dist/pcb-constraints/index.js +9 -0
  105. package/dist/pcb-constraints/index.js.map +1 -0
  106. package/dist/pcb-constraints/types.d.ts +102 -0
  107. package/dist/pcb-constraints/types.js +7 -0
  108. package/dist/pcb-constraints/types.js.map +1 -0
  109. package/dist/pcb-constraints/validation.d.ts +70 -0
  110. package/dist/pcb-constraints/validation.js +309 -0
  111. package/dist/pcb-constraints/validation.js.map +1 -0
  112. package/dist/server/factory.js +2 -0
  113. package/dist/server/factory.js.map +1 -1
  114. package/dist/server/transports/http.d.ts +20 -1
  115. package/dist/server/transports/http.js +156 -34
  116. package/dist/server/transports/http.js.map +1 -1
  117. package/dist/storage/database.d.ts +25 -0
  118. package/dist/storage/database.js +126 -51
  119. package/dist/storage/database.js.map +1 -1
  120. package/dist/tools/{L0_diagnostics.d.ts → L0_diagnostics_api.d.ts} +2 -2
  121. package/dist/tools/L0_diagnostics_api.js +152 -0
  122. package/dist/tools/L0_diagnostics_api.js.map +1 -0
  123. package/dist/tools/L0_diagnostics_core.d.ts +6 -0
  124. package/dist/tools/{L0_diagnostics.js → L0_diagnostics_core.js} +50 -124
  125. package/dist/tools/L0_diagnostics_core.js.map +1 -0
  126. package/dist/tools/L1_board.js +20 -4
  127. package/dist/tools/L1_board.js.map +1 -1
  128. package/dist/tools/{L1_bom.d.ts → L1_bom_core.d.ts} +2 -2
  129. package/dist/tools/{L1_bom.js → L1_bom_core.js} +21 -101
  130. package/dist/tools/L1_bom_core.js.map +1 -0
  131. package/dist/tools/{L1_schematic.d.ts → L1_bom_sourcing.d.ts} +2 -2
  132. package/dist/tools/L1_bom_sourcing.js +265 -0
  133. package/dist/tools/L1_bom_sourcing.js.map +1 -0
  134. package/dist/tools/L1_drc_erc.js +15 -3
  135. package/dist/tools/L1_drc_erc.js.map +1 -1
  136. package/dist/tools/L1_export.js +20 -4
  137. package/dist/tools/L1_export.js.map +1 -1
  138. package/dist/tools/L1_pcb_constraints.d.ts +6 -0
  139. package/dist/tools/L1_pcb_constraints.js +234 -0
  140. package/dist/tools/L1_pcb_constraints.js.map +1 -0
  141. package/dist/tools/L1_pcb_write.js +26 -12
  142. package/dist/tools/L1_pcb_write.js.map +1 -1
  143. package/dist/tools/L1_schematic_read.d.ts +6 -0
  144. package/dist/tools/{L1_schematic.js → L1_schematic_read.js} +125 -190
  145. package/dist/tools/L1_schematic_read.js.map +1 -0
  146. package/dist/tools/L1_schematic_write.d.ts +6 -0
  147. package/dist/tools/L1_schematic_write.js +516 -0
  148. package/dist/tools/L1_schematic_write.js.map +1 -0
  149. package/dist/tools/register.js +15 -7
  150. package/dist/tools/register.js.map +1 -1
  151. package/dist/tools/registry.d.ts +41 -7
  152. package/dist/tools/registry.js +111 -12
  153. package/dist/tools/registry.js.map +1 -1
  154. package/dist/tools/types.d.ts +16 -0
  155. package/dist/utils/logger.d.ts +1 -1
  156. package/dist/utils/logger.js +1 -1
  157. package/dist/utils/logger.js.map +1 -1
  158. package/dist/vendors/base-http-client.d.ts +48 -0
  159. package/dist/vendors/base-http-client.js +75 -0
  160. package/dist/vendors/base-http-client.js.map +1 -0
  161. package/dist/vendors/digikey/client.js +10 -19
  162. package/dist/vendors/digikey/client.js.map +1 -1
  163. package/dist/vendors/jlcpcb/client.js +41 -70
  164. package/dist/vendors/jlcpcb/client.js.map +1 -1
  165. package/dist/vendors/lcsc/client.js +5 -18
  166. package/dist/vendors/lcsc/client.js.map +1 -1
  167. package/dist/vendors/mouser/client.js +4 -12
  168. package/dist/vendors/mouser/client.js.map +1 -1
  169. package/easyeda-bridge-extension.eext +0 -0
  170. package/package.json +41 -26
  171. package/dist/tools/L0_diagnostics.js.map +0 -1
  172. package/dist/tools/L1_bom.js.map +0 -1
  173. package/dist/tools/L1_schematic.js.map +0 -1
@@ -1,4 +1,47 @@
1
1
  import { getEnabledProfiles } from '../config/profiles.js';
2
+ import { ZodError } from 'zod';
3
+ import { SERVER_VERSION } from '../config/version.js';
4
+ // ── Structured error codes ────────────────────────────────────────────────
5
+ export const ErrorCodes = {
6
+ CONFIRM_WRITE_REQUIRED: 'ERR_CONFIRM_WRITE_REQUIRED',
7
+ BRIDGE_DISCONNECTED: 'ERR_BRIDGE_DISCONNECTED',
8
+ TOOL_EXECUTION: 'ERR_TOOL_EXECUTION',
9
+ TOOL_NOT_FOUND: 'ERR_TOOL_NOT_FOUND',
10
+ INVALID_INPUT: 'ERR_INVALID_INPUT',
11
+ };
12
+ /**
13
+ * Build a structured error content block for MCP responses.
14
+ */
15
+ function structuredErrorResponse(error) {
16
+ return {
17
+ isError: true,
18
+ structuredContent: error,
19
+ content: [{ type: 'text', text: `[${error.errorCode}] ${error.message}` }],
20
+ };
21
+ }
22
+ // ── Bridge-disconnected helper ────────────────────────────────────────────
23
+ function bridgeDisconnectedResponse(host = '127.0.0.1', port = '49620') {
24
+ return structuredErrorResponse({
25
+ errorCode: ErrorCodes.BRIDGE_DISCONNECTED,
26
+ message: [
27
+ `Bridge connection failed on ${host}:${port}`,
28
+ '',
29
+ 'Possible causes:',
30
+ ' 1. EasyEDA Pro is not running',
31
+ ' 2. MCP Pro Bridge extension is not installed',
32
+ ' 3. Extension\'s "Allow External Interaction" is disabled',
33
+ ' 4. A firewall is blocking localhost connections',
34
+ '',
35
+ 'Quick fix:',
36
+ ' → Open EasyEDA Pro → Settings → Extensions → Extension Manager',
37
+ ' → Import the extension file: easyeda-bridge-extension.eext',
38
+ ' → Enable "Allow External Interaction"',
39
+ ' → Click MCP Bridge → Connect in the menu bar',
40
+ ].join('\n'),
41
+ details: { host, port },
42
+ });
43
+ }
44
+ // ── Registry ──────────────────────────────────────────────────────────────
2
45
  export class ToolRegistry {
3
46
  tools = new Map();
4
47
  currentProfile = 'core';
@@ -21,6 +64,12 @@ export class ToolRegistry {
21
64
  getAllTools() {
22
65
  return Array.from(this.tools.values());
23
66
  }
67
+ /** Register all enabled tools onto an MCP server.
68
+ * Each handler is wrapped with:
69
+ * - confirmWrite gate (rejects calls that omit the required acknowledgment)
70
+ * - structured error codes
71
+ * - bridge‑disconnected friendly error interception
72
+ */
24
73
  registerAllOnServer(server, context) {
25
74
  for (const tool of this.getEnabledTools()) {
26
75
  server.registerTool(tool.name, {
@@ -30,27 +79,77 @@ export class ToolRegistry {
30
79
  outputSchema: tool.outputSchema,
31
80
  annotations: tool.annotations,
32
81
  }, async (input) => {
33
- const parsed = tool.inputSchema.parse(input ?? {});
34
- const result = await tool.handler(context, parsed);
35
- const structuredContent = typeof result === 'object' && result !== null
36
- ? result
37
- : { value: result };
38
- return {
39
- structuredContent,
40
- content: [{ type: 'text', text: JSON.stringify(result, null, 2) }],
41
- };
82
+ try {
83
+ // ── confirmWrite gate ──────────────────────────────────────
84
+ if (tool.confirmWrite) {
85
+ const raw = (input ?? {});
86
+ if (raw.confirmWrite !== true) {
87
+ return structuredErrorResponse({
88
+ errorCode: ErrorCodes.CONFIRM_WRITE_REQUIRED,
89
+ message: `Tool "${tool.name}" can mutate design state and requires confirmWrite=true.`,
90
+ details: { toolName: tool.name, toolGroup: tool.group, risk: tool.risk },
91
+ });
92
+ }
93
+ }
94
+ // ── Parse & execute ───────────────────────────────────────
95
+ const parsed = tool.inputSchema.parse(input ?? {});
96
+ const result = await tool.handler(context, parsed);
97
+ const structuredContent = typeof result === 'object' && result !== null
98
+ ? result
99
+ : { value: result };
100
+ return {
101
+ structuredContent,
102
+ content: [{ type: 'text', text: JSON.stringify(result, null, 2) }],
103
+ };
104
+ }
105
+ catch (err) {
106
+ // ── Zod validation errors ─────────────────────────────────
107
+ if (err instanceof ZodError) {
108
+ return structuredErrorResponse({
109
+ errorCode: ErrorCodes.INVALID_INPUT,
110
+ message: `Invalid input for "${tool.name}": ${err.message}`,
111
+ details: { toolName: tool.name, issues: err.issues },
112
+ });
113
+ }
114
+ // ── Bridge-disconnected interception ──────────────────────
115
+ const msg = err instanceof Error ? err.message : String(err);
116
+ if (msg.includes('Bridge not connected') || msg.includes('Bridge disconnected')) {
117
+ return bridgeDisconnectedResponse(context.config.bridgeHost, String(context.config.bridgePort));
118
+ }
119
+ // ── Generic execution error ───────────────────────────────
120
+ return structuredErrorResponse({
121
+ errorCode: ErrorCodes.TOOL_EXECUTION,
122
+ message: `Tool "${tool.name}" failed: ${msg}`,
123
+ details: { toolName: tool.name },
124
+ });
125
+ }
42
126
  });
43
127
  }
44
128
  }
129
+ /** Return rich metadata for every enabled tool. */
45
130
  getToolDefinitions() {
46
131
  const enabled = this.getEnabledTools();
47
132
  return enabled.map((t) => ({
48
133
  name: t.name,
134
+ title: t.title,
49
135
  description: t.description,
50
- inputSchema: t.inputSchema.describe
51
- ? { type: 'object' }
52
- : { type: 'object' },
136
+ profile: t.profile,
137
+ risk: t.risk,
138
+ confirmWrite: t.confirmWrite,
139
+ group: t.group,
140
+ version: t.version,
141
+ evidence: t.evidence,
142
+ annotations: t.annotations,
53
143
  }));
54
144
  }
145
+ /** Return a summary snapshot for diagnostics / health‑check endpoints. */
146
+ getSummary() {
147
+ return {
148
+ total: this.tools.size,
149
+ enabled: this.getEnabledTools().length,
150
+ profile: this.currentProfile,
151
+ serverVersion: SERVER_VERSION,
152
+ };
153
+ }
55
154
  }
56
155
  //# sourceMappingURL=registry.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/tools/registry.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/tools/registry.ts"],"names":[],"mappings":"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"}
@@ -5,12 +5,26 @@ import { type JlcpcbClient } from '../vendors/jlcpcb/client.js';
5
5
  import { type MouserClient } from '../vendors/mouser/client.js';
6
6
  import { type DigiKeyClient } from '../vendors/digikey/client.js';
7
7
  export interface ToolDefinition<TInput extends z.ZodType = z.ZodType, TOutput extends z.ZodType = z.ZodType> {
8
+ /** Unique tool name used in MCP protocol */
8
9
  name: string;
10
+ /** Human-readable title */
9
11
  title: string;
12
+ /** Long description explaining purpose, inputs, and effects */
10
13
  description: string;
14
+ /** Minimum profile required to enable this tool */
11
15
  profile: ToolProfile;
16
+ /** Source(s) used to derive the tool's schema and behaviour */
12
17
  evidence: Array<'official-docs' | 'pro-api-types' | 'runtime-probe' | 'official-skill' | 'source-format' | 'vendor-api-docs' | 'inferred'>;
18
+ /** Safety risk level — gates like confirmWrite trigger at 'medium' and above */
13
19
  risk: 'low' | 'medium' | 'high';
20
+ /** Whether the tool can mutate project/design state.
21
+ * When true the runtime MUST require an explicit acknowledgment before execution. */
22
+ confirmWrite: boolean;
23
+ /** Logical group for UI organisation and documentation (e.g. 'schematic', 'bom', 'board') */
24
+ group: string;
25
+ /** Schema version string — bump when breaking changes are made to input/output schemas */
26
+ version: string;
27
+ /** MCP protocol annotation hints */
14
28
  annotations: {
15
29
  readOnlyHint?: boolean;
16
30
  destructiveHint?: boolean;
@@ -33,6 +47,8 @@ export interface ToolContext {
33
47
  config: {
34
48
  bridgeTimeoutMs: number;
35
49
  artifactDir: string;
50
+ bridgeHost: string;
51
+ bridgePort: number;
36
52
  [key: string]: unknown;
37
53
  };
38
54
  vendors: {
@@ -1,4 +1,4 @@
1
1
  import pino from 'pino';
2
2
  import { type EnvConfig } from '../config/env.js';
3
- export declare function createLogger(config: Pick<EnvConfig, 'LOG_LEVEL'>): pino.Logger;
3
+ export declare function createLogger(config: Pick<EnvConfig, 'LOG_LEVEL' | 'NODE_ENV'>): pino.Logger;
4
4
  export declare function getLogger(): pino.Logger;
@@ -5,7 +5,7 @@ export function createLogger(config) {
5
5
  return loggerInstance;
6
6
  const pinoOpts = {
7
7
  level: config.LOG_LEVEL,
8
- ...(process.env.NODE_ENV !== 'production'
8
+ ...(config.NODE_ENV !== 'production'
9
9
  ? { transport: { target: 'pino/file', options: { destination: 2 } } }
10
10
  : {}),
11
11
  redact: {
@@ -1 +1 @@
1
- {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AAGxB,IAAI,cAAc,GAAuB,IAAI,CAAC;AAE9C,MAAM,UAAU,YAAY,CAAC,MAAoC;IAC/D,IAAI,cAAc;QAAE,OAAO,cAAc,CAAC;IAE1C,MAAM,QAAQ,GAAuB;QACnC,KAAK,EAAE,MAAM,CAAC,SAAS;QACvB,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY;YACvC,CAAC,CAAC,EAAE,SAAS,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,EAAE,EAAE;YACrE,CAAC,CAAC,EAAE,CAAC;QACP,MAAM,EAAE;YACN,KAAK,EAAE;gBACL,QAAQ;gBACR,SAAS;gBACT,SAAS;gBACT,cAAc;gBACd,eAAe;gBACf,eAAe;gBACf,OAAO;gBACP,OAAO;gBACP,cAAc;gBACd,eAAe;gBACf,UAAU;gBACV,UAAU;gBACV,eAAe;gBACf,eAAe;gBACf,QAAQ;gBACR,QAAQ;gBACR,KAAK;gBACL,KAAK;gBACL,QAAQ;gBACR,QAAQ;gBACR,KAAK;gBACL,KAAK;gBACL,YAAY;gBACZ,YAAY;aACb;YACD,MAAM,EAAE,YAAY;SACrB;QACD,WAAW,EAAE;YACX,GAAG,EAAE,IAAI,CAAC,cAAc,CAAC,GAAG;YAC5B,KAAK,EAAE,IAAI,CAAC,cAAc,CAAC,GAAG;SAC/B;KACF,CAAC;IAEF,cAAc,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC;IAEhC,OAAO,cAAc,CAAC;AACxB,CAAC;AAED,MAAM,UAAU,SAAS;IACvB,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;IACtE,CAAC;IACD,OAAO,cAAc,CAAC;AACxB,CAAC"}
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AAGxB,IAAI,cAAc,GAAuB,IAAI,CAAC;AAE9C,MAAM,UAAU,YAAY,CAAC,MAAiD;IAC5E,IAAI,cAAc;QAAE,OAAO,cAAc,CAAC;IAE1C,MAAM,QAAQ,GAAuB;QACnC,KAAK,EAAE,MAAM,CAAC,SAAS;QACvB,GAAG,CAAC,MAAM,CAAC,QAAQ,KAAK,YAAY;YAClC,CAAC,CAAC,EAAE,SAAS,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,EAAE,EAAE;YACrE,CAAC,CAAC,EAAE,CAAC;QACP,MAAM,EAAE;YACN,KAAK,EAAE;gBACL,QAAQ;gBACR,SAAS;gBACT,SAAS;gBACT,cAAc;gBACd,eAAe;gBACf,eAAe;gBACf,OAAO;gBACP,OAAO;gBACP,cAAc;gBACd,eAAe;gBACf,UAAU;gBACV,UAAU;gBACV,eAAe;gBACf,eAAe;gBACf,QAAQ;gBACR,QAAQ;gBACR,KAAK;gBACL,KAAK;gBACL,QAAQ;gBACR,QAAQ;gBACR,KAAK;gBACL,KAAK;gBACL,YAAY;gBACZ,YAAY;aACb;YACD,MAAM,EAAE,YAAY;SACrB;QACD,WAAW,EAAE;YACX,GAAG,EAAE,IAAI,CAAC,cAAc,CAAC,GAAG;YAC5B,KAAK,EAAE,IAAI,CAAC,cAAc,CAAC,GAAG;SAC/B;KACF,CAAC;IAEF,cAAc,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC;IAEhC,OAAO,cAAc,CAAC;AACxB,CAAC;AAED,MAAM,UAAU,SAAS;IACvB,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;IACtE,CAAC;IACD,OAAO,cAAc,CAAC;AACxB,CAAC"}
@@ -0,0 +1,48 @@
1
+ import type { Readable } from 'node:stream';
2
+ import type pino from 'pino';
3
+ /** Default max retries for HTTP requests (2 retries = 3 total attempts). */
4
+ export declare const DEFAULT_MAX_RETRIES = 2;
5
+ /** Default base delay for exponential backoff (1 second). */
6
+ export declare const DEFAULT_BASE_DELAY_MS = 1000;
7
+ /** Default timeout for HTTP requests (30 seconds). */
8
+ export declare const DEFAULT_REQUEST_TIMEOUT_MS = 30000;
9
+ /**
10
+ * Read the entire body of a readable stream and return it as a UTF-8 string.
11
+ * Works with both Buffer and string chunks.
12
+ */
13
+ export declare function readBody(stream: Readable): Promise<string>;
14
+ /** Options for an HTTP request. */
15
+ export interface RequestOptions {
16
+ /** HTTP method (default: GET). */
17
+ method?: string;
18
+ /** Request headers. */
19
+ headers?: Record<string, string>;
20
+ /** Request body string. */
21
+ body?: string;
22
+ /** Timeout in milliseconds (default: 30s). */
23
+ timeoutMs?: number;
24
+ }
25
+ /** Result of a completed HTTP request. */
26
+ export interface RequestResult {
27
+ /** HTTP status code. */
28
+ statusCode: number;
29
+ /** Response body as a string. */
30
+ responseText: string;
31
+ }
32
+ export interface RequestResult {
33
+ statusCode: number;
34
+ responseText: string;
35
+ }
36
+ /**
37
+ * Perform an HTTP request with exponential-backoff retry logic.
38
+ *
39
+ * Retries on 429 (rate-limit), 5xx (server errors), network failures,
40
+ * and retryable `EasyEdaMcpError` instances.
41
+ *
42
+ * @param url - The full request URL.
43
+ * @param options - Request method, headers, body, and timeout.
44
+ * @param logger - Pino logger instance for structured logging.
45
+ * @param maxRetries - Max retries before giving up (default: 2).
46
+ * @throws {EasyEdaMcpError} With code `VENDOR_API_UNAVAILABLE` when all attempts fail.
47
+ */
48
+ export declare function httpRequestWithRetry(url: string, options: RequestOptions, logger: pino.Logger, maxRetries?: number): Promise<RequestResult>;
@@ -0,0 +1,75 @@
1
+ import { request } from 'undici';
2
+ import { EasyEdaMcpError } from '../schemas/common.js';
3
+ /** Default max retries for HTTP requests (2 retries = 3 total attempts). */
4
+ export const DEFAULT_MAX_RETRIES = 2;
5
+ /** Default base delay for exponential backoff (1 second). */
6
+ export const DEFAULT_BASE_DELAY_MS = 1000;
7
+ /** Default timeout for HTTP requests (30 seconds). */
8
+ export const DEFAULT_REQUEST_TIMEOUT_MS = 30_000;
9
+ /**
10
+ * Read the entire body of a readable stream and return it as a UTF-8 string.
11
+ * Works with both Buffer and string chunks.
12
+ */
13
+ export async function readBody(stream) {
14
+ const chunks = [];
15
+ for await (const chunk of stream) {
16
+ chunks.push(typeof chunk === 'string' ? Buffer.from(chunk) : chunk);
17
+ }
18
+ return Buffer.concat(chunks).toString('utf-8');
19
+ }
20
+ /**
21
+ * Perform an HTTP request with exponential-backoff retry logic.
22
+ *
23
+ * Retries on 429 (rate-limit), 5xx (server errors), network failures,
24
+ * and retryable `EasyEdaMcpError` instances.
25
+ *
26
+ * @param url - The full request URL.
27
+ * @param options - Request method, headers, body, and timeout.
28
+ * @param logger - Pino logger instance for structured logging.
29
+ * @param maxRetries - Max retries before giving up (default: 2).
30
+ * @throws {EasyEdaMcpError} With code `VENDOR_API_UNAVAILABLE` when all attempts fail.
31
+ */
32
+ export async function httpRequestWithRetry(url, options, logger, maxRetries = DEFAULT_MAX_RETRIES) {
33
+ const method = options.method ?? 'GET';
34
+ const timeoutMs = options.timeoutMs ?? DEFAULT_REQUEST_TIMEOUT_MS;
35
+ let lastError;
36
+ for (let attempt = 1; attempt <= maxRetries + 1; attempt++) {
37
+ try {
38
+ logger.debug({ url, method, attempt }, 'http request');
39
+ const { statusCode, body } = await request(url, {
40
+ method,
41
+ headers: options.headers,
42
+ body: options.body,
43
+ signal: AbortSignal.timeout(timeoutMs),
44
+ });
45
+ const responseText = await readBody(body);
46
+ if ((statusCode === 429 || statusCode >= 500) && attempt <= maxRetries) {
47
+ const delay = DEFAULT_BASE_DELAY_MS * Math.pow(2, attempt - 1);
48
+ logger.warn({ url, statusCode, attempt, delay }, 'retryable error');
49
+ await new Promise((resolve) => setTimeout(resolve, delay));
50
+ continue;
51
+ }
52
+ return { statusCode, responseText };
53
+ }
54
+ catch (err) {
55
+ lastError = err;
56
+ if (err instanceof EasyEdaMcpError && !err.retryable)
57
+ throw err;
58
+ if (attempt <= maxRetries) {
59
+ const delay = DEFAULT_BASE_DELAY_MS * Math.pow(2, attempt - 1);
60
+ logger.debug({ url, attempt, delay }, 'request retry');
61
+ await new Promise((resolve) => setTimeout(resolve, delay));
62
+ }
63
+ }
64
+ }
65
+ throw lastError instanceof EasyEdaMcpError
66
+ ? lastError
67
+ : new EasyEdaMcpError({
68
+ code: 'VENDOR_API_UNAVAILABLE',
69
+ message: 'HTTP request failed after retries.',
70
+ suggestion: 'Check network connectivity.',
71
+ retryable: true,
72
+ details: { error: String(lastError) },
73
+ });
74
+ }
75
+ //# sourceMappingURL=base-http-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base-http-client.js","sourceRoot":"","sources":["../../src/vendors/base-http-client.ts"],"names":[],"mappings":"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"}
@@ -1,13 +1,6 @@
1
- import { request } from 'undici';
2
1
  import { EasyEdaMcpError } from '../../schemas/common.js';
3
2
  import { getLogger } from '../../utils/logger.js';
4
- async function readBody(stream) {
5
- const chunks = [];
6
- for await (const chunk of stream) {
7
- chunks.push(typeof chunk === 'string' ? Buffer.from(chunk) : chunk);
8
- }
9
- return Buffer.concat(chunks).toString('utf-8');
10
- }
3
+ import { httpRequestWithRetry, DEFAULT_REQUEST_TIMEOUT_MS } from '../base-http-client.js';
11
4
  export class DigiKeyClient {
12
5
  config;
13
6
  logger;
@@ -54,15 +47,15 @@ export class DigiKeyClient {
54
47
  }
55
48
  this.logger.debug('digikey acquiring oauth2 token');
56
49
  const basicAuth = Buffer.from(`${this.clientId}:${this.clientSecret}`).toString('base64');
57
- const { statusCode, body } = await request(this.authUrl, {
50
+ const { statusCode, responseText } = await httpRequestWithRetry(this.authUrl, {
58
51
  method: 'POST',
59
52
  headers: {
60
53
  authorization: `Basic ${basicAuth}`,
61
54
  'content-type': 'application/x-www-form-urlencoded',
62
55
  },
63
56
  body: 'grant_type=client_credentials&client_id=' + encodeURIComponent(this.clientId),
64
- });
65
- const responseText = await readBody(body);
57
+ timeoutMs: DEFAULT_REQUEST_TIMEOUT_MS,
58
+ }, this.logger);
66
59
  if (statusCode < 200 || statusCode >= 300) {
67
60
  throw new EasyEdaMcpError({
68
61
  code: 'VENDOR_API_UNAVAILABLE',
@@ -80,16 +73,15 @@ export class DigiKeyClient {
80
73
  async apiGet(path) {
81
74
  const token = await this.ensureToken();
82
75
  const url = `${this.baseUrl}${path}`;
83
- this.logger.debug({ url }, 'digikey api get');
84
- const { statusCode, body } = await request(url, {
76
+ const { statusCode, responseText } = await httpRequestWithRetry(url, {
85
77
  method: 'GET',
86
78
  headers: {
87
79
  authorization: `Bearer ${token}`,
88
80
  accept: 'application/json',
89
81
  'X-DIGIKEY-Client-Id': this.clientId,
90
82
  },
91
- });
92
- const responseText = await readBody(body);
83
+ timeoutMs: DEFAULT_REQUEST_TIMEOUT_MS,
84
+ }, this.logger);
93
85
  if (statusCode === 429) {
94
86
  throw new EasyEdaMcpError({
95
87
  code: 'RATE_LIMITED',
@@ -112,8 +104,7 @@ export class DigiKeyClient {
112
104
  async apiPost(path, body) {
113
105
  const token = await this.ensureToken();
114
106
  const url = `${this.baseUrl}${path}`;
115
- this.logger.debug({ url }, 'digikey api post');
116
- const { statusCode, body: responseBody } = await request(url, {
107
+ const { statusCode, responseText } = await httpRequestWithRetry(url, {
117
108
  method: 'POST',
118
109
  headers: {
119
110
  authorization: `Bearer ${token}`,
@@ -122,8 +113,8 @@ export class DigiKeyClient {
122
113
  'X-DIGIKEY-Client-Id': this.clientId,
123
114
  },
124
115
  body: JSON.stringify(body),
125
- });
126
- const responseText = await readBody(responseBody);
116
+ timeoutMs: DEFAULT_REQUEST_TIMEOUT_MS,
117
+ }, this.logger);
127
118
  if (statusCode === 429) {
128
119
  throw new EasyEdaMcpError({
129
120
  code: 'RATE_LIMITED',
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/vendors/digikey/client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/vendors/digikey/client.ts"],"names":[],"mappings":"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"}
@@ -1,15 +1,8 @@
1
- import { request } from 'undici';
2
1
  import { EasyEdaMcpError } from '../../schemas/common.js';
3
2
  import { getLogger } from '../../utils/logger.js';
4
- async function readBody(stream) {
5
- const chunks = [];
6
- for await (const chunk of stream) {
7
- chunks.push(typeof chunk === 'string' ? Buffer.from(chunk) : chunk);
8
- }
9
- return Buffer.concat(chunks).toString('utf-8');
10
- }
11
- const MAX_RETRIES = 3;
12
- const BASE_DELAY_MS = 1000;
3
+ import { httpRequestWithRetry, DEFAULT_REQUEST_TIMEOUT_MS } from '../base-http-client.js';
4
+ /** Maximum retry attempts for JLCPCB API calls (3 vs base default 2). */
5
+ const JLCPCB_MAX_RETRIES = 3;
13
6
  export class JlcpcbClient {
14
7
  config;
15
8
  logger;
@@ -45,71 +38,49 @@ export class JlcpcbClient {
45
38
  async requestWithRetry(path, options) {
46
39
  const method = options.method ?? 'POST';
47
40
  const url = `${this.baseUrl}${path}`;
48
- let lastError;
49
- for (let attempt = 1; attempt <= MAX_RETRIES; attempt++) {
41
+ const bodyStr = options.body !== undefined ? JSON.stringify(options.body) : undefined;
42
+ const { statusCode, responseText } = await httpRequestWithRetry(url, {
43
+ method,
44
+ headers: this.authHeaders(),
45
+ body: bodyStr,
46
+ timeoutMs: DEFAULT_REQUEST_TIMEOUT_MS,
47
+ }, this.logger, JLCPCB_MAX_RETRIES);
48
+ if (statusCode === 429) {
49
+ this.logger.warn({ url, statusCode }, 'jlcpcb rate limited');
50
+ throw new EasyEdaMcpError({
51
+ code: 'RATE_LIMITED',
52
+ message: `JLCPCB API rate limit exceeded.`,
53
+ suggestion: 'Retry after a short delay or reduce request frequency.',
54
+ retryable: true,
55
+ });
56
+ }
57
+ if (statusCode >= 500) {
58
+ this.logger.warn({ url, statusCode }, 'jlcpcb server error');
59
+ throw new EasyEdaMcpError({
60
+ code: 'VENDOR_API_UNAVAILABLE',
61
+ message: `JLCPCB API returned status ${statusCode}`,
62
+ suggestion: 'Check JLCPCB credentials and request parameters.',
63
+ retryable: true,
64
+ details: { statusCode, response: responseText.slice(0, 500) },
65
+ });
66
+ }
67
+ if (statusCode < 200 || statusCode >= 300) {
68
+ let parsed = null;
50
69
  try {
51
- this.logger.debug({ url, method, attempt }, 'jlcpcb api call');
52
- const { statusCode, body } = await request(url, {
53
- method,
54
- headers: this.authHeaders(),
55
- body: options.body !== undefined ? JSON.stringify(options.body) : undefined,
56
- });
57
- const responseText = await readBody(body);
58
- if (statusCode === 429) {
59
- const retryAfter = 2000;
60
- this.logger.warn({ url, retryAfter, attempt }, 'jlcpcb rate limited');
61
- if (attempt < MAX_RETRIES) {
62
- await new Promise((resolve) => setTimeout(resolve, retryAfter));
63
- }
64
- continue;
65
- }
66
- if (statusCode >= 500) {
67
- this.logger.warn({ url, statusCode, attempt }, 'jlcpcb server error');
68
- if (attempt < MAX_RETRIES) {
69
- const delay = BASE_DELAY_MS * Math.pow(2, attempt - 1);
70
- await new Promise((resolve) => setTimeout(resolve, delay));
71
- }
72
- continue;
73
- }
74
- if (statusCode < 200 || statusCode >= 300) {
75
- let parsed = null;
76
- try {
77
- parsed = JSON.parse(responseText);
78
- }
79
- catch {
80
- // ignore parse failure
81
- }
82
- throw new EasyEdaMcpError({
83
- code: 'VENDOR_API_UNAVAILABLE',
84
- message: parsed?.message ?? parsed?.error ?? `JLCPCB API returned status ${statusCode}`,
85
- suggestion: 'Check JLCPCB credentials and request parameters.',
86
- retryable: statusCode >= 500,
87
- details: { statusCode, response: responseText.slice(0, 500) },
88
- });
89
- }
90
- return JSON.parse(responseText);
70
+ parsed = JSON.parse(responseText);
91
71
  }
92
- catch (err) {
93
- lastError = err;
94
- if (err instanceof EasyEdaMcpError && !err.retryable) {
95
- throw err;
96
- }
97
- if (attempt < MAX_RETRIES) {
98
- const delay = BASE_DELAY_MS * Math.pow(2, attempt - 1);
99
- this.logger.debug({ url, attempt, delay }, 'jlcpcb retry');
100
- await new Promise((resolve) => setTimeout(resolve, delay));
101
- }
72
+ catch {
73
+ // ignore parse failure
102
74
  }
103
- }
104
- throw lastError instanceof EasyEdaMcpError
105
- ? lastError
106
- : new EasyEdaMcpError({
75
+ throw new EasyEdaMcpError({
107
76
  code: 'VENDOR_API_UNAVAILABLE',
108
- message: 'JLCPCB API request failed after retries.',
109
- suggestion: 'Check network connectivity and JLCPCB API status.',
110
- retryable: true,
111
- details: { error: String(lastError) },
77
+ message: parsed?.message ?? parsed?.error ?? `JLCPCB API returned status ${statusCode}`,
78
+ suggestion: 'Check JLCPCB credentials and request parameters.',
79
+ retryable: statusCode >= 500,
80
+ details: { statusCode, response: responseText.slice(0, 500) },
112
81
  });
82
+ }
83
+ return JSON.parse(responseText);
113
84
  }
114
85
  /**
115
86
  * Request a quotation for a PCB order from JLCPCB.
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/vendors/jlcpcb/client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/vendors/jlcpcb/client.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAElD,OAAO,EAAE,oBAAoB,EAAE,0BAA0B,EAAE,MAAM,wBAAwB,CAAC;AAoD1F,yEAAyE;AACzE,MAAM,kBAAkB,GAAG,CAAC,CAAC;AAE7B,MAAM,OAAO,YAAY;IACf,MAAM,CAAY;IAClB,MAAM,CAAc;IACpB,OAAO,CAAS;IAExB,YAAY,MAAiB;QAC3B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,MAAM,GAAG,SAAS,EAAE,CAAC;QAC1B,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,mBAAmB,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QAE9D,IAAI,MAAM,CAAC,WAAW,KAAK,cAAc,EAAE,CAAC;YAC1C,MAAM,IAAI,eAAe,CAAC;gBACxB,IAAI,EAAE,kBAAkB;gBACxB,OAAO,EAAE,oEAAoE;gBAC7E,UAAU,EACR,qFAAqF;gBACvF,SAAS,EAAE,KAAK;aACjB,CAAC,CAAC;QACL,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,gBAAgB,IAAI,CAAC,MAAM,CAAC,oBAAoB,EAAE,CAAC;YAC7D,MAAM,IAAI,eAAe,CAAC;gBACxB,IAAI,EAAE,qBAAqB;gBAC3B,OAAO,EAAE,iCAAiC;gBAC1C,UAAU,EAAE,sEAAsE;gBAClF,SAAS,EAAE,KAAK;aACjB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAEO,WAAW;QACjB,OAAO;YACL,aAAa,EAAE,IAAI,CAAC,MAAM,CAAC,gBAAgB;YAC3C,iBAAiB,EAAE,IAAI,CAAC,MAAM,CAAC,oBAAoB;YACnD,cAAc,EAAE,kBAAkB;SACnC,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,gBAAgB,CAC5B,IAAY,EACZ,OAA4C;QAE5C,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,MAAM,CAAC;QACxC,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,OAAO,GAAG,IAAI,EAAE,CAAC;QACrC,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAEtF,MAAM,EAAE,UAAU,EAAE,YAAY,EAAE,GAAG,MAAM,oBAAoB,CAC7D,GAAG,EACH;YACE,MAAM;YACN,OAAO,EAAE,IAAI,CAAC,WAAW,EAAE;YAC3B,IAAI,EAAE,OAAO;YACb,SAAS,EAAE,0BAA0B;SACtC,EACD,IAAI,CAAC,MAAM,EACX,kBAAkB,CACnB,CAAC;QAEF,IAAI,UAAU,KAAK,GAAG,EAAE,CAAC;YACvB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,UAAU,EAAE,EAAE,qBAAqB,CAAC,CAAC;YAC7D,MAAM,IAAI,eAAe,CAAC;gBACxB,IAAI,EAAE,cAAc;gBACpB,OAAO,EAAE,iCAAiC;gBAC1C,UAAU,EAAE,wDAAwD;gBACpE,SAAS,EAAE,IAAI;aAChB,CAAC,CAAC;QACL,CAAC;QAED,IAAI,UAAU,IAAI,GAAG,EAAE,CAAC;YACtB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,UAAU,EAAE,EAAE,qBAAqB,CAAC,CAAC;YAC7D,MAAM,IAAI,eAAe,CAAC;gBACxB,IAAI,EAAE,wBAAwB;gBAC9B,OAAO,EAAE,8BAA8B,UAAU,EAAE;gBACnD,UAAU,EAAE,kDAAkD;gBAC9D,SAAS,EAAE,IAAI;gBACf,OAAO,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE;aAC9D,CAAC,CAAC;QACL,CAAC;QAED,IAAI,UAAU,GAAG,GAAG,IAAI,UAAU,IAAI,GAAG,EAAE,CAAC;YAC1C,IAAI,MAAM,GAAgD,IAAI,CAAC;YAC/D,IAAI,CAAC;gBACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAyC,CAAC;YAC5E,CAAC;YAAC,MAAM,CAAC;gBACP,uBAAuB;YACzB,CAAC;YACD,MAAM,IAAI,eAAe,CAAC;gBACxB,IAAI,EAAE,wBAAwB;gBAC9B,OAAO,EAAE,MAAM,EAAE,OAAO,IAAI,MAAM,EAAE,KAAK,IAAI,8BAA8B,UAAU,EAAE;gBACvF,UAAU,EAAE,kDAAkD;gBAC9D,SAAS,EAAE,UAAU,IAAI,GAAG;gBAC5B,OAAO,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE;aAC9D,CAAC,CAAC;QACL,CAAC;QAED,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAM,CAAC;IACvC,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,QAAQ,CAAC,OAA2B;QACxC,OAAO,IAAI,CAAC,gBAAgB,CAAoB,qBAAqB,EAAE;YACrE,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,OAAO;SACd,CAAC,CAAC;IACL,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,UAAU,CAAC,OAA2B;QAC1C,OAAO,IAAI,CAAC,gBAAgB,CAAoB,qBAAqB,EAAE;YACrE,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,OAAO;SACd,CAAC,CAAC;IACL,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,cAAc,CAAC,OAAe;QAClC,OAAO,IAAI,CAAC,gBAAgB,CAC1B,qCAAqC,kBAAkB,CAAC,OAAO,CAAC,EAAE,EAClE,EAAE,MAAM,EAAE,KAAK,EAAE,CAClB,CAAC;IACJ,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,iBAAiB,CAAC,SAAsC;QAC5D,OAAO,IAAI,CAAC,gBAAgB,CAAqB,yBAAyB,EAAE;YAC1E,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,SAAS;SAChB,CAAC,CAAC;IACL,CAAC;CACF"}