aws-runtime-bridge 1.9.0 → 1.9.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 (117) hide show
  1. package/dist/adapter/AcodeSdkAdapter.d.ts +2 -0
  2. package/dist/adapter/AcodeSdkAdapter.d.ts.map +1 -1
  3. package/dist/adapter/AcodeSdkAdapter.js +84 -18
  4. package/dist/adapter/AcodeSdkAdapter.test.js +275 -13
  5. package/dist/adapter/acode-tool-names.d.ts +16 -0
  6. package/dist/adapter/acode-tool-names.d.ts.map +1 -0
  7. package/dist/adapter/acode-tool-names.js +37 -0
  8. package/dist/adapter/acode-tool-names.test.d.ts +2 -0
  9. package/dist/adapter/acode-tool-names.test.d.ts.map +1 -0
  10. package/dist/adapter/acode-tool-names.test.js +28 -0
  11. package/dist/adapter/types.d.ts +22 -3
  12. package/dist/adapter/types.d.ts.map +1 -1
  13. package/dist/adapter/types.js +2 -1
  14. package/dist/config.d.ts +0 -4
  15. package/dist/config.d.ts.map +1 -1
  16. package/dist/config.js +0 -4
  17. package/dist/index.js +1 -1
  18. package/dist/routes/ai-sources.js +18 -14
  19. package/dist/routes/git.d.ts +10 -0
  20. package/dist/routes/git.d.ts.map +1 -1
  21. package/dist/routes/git.js +37 -3
  22. package/dist/routes/git.test.js +47 -1
  23. package/dist/routes/sessions.d.ts +1 -1
  24. package/dist/routes/sessions.d.ts.map +1 -1
  25. package/dist/routes/sessions.js +11 -4
  26. package/dist/routes/sessions.test.js +3 -0
  27. package/dist/routes/terminal.d.ts +28 -8
  28. package/dist/routes/terminal.d.ts.map +1 -1
  29. package/dist/routes/terminal.js +266 -44
  30. package/dist/routes/terminal.stop-options.test.d.ts +2 -0
  31. package/dist/routes/terminal.stop-options.test.d.ts.map +1 -0
  32. package/dist/routes/terminal.stop-options.test.js +39 -0
  33. package/dist/routes/terminal.test.js +87 -4
  34. package/dist/services/auto-register.d.ts.map +1 -1
  35. package/dist/services/auto-register.js +4 -5
  36. package/dist/services/mcp-launch-binding-queue.d.ts +5 -0
  37. package/dist/services/mcp-launch-binding-queue.d.ts.map +1 -1
  38. package/dist/services/mcp-launch-binding-queue.js +17 -0
  39. package/dist/services/mcp-launch-binding-queue.test.js +16 -1
  40. package/dist/services/session-output.d.ts +5 -0
  41. package/dist/services/session-output.d.ts.map +1 -1
  42. package/package/acode/dist/built-in-file-tools.d.ts +5 -1
  43. package/package/acode/dist/built-in-file-tools.d.ts.map +1 -1
  44. package/package/acode/dist/built-in-file-tools.js +14 -203
  45. package/package/acode/dist/builtins/commandArtifacts.d.ts +25 -0
  46. package/package/acode/dist/builtins/commandArtifacts.d.ts.map +1 -0
  47. package/package/acode/dist/builtins/commandArtifacts.js +77 -0
  48. package/package/acode/dist/builtins/commandOutputEvents.d.ts +21 -0
  49. package/package/acode/dist/builtins/commandOutputEvents.d.ts.map +1 -0
  50. package/package/acode/dist/builtins/commandOutputEvents.js +56 -0
  51. package/package/acode/dist/builtins/shellCommandPreparation.d.ts +15 -0
  52. package/package/acode/dist/builtins/shellCommandPreparation.d.ts.map +1 -0
  53. package/package/acode/dist/builtins/shellCommandPreparation.js +44 -0
  54. package/package/acode/dist/builtins/shellCommandResult.d.ts +30 -0
  55. package/package/acode/dist/builtins/shellCommandResult.d.ts.map +1 -0
  56. package/package/acode/dist/builtins/shellCommandResult.js +71 -0
  57. package/package/acode/dist/builtins/shellCommandRunner.d.ts +14 -0
  58. package/package/acode/dist/builtins/shellCommandRunner.d.ts.map +1 -0
  59. package/package/acode/dist/builtins/shellCommandRunner.js +114 -0
  60. package/package/acode/dist/builtins/shellOutputDecoder.d.ts +5 -0
  61. package/package/acode/dist/builtins/shellOutputDecoder.d.ts.map +1 -0
  62. package/package/acode/dist/builtins/shellOutputDecoder.js +30 -0
  63. package/package/acode/dist/mcpToolNames.d.ts +11 -0
  64. package/package/acode/dist/mcpToolNames.d.ts.map +1 -0
  65. package/package/acode/dist/mcpToolNames.js +17 -0
  66. package/package/acode/dist/runtime.d.ts +19 -0
  67. package/package/acode/dist/runtime.d.ts.map +1 -1
  68. package/package/acode/dist/runtime.js +233 -35
  69. package/package/acode/dist/types.d.ts +1 -1
  70. package/package/acode/dist/types.d.ts.map +1 -1
  71. package/package/acode/package.json +1 -1
  72. package/package/aws-client-agent-mcp/dist/agent-client.d.ts +20 -0
  73. package/package/aws-client-agent-mcp/dist/agent-client.d.ts.map +1 -1
  74. package/package/aws-client-agent-mcp/dist/agent-client.js +71 -2
  75. package/package/aws-client-agent-mcp/dist/agent-client.js.map +1 -1
  76. package/package/aws-client-agent-mcp/dist/constants.d.ts +4 -1
  77. package/package/aws-client-agent-mcp/dist/constants.d.ts.map +1 -1
  78. package/package/aws-client-agent-mcp/dist/constants.js +5 -1
  79. package/package/aws-client-agent-mcp/dist/constants.js.map +1 -1
  80. package/package/aws-client-agent-mcp/dist/http-client.d.ts +17 -1
  81. package/package/aws-client-agent-mcp/dist/http-client.d.ts.map +1 -1
  82. package/package/aws-client-agent-mcp/dist/http-client.js +124 -28
  83. package/package/aws-client-agent-mcp/dist/http-client.js.map +1 -1
  84. package/package/aws-client-agent-mcp/dist/http-client.test.js +108 -2
  85. package/package/aws-client-agent-mcp/dist/http-client.test.js.map +1 -1
  86. package/package/aws-client-agent-mcp/dist/mcp-server.d.ts +8 -3
  87. package/package/aws-client-agent-mcp/dist/mcp-server.d.ts.map +1 -1
  88. package/package/aws-client-agent-mcp/dist/mcp-server.js +63 -10
  89. package/package/aws-client-agent-mcp/dist/mcp-server.js.map +1 -1
  90. package/package/aws-client-agent-mcp/dist/mcp-server.test.js +47 -0
  91. package/package/aws-client-agent-mcp/dist/mcp-server.test.js.map +1 -1
  92. package/package/aws-client-agent-mcp/dist/mcp-tools.d.ts +1 -36
  93. package/package/aws-client-agent-mcp/dist/mcp-tools.d.ts.map +1 -1
  94. package/package/aws-client-agent-mcp/dist/mcp-tools.js +3 -169
  95. package/package/aws-client-agent-mcp/dist/mcp-tools.js.map +1 -1
  96. package/package/aws-client-agent-mcp/dist/mcp-tools.test.d.ts +2 -0
  97. package/package/aws-client-agent-mcp/dist/mcp-tools.test.d.ts.map +1 -0
  98. package/package/aws-client-agent-mcp/dist/mcp-tools.test.js +45 -0
  99. package/package/aws-client-agent-mcp/dist/mcp-tools.test.js.map +1 -0
  100. package/package/aws-client-agent-mcp/dist/memory-tools.d.ts +11 -0
  101. package/package/aws-client-agent-mcp/dist/memory-tools.d.ts.map +1 -0
  102. package/package/aws-client-agent-mcp/dist/memory-tools.js +144 -0
  103. package/package/aws-client-agent-mcp/dist/memory-tools.js.map +1 -0
  104. package/package/aws-client-agent-mcp/dist/runtime-launch-binding.d.ts.map +1 -1
  105. package/package/aws-client-agent-mcp/dist/runtime-launch-binding.js +79 -28
  106. package/package/aws-client-agent-mcp/dist/runtime-launch-binding.js.map +1 -1
  107. package/package/aws-client-agent-mcp/dist/runtime-launch-binding.test.js +35 -0
  108. package/package/aws-client-agent-mcp/dist/runtime-launch-binding.test.js.map +1 -1
  109. package/package/aws-client-agent-mcp/dist/types.d.ts +9 -0
  110. package/package/aws-client-agent-mcp/dist/types.d.ts.map +1 -1
  111. package/package/aws-client-agent-mcp/dist/types.js.map +1 -1
  112. package/package/aws-client-agent-mcp/dist/websocket-client.d.ts.map +1 -1
  113. package/package/aws-client-agent-mcp/dist/websocket-client.js +1 -0
  114. package/package/aws-client-agent-mcp/dist/websocket-client.js.map +1 -1
  115. package/package/aws-client-agent-mcp/dist/websocket-client.test.js +43 -3
  116. package/package/aws-client-agent-mcp/dist/websocket-client.test.js.map +1 -1
  117. package/package.json +1 -1
@@ -0,0 +1,77 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { promises as fs } from "node:fs";
3
+ import path from "node:path";
4
+ export const COMMAND_OUTPUT_SPILLOVER_LINE_LIMIT = 300;
5
+ export const LONG_COMMAND_LINE_LIMIT = 300;
6
+ export const MAX_COMMAND_OUTPUT_BYTES = 128 * 1024;
7
+ export function toDisplayPath(targetPath) {
8
+ return targetPath.replace(/\\/g, "/");
9
+ }
10
+ function padDatePart(value) {
11
+ return String(value).padStart(2, "0");
12
+ }
13
+ export function countOutputLines(output) {
14
+ if (!output) {
15
+ return 0;
16
+ }
17
+ const normalized = output.replace(/\r\n/g, "\n").replace(/\r/g, "\n");
18
+ const withoutTrailingLineBreak = normalized.endsWith("\n")
19
+ ? normalized.slice(0, -1)
20
+ : normalized;
21
+ return withoutTrailingLineBreak
22
+ ? withoutTrailingLineBreak.split("\n").length
23
+ : 1;
24
+ }
25
+ function buildCommandArtifactPath(workspaceRoot, now, suffix, extension) {
26
+ const year = now.getFullYear();
27
+ const month = padDatePart(now.getMonth() + 1);
28
+ const day = padDatePart(now.getDate());
29
+ const hour = padDatePart(now.getHours());
30
+ const minute = padDatePart(now.getMinutes());
31
+ const timestamp = `${year}${month}${day}-${hour}${minute}${padDatePart(now.getSeconds())}-${String(now.getMilliseconds()).padStart(3, "0")}-${process.pid}-${randomUUID().slice(0, 8)}`;
32
+ return path.join(workspaceRoot, ".agentswork", "acode", "cmd-dist", `${year}-${month}-${day}`, hour, minute, `${timestamp}-${suffix}.${extension}`);
33
+ }
34
+ export async function writeCommandArtifactFile(workspaceRoot, suffix, extension, content, now = new Date()) {
35
+ const targetPath = buildCommandArtifactPath(workspaceRoot, now, suffix, extension);
36
+ await fs.mkdir(path.dirname(targetPath), { recursive: true });
37
+ await fs.writeFile(targetPath, content, "utf-8");
38
+ return targetPath;
39
+ }
40
+ export function buildCommandOutputSpilloverContent(input) {
41
+ return [
42
+ `Command: ${input.commandText}`,
43
+ `Command file: ${input.commandFilePath ?? "null"}`,
44
+ `Command line count: ${input.commandLineCount}`,
45
+ `CWD: ${input.cwd}`,
46
+ `Started: ${input.startedAt.toISOString()}`,
47
+ `Ended: ${input.endedAt.toISOString()}`,
48
+ `Exit code: ${input.exitCode ?? "null"}`,
49
+ `Signal: ${input.signal ?? "null"}`,
50
+ `Timed out: ${input.timedOut}`,
51
+ `Timed out by inactivity: ${input.inactivityTimedOut}`,
52
+ "",
53
+ "--- stdout ---",
54
+ input.stdout,
55
+ "",
56
+ "--- stderr ---",
57
+ input.stderr,
58
+ ].join("\n");
59
+ }
60
+ export function formatCommandOutputSpilloverStdout(outputFilePath, outputLineCount) {
61
+ return [
62
+ `[ACode] 命令输出超过 ${COMMAND_OUTPUT_SPILLOVER_LINE_LIMIT} 行(共 ${outputLineCount} 行),完整输出已写入: ${toDisplayPath(outputFilePath)}`,
63
+ "[ACode] Agent 可自行读取该文件,或在该文件中搜索需要的内容。",
64
+ "",
65
+ ].join("\n");
66
+ }
67
+ export function truncateOutput(value) {
68
+ const bytes = Buffer.byteLength(value, "utf-8");
69
+ if (bytes <= MAX_COMMAND_OUTPUT_BYTES) {
70
+ return { text: value };
71
+ }
72
+ const buffer = Buffer.from(value, "utf-8");
73
+ return {
74
+ text: buffer.subarray(0, MAX_COMMAND_OUTPUT_BYTES).toString("utf-8") +
75
+ `\n...[truncated after ${MAX_COMMAND_OUTPUT_BYTES} bytes]`,
76
+ };
77
+ }
@@ -0,0 +1,21 @@
1
+ export type CommandOutputStream = "stdout" | "stderr" | "mixed";
2
+ export interface CommandOutputEvent {
3
+ readonly stream: CommandOutputStream;
4
+ readonly text: string;
5
+ readonly sequence: number;
6
+ readonly cwd: string;
7
+ readonly commandLineCount: number;
8
+ readonly commandFilePath?: string;
9
+ }
10
+ export type CommandOutputSink = (event: CommandOutputEvent) => void;
11
+ export interface OutputEventCollector {
12
+ readonly push: (stream: Exclude<CommandOutputStream, "mixed">, text: string) => void;
13
+ readonly close: () => void;
14
+ }
15
+ export declare function createOutputEventCollector(input: {
16
+ readonly cwd: string;
17
+ readonly commandLineCount: number;
18
+ readonly commandFilePath?: string;
19
+ readonly onOutput?: CommandOutputSink;
20
+ }): OutputEventCollector;
21
+ //# sourceMappingURL=commandOutputEvents.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commandOutputEvents.d.ts","sourceRoot":"","sources":["../../src/builtins/commandOutputEvents.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,mBAAmB,GAAG,QAAQ,GAAG,QAAQ,GAAG,OAAO,CAAC;AAEhE,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,MAAM,EAAE,mBAAmB,CAAC;IACrC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;CACnC;AAED,MAAM,MAAM,iBAAiB,GAAG,CAAC,KAAK,EAAE,kBAAkB,KAAK,IAAI,CAAC;AAOpE,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,IAAI,EAAE,CACb,MAAM,EAAE,OAAO,CAAC,mBAAmB,EAAE,OAAO,CAAC,EAC7C,IAAI,EAAE,MAAM,KACT,IAAI,CAAC;IACV,QAAQ,CAAC,KAAK,EAAE,MAAM,IAAI,CAAC;CAC5B;AAKD,wBAAgB,0BAA0B,CAAC,KAAK,EAAE;IAChD,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,QAAQ,CAAC,EAAE,iBAAiB,CAAC;CACvC,GAAG,oBAAoB,CAsDvB"}
@@ -0,0 +1,56 @@
1
+ const COMMAND_OUTPUT_EVENT_FLUSH_MS = 80;
2
+ const MAX_COMMAND_OUTPUT_EVENT_CHARS = 16 * 1024;
3
+ export function createOutputEventCollector(input) {
4
+ const onOutput = input.onOutput;
5
+ const pendingChunks = [];
6
+ let pendingCharCount = 0;
7
+ let sequence = 0;
8
+ let flushTimer;
9
+ const clearFlushTimer = () => {
10
+ if (!flushTimer)
11
+ return;
12
+ clearTimeout(flushTimer);
13
+ flushTimer = undefined;
14
+ };
15
+ const flush = () => {
16
+ if (!onOutput || pendingChunks.length === 0)
17
+ return;
18
+ clearFlushTimer();
19
+ sequence += 1;
20
+ const streams = new Set(pendingChunks.map((chunk) => chunk.stream));
21
+ const stream = streams.size === 1 ? pendingChunks[0]?.stream ?? "mixed" : "mixed";
22
+ const text = pendingChunks.map((chunk) => chunk.text).join("");
23
+ pendingChunks.length = 0;
24
+ pendingCharCount = 0;
25
+ onOutput({
26
+ stream,
27
+ text,
28
+ sequence,
29
+ cwd: input.cwd,
30
+ commandLineCount: input.commandLineCount,
31
+ ...(input.commandFilePath
32
+ ? { commandFilePath: input.commandFilePath }
33
+ : {}),
34
+ });
35
+ };
36
+ return {
37
+ push(stream, text) {
38
+ if (!onOutput || !text)
39
+ return;
40
+ pendingChunks.push({ stream, text });
41
+ pendingCharCount += text.length;
42
+ if (pendingCharCount >= MAX_COMMAND_OUTPUT_EVENT_CHARS) {
43
+ flush();
44
+ return;
45
+ }
46
+ if (!flushTimer) {
47
+ flushTimer = setTimeout(flush, COMMAND_OUTPUT_EVENT_FLUSH_MS);
48
+ flushTimer.unref?.();
49
+ }
50
+ },
51
+ close() {
52
+ flush();
53
+ clearFlushTimer();
54
+ },
55
+ };
56
+ }
@@ -0,0 +1,15 @@
1
+ export interface ShellExecutable {
2
+ readonly command: string;
3
+ readonly argsPrefix: readonly string[];
4
+ readonly scriptExtension: "cmd" | "sh";
5
+ readonly scriptInvocation: (scriptPath: string) => string;
6
+ }
7
+ export interface PreparedShellCommand {
8
+ readonly commandText: string;
9
+ readonly originalCommandText: string;
10
+ readonly commandLineCount: number;
11
+ readonly commandFilePath?: string;
12
+ }
13
+ export declare function shellExecutable(): ShellExecutable;
14
+ export declare function prepareShellCommand(commandText: string, workspaceRoot: string, shell: ShellExecutable): Promise<PreparedShellCommand>;
15
+ //# sourceMappingURL=shellCommandPreparation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shellCommandPreparation.d.ts","sourceRoot":"","sources":["../../src/builtins/shellCommandPreparation.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;IACvC,QAAQ,CAAC,eAAe,EAAE,KAAK,GAAG,IAAI,CAAC;IACvC,QAAQ,CAAC,gBAAgB,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,MAAM,CAAC;CAC3D;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;CACnC;AAUD,wBAAgB,eAAe,IAAI,eAAe,CAejD;AAcD,wBAAsB,mBAAmB,CACvC,WAAW,EAAE,MAAM,EACnB,aAAa,EAAE,MAAM,EACrB,KAAK,EAAE,eAAe,GACrB,OAAO,CAAC,oBAAoB,CAAC,CAkB/B"}
@@ -0,0 +1,44 @@
1
+ import { countOutputLines, LONG_COMMAND_LINE_LIMIT, toDisplayPath, writeCommandArtifactFile, } from "./commandArtifacts.js";
2
+ function quotePosixShellArg(value) {
3
+ return `'${value.replace(/'/g, "'\\''")}'`;
4
+ }
5
+ function quoteWindowsCmdPath(value) {
6
+ return `"${value.replace(/"/g, '""')}"`;
7
+ }
8
+ export function shellExecutable() {
9
+ if (process.platform === "win32") {
10
+ return {
11
+ command: process.env.ComSpec || "cmd.exe",
12
+ argsPrefix: ["/d", "/c"],
13
+ scriptExtension: "cmd",
14
+ scriptInvocation: (scriptPath) => `call ${quoteWindowsCmdPath(scriptPath)}`,
15
+ };
16
+ }
17
+ return {
18
+ command: process.env.SHELL || "/bin/sh",
19
+ argsPrefix: ["-lc"],
20
+ scriptExtension: "sh",
21
+ scriptInvocation: (scriptPath) => `sh ${quotePosixShellArg(scriptPath)}`,
22
+ };
23
+ }
24
+ function buildCommandFileContent(commandText, scriptExtension) {
25
+ const commandWithTrailingLineBreak = commandText.endsWith("\n")
26
+ ? commandText
27
+ : `${commandText}\n`;
28
+ return scriptExtension === "cmd"
29
+ ? `@echo off\r\n${commandWithTrailingLineBreak}`
30
+ : commandWithTrailingLineBreak;
31
+ }
32
+ export async function prepareShellCommand(commandText, workspaceRoot, shell) {
33
+ const commandLineCount = countOutputLines(commandText);
34
+ if (commandLineCount <= LONG_COMMAND_LINE_LIMIT) {
35
+ return { commandText, originalCommandText: commandText, commandLineCount };
36
+ }
37
+ const commandFilePath = await writeCommandArtifactFile(workspaceRoot, "cmd", shell.scriptExtension, buildCommandFileContent(commandText, shell.scriptExtension));
38
+ return {
39
+ commandText: shell.scriptInvocation(commandFilePath),
40
+ originalCommandText: commandText,
41
+ commandLineCount,
42
+ commandFilePath: toDisplayPath(commandFilePath),
43
+ };
44
+ }
@@ -0,0 +1,30 @@
1
+ import type { PreparedShellCommand } from "./shellCommandPreparation.js";
2
+ export interface ShellCommandResult {
3
+ readonly exitCode: number | null;
4
+ readonly signal: NodeJS.Signals | null;
5
+ readonly stdout: string;
6
+ readonly stderr: string;
7
+ readonly durationMs: number;
8
+ readonly timedOut: boolean;
9
+ readonly inactivityTimedOut: boolean;
10
+ readonly outputSpilled: boolean;
11
+ readonly outputFilePath?: string;
12
+ readonly outputLineCount: number;
13
+ readonly commandFilePath?: string;
14
+ readonly commandLineCount: number;
15
+ }
16
+ interface ClosedShellCommandInput {
17
+ readonly exitCode: number | null;
18
+ readonly signal: NodeJS.Signals | null;
19
+ readonly stdout: string;
20
+ readonly stderr: string;
21
+ readonly startedAt: Date;
22
+ readonly timedOut: boolean;
23
+ readonly inactivityTimedOut: boolean;
24
+ readonly prepared: PreparedShellCommand;
25
+ readonly workspaceRoot: string;
26
+ readonly cwd: string;
27
+ }
28
+ export declare function resolveClosedShellCommand(input: ClosedShellCommandInput): Promise<ShellCommandResult>;
29
+ export {};
30
+ //# sourceMappingURL=shellCommandResult.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shellCommandResult.d.ts","sourceRoot":"","sources":["../../src/builtins/shellCommandResult.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AAEzE,MAAM,WAAW,kBAAkB;IAClC,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC;IACvC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,kBAAkB,EAAE,OAAO,CAAC;IACrC,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC;IAChC,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;CAClC;AAED,UAAU,uBAAuB;IAChC,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC;IACvC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,kBAAkB,EAAE,OAAO,CAAC;IACrC,QAAQ,CAAC,QAAQ,EAAE,oBAAoB,CAAC;IACxC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACrB;AA0CD,wBAAsB,yBAAyB,CAC9C,KAAK,EAAE,uBAAuB,GAC5B,OAAO,CAAC,kBAAkB,CAAC,CAuD7B"}
@@ -0,0 +1,71 @@
1
+ import { buildCommandOutputSpilloverContent, COMMAND_OUTPUT_SPILLOVER_LINE_LIMIT, countOutputLines, formatCommandOutputSpilloverStdout, toDisplayPath, truncateOutput, writeCommandArtifactFile, } from "./commandArtifacts.js";
2
+ async function writeCommandOutputSpilloverFile(workspaceRoot, content) {
3
+ return writeCommandArtifactFile(workspaceRoot, "cmd", "out", content);
4
+ }
5
+ function buildShellCommandResult(input) {
6
+ return {
7
+ exitCode: input.exitCode,
8
+ signal: input.signal,
9
+ stdout: input.stdout,
10
+ stderr: input.stderr,
11
+ durationMs: input.endedAt.getTime() - input.startedAt.getTime(),
12
+ timedOut: input.timedOut,
13
+ inactivityTimedOut: input.inactivityTimedOut,
14
+ outputSpilled: input.outputSpilled,
15
+ outputLineCount: input.outputLineCount,
16
+ ...(input.outputFilePath ? { outputFilePath: input.outputFilePath } : {}),
17
+ ...(input.commandFilePath
18
+ ? { commandFilePath: input.commandFilePath }
19
+ : {}),
20
+ commandLineCount: input.commandLineCount,
21
+ };
22
+ }
23
+ export async function resolveClosedShellCommand(input) {
24
+ const endedAt = new Date();
25
+ const outputLineCount = countOutputLines(`${input.stdout}${input.stderr}`);
26
+ if (outputLineCount > COMMAND_OUTPUT_SPILLOVER_LINE_LIMIT) {
27
+ const outputFilePath = await writeCommandOutputSpilloverFile(input.workspaceRoot, buildCommandOutputSpilloverContent({
28
+ commandText: input.prepared.originalCommandText,
29
+ commandFilePath: input.prepared.commandFilePath,
30
+ commandLineCount: input.prepared.commandLineCount,
31
+ cwd: input.cwd,
32
+ startedAt: input.startedAt,
33
+ endedAt,
34
+ exitCode: input.exitCode,
35
+ signal: input.signal,
36
+ timedOut: input.timedOut,
37
+ inactivityTimedOut: input.inactivityTimedOut,
38
+ stdout: input.stdout,
39
+ stderr: input.stderr,
40
+ }));
41
+ return buildShellCommandResult({
42
+ exitCode: input.exitCode,
43
+ signal: input.signal,
44
+ stdout: formatCommandOutputSpilloverStdout(outputFilePath, outputLineCount),
45
+ stderr: "",
46
+ startedAt: input.startedAt,
47
+ endedAt,
48
+ timedOut: input.timedOut,
49
+ inactivityTimedOut: input.inactivityTimedOut,
50
+ outputSpilled: true,
51
+ outputFilePath: toDisplayPath(outputFilePath),
52
+ outputLineCount,
53
+ commandFilePath: input.prepared.commandFilePath,
54
+ commandLineCount: input.prepared.commandLineCount,
55
+ });
56
+ }
57
+ return buildShellCommandResult({
58
+ exitCode: input.exitCode,
59
+ signal: input.signal,
60
+ stdout: truncateOutput(input.stdout).text,
61
+ stderr: truncateOutput(input.stderr).text,
62
+ startedAt: input.startedAt,
63
+ endedAt,
64
+ timedOut: input.timedOut,
65
+ inactivityTimedOut: input.inactivityTimedOut,
66
+ outputSpilled: false,
67
+ outputLineCount,
68
+ commandFilePath: input.prepared.commandFilePath,
69
+ commandLineCount: input.prepared.commandLineCount,
70
+ });
71
+ }
@@ -0,0 +1,14 @@
1
+ import { type CommandOutputEvent, type CommandOutputSink } from "./commandOutputEvents.js";
2
+ import { type ShellCommandResult } from "./shellCommandResult.js";
3
+ export type { CommandOutputEvent, CommandOutputSink };
4
+ export interface RunShellCommandOptions {
5
+ readonly commandText: string;
6
+ readonly workspaceRoot: string;
7
+ readonly cwd: string;
8
+ readonly timeoutMs: number;
9
+ readonly inactivityTimeoutMs: number;
10
+ readonly onOutput?: CommandOutputSink;
11
+ }
12
+ export type { ShellCommandResult };
13
+ export declare function runShellCommand(options: RunShellCommandOptions): Promise<ShellCommandResult>;
14
+ //# sourceMappingURL=shellCommandRunner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shellCommandRunner.d.ts","sourceRoot":"","sources":["../../src/builtins/shellCommandRunner.ts"],"names":[],"mappings":"AAEA,OAAO,EACN,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EAEtB,MAAM,0BAA0B,CAAC;AAKlC,OAAO,EAEN,KAAK,kBAAkB,EACvB,MAAM,yBAAyB,CAAC;AAMjC,YAAY,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,CAAC;AAEtD,MAAM,WAAW,sBAAsB;IACtC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,QAAQ,CAAC,EAAE,iBAAiB,CAAC;CACtC;AAED,YAAY,EAAE,kBAAkB,EAAE,CAAC;AAInC,wBAAsB,eAAe,CACpC,OAAO,EAAE,sBAAsB,GAC7B,OAAO,CAAC,kBAAkB,CAAC,CAqH7B"}
@@ -0,0 +1,114 @@
1
+ import { spawn } from "node:child_process";
2
+ import { createOutputEventCollector, } from "./commandOutputEvents.js";
3
+ import { prepareShellCommand, shellExecutable, } from "./shellCommandPreparation.js";
4
+ import { resolveClosedShellCommand, } from "./shellCommandResult.js";
5
+ import { createShellOutputDecoder, decodeShellOutputChunk, } from "./shellOutputDecoder.js";
6
+ const KILL_ESCALATION_DELAY_MS = 1000;
7
+ export async function runShellCommand(options) {
8
+ const shell = shellExecutable();
9
+ const prepared = await prepareShellCommand(options.commandText, options.workspaceRoot, shell);
10
+ return new Promise((resolve, reject) => {
11
+ const startedAt = new Date();
12
+ const child = spawn(shell.command, [...shell.argsPrefix, prepared.commandText], {
13
+ cwd: options.cwd,
14
+ env: process.env,
15
+ windowsVerbatimArguments: process.platform === "win32",
16
+ windowsHide: true,
17
+ });
18
+ const outputEvents = createOutputEventCollector({
19
+ cwd: options.cwd,
20
+ commandLineCount: prepared.commandLineCount,
21
+ commandFilePath: prepared.commandFilePath,
22
+ onOutput: options.onOutput,
23
+ });
24
+ let stdout = "";
25
+ let stderr = "";
26
+ let timedOut = false;
27
+ let inactivityTimedOut = false;
28
+ let killEscalationTimer;
29
+ let inactivityTimer;
30
+ const stdoutDecoder = createShellOutputDecoder();
31
+ const stderrDecoder = createShellOutputDecoder();
32
+ const clearTimers = () => {
33
+ if (inactivityTimer)
34
+ clearTimeout(inactivityTimer);
35
+ if (killEscalationTimer)
36
+ clearTimeout(killEscalationTimer);
37
+ inactivityTimer = undefined;
38
+ killEscalationTimer = undefined;
39
+ };
40
+ const escalateKill = () => {
41
+ if (killEscalationTimer)
42
+ return;
43
+ killEscalationTimer = setTimeout(() => {
44
+ if (!child.killed) {
45
+ child.kill("SIGKILL");
46
+ }
47
+ }, KILL_ESCALATION_DELAY_MS);
48
+ killEscalationTimer.unref?.();
49
+ };
50
+ const timer = setTimeout(() => {
51
+ timedOut = true;
52
+ child.kill("SIGTERM");
53
+ escalateKill();
54
+ }, options.timeoutMs);
55
+ timer.unref?.();
56
+ const resetInactivityTimer = () => {
57
+ if (inactivityTimer)
58
+ clearTimeout(inactivityTimer);
59
+ inactivityTimer = setTimeout(() => {
60
+ inactivityTimedOut = true;
61
+ timedOut = true;
62
+ child.kill("SIGTERM");
63
+ escalateKill();
64
+ }, options.inactivityTimeoutMs);
65
+ inactivityTimer.unref?.();
66
+ };
67
+ resetInactivityTimer();
68
+ const appendStdout = (text) => {
69
+ if (!text)
70
+ return;
71
+ stdout += text;
72
+ outputEvents.push("stdout", text);
73
+ resetInactivityTimer();
74
+ };
75
+ const appendStderr = (text) => {
76
+ if (!text)
77
+ return;
78
+ stderr += text;
79
+ outputEvents.push("stderr", text);
80
+ resetInactivityTimer();
81
+ };
82
+ child.stdout?.on("data", (chunk) => {
83
+ appendStdout(decodeShellOutputChunk(stdoutDecoder, chunk));
84
+ });
85
+ child.stderr?.on("data", (chunk) => {
86
+ appendStderr(decodeShellOutputChunk(stderrDecoder, chunk));
87
+ });
88
+ child.on("error", (error) => {
89
+ clearTimeout(timer);
90
+ clearTimers();
91
+ outputEvents.close();
92
+ reject(error);
93
+ });
94
+ child.on("close", (exitCode, signal) => {
95
+ clearTimeout(timer);
96
+ clearTimers();
97
+ appendStdout(decodeShellOutputChunk(stdoutDecoder, undefined, true));
98
+ appendStderr(decodeShellOutputChunk(stderrDecoder, undefined, true));
99
+ outputEvents.close();
100
+ void resolveClosedShellCommand({
101
+ exitCode,
102
+ signal,
103
+ stdout,
104
+ stderr,
105
+ startedAt,
106
+ timedOut,
107
+ inactivityTimedOut,
108
+ prepared,
109
+ workspaceRoot: options.workspaceRoot,
110
+ cwd: options.cwd,
111
+ }).then(resolve, reject);
112
+ });
113
+ });
114
+ }
@@ -0,0 +1,5 @@
1
+ import { TextDecoder } from "node:util";
2
+ export declare function resolveShellOutputEncoding(platform?: NodeJS.Platform, env?: NodeJS.ProcessEnv): string;
3
+ export declare function createShellOutputDecoder(encoding?: string): TextDecoder;
4
+ export declare function decodeShellOutputChunk(decoder: TextDecoder, chunk?: Buffer, end?: boolean): string;
5
+ //# sourceMappingURL=shellOutputDecoder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shellOutputDecoder.d.ts","sourceRoot":"","sources":["../../src/builtins/shellOutputDecoder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAKxC,wBAAgB,0BAA0B,CACzC,QAAQ,GAAE,MAAM,CAAC,QAA2B,EAC5C,GAAG,GAAE,MAAM,CAAC,UAAwB,GAClC,MAAM,CAUR;AAED,wBAAgB,wBAAwB,CACvC,QAAQ,SAA+B,GACrC,WAAW,CAMb;AAED,wBAAgB,sBAAsB,CACrC,OAAO,EAAE,WAAW,EACpB,KAAK,CAAC,EAAE,MAAM,EACd,GAAG,UAAQ,GACT,MAAM,CAQR"}
@@ -0,0 +1,30 @@
1
+ import { TextDecoder } from "node:util";
2
+ const DEFAULT_WINDOWS_SHELL_OUTPUT_ENCODING = "gb18030";
3
+ const DEFAULT_SHELL_OUTPUT_ENCODING = "utf-8";
4
+ export function resolveShellOutputEncoding(platform = process.platform, env = process.env) {
5
+ const configuredEncoding = env.ACODE_COMMAND_OUTPUT_ENCODING?.trim() ||
6
+ env.AWS_TERMINAL_OUTPUT_ENCODING?.trim();
7
+ if (configuredEncoding) {
8
+ return configuredEncoding;
9
+ }
10
+ return platform === "win32"
11
+ ? DEFAULT_WINDOWS_SHELL_OUTPUT_ENCODING
12
+ : DEFAULT_SHELL_OUTPUT_ENCODING;
13
+ }
14
+ export function createShellOutputDecoder(encoding = resolveShellOutputEncoding()) {
15
+ try {
16
+ return new TextDecoder(encoding, { fatal: false });
17
+ }
18
+ catch {
19
+ return new TextDecoder(DEFAULT_SHELL_OUTPUT_ENCODING, { fatal: false });
20
+ }
21
+ }
22
+ export function decodeShellOutputChunk(decoder, chunk, end = false) {
23
+ if (end) {
24
+ return decoder.decode();
25
+ }
26
+ if (!chunk || chunk.length === 0) {
27
+ return "";
28
+ }
29
+ return decoder.decode(chunk, { stream: true });
30
+ }
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Main flow: normalize common MCP separators, then use the final segment as
3
+ * the semantic tool name that controls timeout policy.
4
+ */
5
+ export declare function getSemanticToolName(toolName: string): string;
6
+ /**
7
+ * Main flow: classify only exact polling tool names so similarly named tools
8
+ * keep the regular MCP timeout.
9
+ */
10
+ export declare function isMcpPollingToolName(toolName: string): boolean;
11
+ //# sourceMappingURL=mcpToolNames.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcpToolNames.d.ts","sourceRoot":"","sources":["../src/mcpToolNames.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAI5D;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAE9D"}
@@ -0,0 +1,17 @@
1
+ const POLLING_TOOL_NAMES = new Set(["poll_message", "get_message"]);
2
+ /**
3
+ * Main flow: normalize common MCP separators, then use the final segment as
4
+ * the semantic tool name that controls timeout policy.
5
+ */
6
+ export function getSemanticToolName(toolName) {
7
+ const normalized = toolName.trim().toLowerCase();
8
+ const segments = normalized.split(/__|[./]/).filter(Boolean);
9
+ return segments.at(-1) ?? normalized;
10
+ }
11
+ /**
12
+ * Main flow: classify only exact polling tool names so similarly named tools
13
+ * keep the regular MCP timeout.
14
+ */
15
+ export function isMcpPollingToolName(toolName) {
16
+ return POLLING_TOOL_NAMES.has(getSemanticToolName(toolName));
17
+ }
@@ -3,12 +3,15 @@ import type { ACodeRuntimeConfig } from "./types.js";
3
3
  export declare class ACodeRuntime extends EventEmitter {
4
4
  private readonly config;
5
5
  private readonly hookBus;
6
+ private initialConversation;
6
7
  private state;
7
8
  private abortController;
8
9
  private submitQueue;
9
10
  private activeTurn;
10
11
  private abortRequested;
11
12
  private sessionCompleteEmitted;
13
+ private contextVersion;
14
+ private readonly stopWaiters;
12
15
  constructor(config: ACodeRuntimeConfig);
13
16
  private emitAcodeEvent;
14
17
  /**
@@ -23,6 +26,12 @@ export declare class ACodeRuntime extends EventEmitter {
23
26
  * MCP tool call 则执行工具并继续同一轮,最后输出 assistant 文本与 usage。
24
27
  */
25
28
  submit(message: string): Promise<void>;
29
+ /**
30
+ * Reset only the conversation context while keeping the live ACode session,
31
+ * MCP connections, exposed tools, commands, and hooks available.
32
+ */
33
+ resetContext(): Promise<void>;
34
+ private isTurnSuperseded;
26
35
  private executeSubmit;
27
36
  /** 中止当前轮次;由执行轮次统一发出一个终态事件,避免 aborted/failed 双终态。 */
28
37
  abort(): Promise<void>;
@@ -34,6 +43,16 @@ export declare class ACodeRuntime extends EventEmitter {
34
43
  private readChatCompletionStream;
35
44
  private handleToolCalls;
36
45
  private callMcpToolWithTimeout;
46
+ /**
47
+ * Build a one-shot waiter that rejects long-running MCP calls when the runtime stops.
48
+ * Main flow: register a stop callback -> race it with the SDK call -> remove it after either side settles.
49
+ */
50
+ private createRuntimeStopWaiter;
51
+ /**
52
+ * Notify and clear every pending runtime-stop waiter.
53
+ * Main flow: snapshot callbacks -> clear the set -> reject each pending MCP race exactly once.
54
+ */
55
+ private notifyRuntimeStop;
37
56
  private appendSyntheticMultimodalUserMessage;
38
57
  private appendToolFailureResult;
39
58
  private connectMcpServers;
@@ -1 +1 @@
1
- {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAiB3C,OAAO,KAAK,EAOV,kBAAkB,EAEnB,MAAM,YAAY,CAAC;AAuoCpB,qBAAa,YAAa,SAAQ,YAAY;IAmChC,OAAO,CAAC,QAAQ,CAAC,MAAM;IAlCnC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAe;IAEvC,OAAO,CAAC,KAAK,CAoBX;IAEF,OAAO,CAAC,eAAe,CAAgC;IAEvD,OAAO,CAAC,WAAW,CAAoC;IAEvD,OAAO,CAAC,UAAU,CAAS;IAE3B,OAAO,CAAC,cAAc,CAAS;IAE/B,OAAO,CAAC,sBAAsB,CAAS;gBAEV,MAAM,EAAE,kBAAkB;IAevD,OAAO,CAAC,cAAc;IAatB;;;;OAIG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAyF5B;;;;OAIG;IACG,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;YAM9B,aAAa;IA2E3B,oDAAoD;IAC9C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAM5B,uCAAuC;IACjC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IA8B3B,OAAO,CAAC,kBAAkB;YAaZ,YAAY;YAoEZ,qBAAqB;YA4JrB,wBAAwB;YA6ExB,eAAe;YAoJf,sBAAsB;YAqCtB,oCAAoC;IAkBlD,OAAO,CAAC,uBAAuB;YAuBjB,iBAAiB;IA2C/B,OAAO,CAAC,kBAAkB;YA2BZ,oBAAoB;CAiBnC"}
1
+ {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAkB3C,OAAO,KAAK,EAOV,kBAAkB,EAEnB,MAAM,YAAY,CAAC;AAksCpB,qBAAa,YAAa,SAAQ,YAAY;IAsChC,OAAO,CAAC,QAAQ,CAAC,MAAM;IArCnC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAe;IACvC,OAAO,CAAC,mBAAmB,CAAqB;IAEhD,OAAO,CAAC,KAAK,CAoBX;IAEF,OAAO,CAAC,eAAe,CAAgC;IAEvD,OAAO,CAAC,WAAW,CAAoC;IAEvD,OAAO,CAAC,UAAU,CAAS;IAE3B,OAAO,CAAC,cAAc,CAAS;IAE/B,OAAO,CAAC,sBAAsB,CAAS;IACvC,OAAO,CAAC,cAAc,CAAK;IAC3B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAyB;gBAExB,MAAM,EAAE,kBAAkB;IAevD,OAAO,CAAC,cAAc;IAatB;;;;OAIG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IA2F5B;;;;OAIG;IACG,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAS5C;;;OAGG;IACG,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAWnC,OAAO,CAAC,gBAAgB;YAIV,aAAa;IA6F3B,oDAAoD;IAC9C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAM5B,uCAAuC;IACjC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IA+B3B,OAAO,CAAC,kBAAkB;YAaZ,YAAY;YAoFZ,qBAAqB;YAuKrB,wBAAwB;YA8ExB,eAAe;YAuMf,sBAAsB;IA6CpC;;;OAGG;IACH,OAAO,CAAC,uBAAuB;IAiC/B;;;OAGG;IACH,OAAO,CAAC,iBAAiB;YAQX,oCAAoC;IAsBlD,OAAO,CAAC,uBAAuB;YAuBjB,iBAAiB;IA2C/B,OAAO,CAAC,kBAAkB;YA2BZ,oBAAoB;CAiBnC"}