glm-acp-agent 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 (102) hide show
  1. package/README.md +365 -0
  2. package/dist/index.d.ts +3 -0
  3. package/dist/index.d.ts.map +1 -0
  4. package/dist/index.js +62 -0
  5. package/dist/index.js.map +1 -0
  6. package/dist/llm/credentials.d.ts +15 -0
  7. package/dist/llm/credentials.d.ts.map +1 -0
  8. package/dist/llm/credentials.js +54 -0
  9. package/dist/llm/credentials.js.map +1 -0
  10. package/dist/llm/glm-client.d.ts +63 -0
  11. package/dist/llm/glm-client.d.ts.map +1 -0
  12. package/dist/llm/glm-client.js +217 -0
  13. package/dist/llm/glm-client.js.map +1 -0
  14. package/dist/llm/logger.d.ts +19 -0
  15. package/dist/llm/logger.d.ts.map +1 -0
  16. package/dist/llm/logger.js +44 -0
  17. package/dist/llm/logger.js.map +1 -0
  18. package/dist/protocol/agent.d.ts +77 -0
  19. package/dist/protocol/agent.d.ts.map +1 -0
  20. package/dist/protocol/agent.js +732 -0
  21. package/dist/protocol/agent.js.map +1 -0
  22. package/dist/protocol/connection.d.ts +9 -0
  23. package/dist/protocol/connection.d.ts.map +1 -0
  24. package/dist/protocol/connection.js +18 -0
  25. package/dist/protocol/connection.js.map +1 -0
  26. package/dist/protocol/image-preprocessor.d.ts +32 -0
  27. package/dist/protocol/image-preprocessor.d.ts.map +1 -0
  28. package/dist/protocol/image-preprocessor.js +149 -0
  29. package/dist/protocol/image-preprocessor.js.map +1 -0
  30. package/dist/protocol/session-store.d.ts +54 -0
  31. package/dist/protocol/session-store.d.ts.map +1 -0
  32. package/dist/protocol/session-store.js +109 -0
  33. package/dist/protocol/session-store.js.map +1 -0
  34. package/dist/protocol/system-prompt.d.ts +29 -0
  35. package/dist/protocol/system-prompt.d.ts.map +1 -0
  36. package/dist/protocol/system-prompt.js +103 -0
  37. package/dist/protocol/system-prompt.js.map +1 -0
  38. package/dist/setup.d.ts +8 -0
  39. package/dist/setup.d.ts.map +1 -0
  40. package/dist/setup.js +95 -0
  41. package/dist/setup.js.map +1 -0
  42. package/dist/tests/agent.test.d.ts +2 -0
  43. package/dist/tests/agent.test.d.ts.map +1 -0
  44. package/dist/tests/agent.test.js +1118 -0
  45. package/dist/tests/agent.test.js.map +1 -0
  46. package/dist/tests/credentials.test.d.ts +2 -0
  47. package/dist/tests/credentials.test.d.ts.map +1 -0
  48. package/dist/tests/credentials.test.js +112 -0
  49. package/dist/tests/credentials.test.js.map +1 -0
  50. package/dist/tests/executor.test.d.ts +2 -0
  51. package/dist/tests/executor.test.d.ts.map +1 -0
  52. package/dist/tests/executor.test.js +497 -0
  53. package/dist/tests/executor.test.js.map +1 -0
  54. package/dist/tests/glm-client.test.d.ts +2 -0
  55. package/dist/tests/glm-client.test.d.ts.map +1 -0
  56. package/dist/tests/glm-client.test.js +205 -0
  57. package/dist/tests/glm-client.test.js.map +1 -0
  58. package/dist/tests/image-preprocessor.test.d.ts +2 -0
  59. package/dist/tests/image-preprocessor.test.d.ts.map +1 -0
  60. package/dist/tests/image-preprocessor.test.js +133 -0
  61. package/dist/tests/image-preprocessor.test.js.map +1 -0
  62. package/dist/tests/integration.test.d.ts +2 -0
  63. package/dist/tests/integration.test.d.ts.map +1 -0
  64. package/dist/tests/integration.test.js +192 -0
  65. package/dist/tests/integration.test.js.map +1 -0
  66. package/dist/tests/logger.test.d.ts +2 -0
  67. package/dist/tests/logger.test.d.ts.map +1 -0
  68. package/dist/tests/logger.test.js +14 -0
  69. package/dist/tests/logger.test.js.map +1 -0
  70. package/dist/tests/mcp-arg-remap.test.d.ts +2 -0
  71. package/dist/tests/mcp-arg-remap.test.d.ts.map +1 -0
  72. package/dist/tests/mcp-arg-remap.test.js +65 -0
  73. package/dist/tests/mcp-arg-remap.test.js.map +1 -0
  74. package/dist/tests/vision-mcp-client.test.d.ts +2 -0
  75. package/dist/tests/vision-mcp-client.test.d.ts.map +1 -0
  76. package/dist/tests/vision-mcp-client.test.js +129 -0
  77. package/dist/tests/vision-mcp-client.test.js.map +1 -0
  78. package/dist/tests/zai-mcp-client.test.d.ts +2 -0
  79. package/dist/tests/zai-mcp-client.test.d.ts.map +1 -0
  80. package/dist/tests/zai-mcp-client.test.js +386 -0
  81. package/dist/tests/zai-mcp-client.test.js.map +1 -0
  82. package/dist/tools/definitions.d.ts +18 -0
  83. package/dist/tools/definitions.d.ts.map +1 -0
  84. package/dist/tools/definitions.js +149 -0
  85. package/dist/tools/definitions.js.map +1 -0
  86. package/dist/tools/executor.d.ts +48 -0
  87. package/dist/tools/executor.d.ts.map +1 -0
  88. package/dist/tools/executor.js +670 -0
  89. package/dist/tools/executor.js.map +1 -0
  90. package/dist/tools/mcp-arg-remap.d.ts +21 -0
  91. package/dist/tools/mcp-arg-remap.d.ts.map +1 -0
  92. package/dist/tools/mcp-arg-remap.js +70 -0
  93. package/dist/tools/mcp-arg-remap.js.map +1 -0
  94. package/dist/tools/vision-mcp-client.d.ts +38 -0
  95. package/dist/tools/vision-mcp-client.d.ts.map +1 -0
  96. package/dist/tools/vision-mcp-client.js +191 -0
  97. package/dist/tools/vision-mcp-client.js.map +1 -0
  98. package/dist/tools/zai-mcp-client.d.ts +24 -0
  99. package/dist/tools/zai-mcp-client.d.ts.map +1 -0
  100. package/dist/tools/zai-mcp-client.js +189 -0
  101. package/dist/tools/zai-mcp-client.js.map +1 -0
  102. package/package.json +37 -0
@@ -0,0 +1,497 @@
1
+ import test from "node:test";
2
+ import assert from "node:assert/strict";
3
+ import { mkdtempSync, rmSync } from "node:fs";
4
+ import { tmpdir } from "node:os";
5
+ import { join } from "node:path";
6
+ import { writeCredentials } from "../llm/credentials.js";
7
+ import { ToolExecutor } from "../tools/executor.js";
8
+ function createConnectionStub(opts = {}) {
9
+ const updates = [];
10
+ const permissionRequests = [];
11
+ const terminalCalls = [];
12
+ return {
13
+ updates,
14
+ permissionRequests,
15
+ terminalCalls,
16
+ async sessionUpdate(payload) {
17
+ updates.push(payload);
18
+ },
19
+ async readTextFile(_params) {
20
+ if (opts.readError)
21
+ throw new Error("file not found");
22
+ return { content: "hello" };
23
+ },
24
+ async writeTextFile(_params) {
25
+ if (opts.writeError)
26
+ throw new Error("permission denied");
27
+ },
28
+ async createTerminal(params) {
29
+ terminalCalls.push(params);
30
+ return {
31
+ id: "term-1",
32
+ async waitForExit() {
33
+ return { exitCode: 0 };
34
+ },
35
+ async currentOutput() {
36
+ return { output: opts.terminalOutput ?? "(stub)" };
37
+ },
38
+ async release() {
39
+ /* noop */
40
+ },
41
+ };
42
+ },
43
+ async requestPermission(params) {
44
+ permissionRequests.push(params);
45
+ switch (opts.permission ?? "allow") {
46
+ case "allow":
47
+ return { outcome: { outcome: "selected", optionId: "allow" } };
48
+ case "reject":
49
+ return { outcome: { outcome: "selected", optionId: "reject" } };
50
+ case "cancelled":
51
+ return { outcome: { outcome: "cancelled" } };
52
+ }
53
+ },
54
+ };
55
+ }
56
+ const FULL_CAPS = {
57
+ fs: { readTextFile: true, writeTextFile: true },
58
+ terminal: true,
59
+ };
60
+ function jsonResponse(body, init = {}) {
61
+ const headers = new Headers(init.headers);
62
+ headers.set("Content-Type", "application/json");
63
+ if (init.sessionId)
64
+ headers.set("MCP-Session-Id", init.sessionId);
65
+ return new Response(JSON.stringify(body), { ...init, headers });
66
+ }
67
+ function createFetchStub(responses) {
68
+ const calls = [];
69
+ const fetchStub = async (url, init) => {
70
+ assert.ok(init, "fetch init is required");
71
+ const body = typeof init.body === "string" ? JSON.parse(init.body) : {};
72
+ const headers = new Headers(init.headers);
73
+ calls.push({ url: String(url), init, body, headers });
74
+ const response = responses.shift();
75
+ assert.ok(response, "unexpected fetch call");
76
+ return response;
77
+ };
78
+ return { calls, fetchStub };
79
+ }
80
+ async function withStoredApiKey(fn) {
81
+ const dir = mkdtempSync(join(tmpdir(), "glm-executor-creds-"));
82
+ const oldEnv = process.env["Z_AI_API_KEY"];
83
+ const oldXdg = process.env["XDG_CONFIG_HOME"];
84
+ try {
85
+ delete process.env["Z_AI_API_KEY"];
86
+ process.env["XDG_CONFIG_HOME"] = dir;
87
+ writeCredentials("from-disk", join(dir, "glm-acp-agent", "credentials.json"));
88
+ return await fn();
89
+ }
90
+ finally {
91
+ if (oldEnv === undefined)
92
+ delete process.env["Z_AI_API_KEY"];
93
+ else
94
+ process.env["Z_AI_API_KEY"] = oldEnv;
95
+ if (oldXdg === undefined)
96
+ delete process.env["XDG_CONFIG_HOME"];
97
+ else
98
+ process.env["XDG_CONFIG_HOME"] = oldXdg;
99
+ rmSync(dir, { recursive: true, force: true });
100
+ }
101
+ }
102
+ async function withMockedFetch(responses, fn) {
103
+ const oldFetch = globalThis.fetch;
104
+ const { calls, fetchStub } = createFetchStub(responses);
105
+ try {
106
+ globalThis.fetch = fetchStub;
107
+ return await fn(calls);
108
+ }
109
+ finally {
110
+ globalThis.fetch = oldFetch;
111
+ }
112
+ }
113
+ // ---------------------------------------------------------------------------
114
+ // Argument parsing
115
+ // ---------------------------------------------------------------------------
116
+ test("invalid JSON arguments yield a failed tool_call notification", async () => {
117
+ const conn = createConnectionStub();
118
+ const exec = new ToolExecutor(conn, "s1", FULL_CAPS);
119
+ const result = await exec.execute("tc1", "read_file", "{ not json");
120
+ assert.match(result.content, /could not parse tool arguments as JSON/);
121
+ const last = conn.updates.at(-1);
122
+ assert.equal(last.update.sessionUpdate, "tool_call");
123
+ assert.equal(last.update.status, "failed");
124
+ });
125
+ test("unknown tool name yields a failed tool_call notification", async () => {
126
+ const conn = createConnectionStub();
127
+ const exec = new ToolExecutor(conn, "s1", FULL_CAPS);
128
+ const result = await exec.execute("tc1", "frobnicate", "{}");
129
+ assert.match(result.content, /unknown tool/);
130
+ const last = conn.updates.at(-1);
131
+ assert.equal(last.update.status, "failed");
132
+ });
133
+ test("empty arguments string is accepted as empty object", async () => {
134
+ const conn = createConnectionStub({ readError: true });
135
+ const exec = new ToolExecutor(conn, "s1", FULL_CAPS);
136
+ const result = await exec.execute("tc1", "read_file", "");
137
+ // Path is empty so the tool reports an error, not a JSON parse error.
138
+ assert.match(result.content, /path.*required/);
139
+ });
140
+ // ---------------------------------------------------------------------------
141
+ // Capability gating
142
+ // ---------------------------------------------------------------------------
143
+ test("read_file is unavailable without fs.readTextFile capability", async () => {
144
+ const conn = createConnectionStub();
145
+ const exec = new ToolExecutor(conn, "s1", { fs: {} });
146
+ const result = await exec.execute("tc1", "read_file", JSON.stringify({ path: "/x" }));
147
+ assert.match(result.content, /does not advertise the fs.readTextFile capability/);
148
+ });
149
+ test("write_file is unavailable without fs.writeTextFile capability", async () => {
150
+ const conn = createConnectionStub();
151
+ const exec = new ToolExecutor(conn, "s1", { fs: { readTextFile: true } });
152
+ const result = await exec.execute("tc1", "write_file", JSON.stringify({ path: "/x", content: "hi" }));
153
+ assert.match(result.content, /does not advertise the fs.writeTextFile capability/);
154
+ });
155
+ test("list_files / run_command are unavailable without terminal capability", async () => {
156
+ const conn = createConnectionStub();
157
+ const exec = new ToolExecutor(conn, "s1", { fs: {} });
158
+ const ls = await exec.execute("tc1", "list_files", JSON.stringify({ path: "/" }));
159
+ assert.match(ls.content, /does not advertise the terminal capability/);
160
+ const rc = await exec.execute("tc2", "run_command", JSON.stringify({ command: "ls" }));
161
+ assert.match(rc.content, /does not advertise the terminal capability/);
162
+ });
163
+ // ---------------------------------------------------------------------------
164
+ // read_file
165
+ // ---------------------------------------------------------------------------
166
+ test("read_file success path emits in_progress and completed updates", async () => {
167
+ const conn = createConnectionStub();
168
+ const exec = new ToolExecutor(conn, "s1", FULL_CAPS);
169
+ const result = await exec.execute("tc1", "read_file", JSON.stringify({ path: "/x.txt" }));
170
+ assert.equal(result.content, "hello");
171
+ const sequence = conn.updates.map((u) => ({
172
+ type: u.update.sessionUpdate,
173
+ status: u.update.status,
174
+ }));
175
+ assert.deepEqual(sequence, [
176
+ { type: "tool_call", status: "in_progress" },
177
+ { type: "tool_call_update", status: "completed" },
178
+ ]);
179
+ });
180
+ test("read_file failure is reported with status=failed and an error message", async () => {
181
+ const conn = createConnectionStub({ readError: true });
182
+ const exec = new ToolExecutor(conn, "s1", FULL_CAPS);
183
+ const result = await exec.execute("tc1", "read_file", JSON.stringify({ path: "/x.txt" }));
184
+ assert.match(result.content, /Error reading file:/);
185
+ const last = conn.updates.at(-1);
186
+ assert.equal(last.update.status, "failed");
187
+ });
188
+ // ---------------------------------------------------------------------------
189
+ // write_file (permission flow)
190
+ // ---------------------------------------------------------------------------
191
+ test("write_file requests permission, then transitions through pending → in_progress → completed", async () => {
192
+ const conn = createConnectionStub({ permission: "allow" });
193
+ const exec = new ToolExecutor(conn, "s1", FULL_CAPS);
194
+ const result = await exec.execute("tc1", "write_file", JSON.stringify({ path: "/y.txt", content: "data" }));
195
+ assert.match(result.content, /written successfully/);
196
+ assert.equal(conn.permissionRequests.length, 1);
197
+ const sequence = conn.updates.map((u) => ({
198
+ type: u.update.sessionUpdate,
199
+ status: u.update.status,
200
+ }));
201
+ assert.deepEqual(sequence, [
202
+ { type: "tool_call", status: "pending" },
203
+ { type: "tool_call_update", status: "in_progress" },
204
+ { type: "tool_call_update", status: "completed" },
205
+ ]);
206
+ });
207
+ test("write_file rejected by user marks call failed and skips writing", async () => {
208
+ const conn = createConnectionStub({ permission: "reject" });
209
+ const exec = new ToolExecutor(conn, "s1", FULL_CAPS);
210
+ const result = await exec.execute("tc1", "write_file", JSON.stringify({ path: "/y.txt", content: "data" }));
211
+ assert.match(result.content, /rejected by user/i);
212
+ const last = conn.updates.at(-1);
213
+ assert.equal(last.update.status, "failed");
214
+ });
215
+ test("write_file cancelled by user marks call failed", async () => {
216
+ const conn = createConnectionStub({ permission: "cancelled" });
217
+ const exec = new ToolExecutor(conn, "s1", FULL_CAPS);
218
+ const result = await exec.execute("tc1", "write_file", JSON.stringify({ path: "/y.txt", content: "data" }));
219
+ assert.match(result.content, /cancelled by user/i);
220
+ const last = conn.updates.at(-1);
221
+ assert.equal(last.update.status, "failed");
222
+ });
223
+ // ---------------------------------------------------------------------------
224
+ // run_command
225
+ // ---------------------------------------------------------------------------
226
+ test("run_command rejects empty input", async () => {
227
+ const conn = createConnectionStub();
228
+ const exec = new ToolExecutor(conn, "s1", FULL_CAPS);
229
+ const result = await exec.execute("tc1", "run_command", JSON.stringify({ command: " " }));
230
+ assert.match(result.content, /non-empty string/);
231
+ const last = conn.updates.at(-1);
232
+ assert.equal(last.update.status, "failed");
233
+ });
234
+ test("run_command runs through sh -c so quoting/pipes work", async () => {
235
+ const conn = createConnectionStub({ terminalOutput: "/tmp" });
236
+ const exec = new ToolExecutor(conn, "s1", FULL_CAPS);
237
+ const result = await exec.execute("tc1", "run_command", JSON.stringify({ command: "echo $HOME | tr a-z A-Z" }));
238
+ assert.equal(result.content, "/tmp");
239
+ const call = conn.terminalCalls[0];
240
+ assert.equal(call?.command, "sh");
241
+ assert.deepEqual(call?.args, ["-c", "echo $HOME | tr a-z A-Z"]);
242
+ });
243
+ // ---------------------------------------------------------------------------
244
+ // list_files
245
+ // ---------------------------------------------------------------------------
246
+ test("list_files runs through sh -c with shell-quoted path", async () => {
247
+ const conn = createConnectionStub({ terminalOutput: "drwxr-xr-x ..." });
248
+ const exec = new ToolExecutor(conn, "s1", FULL_CAPS);
249
+ const result = await exec.execute("tc1", "list_files", JSON.stringify({ path: "/tmp/with space" }));
250
+ assert.match(result.content, /drwxr-xr-x/);
251
+ const call = conn.terminalCalls[0];
252
+ assert.equal(call?.command, "sh");
253
+ assert.equal(call?.args?.[0], "-c");
254
+ assert.match(call?.args?.[1] ?? "", /^ls -la --/);
255
+ assert.match(call?.args?.[1] ?? "", /'\/tmp\/with space'/);
256
+ });
257
+ test("list_files rejects empty path", async () => {
258
+ const conn = createConnectionStub();
259
+ const exec = new ToolExecutor(conn, "s1", FULL_CAPS);
260
+ const result = await exec.execute("tc1", "list_files", JSON.stringify({ path: "" }));
261
+ assert.match(result.content, /non-empty string/);
262
+ });
263
+ // ---------------------------------------------------------------------------
264
+ // web_search / web_reader via Z.AI Coding Plan MCP
265
+ // ---------------------------------------------------------------------------
266
+ test("web_search uses stored credentials and calls the Coding Plan MCP search tool", async () => {
267
+ await withStoredApiKey(async () => {
268
+ await withMockedFetch([
269
+ jsonResponse({
270
+ jsonrpc: "2.0",
271
+ id: 1,
272
+ result: { protocolVersion: "2025-06-18", capabilities: {} },
273
+ }, { sessionId: "search-session" }),
274
+ new Response(null, { status: 202 }),
275
+ jsonResponse({
276
+ jsonrpc: "2.0",
277
+ id: 2,
278
+ result: { tools: [{ name: "webSearchPrime", inputSchema: { properties: { search_query: { type: "string" } } } }] },
279
+ }),
280
+ jsonResponse({
281
+ jsonrpc: "2.0",
282
+ id: 3,
283
+ result: {
284
+ content: [
285
+ {
286
+ type: "text",
287
+ text: JSON.stringify({
288
+ search_result: [
289
+ {
290
+ title: "GLM Coding Plan",
291
+ link: "https://z.ai/",
292
+ media: "Z.AI",
293
+ publish_date: "2026-04-29",
294
+ content: "MCP quota path",
295
+ },
296
+ ],
297
+ }),
298
+ },
299
+ ],
300
+ },
301
+ }),
302
+ ], async (calls) => {
303
+ const conn = createConnectionStub();
304
+ const exec = new ToolExecutor(conn, "s1", FULL_CAPS);
305
+ const result = await exec.execute("tc-web-search", "web_search", JSON.stringify({ query: "glm coding plan", count: 1 }));
306
+ assert.match(result.content, /\[1\] GLM Coding Plan/);
307
+ assert.match(result.content, /URL: https:\/\/z\.ai\//);
308
+ assert.equal(calls.length, 4);
309
+ assert.ok(calls.every((call) => call.url === "https://api.z.ai/api/mcp/web_search_prime/mcp"));
310
+ assert.equal(calls[0]?.headers.get("Authorization"), "Bearer from-disk");
311
+ assert.equal(calls[3]?.headers.get("Mcp-Method"), "tools/call");
312
+ assert.equal(calls[3]?.headers.get("Mcp-Name"), "webSearchPrime");
313
+ assert.deepEqual(calls[3]?.body.params, {
314
+ name: "webSearchPrime",
315
+ arguments: { search_query: "glm coding plan", count: 1 },
316
+ });
317
+ const last = conn.updates.at(-1);
318
+ assert.equal(last.update.status, "completed");
319
+ });
320
+ });
321
+ });
322
+ test("web_reader calls the Coding Plan MCP reader tool and formats reader_result", async () => {
323
+ const oldEnv = process.env["Z_AI_API_KEY"];
324
+ try {
325
+ process.env["Z_AI_API_KEY"] = "from-env";
326
+ await withMockedFetch([
327
+ jsonResponse({
328
+ jsonrpc: "2.0",
329
+ id: 1,
330
+ result: { protocolVersion: "2025-06-18", capabilities: {} },
331
+ }),
332
+ new Response(null, { status: 202 }),
333
+ jsonResponse({
334
+ jsonrpc: "2.0",
335
+ id: 2,
336
+ result: { tools: [{ name: "webReader" }] },
337
+ }),
338
+ jsonResponse({
339
+ jsonrpc: "2.0",
340
+ id: 3,
341
+ result: {
342
+ content: [
343
+ {
344
+ type: "text",
345
+ text: JSON.stringify({
346
+ reader_result: {
347
+ title: "Example",
348
+ url: "https://example.com/",
349
+ description: "Short description",
350
+ content: "Main body",
351
+ },
352
+ }),
353
+ },
354
+ ],
355
+ },
356
+ }),
357
+ ], async (calls) => {
358
+ const conn = createConnectionStub();
359
+ const exec = new ToolExecutor(conn, "s1", FULL_CAPS);
360
+ const result = await exec.execute("tc-web-reader", "web_reader", JSON.stringify({ url: "https://example.com/", return_format: "markdown" }));
361
+ assert.match(result.content, /^# Example/);
362
+ assert.match(result.content, /URL: https:\/\/example\.com\//);
363
+ assert.match(result.content, /Main body/);
364
+ assert.ok(calls.every((call) => call.url === "https://api.z.ai/api/mcp/web_reader/mcp"));
365
+ assert.equal(calls[3]?.headers.get("Mcp-Name"), "webReader");
366
+ assert.deepEqual(calls[3]?.body.params, {
367
+ name: "webReader",
368
+ arguments: { url: "https://example.com/", return_format: "markdown" },
369
+ });
370
+ });
371
+ }
372
+ finally {
373
+ if (oldEnv === undefined)
374
+ delete process.env["Z_AI_API_KEY"];
375
+ else
376
+ process.env["Z_AI_API_KEY"] = oldEnv;
377
+ }
378
+ });
379
+ test("web_search reports Coding Plan 1113 MCP errors as actionable failed tool results", async () => {
380
+ const oldEnv = process.env["Z_AI_API_KEY"];
381
+ try {
382
+ process.env["Z_AI_API_KEY"] = "from-env";
383
+ await withMockedFetch([
384
+ jsonResponse({ error: { code: "1113", message: "No permission for current API key" } }, { status: 429 }),
385
+ ], async () => {
386
+ const conn = createConnectionStub();
387
+ const exec = new ToolExecutor(conn, "s1", FULL_CAPS);
388
+ const result = await exec.execute("tc-web-search-error", "web_search", JSON.stringify({ query: "glm" }));
389
+ assert.match(result.content, /Coding Plan quota\/base URL\/tool eligibility/);
390
+ assert.match(result.content, /1113/);
391
+ const last = conn.updates.at(-1);
392
+ assert.equal(last.update.status, "failed");
393
+ });
394
+ }
395
+ finally {
396
+ if (oldEnv === undefined)
397
+ delete process.env["Z_AI_API_KEY"];
398
+ else
399
+ process.env["Z_AI_API_KEY"] = oldEnv;
400
+ }
401
+ });
402
+ // ---------------------------------------------------------------------------
403
+ // Permission transport errors
404
+ // ---------------------------------------------------------------------------
405
+ test("write_file converts requestPermission transport errors into a failed tool result", async () => {
406
+ const conn = {
407
+ updates: [],
408
+ async sessionUpdate(payload) {
409
+ this.updates.push(payload);
410
+ },
411
+ async writeTextFile() {
412
+ throw new Error("should not be called");
413
+ },
414
+ async requestPermission() {
415
+ throw new Error("connection lost");
416
+ },
417
+ };
418
+ const exec = new ToolExecutor(conn, "s1", FULL_CAPS);
419
+ const result = await exec.execute("tc1", "write_file", JSON.stringify({ path: "/y.txt", content: "data" }));
420
+ assert.match(result.content, /requesting permission.*connection lost/i);
421
+ const last = conn.updates.at(-1);
422
+ assert.equal(last.update.status, "failed");
423
+ });
424
+ test("run_command converts requestPermission transport errors into a failed tool result", async () => {
425
+ const conn = {
426
+ updates: [],
427
+ async sessionUpdate(payload) {
428
+ this.updates.push(payload);
429
+ },
430
+ async createTerminal() {
431
+ throw new Error("should not be called");
432
+ },
433
+ async requestPermission() {
434
+ throw new Error("connection lost");
435
+ },
436
+ };
437
+ const exec = new ToolExecutor(conn, "s1", FULL_CAPS);
438
+ const result = await exec.execute("tc1", "run_command", JSON.stringify({ command: "echo hi" }));
439
+ assert.match(result.content, /requesting permission.*connection lost/i);
440
+ const last = conn.updates.at(-1);
441
+ assert.equal(last.update.status, "failed");
442
+ });
443
+ // ---------------------------------------------------------------------------
444
+ // Whitespace path normalization
445
+ // ---------------------------------------------------------------------------
446
+ test("read_file rejects whitespace-only paths", async () => {
447
+ const conn = createConnectionStub();
448
+ const exec = new ToolExecutor(conn, "s1", FULL_CAPS);
449
+ const result = await exec.execute("tc1", "read_file", JSON.stringify({ path: " " }));
450
+ assert.match(result.content, /path.*required/);
451
+ });
452
+ test("write_file rejects whitespace-only paths", async () => {
453
+ const conn = createConnectionStub();
454
+ const exec = new ToolExecutor(conn, "s1", FULL_CAPS);
455
+ const result = await exec.execute("tc1", "write_file", JSON.stringify({ path: " \t\n", content: "x" }));
456
+ assert.match(result.content, /path.*required/);
457
+ });
458
+ // ---------------------------------------------------------------------------
459
+ // image_analysis (Vision MCP)
460
+ // ---------------------------------------------------------------------------
461
+ function fakeVisionClient(impl) {
462
+ return {
463
+ callTool: impl,
464
+ async dispose() { },
465
+ };
466
+ }
467
+ test("image_analysis routes through the injected vision client and returns the text", async () => {
468
+ const conn = createConnectionStub();
469
+ const vision = fakeVisionClient(async (toolName, args) => {
470
+ assert.equal(toolName, "image_analysis");
471
+ assert.equal(args["image_source"], "/tmp/cat.png");
472
+ return { content: [{ type: "text", text: "A tabby cat." }] };
473
+ });
474
+ const exec = new ToolExecutor(conn, "s1", FULL_CAPS, undefined, vision);
475
+ const result = await exec.execute("tc1", "image_analysis", JSON.stringify({ image_source: "/tmp/cat.png", prompt: "describe" }));
476
+ assert.equal(result.content, "A tabby cat.");
477
+ const last = conn.updates.at(-1);
478
+ assert.equal(last.update.status, "completed");
479
+ });
480
+ test("image_analysis surfaces vision errors as a failed tool result", async () => {
481
+ const conn = createConnectionStub();
482
+ const vision = fakeVisionClient(async () => {
483
+ throw new Error("Vision MCP image_analysis failed: quota exceeded");
484
+ });
485
+ const exec = new ToolExecutor(conn, "s1", FULL_CAPS, undefined, vision);
486
+ const result = await exec.execute("tc1", "image_analysis", JSON.stringify({ image_source: "/tmp/x.png" }));
487
+ assert.match(result.content, /quota exceeded/);
488
+ const last = conn.updates.at(-1);
489
+ assert.equal(last.update.status, "failed");
490
+ });
491
+ test("image_analysis is unavailable when no vision client is configured", async () => {
492
+ const conn = createConnectionStub();
493
+ const exec = new ToolExecutor(conn, "s1", FULL_CAPS);
494
+ const result = await exec.execute("tc1", "image_analysis", JSON.stringify({ image_source: "/tmp/x.png" }));
495
+ assert.match(result.content, /vision[^.]*not configured/i);
496
+ });
497
+ //# sourceMappingURL=executor.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"executor.test.js","sourceRoot":"","sources":["../../src/tests/executor.test.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAUpD,SAAS,oBAAoB,CAAC,OAK1B,EAAE;IACJ,MAAM,OAAO,GAAmC,EAAE,CAAC;IACnD,MAAM,kBAAkB,GAAmB,EAAE,CAAC;IAC9C,MAAM,aAAa,GAAgD,EAAE,CAAC;IAEtE,OAAO;QACL,OAAO;QACP,kBAAkB;QAClB,aAAa;QACb,KAAK,CAAC,aAAa,CAAC,OAAgC;YAClD,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACxB,CAAC;QACD,KAAK,CAAC,YAAY,CAAC,OAA4C;YAC7D,IAAI,IAAI,CAAC,SAAS;gBAAE,MAAM,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAC;YACtD,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;QAC9B,CAAC;QACD,KAAK,CAAC,aAAa,CAAC,OAA6D;YAC/E,IAAI,IAAI,CAAC,UAAU;gBAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;QAC5D,CAAC;QACD,KAAK,CAAC,cAAc,CAAC,MAA4C;YAC/D,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAC3B,OAAO;gBACL,EAAE,EAAE,QAAQ;gBACZ,KAAK,CAAC,WAAW;oBACf,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;gBACzB,CAAC;gBACD,KAAK,CAAC,aAAa;oBACjB,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,cAAc,IAAI,QAAQ,EAAE,CAAC;gBACrD,CAAC;gBACD,KAAK,CAAC,OAAO;oBACX,UAAU;gBACZ,CAAC;aACF,CAAC;QACJ,CAAC;QACD,KAAK,CAAC,iBAAiB,CAAC,MAAe;YACrC,kBAAkB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAChC,QAAQ,IAAI,CAAC,UAAU,IAAI,OAAO,EAAE,CAAC;gBACnC,KAAK,OAAO;oBACV,OAAO,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,CAAC;gBACjE,KAAK,QAAQ;oBACX,OAAO,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,CAAC;gBAClE,KAAK,WAAW;oBACd,OAAO,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,WAAW,EAAE,EAAE,CAAC;YACjD,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC;AAED,MAAM,SAAS,GAAG;IAChB,EAAE,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE;IAC/C,QAAQ,EAAE,IAAI;CACf,CAAC;AASF,SAAS,YAAY,CACnB,IAAa,EACb,OAA8C,EAAE;IAEhD,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC1C,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,kBAAkB,CAAC,CAAC;IAChD,IAAI,IAAI,CAAC,SAAS;QAAE,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;IAClE,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;AAClE,CAAC;AAED,SAAS,eAAe,CAAC,SAAqB;IAC5C,MAAM,KAAK,GAAgB,EAAE,CAAC;IAC9B,MAAM,SAAS,GAAG,KAAK,EAAE,GAA2B,EAAE,IAAkB,EAAE,EAAE;QAC1E,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,wBAAwB,CAAC,CAAC;QAC1C,MAAM,IAAI,GACR,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAA6B,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1F,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC1C,KAAK,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;QACtD,MAAM,QAAQ,GAAG,SAAS,CAAC,KAAK,EAAE,CAAC;QACnC,MAAM,CAAC,EAAE,CAAC,QAAQ,EAAE,uBAAuB,CAAC,CAAC;QAC7C,OAAO,QAAQ,CAAC;IAClB,CAAC,CAAC;IACF,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;AAC9B,CAAC;AAED,KAAK,UAAU,gBAAgB,CAAI,EAAoB;IACrD,MAAM,GAAG,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,qBAAqB,CAAC,CAAC,CAAC;IAC/D,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAC3C,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;IAC9C,IAAI,CAAC;QACH,OAAO,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;QACnC,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,GAAG,GAAG,CAAC;QACrC,gBAAgB,CAAC,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE,eAAe,EAAE,kBAAkB,CAAC,CAAC,CAAC;QAC9E,OAAO,MAAM,EAAE,EAAE,CAAC;IACpB,CAAC;YAAS,CAAC;QACT,IAAI,MAAM,KAAK,SAAS;YAAE,OAAO,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;;YACxD,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,GAAG,MAAM,CAAC;QAC1C,IAAI,MAAM,KAAK,SAAS;YAAE,OAAO,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;;YAC3D,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,GAAG,MAAM,CAAC;QAC7C,MAAM,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAChD,CAAC;AACH,CAAC;AAED,KAAK,UAAU,eAAe,CAC5B,SAAqB,EACrB,EAAsC;IAEtC,MAAM,QAAQ,GAAG,UAAU,CAAC,KAAK,CAAC;IAClC,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,eAAe,CAAC,SAAS,CAAC,CAAC;IACxD,IAAI,CAAC;QACH,UAAU,CAAC,KAAK,GAAG,SAAyB,CAAC;QAC7C,OAAO,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC;IACzB,CAAC;YAAS,CAAC;QACT,UAAU,CAAC,KAAK,GAAG,QAAQ,CAAC;IAC9B,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,mBAAmB;AACnB,8EAA8E;AAE9E,IAAI,CAAC,8DAA8D,EAAE,KAAK,IAAI,EAAE;IAC9E,MAAM,IAAI,GAAG,oBAAoB,EAAE,CAAC;IACpC,MAAM,IAAI,GAAG,IAAI,YAAY,CAAC,IAAa,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;IAC9D,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,WAAW,EAAE,YAAY,CAAC,CAAC;IACpE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,wCAAwC,CAAC,CAAC;IACvE,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAA2D,CAAC;IAC3F,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,WAAW,CAAC,CAAC;IACrD,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;AAC7C,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,0DAA0D,EAAE,KAAK,IAAI,EAAE;IAC1E,MAAM,IAAI,GAAG,oBAAoB,EAAE,CAAC;IACpC,MAAM,IAAI,GAAG,IAAI,YAAY,CAAC,IAAa,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;IAC9D,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,YAAY,EAAE,IAAI,CAAC,CAAC;IAC7D,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;IAC7C,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAoC,CAAC;IACpE,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;AAC7C,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,oDAAoD,EAAE,KAAK,IAAI,EAAE;IACpE,MAAM,IAAI,GAAG,oBAAoB,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACvD,MAAM,IAAI,GAAG,IAAI,YAAY,CAAC,IAAa,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;IAC9D,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,WAAW,EAAE,EAAE,CAAC,CAAC;IAC1D,sEAAsE;IACtE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,gBAAgB,CAAC,CAAC;AACjD,CAAC,CAAC,CAAC;AAEH,8EAA8E;AAC9E,oBAAoB;AACpB,8EAA8E;AAE9E,IAAI,CAAC,6DAA6D,EAAE,KAAK,IAAI,EAAE;IAC7E,MAAM,IAAI,GAAG,oBAAoB,EAAE,CAAC;IACpC,MAAM,IAAI,GAAG,IAAI,YAAY,CAAC,IAAa,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;IAC/D,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IACtF,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,mDAAmD,CAAC,CAAC;AACpF,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,+DAA+D,EAAE,KAAK,IAAI,EAAE;IAC/E,MAAM,IAAI,GAAG,oBAAoB,EAAE,CAAC;IACpC,MAAM,IAAI,GAAG,IAAI,YAAY,CAAC,IAAa,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;IACnF,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAC/B,KAAK,EACL,YAAY,EACZ,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAC9C,CAAC;IACF,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,oDAAoD,CAAC,CAAC;AACrF,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,sEAAsE,EAAE,KAAK,IAAI,EAAE;IACtF,MAAM,IAAI,GAAG,oBAAoB,EAAE,CAAC;IACpC,MAAM,IAAI,GAAG,IAAI,YAAY,CAAC,IAAa,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;IAC/D,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;IAClF,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,4CAA4C,CAAC,CAAC;IACvE,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,aAAa,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IACvF,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,4CAA4C,CAAC,CAAC;AACzE,CAAC,CAAC,CAAC;AAEH,8EAA8E;AAC9E,YAAY;AACZ,8EAA8E;AAE9E,IAAI,CAAC,gEAAgE,EAAE,KAAK,IAAI,EAAE;IAChF,MAAM,IAAI,GAAG,oBAAoB,EAAE,CAAC;IACpC,MAAM,IAAI,GAAG,IAAI,YAAY,CAAC,IAAa,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;IAC9D,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC;IAC1F,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAEtC,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAC/B,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACN,IAAI,EAAG,CAAC,CAAC,MAAoC,CAAC,aAAa;QAC3D,MAAM,EAAG,CAAC,CAAC,MAA8B,CAAC,MAAM;KACjD,CAAC,CACH,CAAC;IACF,MAAM,CAAC,SAAS,CAAC,QAAQ,EAAE;QACzB,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,aAAa,EAAE;QAC5C,EAAE,IAAI,EAAE,kBAAkB,EAAE,MAAM,EAAE,WAAW,EAAE;KAClD,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,uEAAuE,EAAE,KAAK,IAAI,EAAE;IACvF,MAAM,IAAI,GAAG,oBAAoB,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACvD,MAAM,IAAI,GAAG,IAAI,YAAY,CAAC,IAAa,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;IAC9D,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC;IAC1F,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,qBAAqB,CAAC,CAAC;IACpD,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAoC,CAAC;IACpE,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;AAC7C,CAAC,CAAC,CAAC;AAEH,8EAA8E;AAC9E,+BAA+B;AAC/B,8EAA8E;AAE9E,IAAI,CAAC,4FAA4F,EAAE,KAAK,IAAI,EAAE;IAC5G,MAAM,IAAI,GAAG,oBAAoB,CAAC,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC,CAAC;IAC3D,MAAM,IAAI,GAAG,IAAI,YAAY,CAAC,IAAa,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;IAC9D,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAC/B,KAAK,EACL,YAAY,EACZ,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CACpD,CAAC;IACF,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,sBAAsB,CAAC,CAAC;IAErD,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAChD,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACxC,IAAI,EAAG,CAAC,CAAC,MAAoC,CAAC,aAAa;QAC3D,MAAM,EAAG,CAAC,CAAC,MAA8B,CAAC,MAAM;KACjD,CAAC,CAAC,CAAC;IACJ,MAAM,CAAC,SAAS,CAAC,QAAQ,EAAE;QACzB,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE;QACxC,EAAE,IAAI,EAAE,kBAAkB,EAAE,MAAM,EAAE,aAAa,EAAE;QACnD,EAAE,IAAI,EAAE,kBAAkB,EAAE,MAAM,EAAE,WAAW,EAAE;KAClD,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,iEAAiE,EAAE,KAAK,IAAI,EAAE;IACjF,MAAM,IAAI,GAAG,oBAAoB,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC,CAAC;IAC5D,MAAM,IAAI,GAAG,IAAI,YAAY,CAAC,IAAa,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;IAC9D,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAC/B,KAAK,EACL,YAAY,EACZ,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CACpD,CAAC;IACF,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,mBAAmB,CAAC,CAAC;IAClD,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAoC,CAAC;IACpE,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;AAC7C,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;IAChE,MAAM,IAAI,GAAG,oBAAoB,CAAC,EAAE,UAAU,EAAE,WAAW,EAAE,CAAC,CAAC;IAC/D,MAAM,IAAI,GAAG,IAAI,YAAY,CAAC,IAAa,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;IAC9D,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAC/B,KAAK,EACL,YAAY,EACZ,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CACpD,CAAC;IACF,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,oBAAoB,CAAC,CAAC;IACnD,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAoC,CAAC;IACpE,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;AAC7C,CAAC,CAAC,CAAC;AAEH,8EAA8E;AAC9E,cAAc;AACd,8EAA8E;AAE9E,IAAI,CAAC,iCAAiC,EAAE,KAAK,IAAI,EAAE;IACjD,MAAM,IAAI,GAAG,oBAAoB,EAAE,CAAC;IACpC,MAAM,IAAI,GAAG,IAAI,YAAY,CAAC,IAAa,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;IAC9D,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAC/B,KAAK,EACL,aAAa,EACb,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CACnC,CAAC;IACF,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,kBAAkB,CAAC,CAAC;IACjD,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAoC,CAAC;IACpE,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;AAC7C,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,sDAAsD,EAAE,KAAK,IAAI,EAAE;IACtE,MAAM,IAAI,GAAG,oBAAoB,CAAC,EAAE,cAAc,EAAE,MAAM,EAAE,CAAC,CAAC;IAC9D,MAAM,IAAI,GAAG,IAAI,YAAY,CAAC,IAAa,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;IAC9D,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAC/B,KAAK,EACL,aAAa,EACb,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,yBAAyB,EAAE,CAAC,CACvD,CAAC;IACF,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IACrC,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;IACnC,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;IAClC,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,IAAI,EAAE,yBAAyB,CAAC,CAAC,CAAC;AAClE,CAAC,CAAC,CAAC;AAEH,8EAA8E;AAC9E,aAAa;AACb,8EAA8E;AAE9E,IAAI,CAAC,sDAAsD,EAAE,KAAK,IAAI,EAAE;IACtE,MAAM,IAAI,GAAG,oBAAoB,CAAC,EAAE,cAAc,EAAE,gBAAgB,EAAE,CAAC,CAAC;IACxE,MAAM,IAAI,GAAG,IAAI,YAAY,CAAC,IAAa,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;IAC9D,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAC/B,KAAK,EACL,YAAY,EACZ,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,CAAC,CAC5C,CAAC;IACF,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;IAC3C,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;IACnC,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;IAClC,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IACpC,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,YAAY,CAAC,CAAC;IAClD,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,qBAAqB,CAAC,CAAC;AAC7D,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,+BAA+B,EAAE,KAAK,IAAI,EAAE;IAC/C,MAAM,IAAI,GAAG,oBAAoB,EAAE,CAAC;IACpC,MAAM,IAAI,GAAG,IAAI,YAAY,CAAC,IAAa,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;IAC9D,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;IACrF,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,kBAAkB,CAAC,CAAC;AACnD,CAAC,CAAC,CAAC;AAEH,8EAA8E;AAC9E,mDAAmD;AACnD,8EAA8E;AAE9E,IAAI,CAAC,8EAA8E,EAAE,KAAK,IAAI,EAAE;IAC9F,MAAM,gBAAgB,CAAC,KAAK,IAAI,EAAE;QAChC,MAAM,eAAe,CACnB;YACE,YAAY,CACV;gBACE,OAAO,EAAE,KAAK;gBACd,EAAE,EAAE,CAAC;gBACL,MAAM,EAAE,EAAE,eAAe,EAAE,YAAY,EAAE,YAAY,EAAE,EAAE,EAAE;aAC5D,EACD,EAAE,SAAS,EAAE,gBAAgB,EAAE,CAChC;YACD,IAAI,QAAQ,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;YACnC,YAAY,CAAC;gBACX,OAAO,EAAE,KAAK;gBACd,EAAE,EAAE,CAAC;gBACL,MAAM,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,WAAW,EAAE,EAAE,UAAU,EAAE,EAAE,YAAY,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE;aACnH,CAAC;YACF,YAAY,CAAC;gBACX,OAAO,EAAE,KAAK;gBACd,EAAE,EAAE,CAAC;gBACL,MAAM,EAAE;oBACN,OAAO,EAAE;wBACP;4BACE,IAAI,EAAE,MAAM;4BACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gCACnB,aAAa,EAAE;oCACb;wCACE,KAAK,EAAE,iBAAiB;wCACxB,IAAI,EAAE,eAAe;wCACrB,KAAK,EAAE,MAAM;wCACb,YAAY,EAAE,YAAY;wCAC1B,OAAO,EAAE,gBAAgB;qCAC1B;iCACF;6BACF,CAAC;yBACH;qBACF;iBACF;aACF,CAAC;SACH,EACD,KAAK,EAAE,KAAK,EAAE,EAAE;YACd,MAAM,IAAI,GAAG,oBAAoB,EAAE,CAAC;YACpC,MAAM,IAAI,GAAG,IAAI,YAAY,CAAC,IAAa,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;YAC9D,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAC/B,eAAe,EACf,YAAY,EACZ,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,iBAAiB,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CACvD,CAAC;YAEF,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,uBAAuB,CAAC,CAAC;YACtD,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,wBAAwB,CAAC,CAAC;YACvD,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YAC9B,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,KAAK,+CAA+C,CAAC,CAAC,CAAC;YAC/F,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,EAAE,kBAAkB,CAAC,CAAC;YACzE,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,YAAY,CAAC,CAAC;YAChE,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,gBAAgB,CAAC,CAAC;YAClE,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,EAAE;gBACtC,IAAI,EAAE,gBAAgB;gBACtB,SAAS,EAAE,EAAE,YAAY,EAAE,iBAAiB,EAAE,KAAK,EAAE,CAAC,EAAE;aACzD,CAAC,CAAC;YACH,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAoC,CAAC;YACpE,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;QAChD,CAAC,CACF,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,4EAA4E,EAAE,KAAK,IAAI,EAAE;IAC5F,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAC3C,IAAI,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,GAAG,UAAU,CAAC;QACzC,MAAM,eAAe,CACnB;YACE,YAAY,CAAC;gBACX,OAAO,EAAE,KAAK;gBACd,EAAE,EAAE,CAAC;gBACL,MAAM,EAAE,EAAE,eAAe,EAAE,YAAY,EAAE,YAAY,EAAE,EAAE,EAAE;aAC5D,CAAC;YACF,IAAI,QAAQ,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;YACnC,YAAY,CAAC;gBACX,OAAO,EAAE,KAAK;gBACd,EAAE,EAAE,CAAC;gBACL,MAAM,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,EAAE;aAC3C,CAAC;YACF,YAAY,CAAC;gBACX,OAAO,EAAE,KAAK;gBACd,EAAE,EAAE,CAAC;gBACL,MAAM,EAAE;oBACN,OAAO,EAAE;wBACP;4BACE,IAAI,EAAE,MAAM;4BACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gCACnB,aAAa,EAAE;oCACb,KAAK,EAAE,SAAS;oCAChB,GAAG,EAAE,sBAAsB;oCAC3B,WAAW,EAAE,mBAAmB;oCAChC,OAAO,EAAE,WAAW;iCACrB;6BACF,CAAC;yBACH;qBACF;iBACF;aACF,CAAC;SACH,EACD,KAAK,EAAE,KAAK,EAAE,EAAE;YACd,MAAM,IAAI,GAAG,oBAAoB,EAAE,CAAC;YACpC,MAAM,IAAI,GAAG,IAAI,YAAY,CAAC,IAAa,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;YAC9D,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAC/B,eAAe,EACf,YAAY,EACZ,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,EAAE,sBAAsB,EAAE,aAAa,EAAE,UAAU,EAAE,CAAC,CAC3E,CAAC;YAEF,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;YAC3C,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,+BAA+B,CAAC,CAAC;YAC9D,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;YAC1C,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,KAAK,yCAAyC,CAAC,CAAC,CAAC;YACzF,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,WAAW,CAAC,CAAC;YAC7D,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,EAAE;gBACtC,IAAI,EAAE,WAAW;gBACjB,SAAS,EAAE,EAAE,GAAG,EAAE,sBAAsB,EAAE,aAAa,EAAE,UAAU,EAAE;aACtE,CAAC,CAAC;QACL,CAAC,CACF,CAAC;IACJ,CAAC;YAAS,CAAC;QACT,IAAI,MAAM,KAAK,SAAS;YAAE,OAAO,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;;YACxD,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,GAAG,MAAM,CAAC;IAC5C,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,kFAAkF,EAAE,KAAK,IAAI,EAAE;IAClG,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAC3C,IAAI,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,GAAG,UAAU,CAAC;QACzC,MAAM,eAAe,CACnB;YACE,YAAY,CACV,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,mCAAmC,EAAE,EAAE,EACzE,EAAE,MAAM,EAAE,GAAG,EAAE,CAChB;SACF,EACD,KAAK,IAAI,EAAE;YACT,MAAM,IAAI,GAAG,oBAAoB,EAAE,CAAC;YACpC,MAAM,IAAI,GAAG,IAAI,YAAY,CAAC,IAAa,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;YAC9D,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAC/B,qBAAqB,EACrB,YAAY,EACZ,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CACjC,CAAC;YAEF,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,+CAA+C,CAAC,CAAC;YAC9E,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YACrC,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAoC,CAAC;YACpE,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAC7C,CAAC,CACF,CAAC;IACJ,CAAC;YAAS,CAAC;QACT,IAAI,MAAM,KAAK,SAAS;YAAE,OAAO,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;;YACxD,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,GAAG,MAAM,CAAC;IAC5C,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,8EAA8E;AAC9E,8BAA8B;AAC9B,8EAA8E;AAE9E,IAAI,CAAC,kFAAkF,EAAE,KAAK,IAAI,EAAE;IAClG,MAAM,IAAI,GAAG;QACX,OAAO,EAAE,EAAoC;QAC7C,KAAK,CAAC,aAAa,CAAC,OAAgC;YAClD,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC7B,CAAC;QACD,KAAK,CAAC,aAAa;YACjB,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;QAC1C,CAAC;QACD,KAAK,CAAC,iBAAiB;YACrB,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;QACrC,CAAC;KACF,CAAC;IACF,MAAM,IAAI,GAAG,IAAI,YAAY,CAAC,IAAa,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;IAC9D,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAC/B,KAAK,EACL,YAAY,EACZ,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CACpD,CAAC;IACF,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,yCAAyC,CAAC,CAAC;IACxE,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAoC,CAAC;IACpE,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;AAC7C,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,mFAAmF,EAAE,KAAK,IAAI,EAAE;IACnG,MAAM,IAAI,GAAG;QACX,OAAO,EAAE,EAAoC;QAC7C,KAAK,CAAC,aAAa,CAAC,OAAgC;YAClD,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC7B,CAAC;QACD,KAAK,CAAC,cAAc;YAClB,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;QAC1C,CAAC;QACD,KAAK,CAAC,iBAAiB;YACrB,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;QACrC,CAAC;KACF,CAAC;IACF,MAAM,IAAI,GAAG,IAAI,YAAY,CAAC,IAAa,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;IAC9D,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAC/B,KAAK,EACL,aAAa,EACb,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CACvC,CAAC;IACF,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,yCAAyC,CAAC,CAAC;IACxE,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAoC,CAAC;IACpE,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;AAC7C,CAAC,CAAC,CAAC;AAEH,8EAA8E;AAC9E,gCAAgC;AAChC,8EAA8E;AAE9E,IAAI,CAAC,yCAAyC,EAAE,KAAK,IAAI,EAAE;IACzD,MAAM,IAAI,GAAG,oBAAoB,EAAE,CAAC;IACpC,MAAM,IAAI,GAAG,IAAI,YAAY,CAAC,IAAa,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;IAC9D,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;IACvF,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,gBAAgB,CAAC,CAAC;AACjD,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;IAC1D,MAAM,IAAI,GAAG,oBAAoB,EAAE,CAAC;IACpC,MAAM,IAAI,GAAG,IAAI,YAAY,CAAC,IAAa,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;IAC9D,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAC/B,KAAK,EACL,YAAY,EACZ,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,CAChD,CAAC;IACF,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,gBAAgB,CAAC,CAAC;AACjD,CAAC,CAAC,CAAC;AAEH,8EAA8E;AAC9E,8BAA8B;AAC9B,8EAA8E;AAE9E,SAAS,gBAAgB,CAAC,IAAiC;IACzD,OAAO;QACL,QAAQ,EAAE,IAAI;QACd,KAAK,CAAC,OAAO,KAAgB,CAAC;KAC/B,CAAC;AACJ,CAAC;AAED,IAAI,CAAC,+EAA+E,EAAE,KAAK,IAAI,EAAE;IAC/F,MAAM,IAAI,GAAG,oBAAoB,EAAE,CAAC;IACpC,MAAM,MAAM,GAAG,gBAAgB,CAAC,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE;QACvD,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,gBAAgB,CAAC,CAAC;QACzC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,cAAc,CAAC,CAAC;QACnD,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,EAAE,CAAC;IAC/D,CAAC,CAAC,CAAC;IACH,MAAM,IAAI,GAAG,IAAI,YAAY,CAAC,IAAa,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;IACjF,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAC/B,KAAK,EACL,gBAAgB,EAChB,IAAI,CAAC,SAAS,CAAC,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CACrE,CAAC;IACF,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;IAC7C,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAoC,CAAC;IACpE,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;AAChD,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,+DAA+D,EAAE,KAAK,IAAI,EAAE;IAC/E,MAAM,IAAI,GAAG,oBAAoB,EAAE,CAAC;IACpC,MAAM,MAAM,GAAG,gBAAgB,CAAC,KAAK,IAAI,EAAE;QACzC,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;IACtE,CAAC,CAAC,CAAC;IACH,MAAM,IAAI,GAAG,IAAI,YAAY,CAAC,IAAa,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;IACjF,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAC/B,KAAK,EACL,gBAAgB,EAChB,IAAI,CAAC,SAAS,CAAC,EAAE,YAAY,EAAE,YAAY,EAAE,CAAC,CAC/C,CAAC;IACF,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,gBAAgB,CAAC,CAAC;IAC/C,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAoC,CAAC;IACpE,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;AAC7C,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,mEAAmE,EAAE,KAAK,IAAI,EAAE;IACnF,MAAM,IAAI,GAAG,oBAAoB,EAAE,CAAC;IACpC,MAAM,IAAI,GAAG,IAAI,YAAY,CAAC,IAAa,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;IAC9D,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAC/B,KAAK,EACL,gBAAgB,EAChB,IAAI,CAAC,SAAS,CAAC,EAAE,YAAY,EAAE,YAAY,EAAE,CAAC,CAC/C,CAAC;IACF,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,4BAA4B,CAAC,CAAC;AAC7D,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=glm-client.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"glm-client.test.d.ts","sourceRoot":"","sources":["../../src/tests/glm-client.test.ts"],"names":[],"mappings":""}