chivgent 0.9.0 → 0.11.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.
- package/README.md +144 -10
- package/README.zh-CN.md +123 -8
- package/dist/agent.d.ts.map +1 -1
- package/dist/agent.js +9 -0
- package/dist/agent.js.map +1 -1
- package/dist/cli-options.d.ts +13 -2
- package/dist/cli-options.d.ts.map +1 -1
- package/dist/cli-options.js +39 -5
- package/dist/cli-options.js.map +1 -1
- package/dist/cli.js +166 -6
- package/dist/cli.js.map +1 -1
- package/dist/events.d.ts +17 -1
- package/dist/events.d.ts.map +1 -1
- package/dist/events.js.map +1 -1
- package/dist/extensions/api.d.ts +38 -0
- package/dist/extensions/api.d.ts.map +1 -0
- package/dist/extensions/api.js +2 -0
- package/dist/extensions/api.js.map +1 -0
- package/dist/extensions/decide-trust.d.ts +28 -0
- package/dist/extensions/decide-trust.d.ts.map +1 -0
- package/dist/extensions/decide-trust.js +96 -0
- package/dist/extensions/decide-trust.js.map +1 -0
- package/dist/extensions/discover.d.ts +19 -0
- package/dist/extensions/discover.d.ts.map +1 -0
- package/dist/extensions/discover.js +61 -0
- package/dist/extensions/discover.js.map +1 -0
- package/dist/extensions/loader.d.ts +28 -0
- package/dist/extensions/loader.d.ts.map +1 -0
- package/dist/extensions/loader.js +60 -0
- package/dist/extensions/loader.js.map +1 -0
- package/dist/extensions/registry.d.ts +36 -0
- package/dist/extensions/registry.d.ts.map +1 -0
- package/dist/extensions/registry.js +115 -0
- package/dist/extensions/registry.js.map +1 -0
- package/dist/extensions/trust.d.ts +44 -0
- package/dist/extensions/trust.d.ts.map +1 -0
- package/dist/extensions/trust.js +129 -0
- package/dist/extensions/trust.js.map +1 -0
- package/dist/render.d.ts +5 -0
- package/dist/render.d.ts.map +1 -1
- package/dist/render.js +36 -0
- package/dist/render.js.map +1 -1
- package/dist/repl.d.ts +12 -1
- package/dist/repl.d.ts.map +1 -1
- package/dist/repl.js +47 -2
- package/dist/repl.js.map +1 -1
- package/dist/session.d.ts.map +1 -1
- package/dist/session.js +2 -1
- package/dist/session.js.map +1 -1
- package/dist/shell/config.d.ts +14 -0
- package/dist/shell/config.d.ts.map +1 -0
- package/dist/shell/config.js +43 -0
- package/dist/shell/config.js.map +1 -0
- package/dist/shell/local.d.ts +10 -0
- package/dist/shell/local.d.ts.map +1 -0
- package/dist/shell/local.js +90 -0
- package/dist/shell/local.js.map +1 -0
- package/dist/shell/output.d.ts +54 -0
- package/dist/shell/output.d.ts.map +1 -0
- package/dist/shell/output.js +168 -0
- package/dist/shell/output.js.map +1 -0
- package/dist/shell/process.d.ts +21 -0
- package/dist/shell/process.d.ts.map +1 -0
- package/dist/shell/process.js +134 -0
- package/dist/shell/process.js.map +1 -0
- package/dist/shell/sanitize.d.ts +10 -0
- package/dist/shell/sanitize.d.ts.map +1 -0
- package/dist/shell/sanitize.js +34 -0
- package/dist/shell/sanitize.js.map +1 -0
- package/dist/shell/truncate.d.ts +31 -0
- package/dist/shell/truncate.d.ts.map +1 -0
- package/dist/shell/truncate.js +121 -0
- package/dist/shell/truncate.js.map +1 -0
- package/dist/shell/types.d.ts +33 -0
- package/dist/shell/types.d.ts.map +1 -0
- package/dist/shell/types.js +26 -0
- package/dist/shell/types.js.map +1 -0
- package/dist/tools/bash.d.ts +42 -0
- package/dist/tools/bash.d.ts.map +1 -0
- package/dist/tools/bash.js +225 -0
- package/dist/tools/bash.js.map +1 -0
- package/dist/tools/tool.d.ts +5 -0
- package/dist/tools/tool.d.ts.map +1 -1
- package/package.json +1 -1
package/dist/repl.js
CHANGED
|
@@ -1,5 +1,13 @@
|
|
|
1
1
|
import { createInterface } from "node:readline";
|
|
2
2
|
export const REPL_PROMPT = "› ";
|
|
3
|
+
export const BUILT_IN_COMMANDS = [
|
|
4
|
+
"help",
|
|
5
|
+
"session",
|
|
6
|
+
"tools",
|
|
7
|
+
"clear",
|
|
8
|
+
"exit",
|
|
9
|
+
"quit",
|
|
10
|
+
];
|
|
3
11
|
const HELP = `Commands:
|
|
4
12
|
/help Show this help
|
|
5
13
|
/session Show the current session id, workspace, and size
|
|
@@ -9,6 +17,17 @@ const HELP = `Commands:
|
|
|
9
17
|
|
|
10
18
|
Anything else is sent to the model. Ctrl+C stops the answer in progress.
|
|
11
19
|
`;
|
|
20
|
+
function helpText(context) {
|
|
21
|
+
const extras = context.extensionCommands ?? [];
|
|
22
|
+
if (extras.length === 0) {
|
|
23
|
+
return HELP;
|
|
24
|
+
}
|
|
25
|
+
const width = Math.max(...extras.map((command) => command.name.length)) + 3;
|
|
26
|
+
const lines = extras.map((command) => ` /${command.name.padEnd(width)}${command.description}`);
|
|
27
|
+
// Extension commands are listed apart from the built-ins so it is always
|
|
28
|
+
// clear which of them came from code this project supplied.
|
|
29
|
+
return `${HELP}\nFrom extensions:\n${lines.join("\n")}\n`;
|
|
30
|
+
}
|
|
12
31
|
/**
|
|
13
32
|
* Interprets one line of REPL input. Returns `not-a-command` when the line is
|
|
14
33
|
* an ordinary prompt for the model.
|
|
@@ -21,7 +40,7 @@ export function handleSlashCommand(line, context) {
|
|
|
21
40
|
switch (trimmed.split(/\s+/, 1)[0]) {
|
|
22
41
|
case "/help":
|
|
23
42
|
case "/?":
|
|
24
|
-
context.write(
|
|
43
|
+
context.write(helpText(context));
|
|
25
44
|
return "handled";
|
|
26
45
|
case "/session":
|
|
27
46
|
context.write(describeSession(context));
|
|
@@ -36,9 +55,15 @@ export function handleSlashCommand(line, context) {
|
|
|
36
55
|
case "/exit":
|
|
37
56
|
case "/quit":
|
|
38
57
|
return "exit";
|
|
39
|
-
default:
|
|
58
|
+
default: {
|
|
59
|
+
const name = (trimmed.split(/\s+/, 1)[0] ?? "").slice(1);
|
|
60
|
+
const command = (context.extensionCommands ?? []).find((candidate) => candidate.name === name);
|
|
61
|
+
if (command !== undefined) {
|
|
62
|
+
return { kind: "extension", command, argument: trimmed.slice(name.length + 1).trim() };
|
|
63
|
+
}
|
|
40
64
|
context.write(`Unknown command: ${trimmed}. Try /help.\n`);
|
|
41
65
|
return "handled";
|
|
66
|
+
}
|
|
42
67
|
}
|
|
43
68
|
}
|
|
44
69
|
function describeSession(context) {
|
|
@@ -92,10 +117,30 @@ export async function runRepl(options) {
|
|
|
92
117
|
...(options.sessionFile === undefined
|
|
93
118
|
? {}
|
|
94
119
|
: { sessionFile: options.sessionFile }),
|
|
120
|
+
...(options.extensionCommands === undefined
|
|
121
|
+
? {}
|
|
122
|
+
: { extensionCommands: options.extensionCommands }),
|
|
95
123
|
});
|
|
96
124
|
if (outcome === "exit") {
|
|
97
125
|
break;
|
|
98
126
|
}
|
|
127
|
+
if (typeof outcome === "object") {
|
|
128
|
+
// An extension command runs here rather than inside the parser so it may
|
|
129
|
+
// be async, and so a throwing command cannot take the REPL down.
|
|
130
|
+
try {
|
|
131
|
+
await outcome.command.run({
|
|
132
|
+
session: options.session,
|
|
133
|
+
write,
|
|
134
|
+
argument: outcome.argument,
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
catch (error) {
|
|
138
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
139
|
+
write(`/${outcome.command.name} failed: ${message}\n`);
|
|
140
|
+
}
|
|
141
|
+
readline.prompt();
|
|
142
|
+
continue;
|
|
143
|
+
}
|
|
99
144
|
if (outcome === "handled") {
|
|
100
145
|
readline.prompt();
|
|
101
146
|
continue;
|
package/dist/repl.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"repl.js","sourceRoot":"","sources":["../src/repl.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"repl.js","sourceRoot":"","sources":["../src/repl.ts"],"names":[],"mappings":"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"}
|
package/dist/session.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,KAAK,YAAY,EAAE,KAAK,cAAc,EAAE,MAAM,YAAY,CAAC;AAC3E,OAAO,KAAK,EAAc,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAClE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAGL,KAAK,aAAa,EAClB,KAAK,YAAY,EAClB,MAAM,oBAAoB,CAAC;AAE5B,MAAM,WAAW,mBAAmB;IAClC,4FAA4F;IAC5F,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC;IAC9C,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,CAAC,EAAE,YAAY,CAAC;IAC9B,iDAAiD;IACjD,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,OAAO,EAAE,CAAC;IACvC,2DAA2D;IAC3D,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;CAC3B;AAED;;;;;GAKG;AACH,qBAAa,YAAY;IACvB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IAErB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAQ;IAC9B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAiC;IAC3D,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA2B;IACjD,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAa;IACjC,OAAO,CAAC,UAAU,CAAqB;IACvC,OAAO,CAAC,aAAa,CAAU;IAC/B,OAAO,CAAC,WAAW,CAAK;IAExB,YAAY,OAAO,EAAE,mBAAmB,EAavC;IAED,IAAI,QAAQ,IAAI,SAAS,OAAO,EAAE,CAEjC;IAED,IAAI,KAAK,IAAI,MAAM,CAElB;IAED,IAAI,SAAS,IAAI,SAAS,MAAM,EAAE,CAEjC;IAED,SAAS,CAAC,QAAQ,EAAE,kBAAkB,GAAG,MAAM,IAAI,CAKlD;IAED,iEAAiE;IACjE,KAAK,IAAI,IAAI,CAEZ;IAEK,MAAM,CACV,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE;QAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAA;KAAO,GAC9C,OAAO,CAAC,cAAc,CAAC,CAWzB;IAED,MAAM,IAAI,aAAa,CAQtB;IAED,OAAO,CAAC,QAAQ;IAWhB,OAAO,CAAC,MAAM;
|
|
1
|
+
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,KAAK,YAAY,EAAE,KAAK,cAAc,EAAE,MAAM,YAAY,CAAC;AAC3E,OAAO,KAAK,EAAc,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAClE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAGL,KAAK,aAAa,EAClB,KAAK,YAAY,EAClB,MAAM,oBAAoB,CAAC;AAE5B,MAAM,WAAW,mBAAmB;IAClC,4FAA4F;IAC5F,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC;IAC9C,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,CAAC,EAAE,YAAY,CAAC;IAC9B,iDAAiD;IACjD,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,OAAO,EAAE,CAAC;IACvC,2DAA2D;IAC3D,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;CAC3B;AAED;;;;;GAKG;AACH,qBAAa,YAAY;IACvB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IAErB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAQ;IAC9B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAiC;IAC3D,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA2B;IACjD,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAa;IACjC,OAAO,CAAC,UAAU,CAAqB;IACvC,OAAO,CAAC,aAAa,CAAU;IAC/B,OAAO,CAAC,WAAW,CAAK;IAExB,YAAY,OAAO,EAAE,mBAAmB,EAavC;IAED,IAAI,QAAQ,IAAI,SAAS,OAAO,EAAE,CAEjC;IAED,IAAI,KAAK,IAAI,MAAM,CAElB;IAED,IAAI,SAAS,IAAI,SAAS,MAAM,EAAE,CAEjC;IAED,SAAS,CAAC,QAAQ,EAAE,kBAAkB,GAAG,MAAM,IAAI,CAKlD;IAED,iEAAiE;IACjE,KAAK,IAAI,IAAI,CAEZ;IAEK,MAAM,CACV,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE;QAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAA;KAAO,GAC9C,OAAO,CAAC,cAAc,CAAC,CAWzB;IAED,MAAM,IAAI,aAAa,CAQtB;IAED,OAAO,CAAC,QAAQ;IAWhB,OAAO,CAAC,MAAM;YAeA,WAAW;YAYX,KAAK;CAOpB"}
|
package/dist/session.js
CHANGED
|
@@ -83,7 +83,8 @@ export class AgentSession {
|
|
|
83
83
|
record(event) {
|
|
84
84
|
if (this.store === undefined ||
|
|
85
85
|
!this.headerWritten ||
|
|
86
|
-
event.type === "message_update"
|
|
86
|
+
event.type === "message_update" ||
|
|
87
|
+
event.type === "tool_execution_update") {
|
|
87
88
|
return;
|
|
88
89
|
}
|
|
89
90
|
// Events are emitted synchronously; the store serialises the writes.
|
package/dist/session.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.js","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export interface ShellConfig {
|
|
2
|
+
readonly shell: string;
|
|
3
|
+
readonly args: readonly string[];
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* Resolves the shell to run commands with.
|
|
7
|
+
*
|
|
8
|
+
* Windows is deliberately unsupported for now: doing it properly means Git Bash
|
|
9
|
+
* discovery, WSL's `bash.exe -s` (which takes the command on stdin rather than
|
|
10
|
+
* argv), and a separate PowerShell tool. That is a stage of its own, and a
|
|
11
|
+
* clear error is more useful than a half-working shell.
|
|
12
|
+
*/
|
|
13
|
+
export declare function resolveShellConfig(platform?: NodeJS.Platform): ShellConfig;
|
|
14
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/shell/config.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;CAClC;AAoBD;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,GAAE,MAAM,CAAC,QAA2B,GAC3C,WAAW,CAcb"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { existsSync } from "node:fs";
|
|
2
|
+
import { spawnSync } from "node:child_process";
|
|
3
|
+
import { ShellUnavailableError } from "./types.js";
|
|
4
|
+
function whichBash() {
|
|
5
|
+
try {
|
|
6
|
+
const result = spawnSync("which", ["bash"], {
|
|
7
|
+
encoding: "utf8",
|
|
8
|
+
timeout: 5_000,
|
|
9
|
+
});
|
|
10
|
+
if (result.status === 0 && typeof result.stdout === "string") {
|
|
11
|
+
const first = result.stdout.trim().split("\n")[0];
|
|
12
|
+
if (first !== undefined && first.length > 0) {
|
|
13
|
+
return first;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
catch {
|
|
18
|
+
// Fall through to sh.
|
|
19
|
+
}
|
|
20
|
+
return undefined;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Resolves the shell to run commands with.
|
|
24
|
+
*
|
|
25
|
+
* Windows is deliberately unsupported for now: doing it properly means Git Bash
|
|
26
|
+
* discovery, WSL's `bash.exe -s` (which takes the command on stdin rather than
|
|
27
|
+
* argv), and a separate PowerShell tool. That is a stage of its own, and a
|
|
28
|
+
* clear error is more useful than a half-working shell.
|
|
29
|
+
*/
|
|
30
|
+
export function resolveShellConfig(platform = process.platform) {
|
|
31
|
+
if (platform === "win32") {
|
|
32
|
+
throw new ShellUnavailableError("The bash tool is not supported on Windows yet. Run chivgent under WSL.");
|
|
33
|
+
}
|
|
34
|
+
if (existsSync("/bin/bash")) {
|
|
35
|
+
return { shell: "/bin/bash", args: ["-c"] };
|
|
36
|
+
}
|
|
37
|
+
const bash = whichBash();
|
|
38
|
+
if (bash !== undefined) {
|
|
39
|
+
return { shell: bash, args: ["-c"] };
|
|
40
|
+
}
|
|
41
|
+
return { shell: "sh", args: ["-c"] };
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/shell/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAOnD,SAAS,SAAS;IAChB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,EAAE,CAAC,MAAM,CAAC,EAAE;YAC1C,QAAQ,EAAE,MAAM;YAChB,OAAO,EAAE,KAAK;SACf,CAAC,CAAC;QACH,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,MAAM,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC7D,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;YAClD,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC5C,OAAO,KAAK,CAAC;YACf,CAAC;QACH,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,sBAAsB;IACxB,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,kBAAkB,CAChC,QAAQ,GAAoB,OAAO,CAAC,QAAQ;IAE5C,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QACzB,MAAM,IAAI,qBAAqB,CAC7B,wEAAwE,CACzE,CAAC;IACJ,CAAC;IACD,IAAI,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC5B,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;IAC9C,CAAC;IACD,MAAM,IAAI,GAAG,SAAS,EAAE,CAAC;IACzB,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;IACvC,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;AACvC,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { type ShellConfig } from "./config.js";
|
|
2
|
+
import { type ShellOperations } from "./types.js";
|
|
3
|
+
export declare function validateTimeoutSeconds(value: number): number;
|
|
4
|
+
export interface LocalShellOptions {
|
|
5
|
+
/** Resolved once per command so a shell installed mid-session is picked up. */
|
|
6
|
+
readonly resolveConfig?: () => ShellConfig;
|
|
7
|
+
}
|
|
8
|
+
/** Runs commands as child processes of this one. */
|
|
9
|
+
export declare function createLocalShellOperations(options?: LocalShellOptions): ShellOperations;
|
|
10
|
+
//# sourceMappingURL=local.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local.d.ts","sourceRoot":"","sources":["../../src/shell/local.ts"],"names":[],"mappings":"AAEA,OAAO,EAAsB,KAAK,WAAW,EAAE,MAAM,aAAa,CAAC;AAOnE,OAAO,EAML,KAAK,eAAe,EACrB,MAAM,YAAY,CAAC;AASpB,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAU5D;AAED,MAAM,WAAW,iBAAiB;IAChC,+EAA+E;IAC/E,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,WAAW,CAAC;CAC5C;AAED,oDAAoD;AACpD,wBAAgB,0BAA0B,CACxC,OAAO,GAAE,iBAAsB,GAC9B,eAAe,CA+EjB"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import { existsSync } from "node:fs";
|
|
3
|
+
import { resolveShellConfig } from "./config.js";
|
|
4
|
+
import { killProcessTree, trackChildPid, untrackChildPid, waitForChildProcess, } from "./process.js";
|
|
5
|
+
import { ShellAbortError, ShellTimeoutError, ShellUnavailableError, } from "./types.js";
|
|
6
|
+
const MAX_TIMEOUT_SECONDS = 24 * 60 * 60;
|
|
7
|
+
/** Kept as a call so narrowing never hides a signal that aborts mid-command. */
|
|
8
|
+
function isAborted(signal) {
|
|
9
|
+
return signal !== undefined && signal.aborted;
|
|
10
|
+
}
|
|
11
|
+
export function validateTimeoutSeconds(value) {
|
|
12
|
+
if (!Number.isFinite(value) || value <= 0) {
|
|
13
|
+
throw new TypeError("timeout must be a positive number of seconds.");
|
|
14
|
+
}
|
|
15
|
+
if (value > MAX_TIMEOUT_SECONDS) {
|
|
16
|
+
throw new TypeError(`timeout must be at most ${MAX_TIMEOUT_SECONDS} seconds.`);
|
|
17
|
+
}
|
|
18
|
+
return value;
|
|
19
|
+
}
|
|
20
|
+
/** Runs commands as child processes of this one. */
|
|
21
|
+
export function createLocalShellOperations(options = {}) {
|
|
22
|
+
const resolveConfig = options.resolveConfig ?? (() => resolveShellConfig());
|
|
23
|
+
return {
|
|
24
|
+
async exec(command, cwd, execOptions) {
|
|
25
|
+
const { onData, signal, timeoutSeconds, env } = execOptions;
|
|
26
|
+
if (isAborted(signal)) {
|
|
27
|
+
throw new ShellAbortError();
|
|
28
|
+
}
|
|
29
|
+
if (!existsSync(cwd)) {
|
|
30
|
+
throw new ShellUnavailableError(`Working directory does not exist: ${cwd}`);
|
|
31
|
+
}
|
|
32
|
+
const config = resolveConfig();
|
|
33
|
+
// detached makes the child a process group leader, which is what lets a
|
|
34
|
+
// cancel kill its descendants too.
|
|
35
|
+
const child = spawn(config.shell, [...config.args, command], {
|
|
36
|
+
cwd,
|
|
37
|
+
detached: true,
|
|
38
|
+
env: env ?? process.env,
|
|
39
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
40
|
+
});
|
|
41
|
+
if (child.pid !== undefined) {
|
|
42
|
+
trackChildPid(child.pid);
|
|
43
|
+
}
|
|
44
|
+
let timedOut = false;
|
|
45
|
+
let timeoutHandle;
|
|
46
|
+
const onAbort = () => {
|
|
47
|
+
if (child.pid !== undefined) {
|
|
48
|
+
killProcessTree(child.pid);
|
|
49
|
+
}
|
|
50
|
+
};
|
|
51
|
+
try {
|
|
52
|
+
if (timeoutSeconds !== undefined) {
|
|
53
|
+
timeoutHandle = setTimeout(() => {
|
|
54
|
+
timedOut = true;
|
|
55
|
+
onAbort();
|
|
56
|
+
}, timeoutSeconds * 1000);
|
|
57
|
+
}
|
|
58
|
+
child.stdout?.on("data", onData);
|
|
59
|
+
child.stderr?.on("data", onData);
|
|
60
|
+
if (signal !== undefined) {
|
|
61
|
+
if (signal.aborted) {
|
|
62
|
+
onAbort();
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
signal.addEventListener("abort", onAbort, { once: true });
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
const exitCode = await waitForChildProcess(child);
|
|
69
|
+
// Order matters: an abort that also tripped the timeout is an abort.
|
|
70
|
+
if (isAborted(signal)) {
|
|
71
|
+
throw new ShellAbortError();
|
|
72
|
+
}
|
|
73
|
+
if (timedOut) {
|
|
74
|
+
throw new ShellTimeoutError(timeoutSeconds ?? 0);
|
|
75
|
+
}
|
|
76
|
+
return { exitCode };
|
|
77
|
+
}
|
|
78
|
+
finally {
|
|
79
|
+
if (child.pid !== undefined) {
|
|
80
|
+
untrackChildPid(child.pid);
|
|
81
|
+
}
|
|
82
|
+
if (timeoutHandle !== undefined) {
|
|
83
|
+
clearTimeout(timeoutHandle);
|
|
84
|
+
}
|
|
85
|
+
signal?.removeEventListener("abort", onAbort);
|
|
86
|
+
}
|
|
87
|
+
},
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=local.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local.js","sourceRoot":"","sources":["../../src/shell/local.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { type TruncationResult } from "./truncate.js";
|
|
2
|
+
export interface OutputAccumulatorOptions {
|
|
3
|
+
readonly maxLines?: number;
|
|
4
|
+
readonly maxBytes?: number;
|
|
5
|
+
readonly tempFilePrefix?: string;
|
|
6
|
+
/** Overridable so tests do not write into the real temp directory. */
|
|
7
|
+
readonly tempDirectory?: string;
|
|
8
|
+
}
|
|
9
|
+
export interface OutputSnapshot {
|
|
10
|
+
readonly content: string;
|
|
11
|
+
readonly truncation: TruncationResult;
|
|
12
|
+
/** Set once the full output has been spilled to disk. */
|
|
13
|
+
readonly fullOutputPath?: string;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Collects streaming command output in bounded memory.
|
|
17
|
+
*
|
|
18
|
+
* Two things make this more than a string concatenation. Chunks are decoded
|
|
19
|
+
* with a streaming decoder, because a multi-byte character split across a chunk
|
|
20
|
+
* boundary decodes to garbage otherwise. And once the output passes the limits
|
|
21
|
+
* the accumulator stops keeping it: it spills the raw bytes to a temp file and
|
|
22
|
+
* holds only a rolling tail, so a command that prints a gigabyte does not cost
|
|
23
|
+
* a gigabyte of memory.
|
|
24
|
+
*/
|
|
25
|
+
export declare class OutputAccumulator {
|
|
26
|
+
private readonly maxLines;
|
|
27
|
+
private readonly maxBytes;
|
|
28
|
+
private readonly maxRollingBytes;
|
|
29
|
+
private readonly tempFilePrefix;
|
|
30
|
+
private readonly tempDirectory;
|
|
31
|
+
private readonly decoder;
|
|
32
|
+
private bufferedChunks;
|
|
33
|
+
private tail;
|
|
34
|
+
private tailBytes;
|
|
35
|
+
private totalBytes;
|
|
36
|
+
private newlineCount;
|
|
37
|
+
private hasOpenLine;
|
|
38
|
+
private finished;
|
|
39
|
+
private tempFilePath;
|
|
40
|
+
private tempFileStream;
|
|
41
|
+
constructor(options?: OutputAccumulatorOptions);
|
|
42
|
+
append(chunk: Buffer): void;
|
|
43
|
+
/** Idempotent: the tool finishes on the happy path and again in its cleanup. */
|
|
44
|
+
finish(): void;
|
|
45
|
+
get totalLines(): number;
|
|
46
|
+
snapshot(): OutputSnapshot;
|
|
47
|
+
/** Flushes and closes the spill file. Safe to call when there is none. */
|
|
48
|
+
close(): Promise<void>;
|
|
49
|
+
private exceedsLimits;
|
|
50
|
+
private appendText;
|
|
51
|
+
private trimTail;
|
|
52
|
+
private spillToTempFile;
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=output.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../../src/shell/output.ts"],"names":[],"mappings":"AAKA,OAAO,EAIL,KAAK,gBAAgB,EACtB,MAAM,eAAe,CAAC;AAEvB,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,sEAAsE;IACtE,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;CACjC;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,UAAU,EAAE,gBAAgB,CAAC;IACtC,yDAAyD;IACzD,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;CAClC;AAED;;;;;;;;;GASG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAS;IACzC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IACxC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA4B;IAEpD,OAAO,CAAC,cAAc,CAAgB;IACtC,OAAO,CAAC,IAAI,CAAM;IAClB,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,UAAU,CAAK;IACvB,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,QAAQ,CAAS;IAEzB,OAAO,CAAC,YAAY,CAAqB;IACzC,OAAO,CAAC,cAAc,CAA0B;IAEhD,YAAY,OAAO,GAAE,wBAA6B,EAMjD;IAED,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAe1B;IAED,gFAAgF;IAChF,MAAM,IAAI,IAAI,CASb;IAED,IAAI,UAAU,IAAI,MAAM,CAEvB;IAED,QAAQ,IAAI,cAAc,CAwBzB;IAED,0EAA0E;IACpE,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAS3B;IAED,OAAO,CAAC,aAAa;IAIrB,OAAO,CAAC,UAAU;IAwBlB,OAAO,CAAC,QAAQ;IAqBhB,OAAO,CAAC,eAAe;CAmBxB"}
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
import { randomBytes } from "node:crypto";
|
|
2
|
+
import { createWriteStream } from "node:fs";
|
|
3
|
+
import { tmpdir } from "node:os";
|
|
4
|
+
import path from "node:path";
|
|
5
|
+
import { sanitizeShellOutput } from "./sanitize.js";
|
|
6
|
+
import { DEFAULT_MAX_BYTES, DEFAULT_MAX_LINES, truncateTail, } from "./truncate.js";
|
|
7
|
+
/**
|
|
8
|
+
* Collects streaming command output in bounded memory.
|
|
9
|
+
*
|
|
10
|
+
* Two things make this more than a string concatenation. Chunks are decoded
|
|
11
|
+
* with a streaming decoder, because a multi-byte character split across a chunk
|
|
12
|
+
* boundary decodes to garbage otherwise. And once the output passes the limits
|
|
13
|
+
* the accumulator stops keeping it: it spills the raw bytes to a temp file and
|
|
14
|
+
* holds only a rolling tail, so a command that prints a gigabyte does not cost
|
|
15
|
+
* a gigabyte of memory.
|
|
16
|
+
*/
|
|
17
|
+
export class OutputAccumulator {
|
|
18
|
+
maxLines;
|
|
19
|
+
maxBytes;
|
|
20
|
+
maxRollingBytes;
|
|
21
|
+
tempFilePrefix;
|
|
22
|
+
tempDirectory;
|
|
23
|
+
decoder = new TextDecoder("utf-8");
|
|
24
|
+
bufferedChunks = [];
|
|
25
|
+
tail = "";
|
|
26
|
+
tailBytes = 0;
|
|
27
|
+
totalBytes = 0;
|
|
28
|
+
newlineCount = 0;
|
|
29
|
+
hasOpenLine = false;
|
|
30
|
+
finished = false;
|
|
31
|
+
tempFilePath;
|
|
32
|
+
tempFileStream;
|
|
33
|
+
constructor(options = {}) {
|
|
34
|
+
this.maxLines = options.maxLines ?? DEFAULT_MAX_LINES;
|
|
35
|
+
this.maxBytes = options.maxBytes ?? DEFAULT_MAX_BYTES;
|
|
36
|
+
this.maxRollingBytes = Math.max(this.maxBytes * 2, 1);
|
|
37
|
+
this.tempFilePrefix = options.tempFilePrefix ?? "chivgent-bash";
|
|
38
|
+
this.tempDirectory = options.tempDirectory ?? tmpdir();
|
|
39
|
+
}
|
|
40
|
+
append(chunk) {
|
|
41
|
+
// A detached descendant can still write after the command was finalised.
|
|
42
|
+
// Throwing here would surface as an uncaught exception inside a stream
|
|
43
|
+
// handler, so late output is dropped instead.
|
|
44
|
+
if (this.finished) {
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
this.appendText(this.decoder.decode(chunk, { stream: true }));
|
|
48
|
+
if (this.tempFileStream !== undefined || this.exceedsLimits()) {
|
|
49
|
+
this.spillToTempFile();
|
|
50
|
+
this.tempFileStream?.write(chunk);
|
|
51
|
+
}
|
|
52
|
+
else if (chunk.length > 0) {
|
|
53
|
+
this.bufferedChunks.push(chunk);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
/** Idempotent: the tool finishes on the happy path and again in its cleanup. */
|
|
57
|
+
finish() {
|
|
58
|
+
if (this.finished) {
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
this.finished = true;
|
|
62
|
+
this.appendText(this.decoder.decode());
|
|
63
|
+
if (this.exceedsLimits()) {
|
|
64
|
+
this.spillToTempFile();
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
get totalLines() {
|
|
68
|
+
return this.newlineCount + (this.hasOpenLine ? 1 : 0);
|
|
69
|
+
}
|
|
70
|
+
snapshot() {
|
|
71
|
+
const tailTruncation = truncateTail(this.tail, {
|
|
72
|
+
maxLines: this.maxLines,
|
|
73
|
+
maxBytes: this.maxBytes,
|
|
74
|
+
});
|
|
75
|
+
// The tail alone cannot tell how much was dropped, so the totals come from
|
|
76
|
+
// the counters that saw every chunk.
|
|
77
|
+
const truncation = {
|
|
78
|
+
...tailTruncation,
|
|
79
|
+
truncated: this.exceedsLimits() || tailTruncation.truncated,
|
|
80
|
+
truncatedBy: this.exceedsLimits()
|
|
81
|
+
? (tailTruncation.truncatedBy ??
|
|
82
|
+
(this.totalBytes > this.maxBytes ? "bytes" : "lines"))
|
|
83
|
+
: tailTruncation.truncatedBy,
|
|
84
|
+
totalLines: this.totalLines,
|
|
85
|
+
totalBytes: this.totalBytes,
|
|
86
|
+
};
|
|
87
|
+
return {
|
|
88
|
+
content: truncation.content,
|
|
89
|
+
truncation,
|
|
90
|
+
...(this.tempFilePath === undefined
|
|
91
|
+
? {}
|
|
92
|
+
: { fullOutputPath: this.tempFilePath }),
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
/** Flushes and closes the spill file. Safe to call when there is none. */
|
|
96
|
+
async close() {
|
|
97
|
+
const stream = this.tempFileStream;
|
|
98
|
+
if (stream === undefined) {
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
this.tempFileStream = undefined;
|
|
102
|
+
await new Promise((resolve) => {
|
|
103
|
+
stream.end(() => resolve());
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
exceedsLimits() {
|
|
107
|
+
return this.totalLines > this.maxLines || this.totalBytes > this.maxBytes;
|
|
108
|
+
}
|
|
109
|
+
appendText(text) {
|
|
110
|
+
if (text.length === 0) {
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
const clean = sanitizeShellOutput(text);
|
|
114
|
+
if (clean.length === 0) {
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
this.totalBytes += Buffer.byteLength(clean, "utf8");
|
|
118
|
+
for (const character of clean) {
|
|
119
|
+
if (character === "\n") {
|
|
120
|
+
this.newlineCount += 1;
|
|
121
|
+
this.hasOpenLine = false;
|
|
122
|
+
}
|
|
123
|
+
else {
|
|
124
|
+
this.hasOpenLine = true;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
this.tail += clean;
|
|
128
|
+
this.tailBytes += Buffer.byteLength(clean, "utf8");
|
|
129
|
+
this.trimTail();
|
|
130
|
+
}
|
|
131
|
+
trimTail() {
|
|
132
|
+
if (this.tailBytes <= this.maxRollingBytes) {
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
// Dropping from the front can cut mid-line; truncateTail rebuilds whole
|
|
136
|
+
// lines from what is left, and the totals stay correct either way.
|
|
137
|
+
const characters = [...this.tail];
|
|
138
|
+
let bytes = 0;
|
|
139
|
+
let index = characters.length;
|
|
140
|
+
while (index > 0) {
|
|
141
|
+
const size = Buffer.byteLength(characters[index - 1] ?? "", "utf8");
|
|
142
|
+
if (bytes + size > this.maxRollingBytes) {
|
|
143
|
+
break;
|
|
144
|
+
}
|
|
145
|
+
bytes += size;
|
|
146
|
+
index -= 1;
|
|
147
|
+
}
|
|
148
|
+
this.tail = characters.slice(index).join("");
|
|
149
|
+
this.tailBytes = bytes;
|
|
150
|
+
}
|
|
151
|
+
spillToTempFile() {
|
|
152
|
+
if (this.tempFileStream !== undefined) {
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
155
|
+
const id = randomBytes(8).toString("hex");
|
|
156
|
+
this.tempFilePath = path.join(this.tempDirectory, `${this.tempFilePrefix}-${id}.log`);
|
|
157
|
+
// Command output can contain anything the command had access to, so the
|
|
158
|
+
// spill file is owner-only rather than world-readable.
|
|
159
|
+
this.tempFileStream = createWriteStream(this.tempFilePath, { mode: 0o600 });
|
|
160
|
+
// A spill file is a convenience: losing it must not fail the command.
|
|
161
|
+
this.tempFileStream.on("error", () => undefined);
|
|
162
|
+
for (const chunk of this.bufferedChunks) {
|
|
163
|
+
this.tempFileStream.write(chunk);
|
|
164
|
+
}
|
|
165
|
+
this.bufferedChunks = [];
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
//# sourceMappingURL=output.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/shell/output.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { ChildProcess } from "node:child_process";
|
|
2
|
+
/**
|
|
3
|
+
* Kills a process and everything it spawned.
|
|
4
|
+
*
|
|
5
|
+
* Children are spawned detached, which makes each one a process group leader,
|
|
6
|
+
* so a negative pid signals the whole group. Killing only the direct child
|
|
7
|
+
* would leave its grandchildren running: stopping `npm test` would kill the npm
|
|
8
|
+
* process and leave the test workers holding CPU and ports.
|
|
9
|
+
*/
|
|
10
|
+
export declare function killProcessTree(pid: number): void;
|
|
11
|
+
/** Detached children outlive the parent, so every pid is tracked until it exits. */
|
|
12
|
+
export declare function trackChildPid(pid: number): void;
|
|
13
|
+
export declare function untrackChildPid(pid: number): void;
|
|
14
|
+
/** Kills every command still running. Called when chivgent itself is shutting down. */
|
|
15
|
+
export declare function killTrackedChildren(): void;
|
|
16
|
+
/**
|
|
17
|
+
* Resolves with the exit code once the child has exited and its pipes have
|
|
18
|
+
* fallen idle. Rejects only when the process could not be spawned.
|
|
19
|
+
*/
|
|
20
|
+
export declare function waitForChildProcess(child: ChildProcess): Promise<number | null>;
|
|
21
|
+
//# sourceMappingURL=process.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"process.d.ts","sourceRoot":"","sources":["../../src/shell/process.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAavD;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAUjD;AAID,oFAAoF;AACpF,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAE/C;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAEjD;AAED,uFAAuF;AACvF,wBAAgB,mBAAmB,IAAI,IAAI,CAK1C;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CA6F/E"}
|