@autonome-research/thread-phase-agents 3.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 (79) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +207 -0
  3. package/dist/acp/adapter.d.ts +89 -0
  4. package/dist/acp/adapter.d.ts.map +1 -0
  5. package/dist/acp/adapter.js +461 -0
  6. package/dist/acp/adapter.js.map +1 -0
  7. package/dist/acp/index.d.ts +12 -0
  8. package/dist/acp/index.d.ts.map +1 -0
  9. package/dist/acp/index.js +10 -0
  10. package/dist/acp/index.js.map +1 -0
  11. package/dist/acp/transport.d.ts +82 -0
  12. package/dist/acp/transport.d.ts.map +1 -0
  13. package/dist/acp/transport.js +199 -0
  14. package/dist/acp/transport.js.map +1 -0
  15. package/dist/acp/types.d.ts +157 -0
  16. package/dist/acp/types.d.ts.map +1 -0
  17. package/dist/acp/types.js +34 -0
  18. package/dist/acp/types.js.map +1 -0
  19. package/dist/anthropic/adapter.d.ts +55 -0
  20. package/dist/anthropic/adapter.d.ts.map +1 -0
  21. package/dist/anthropic/adapter.js +259 -0
  22. package/dist/anthropic/adapter.js.map +1 -0
  23. package/dist/anthropic/index.d.ts +8 -0
  24. package/dist/anthropic/index.d.ts.map +1 -0
  25. package/dist/anthropic/index.js +8 -0
  26. package/dist/anthropic/index.js.map +1 -0
  27. package/dist/claude-code/adapter.d.ts +56 -0
  28. package/dist/claude-code/adapter.d.ts.map +1 -0
  29. package/dist/claude-code/adapter.js +319 -0
  30. package/dist/claude-code/adapter.js.map +1 -0
  31. package/dist/claude-code/index.d.ts +8 -0
  32. package/dist/claude-code/index.d.ts.map +1 -0
  33. package/dist/claude-code/index.js +8 -0
  34. package/dist/claude-code/index.js.map +1 -0
  35. package/dist/codex/adapter.d.ts +62 -0
  36. package/dist/codex/adapter.d.ts.map +1 -0
  37. package/dist/codex/adapter.js +258 -0
  38. package/dist/codex/adapter.js.map +1 -0
  39. package/dist/codex/index.d.ts +9 -0
  40. package/dist/codex/index.d.ts.map +1 -0
  41. package/dist/codex/index.js +9 -0
  42. package/dist/codex/index.js.map +1 -0
  43. package/dist/codex-cli/adapter.d.ts +70 -0
  44. package/dist/codex-cli/adapter.d.ts.map +1 -0
  45. package/dist/codex-cli/adapter.js +368 -0
  46. package/dist/codex-cli/adapter.js.map +1 -0
  47. package/dist/codex-cli/index.d.ts +10 -0
  48. package/dist/codex-cli/index.d.ts.map +1 -0
  49. package/dist/codex-cli/index.js +10 -0
  50. package/dist/codex-cli/index.js.map +1 -0
  51. package/dist/hermes/index.d.ts +50 -0
  52. package/dist/hermes/index.d.ts.map +1 -0
  53. package/dist/hermes/index.js +43 -0
  54. package/dist/hermes/index.js.map +1 -0
  55. package/dist/index.d.ts +11 -0
  56. package/dist/index.d.ts.map +1 -0
  57. package/dist/index.js +14 -0
  58. package/dist/index.js.map +1 -0
  59. package/dist/injectors.d.ts +104 -0
  60. package/dist/injectors.d.ts.map +1 -0
  61. package/dist/injectors.js +219 -0
  62. package/dist/injectors.js.map +1 -0
  63. package/dist/openclaw/index.d.ts +54 -0
  64. package/dist/openclaw/index.d.ts.map +1 -0
  65. package/dist/openclaw/index.js +61 -0
  66. package/dist/openclaw/index.js.map +1 -0
  67. package/dist/pi/adapter.d.ts +79 -0
  68. package/dist/pi/adapter.d.ts.map +1 -0
  69. package/dist/pi/adapter.js +396 -0
  70. package/dist/pi/adapter.js.map +1 -0
  71. package/dist/pi/index.d.ts +14 -0
  72. package/dist/pi/index.d.ts.map +1 -0
  73. package/dist/pi/index.js +14 -0
  74. package/dist/pi/index.js.map +1 -0
  75. package/dist/thread-bridge.d.ts +83 -0
  76. package/dist/thread-bridge.d.ts.map +1 -0
  77. package/dist/thread-bridge.js +143 -0
  78. package/dist/thread-bridge.js.map +1 -0
  79. package/package.json +46 -0
@@ -0,0 +1,199 @@
1
+ /**
2
+ * NDJSON JSON-RPC 2.0 transport over a child-process stdio pair.
3
+ *
4
+ * ACP frames messages as newline-delimited JSON — one JSON-RPC envelope
5
+ * per line, no Content-Length headers. The transport owns the byte-level
6
+ * framing, request/response correlation, and notification dispatch. The
7
+ * adapter layer above translates ACP-specific messages into canonical
8
+ * `AgentEvent`s.
9
+ *
10
+ * Single-process scope: each transport instance binds to one subprocess.
11
+ * Disposing it ends the child's stdin and (optionally) signals the child.
12
+ *
13
+ * @internal
14
+ */
15
+ /** @internal */
16
+ export class JsonRpcCallError extends Error {
17
+ method;
18
+ rpcError;
19
+ constructor(method, rpcError) {
20
+ super(`JSON-RPC error from ${method}: ${rpcError.message} (code ${rpcError.code})`);
21
+ this.method = method;
22
+ this.rpcError = rpcError;
23
+ this.name = 'JsonRpcCallError';
24
+ }
25
+ }
26
+ /**
27
+ * Build a transport bound to the given child's stdio. The transport
28
+ * starts reading immediately. Call `dispose()` to release listeners and
29
+ * close stdin.
30
+ *
31
+ * @internal
32
+ */
33
+ export function createAcpTransport(opts) {
34
+ const { child, onNotification, onRequest, onTransportError } = opts;
35
+ const pending = new Map();
36
+ let nextId = 1;
37
+ let buffer = '';
38
+ let disposed = false;
39
+ const writeMessage = (msg) => {
40
+ if (disposed)
41
+ return;
42
+ const line = JSON.stringify(msg) + '\n';
43
+ // child.stdin is Writable; back-pressure is the caller's problem
44
+ // (we don't await drain — ACP messages are small). Write callback
45
+ // catches EPIPE etc. when the subprocess has already exited — those
46
+ // are surfaced via onTransportError, not as uncaught exceptions.
47
+ try {
48
+ child.stdin.write(line, (err) => {
49
+ if (err && !disposed)
50
+ onTransportError?.(err);
51
+ });
52
+ }
53
+ catch (err) {
54
+ if (!disposed && err instanceof Error)
55
+ onTransportError?.(err);
56
+ }
57
+ };
58
+ const handleParsed = (msg) => {
59
+ if (!isJsonRpcMessage(msg)) {
60
+ onTransportError?.(new Error(`malformed JSON-RPC message: ${JSON.stringify(msg).slice(0, 200)}`));
61
+ return;
62
+ }
63
+ if ('id' in msg && 'method' in msg) {
64
+ // Request from agent to client.
65
+ void handleAgentRequest(msg.id, msg.method, msg.params);
66
+ return;
67
+ }
68
+ if ('id' in msg && ('result' in msg || 'error' in msg)) {
69
+ const entry = pending.get(msg.id);
70
+ if (!entry) {
71
+ // Late or unsolicited response — drop quietly. Logging would
72
+ // be the caller's concern if they want it.
73
+ return;
74
+ }
75
+ pending.delete(msg.id);
76
+ if ('error' in msg) {
77
+ entry.reject(new JsonRpcCallError(entry.method, msg.error));
78
+ }
79
+ else {
80
+ entry.resolve(msg.result);
81
+ }
82
+ return;
83
+ }
84
+ if ('method' in msg) {
85
+ // Notification from agent.
86
+ onNotification?.(msg.method, msg.params);
87
+ return;
88
+ }
89
+ onTransportError?.(new Error(`unknown JSON-RPC message shape: ${JSON.stringify(msg).slice(0, 200)}`));
90
+ };
91
+ const handleAgentRequest = async (id, method, params) => {
92
+ if (!onRequest) {
93
+ writeMessage({
94
+ jsonrpc: '2.0',
95
+ id,
96
+ error: { code: -32601, message: `Method not found: ${method}` },
97
+ });
98
+ return;
99
+ }
100
+ try {
101
+ const result = await onRequest(method, params);
102
+ writeMessage({ jsonrpc: '2.0', id, result });
103
+ }
104
+ catch (err) {
105
+ writeMessage({
106
+ jsonrpc: '2.0',
107
+ id,
108
+ error: {
109
+ code: -32603,
110
+ message: err instanceof Error ? err.message : String(err),
111
+ },
112
+ });
113
+ }
114
+ };
115
+ const consumeBuffer = () => {
116
+ while (true) {
117
+ const newlineIdx = buffer.indexOf('\n');
118
+ if (newlineIdx === -1)
119
+ return;
120
+ const line = buffer.slice(0, newlineIdx);
121
+ buffer = buffer.slice(newlineIdx + 1);
122
+ if (line.trim().length === 0)
123
+ continue;
124
+ let parsed;
125
+ try {
126
+ parsed = JSON.parse(line);
127
+ }
128
+ catch (err) {
129
+ onTransportError?.(new Error(`JSON parse error on line: ${line.slice(0, 200)}`));
130
+ continue;
131
+ }
132
+ handleParsed(parsed);
133
+ }
134
+ };
135
+ const onStdoutData = (chunk) => {
136
+ buffer += typeof chunk === 'string' ? chunk : chunk.toString('utf8');
137
+ consumeBuffer();
138
+ };
139
+ const onStdoutEnd = () => {
140
+ if (buffer.trim().length > 0)
141
+ consumeBuffer();
142
+ // Reject any still-pending requests so callers don't hang.
143
+ for (const [id, entry] of pending) {
144
+ entry.reject(new Error(`subprocess stdout closed while waiting on ${entry.method}`));
145
+ pending.delete(id);
146
+ }
147
+ };
148
+ child.stdout.setEncoding('utf8');
149
+ child.stdout.on('data', onStdoutData);
150
+ child.stdout.on('end', onStdoutEnd);
151
+ child.stdout.on('error', (err) => onTransportError?.(err));
152
+ // EPIPE / EBADF on stdin after the child exits would otherwise bubble
153
+ // as an uncaught exception — route to onTransportError instead.
154
+ child.stdin.on('error', (err) => {
155
+ if (!disposed)
156
+ onTransportError?.(err);
157
+ });
158
+ return {
159
+ request(method, params) {
160
+ if (disposed) {
161
+ return Promise.reject(new Error('transport disposed'));
162
+ }
163
+ const id = nextId++;
164
+ const promise = new Promise((resolve, reject) => {
165
+ pending.set(id, { resolve, reject, method });
166
+ });
167
+ writeMessage({ jsonrpc: '2.0', id, method, params });
168
+ return promise;
169
+ },
170
+ notify(method, params) {
171
+ writeMessage({ jsonrpc: '2.0', method, params });
172
+ },
173
+ dispose() {
174
+ if (disposed)
175
+ return;
176
+ disposed = true;
177
+ child.stdout.removeListener('data', onStdoutData);
178
+ child.stdout.removeListener('end', onStdoutEnd);
179
+ try {
180
+ child.stdin.end();
181
+ }
182
+ catch {
183
+ // already closed
184
+ }
185
+ // Reject any remaining pending so callers unblock.
186
+ for (const [id, entry] of pending) {
187
+ entry.reject(new Error('transport disposed'));
188
+ pending.delete(id);
189
+ }
190
+ },
191
+ };
192
+ }
193
+ function isJsonRpcMessage(value) {
194
+ return (value !== null &&
195
+ typeof value === 'object' &&
196
+ 'jsonrpc' in value &&
197
+ value.jsonrpc === '2.0');
198
+ }
199
+ //# sourceMappingURL=transport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport.js","sourceRoot":"","sources":["../../src/acp/transport.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,157 @@
1
+ /**
2
+ * Agent Client Protocol — TypeScript types for the subset this chassis
3
+ * implements. Faithful to the ACP spec at
4
+ * https://agentclientprotocol.com/protocol — field names are literal.
5
+ *
6
+ * We model only the messages the chassis sends or receives: initialize,
7
+ * session/new, session/prompt, session/update notifications, and
8
+ * session/cancel. Optional features (filesystem ops, terminals,
9
+ * session/request_permission, MCP transport configuration) are out of
10
+ * scope for v1 and surface as `native` events when encountered.
11
+ *
12
+ * @internal
13
+ */
14
+ /** Negotiated at initialize time; the spec is currently at v1. */
15
+ export declare const ACP_PROTOCOL_VERSION = 1;
16
+ export type SessionId = string;
17
+ export interface Implementation {
18
+ name: string;
19
+ version: string;
20
+ }
21
+ export interface ClientCapabilities {
22
+ fs?: {
23
+ readTextFile?: boolean;
24
+ writeTextFile?: boolean;
25
+ };
26
+ terminal?: boolean;
27
+ }
28
+ export interface AgentCapabilities {
29
+ promptCapabilities?: {
30
+ image?: boolean;
31
+ audio?: boolean;
32
+ embeddedContext?: boolean;
33
+ };
34
+ loadSession?: boolean;
35
+ [key: string]: unknown;
36
+ }
37
+ export interface AuthMethod {
38
+ id: string;
39
+ name: string;
40
+ description?: string;
41
+ }
42
+ export interface InitializeRequest {
43
+ protocolVersion: number;
44
+ clientInfo?: Implementation;
45
+ clientCapabilities?: ClientCapabilities;
46
+ }
47
+ export interface InitializeResponse {
48
+ protocolVersion: number;
49
+ agentInfo?: Implementation;
50
+ agentCapabilities?: AgentCapabilities;
51
+ authMethods?: AuthMethod[];
52
+ }
53
+ export interface McpServer {
54
+ name?: string;
55
+ command?: string;
56
+ args?: string[];
57
+ env?: Record<string, string>;
58
+ }
59
+ export interface NewSessionRequest {
60
+ cwd: string;
61
+ mcpServers: McpServer[];
62
+ }
63
+ export interface NewSessionResponse {
64
+ sessionId: SessionId;
65
+ }
66
+ export interface LoadSessionRequest {
67
+ sessionId: SessionId;
68
+ cwd: string;
69
+ mcpServers: McpServer[];
70
+ }
71
+ export type ContentBlock = {
72
+ type: 'text';
73
+ text: string;
74
+ } | {
75
+ type: 'image';
76
+ data: string;
77
+ mimeType: string;
78
+ uri?: string;
79
+ } | {
80
+ type: 'audio';
81
+ data: string;
82
+ mimeType: string;
83
+ } | {
84
+ type: 'resource_link';
85
+ uri: string;
86
+ name: string;
87
+ mimeType?: string;
88
+ } | {
89
+ type: 'resource';
90
+ resource: unknown;
91
+ };
92
+ /** Extract plain text from a single content block (best-effort). */
93
+ export declare function contentBlockToText(block: ContentBlock): string;
94
+ export interface PromptRequest {
95
+ sessionId: SessionId;
96
+ prompt: ContentBlock[];
97
+ }
98
+ export type StopReason = 'end_turn' | 'max_tokens' | 'max_turn_requests' | 'refusal' | 'cancelled';
99
+ export interface PromptResponse {
100
+ stopReason: StopReason;
101
+ }
102
+ export type ToolCallStatus = 'pending' | 'in_progress' | 'completed' | 'failed' | 'cancelled';
103
+ /**
104
+ * Known session/update variants. Unknown variants (future versions, vendor
105
+ * extensions) are represented at runtime by the same shape with an
106
+ * unrecognized `sessionUpdate` string — the adapter routes those to
107
+ * `native` events without narrowing.
108
+ */
109
+ export type SessionUpdate = {
110
+ sessionUpdate: 'agent_message_chunk';
111
+ content: ContentBlock;
112
+ } | {
113
+ sessionUpdate: 'agent_thought_chunk';
114
+ content: ContentBlock;
115
+ } | {
116
+ sessionUpdate: 'user_message_chunk';
117
+ content: ContentBlock;
118
+ } | {
119
+ sessionUpdate: 'tool_call';
120
+ toolCallId: string;
121
+ title?: string;
122
+ kind?: string;
123
+ status?: ToolCallStatus;
124
+ content?: ContentBlock[];
125
+ rawInput?: unknown;
126
+ } | {
127
+ sessionUpdate: 'tool_call_update';
128
+ toolCallId: string;
129
+ status?: ToolCallStatus;
130
+ content?: ContentBlock[];
131
+ title?: string;
132
+ rawInput?: unknown;
133
+ rawOutput?: unknown;
134
+ } | {
135
+ sessionUpdate: 'plan';
136
+ entries?: unknown[];
137
+ } | {
138
+ sessionUpdate: 'mode';
139
+ mode?: unknown;
140
+ };
141
+ export interface SessionNotificationParams {
142
+ sessionId: SessionId;
143
+ update: SessionUpdate;
144
+ }
145
+ export interface CancelNotificationParams {
146
+ sessionId: SessionId;
147
+ }
148
+ export declare const ACP_METHODS: {
149
+ readonly initialize: "initialize";
150
+ readonly newSession: "session/new";
151
+ readonly loadSession: "session/load";
152
+ readonly prompt: "session/prompt";
153
+ readonly cancel: "session/cancel";
154
+ readonly sessionUpdate: "session/update";
155
+ readonly requestPermission: "session/request_permission";
156
+ };
157
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/acp/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Agent Client Protocol — TypeScript types for the subset this chassis
3
+ * implements. Faithful to the ACP spec at
4
+ * https://agentclientprotocol.com/protocol — field names are literal.
5
+ *
6
+ * We model only the messages the chassis sends or receives: initialize,
7
+ * session/new, session/prompt, session/update notifications, and
8
+ * session/cancel. Optional features (filesystem ops, terminals,
9
+ * session/request_permission, MCP transport configuration) are out of
10
+ * scope for v1 and surface as `native` events when encountered.
11
+ *
12
+ * @internal
13
+ */
14
+ /** Negotiated at initialize time; the spec is currently at v1. */
15
+ export const ACP_PROTOCOL_VERSION = 1;
16
+ /** Extract plain text from a single content block (best-effort). */
17
+ export function contentBlockToText(block) {
18
+ if (block.type === 'text')
19
+ return block.text;
20
+ if (block.type === 'resource_link')
21
+ return `[resource: ${block.name} (${block.uri})]`;
22
+ return `[${block.type}]`;
23
+ }
24
+ // --- ACP method names (string literals so call sites are uniform) ---
25
+ export const ACP_METHODS = {
26
+ initialize: 'initialize',
27
+ newSession: 'session/new',
28
+ loadSession: 'session/load',
29
+ prompt: 'session/prompt',
30
+ cancel: 'session/cancel',
31
+ sessionUpdate: 'session/update',
32
+ requestPermission: 'session/request_permission',
33
+ };
34
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/acp/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,kEAAkE;AAClE,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC;AA8EtC,oEAAoE;AACpE,MAAM,UAAU,kBAAkB,CAAC,KAAmB;IACpD,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM;QAAE,OAAO,KAAK,CAAC,IAAI,CAAC;IAC7C,IAAI,KAAK,CAAC,IAAI,KAAK,eAAe;QAAE,OAAO,cAAc,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,GAAG,IAAI,CAAC;IACtF,OAAO,IAAI,KAAK,CAAC,IAAI,GAAG,CAAC;AAC3B,CAAC;AAuED,uEAAuE;AAEvE,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,UAAU,EAAE,YAAY;IACxB,UAAU,EAAE,aAAa;IACzB,WAAW,EAAE,cAAc;IAC3B,MAAM,EAAE,gBAAgB;IACxB,MAAM,EAAE,gBAAgB;IACxB,aAAa,EAAE,gBAAgB;IAC/B,iBAAiB,EAAE,4BAA4B;CACvC,CAAC"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * Anthropic adapter — in-process via `@anthropic-ai/sdk`.
3
+ *
4
+ * Single-turn. The adapter streams from `client.messages.stream(...)`,
5
+ * translates Anthropic's RawMessageStreamEvent union to canonical
6
+ * `AgentEvent`s, and returns when the stream ends. Tool-use loops are
7
+ * the caller's responsibility — the adapter surfaces `tool_call` events
8
+ * but does not execute tools; on subsequent calls the caller passes the
9
+ * tool result back in `messages` as a user `tool_result` block.
10
+ *
11
+ * Capabilities:
12
+ * streaming 'text'
13
+ * cancellation 'cooperative' (Anthropic SDK accepts an AbortSignal)
14
+ * resumption 'none' (no native session id; pass history)
15
+ * structuredOutput 'prompted' (uses thread-phase's <response> parser)
16
+ *
17
+ * Extended thinking surfaces as canonical `thinking` events. Vision /
18
+ * citations / cache-control blocks pass through transparently in
19
+ * config.messages; we don't intercept them.
20
+ *
21
+ * @internal
22
+ */
23
+ import Anthropic from '@anthropic-ai/sdk';
24
+ import type { MessageParam, Tool as AnthropicTool, ToolChoice, ThinkingConfigParam } from '@anthropic-ai/sdk/resources/messages.js';
25
+ import { type AgentAdapterMeta, type StructuredOutputConfig } from '@autonome-research/thread-phase/agents';
26
+ /** @internal */
27
+ export interface AnthropicAgentConfig {
28
+ /** Model name, e.g. 'claude-opus-4-7' or 'claude-sonnet-4-6'. */
29
+ model: string;
30
+ /** Conversation messages. The adapter prepends/appends nothing. */
31
+ messages: MessageParam[];
32
+ /** System prompt. */
33
+ systemPrompt?: string;
34
+ /** Optional tools the model may call. The adapter emits tool_call events; the caller executes and feeds tool_result back on the next call. */
35
+ tools?: AnthropicTool[];
36
+ /** Tool-choice control. */
37
+ toolChoice?: ToolChoice;
38
+ /** max_tokens — default 4096. */
39
+ maxTokens?: number;
40
+ /** Temperature. */
41
+ temperature?: number;
42
+ /** Optional thinking config (extended thinking). */
43
+ thinking?: ThinkingConfigParam;
44
+ /** Optional pre-built client. Useful for DI in tests. */
45
+ client?: Anthropic;
46
+ /** API key. Defaults to ANTHROPIC_API_KEY env var. */
47
+ apiKey?: string;
48
+ /** Base URL override. */
49
+ baseURL?: string;
50
+ /** Optional structured-output spec (prompted path). */
51
+ outputSchema?: StructuredOutputConfig;
52
+ }
53
+ /** @internal */
54
+ export declare const anthropicAgent: AgentAdapterMeta<AnthropicAgentConfig>;
55
+ //# sourceMappingURL=adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../src/anthropic/adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,SAAS,MAAM,mBAAmB,CAAC;AAC1C,OAAO,KAAK,EACV,YAAY,EACZ,IAAI,IAAI,aAAa,EACrB,UAAU,EAEV,mBAAmB,EACpB,MAAM,yCAAyC,CAAC;AAEjD,OAAO,EASL,KAAK,gBAAgB,EAKrB,KAAK,sBAAsB,EAC5B,MAAM,wCAAwC,CAAC;AAKhD,gBAAgB;AAChB,MAAM,WAAW,oBAAoB;IACnC,iEAAiE;IACjE,KAAK,EAAE,MAAM,CAAC;IACd,mEAAmE;IACnE,QAAQ,EAAE,YAAY,EAAE,CAAC;IACzB,qBAAqB;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,8IAA8I;IAC9I,KAAK,CAAC,EAAE,aAAa,EAAE,CAAC;IACxB,2BAA2B;IAC3B,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,iCAAiC;IACjC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mBAAmB;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,oDAAoD;IACpD,QAAQ,CAAC,EAAE,mBAAmB,CAAC;IAC/B,yDAAyD;IACzD,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,sDAAsD;IACtD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,yBAAyB;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,uDAAuD;IACvD,YAAY,CAAC,EAAE,sBAAsB,CAAC;CACvC;AAED,gBAAgB;AAChB,eAAO,MAAM,cAAc,EAAE,gBAAgB,CAAC,oBAAoB,CAShE,CAAC"}