@moxt-ai/mobius 0.0.3 → 0.0.5
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/dist/acp/session-manager.d.ts.map +1 -1
- package/dist/acp/session-manager.js +15 -29
- package/dist/acp/session-manager.js.map +1 -1
- package/dist/agent-catalog/agent-diagnostics.d.ts +3 -0
- package/dist/agent-catalog/agent-diagnostics.d.ts.map +1 -0
- package/dist/agent-catalog/agent-diagnostics.js +62 -0
- package/dist/agent-catalog/agent-diagnostics.js.map +1 -0
- package/dist/agent-catalog/discover-local-agents.d.ts +77 -0
- package/dist/agent-catalog/discover-local-agents.d.ts.map +1 -0
- package/dist/agent-catalog/discover-local-agents.js +478 -0
- package/dist/agent-catalog/discover-local-agents.js.map +1 -0
- package/dist/agent-catalog/local-agent.d.ts +38 -0
- package/dist/agent-catalog/local-agent.d.ts.map +1 -0
- package/dist/agent-catalog/local-agent.js +93 -0
- package/dist/agent-catalog/local-agent.js.map +1 -0
- package/dist/agent-catalog/publish-agent-catalog.d.ts +3 -0
- package/dist/agent-catalog/publish-agent-catalog.d.ts.map +1 -0
- package/dist/agent-catalog/publish-agent-catalog.js +58 -0
- package/dist/agent-catalog/publish-agent-catalog.js.map +1 -0
- package/dist/agent-installation/agent-installation-manager.d.ts +60 -0
- package/dist/agent-installation/agent-installation-manager.d.ts.map +1 -0
- package/dist/agent-installation/agent-installation-manager.js +242 -0
- package/dist/agent-installation/agent-installation-manager.js.map +1 -0
- package/dist/agent-installation/automatic-adapter-provisioner.d.ts +18 -0
- package/dist/agent-installation/automatic-adapter-provisioner.d.ts.map +1 -0
- package/dist/agent-installation/automatic-adapter-provisioner.js +116 -0
- package/dist/agent-installation/automatic-adapter-provisioner.js.map +1 -0
- package/dist/agent-installation/fixed-agent-install-recipes.d.ts +20 -0
- package/dist/agent-installation/fixed-agent-install-recipes.d.ts.map +1 -0
- package/dist/agent-installation/fixed-agent-install-recipes.js +163 -0
- package/dist/agent-installation/fixed-agent-install-recipes.js.map +1 -0
- package/dist/agent-installation/fixed-installation-executor.d.ts +20 -0
- package/dist/agent-installation/fixed-installation-executor.d.ts.map +1 -0
- package/dist/agent-installation/fixed-installation-executor.js +213 -0
- package/dist/agent-installation/fixed-installation-executor.js.map +1 -0
- package/dist/agent-installation/installation-grants.d.ts +2 -0
- package/dist/agent-installation/installation-grants.d.ts.map +1 -0
- package/dist/agent-installation/installation-grants.js +52 -0
- package/dist/agent-installation/installation-grants.js.map +1 -0
- package/dist/agent-installation/local-installation-authorizer.d.ts +7 -0
- package/dist/agent-installation/local-installation-authorizer.d.ts.map +1 -0
- package/dist/agent-installation/local-installation-authorizer.js +32 -0
- package/dist/agent-installation/local-installation-authorizer.js.map +1 -0
- package/dist/agent-installation/managed-adapter-installer.d.ts +21 -0
- package/dist/agent-installation/managed-adapter-installer.d.ts.map +1 -0
- package/dist/agent-installation/managed-adapter-installer.js +161 -0
- package/dist/agent-installation/managed-adapter-installer.js.map +1 -0
- package/dist/agent-installation/verified-download.d.ts +24 -0
- package/dist/agent-installation/verified-download.d.ts.map +1 -0
- package/dist/agent-installation/verified-download.js +158 -0
- package/dist/agent-installation/verified-download.js.map +1 -0
- package/dist/audit/audit-store.d.ts +1 -0
- package/dist/audit/audit-store.d.ts.map +1 -1
- package/dist/audit/audit-store.js +12 -4
- package/dist/audit/audit-store.js.map +1 -1
- package/dist/cli.js +4284 -1178
- package/dist/cli.js.map +4 -4
- package/dist/config.d.ts +6 -10
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +10 -53
- package/dist/config.js.map +1 -1
- package/dist/index.js +3476 -458
- package/dist/index.js.map +4 -4
- package/dist/pairing/pair-local-machine.d.ts +2 -2
- package/dist/pairing/pair-local-machine.d.ts.map +1 -1
- package/dist/pairing/pair-local-machine.js +41 -20
- package/dist/pairing/pair-local-machine.js.map +1 -1
- package/dist/process/executable.d.ts +40 -0
- package/dist/process/executable.d.ts.map +1 -0
- package/dist/process/executable.js +313 -0
- package/dist/process/executable.js.map +1 -0
- package/dist/relay-connection/liveness.d.ts +14 -0
- package/dist/relay-connection/liveness.d.ts.map +1 -0
- package/dist/relay-connection/liveness.js +102 -0
- package/dist/relay-connection/liveness.js.map +1 -0
- package/dist/relay-connection/timer.d.ts +8 -0
- package/dist/relay-connection/timer.d.ts.map +1 -0
- package/dist/relay-connection/timer.js +8 -0
- package/dist/relay-connection/timer.js.map +1 -0
- package/dist/run-daemon.d.ts +3 -2
- package/dist/run-daemon.d.ts.map +1 -1
- package/dist/run-daemon.js +272 -22
- package/dist/run-daemon.js.map +1 -1
- package/dist/storage/state-directory.d.ts +2 -0
- package/dist/storage/state-directory.d.ts.map +1 -0
- package/dist/storage/state-directory.js +10 -0
- package/dist/storage/state-directory.js.map +1 -0
- package/package.json +3 -5
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
import { mkdir, mkdtemp, rm } from "node:fs/promises";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { resolveExecutablePath, runBoundedProcess, } from "../process/executable.js";
|
|
4
|
+
import { InstallationManagerError } from "./agent-installation-manager.js";
|
|
5
|
+
import { downloadVerifiedFile } from "./verified-download.js";
|
|
6
|
+
const INSTALLER_DOWNLOAD_LIMIT_BYTES = 1024 * 1024;
|
|
7
|
+
const INSTALLER_DOWNLOAD_TIMEOUT_MILLISECONDS = 60_000;
|
|
8
|
+
const AGENT_INSTALL_TIMEOUT_MILLISECONDS = 5 * 60 * 1_000;
|
|
9
|
+
const MINIMAL_PATH = "/usr/bin:/bin";
|
|
10
|
+
export class FixedAgentInstallRecipe {
|
|
11
|
+
assertSupportedPlatform = () => {
|
|
12
|
+
if ((process.platform !== "darwin" && process.platform !== "linux") ||
|
|
13
|
+
(process.arch !== "arm64" && process.arch !== "x64")) {
|
|
14
|
+
throw new InstallationManagerError("unsupported_install_platform", "This Agent installation recipe does not support the local platform");
|
|
15
|
+
}
|
|
16
|
+
};
|
|
17
|
+
requireInstalledExecutable = async (path) => {
|
|
18
|
+
const executable = await resolveExecutablePath(path);
|
|
19
|
+
if (executable === null) {
|
|
20
|
+
throw new InstallationManagerError("agent_verification_failed", "The Agent installer did not produce a valid executable");
|
|
21
|
+
}
|
|
22
|
+
return executable;
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
class CodexInstallRecipe extends FixedAgentInstallRecipe {
|
|
26
|
+
id = "codex";
|
|
27
|
+
label = "Codex";
|
|
28
|
+
releaseChannel = "latest";
|
|
29
|
+
install = async (options) => {
|
|
30
|
+
this.assertSupportedPlatform();
|
|
31
|
+
const root = join(options.stateDirectory, "agents", this.id);
|
|
32
|
+
const temporaryRoot = join(options.stateDirectory, "temporary");
|
|
33
|
+
await Promise.all([
|
|
34
|
+
mkdir(root, { mode: 0o700, recursive: true }),
|
|
35
|
+
mkdir(temporaryRoot, { mode: 0o700, recursive: true }),
|
|
36
|
+
]);
|
|
37
|
+
const temporaryDirectory = await mkdtemp(join(temporaryRoot, ".codex-install-"));
|
|
38
|
+
const installerPath = join(temporaryDirectory, "install.sh");
|
|
39
|
+
const installDirectory = join(root, "bin");
|
|
40
|
+
const codexHome = join(root, "home");
|
|
41
|
+
try {
|
|
42
|
+
await Promise.all([
|
|
43
|
+
mkdir(installDirectory, { mode: 0o700, recursive: true }),
|
|
44
|
+
mkdir(codexHome, { mode: 0o700, recursive: true }),
|
|
45
|
+
]);
|
|
46
|
+
await options.report("downloading");
|
|
47
|
+
const download = await downloadVerifiedFile({
|
|
48
|
+
allowedHosts: new Set(["chatgpt.com", "releases.openai.com"]),
|
|
49
|
+
destination: installerPath,
|
|
50
|
+
maximumBytes: INSTALLER_DOWNLOAD_LIMIT_BYTES,
|
|
51
|
+
signal: options.signal,
|
|
52
|
+
timeoutMilliseconds: INSTALLER_DOWNLOAD_TIMEOUT_MILLISECONDS,
|
|
53
|
+
url: new URL("https://chatgpt.com/codex/install.sh"),
|
|
54
|
+
});
|
|
55
|
+
options.audit.record("agent_installer_download_verified", options.requestId, this.id, {
|
|
56
|
+
bytes: download.bytes.toString(),
|
|
57
|
+
releaseChannel: this.releaseChannel,
|
|
58
|
+
sha256: download.sha256,
|
|
59
|
+
});
|
|
60
|
+
await options.report("verifying");
|
|
61
|
+
await options.report("installing_agent");
|
|
62
|
+
await runBoundedProcess({
|
|
63
|
+
arguments: [installerPath],
|
|
64
|
+
command: "/bin/sh",
|
|
65
|
+
cwd: temporaryDirectory,
|
|
66
|
+
environment: {
|
|
67
|
+
CODEX_HOME: codexHome,
|
|
68
|
+
CODEX_INSTALL_DIR: installDirectory,
|
|
69
|
+
CODEX_NON_INTERACTIVE: "1",
|
|
70
|
+
CODEX_RELEASE: this.releaseChannel,
|
|
71
|
+
HOME: codexHome,
|
|
72
|
+
PATH: MINIMAL_PATH,
|
|
73
|
+
},
|
|
74
|
+
outputLimitBytes: 64 * 1024,
|
|
75
|
+
signal: options.signal,
|
|
76
|
+
timeoutMilliseconds: AGENT_INSTALL_TIMEOUT_MILLISECONDS,
|
|
77
|
+
});
|
|
78
|
+
return await this.requireInstalledExecutable(join(installDirectory, "codex"));
|
|
79
|
+
}
|
|
80
|
+
catch (error) {
|
|
81
|
+
if (options.signal.aborted) {
|
|
82
|
+
options.signal.throwIfAborted();
|
|
83
|
+
}
|
|
84
|
+
if (error instanceof InstallationManagerError ||
|
|
85
|
+
(error instanceof Error && "code" in error)) {
|
|
86
|
+
throw error;
|
|
87
|
+
}
|
|
88
|
+
throw new InstallationManagerError("agent_install_failed", "The fixed Codex installation recipe failed");
|
|
89
|
+
}
|
|
90
|
+
finally {
|
|
91
|
+
await rm(temporaryDirectory, { force: true, recursive: true });
|
|
92
|
+
}
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
class ClaudeCodeInstallRecipe extends FixedAgentInstallRecipe {
|
|
96
|
+
id = "claude";
|
|
97
|
+
label = "Claude Code";
|
|
98
|
+
releaseChannel = "stable";
|
|
99
|
+
install = async (options) => {
|
|
100
|
+
this.assertSupportedPlatform();
|
|
101
|
+
const root = join(options.stateDirectory, "agents", this.id);
|
|
102
|
+
const managedHome = join(root, "home");
|
|
103
|
+
const temporaryRoot = join(options.stateDirectory, "temporary");
|
|
104
|
+
await Promise.all([
|
|
105
|
+
mkdir(managedHome, { mode: 0o700, recursive: true }),
|
|
106
|
+
mkdir(temporaryRoot, { mode: 0o700, recursive: true }),
|
|
107
|
+
]);
|
|
108
|
+
const temporaryDirectory = await mkdtemp(join(temporaryRoot, ".claude-install-"));
|
|
109
|
+
const installerPath = join(temporaryDirectory, "install.sh");
|
|
110
|
+
try {
|
|
111
|
+
await options.report("downloading");
|
|
112
|
+
const download = await downloadVerifiedFile({
|
|
113
|
+
allowedHosts: new Set(["claude.ai"]),
|
|
114
|
+
destination: installerPath,
|
|
115
|
+
maximumBytes: INSTALLER_DOWNLOAD_LIMIT_BYTES,
|
|
116
|
+
signal: options.signal,
|
|
117
|
+
timeoutMilliseconds: INSTALLER_DOWNLOAD_TIMEOUT_MILLISECONDS,
|
|
118
|
+
url: new URL("https://claude.ai/install.sh"),
|
|
119
|
+
});
|
|
120
|
+
options.audit.record("agent_installer_download_verified", options.requestId, this.id, {
|
|
121
|
+
bytes: download.bytes.toString(),
|
|
122
|
+
releaseChannel: this.releaseChannel,
|
|
123
|
+
sha256: download.sha256,
|
|
124
|
+
});
|
|
125
|
+
await options.report("verifying");
|
|
126
|
+
await options.report("installing_agent");
|
|
127
|
+
await runBoundedProcess({
|
|
128
|
+
arguments: [installerPath, "stable"],
|
|
129
|
+
command: "/bin/bash",
|
|
130
|
+
cwd: temporaryDirectory,
|
|
131
|
+
environment: {
|
|
132
|
+
HOME: managedHome,
|
|
133
|
+
PATH: MINIMAL_PATH,
|
|
134
|
+
SHELL: "/bin/bash",
|
|
135
|
+
},
|
|
136
|
+
outputLimitBytes: 64 * 1024,
|
|
137
|
+
signal: options.signal,
|
|
138
|
+
timeoutMilliseconds: AGENT_INSTALL_TIMEOUT_MILLISECONDS,
|
|
139
|
+
});
|
|
140
|
+
return await this.requireInstalledExecutable(join(managedHome, ".local", "bin", "claude"));
|
|
141
|
+
}
|
|
142
|
+
catch (error) {
|
|
143
|
+
if (options.signal.aborted) {
|
|
144
|
+
options.signal.throwIfAborted();
|
|
145
|
+
}
|
|
146
|
+
if (error instanceof InstallationManagerError ||
|
|
147
|
+
(error instanceof Error && "code" in error)) {
|
|
148
|
+
throw error;
|
|
149
|
+
}
|
|
150
|
+
throw new InstallationManagerError("agent_install_failed", "The fixed Claude Code installation recipe failed");
|
|
151
|
+
}
|
|
152
|
+
finally {
|
|
153
|
+
await rm(temporaryDirectory, { force: true, recursive: true });
|
|
154
|
+
}
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
export function fixedAgentInstallRecipes() {
|
|
158
|
+
return Object.freeze([
|
|
159
|
+
new CodexInstallRecipe(),
|
|
160
|
+
new ClaudeCodeInstallRecipe(),
|
|
161
|
+
]);
|
|
162
|
+
}
|
|
163
|
+
//# sourceMappingURL=fixed-agent-install-recipes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fixed-agent-install-recipes.js","sourceRoot":"","sources":["../../src/agent-installation/fixed-agent-install-recipes.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { AgentInstallationStage } from "@moxt-ai/mobius-protocol";
|
|
2
|
+
import { type LocalAgentSpecification } from "../agent-catalog/discover-local-agents.ts";
|
|
3
|
+
import type { LocalAgentCatalog } from "../agent-catalog/local-agent.ts";
|
|
4
|
+
import type { InstallationAudit, InstallationExecutor } from "./agent-installation-manager.ts";
|
|
5
|
+
import { type FixedAgentInstallRecipe } from "./fixed-agent-install-recipes.ts";
|
|
6
|
+
import { type AdapterInstallationPort } from "./managed-adapter-installer.ts";
|
|
7
|
+
export interface FixedInstallationExecutorOptions {
|
|
8
|
+
readonly approvedRoot: string;
|
|
9
|
+
readonly audit: InstallationAudit;
|
|
10
|
+
readonly catalog: LocalAgentCatalog;
|
|
11
|
+
readonly environment: Readonly<NodeJS.ProcessEnv>;
|
|
12
|
+
readonly publishCatalog: (signal: AbortSignal) => Promise<void>;
|
|
13
|
+
readonly stateDirectory: string;
|
|
14
|
+
}
|
|
15
|
+
export declare class FixedInstallationExecutor implements InstallationExecutor {
|
|
16
|
+
#private;
|
|
17
|
+
constructor(options: FixedInstallationExecutorOptions, specifications?: readonly LocalAgentSpecification[], recipes?: readonly FixedAgentInstallRecipe[], adapterInstaller?: AdapterInstallationPort);
|
|
18
|
+
readonly execute: (agentId: string, requestId: string, report: (stage: AgentInstallationStage) => Promise<void>, signal: AbortSignal) => Promise<void>;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=fixed-installation-executor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fixed-installation-executor.d.ts","sourceRoot":"","sources":["../../src/agent-installation/fixed-installation-executor.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAEvE,OAAO,EAGL,KAAK,uBAAuB,EAI7B,MAAM,2CAA2C,CAAC;AACnD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AAEzE,OAAO,KAAK,EACV,iBAAiB,EACjB,oBAAoB,EACrB,MAAM,iCAAiC,CAAC;AAEzC,OAAO,EACL,KAAK,uBAAuB,EAE7B,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EACL,KAAK,uBAAuB,EAG7B,MAAM,gCAAgC,CAAC;AAGxC,MAAM,WAAW,gCAAgC;IAC/C,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,KAAK,EAAE,iBAAiB,CAAC;IAClC,QAAQ,CAAC,OAAO,EAAE,iBAAiB,CAAC;IACpC,QAAQ,CAAC,WAAW,EAAE,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IAClD,QAAQ,CAAC,cAAc,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAChE,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;CACjC;AAkHD,qBAAa,yBAA0B,YAAW,oBAAoB;;IAWpE,YACE,OAAO,EAAE,gCAAgC,EACzC,cAAc,GAAE,SAAS,uBAAuB,EAAwC,EACxF,OAAO,GAAE,SAAS,uBAAuB,EAA+B,EACxE,gBAAgB,CAAC,EAAE,uBAAuB,EA2B3C;IAED,QAAQ,CAAC,OAAO,YACL,MAAM,aACJ,MAAM,UACT,CAAC,KAAK,EAAE,sBAAsB,KAAK,OAAO,CAAC,IAAI,CAAC,UAChD,WAAW,KAClB,OAAO,CAAC,IAAI,CAAC,CAkId;CACH"}
|
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
import { realpathSync, statSync } from "node:fs";
|
|
2
|
+
import { isAbsolute, relative, resolve } from "node:path";
|
|
3
|
+
import { AvailableAgent, discoverLocalAgentInventory, resolveAdapterExecutable, resolveAgentExecutable, supportedLocalAgentSpecifications, } from "../agent-catalog/discover-local-agents.js";
|
|
4
|
+
import { ProcessExecutionError } from "../process/executable.js";
|
|
5
|
+
import { InstallationManagerError } from "./agent-installation-manager.js";
|
|
6
|
+
import { fixedAgentInstallRecipes, } from "./fixed-agent-install-recipes.js";
|
|
7
|
+
import { ManagedAdapterInstallError, ManagedAdapterInstaller, } from "./managed-adapter-installer.js";
|
|
8
|
+
import { InstallerDownloadError } from "./verified-download.js";
|
|
9
|
+
function findSpecification(specifications, agentId) {
|
|
10
|
+
for (const specification of specifications) {
|
|
11
|
+
if (specification.id === agentId) {
|
|
12
|
+
return specification;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
throw new InstallationManagerError("unknown_agent", "The requested Agent is not supported");
|
|
16
|
+
}
|
|
17
|
+
function findRecipe(recipes, agentId) {
|
|
18
|
+
for (const recipe of recipes) {
|
|
19
|
+
if (recipe.id === agentId) {
|
|
20
|
+
return recipe;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
throw new InstallationManagerError("agent_not_installable", "The requested Agent does not have an approved installation recipe");
|
|
24
|
+
}
|
|
25
|
+
function isInside(root, candidate) {
|
|
26
|
+
const difference = relative(resolve(root), resolve(candidate));
|
|
27
|
+
return (difference.length === 0 ||
|
|
28
|
+
(!difference.startsWith("..") && !isAbsolute(difference)));
|
|
29
|
+
}
|
|
30
|
+
function resolveApprovedRoot(path) {
|
|
31
|
+
try {
|
|
32
|
+
const directory = realpathSync(resolve(path));
|
|
33
|
+
if (!statSync(directory).isDirectory()) {
|
|
34
|
+
throw new Error("Approved root is not a directory");
|
|
35
|
+
}
|
|
36
|
+
return directory;
|
|
37
|
+
}
|
|
38
|
+
catch (error) {
|
|
39
|
+
throw new InstallationManagerError("unsafe_installation_root", "The approved workspace is unavailable or unsafe", { cause: error });
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
function resolveUserInstallationDirectory(path) {
|
|
43
|
+
try {
|
|
44
|
+
const directory = realpathSync(resolve(path));
|
|
45
|
+
const metadata = statSync(directory);
|
|
46
|
+
if (!metadata.isDirectory() ||
|
|
47
|
+
(typeof process.getuid === "function" &&
|
|
48
|
+
metadata.uid !== process.getuid())) {
|
|
49
|
+
throw new Error("Installation directory is not user-owned");
|
|
50
|
+
}
|
|
51
|
+
return directory;
|
|
52
|
+
}
|
|
53
|
+
catch (error) {
|
|
54
|
+
throw new InstallationManagerError("unsafe_installation_root", "The local Agent installation root is unavailable or unsafe", { cause: error });
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
function translateExecutionError(error) {
|
|
58
|
+
if (error instanceof InstallationManagerError) {
|
|
59
|
+
return error;
|
|
60
|
+
}
|
|
61
|
+
if (error instanceof ManagedAdapterInstallError ||
|
|
62
|
+
error instanceof InstallerDownloadError ||
|
|
63
|
+
error instanceof ProcessExecutionError) {
|
|
64
|
+
return new InstallationManagerError(error.code, error.message, {
|
|
65
|
+
cause: error,
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
return new InstallationManagerError("installation_failed", "The fixed local Agent installation failed", { cause: error });
|
|
69
|
+
}
|
|
70
|
+
function requiresAgentReplacement(code) {
|
|
71
|
+
return (code === "agent_not_found" ||
|
|
72
|
+
code === "agent_probe_failed" ||
|
|
73
|
+
code === "agent_probe_timeout");
|
|
74
|
+
}
|
|
75
|
+
function requiresAdapterReplacement(code) {
|
|
76
|
+
return (code === "adapter_not_found" ||
|
|
77
|
+
code === "adapter_probe_failed" ||
|
|
78
|
+
code === "adapter_probe_timeout" ||
|
|
79
|
+
code === "acp_incompatible");
|
|
80
|
+
}
|
|
81
|
+
export class FixedInstallationExecutor {
|
|
82
|
+
#adapterInstaller;
|
|
83
|
+
#approvedRoot;
|
|
84
|
+
#audit;
|
|
85
|
+
#catalog;
|
|
86
|
+
#environment;
|
|
87
|
+
#publishCatalog;
|
|
88
|
+
#recipes;
|
|
89
|
+
#specifications;
|
|
90
|
+
#stateDirectory;
|
|
91
|
+
constructor(options, specifications = supportedLocalAgentSpecifications(), recipes = fixedAgentInstallRecipes(), adapterInstaller) {
|
|
92
|
+
const approvedRoot = resolveApprovedRoot(options.approvedRoot);
|
|
93
|
+
const stateDirectory = resolveUserInstallationDirectory(options.stateDirectory);
|
|
94
|
+
if (isInside(approvedRoot, stateDirectory)) {
|
|
95
|
+
throw new InstallationManagerError("unsafe_installation_root", "The Mobius state directory cannot be inside the approved workspace");
|
|
96
|
+
}
|
|
97
|
+
this.#approvedRoot = approvedRoot;
|
|
98
|
+
this.#audit = options.audit;
|
|
99
|
+
this.#catalog = options.catalog;
|
|
100
|
+
this.#environment = Object.freeze({ ...options.environment });
|
|
101
|
+
this.#publishCatalog = options.publishCatalog;
|
|
102
|
+
this.#recipes = Object.freeze([...recipes]);
|
|
103
|
+
this.#specifications = Object.freeze([...specifications]);
|
|
104
|
+
this.#stateDirectory = stateDirectory;
|
|
105
|
+
this.#adapterInstaller =
|
|
106
|
+
adapterInstaller ??
|
|
107
|
+
new ManagedAdapterInstaller({
|
|
108
|
+
approvedRoot,
|
|
109
|
+
environment: this.#environment,
|
|
110
|
+
stateDirectory,
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
execute = async (agentId, requestId, report, signal) => {
|
|
114
|
+
try {
|
|
115
|
+
const specification = findSpecification(this.#specifications, agentId);
|
|
116
|
+
const recipe = findRecipe(this.#recipes, agentId);
|
|
117
|
+
this.#audit.record("agent_installation_recipe_resolved", requestId, agentId, {
|
|
118
|
+
adapterVersion: specification.adapterVersion,
|
|
119
|
+
releaseChannel: recipe.releaseChannel,
|
|
120
|
+
});
|
|
121
|
+
const discoveryOptions = {
|
|
122
|
+
approvedRoot: this.#approvedRoot,
|
|
123
|
+
environment: this.#environment,
|
|
124
|
+
signal,
|
|
125
|
+
};
|
|
126
|
+
let agent = await resolveAgentExecutable(specification, discoveryOptions);
|
|
127
|
+
let installedAgent = false;
|
|
128
|
+
if (agent === null) {
|
|
129
|
+
agent = await recipe.install({
|
|
130
|
+
audit: this.#audit,
|
|
131
|
+
report,
|
|
132
|
+
requestId,
|
|
133
|
+
signal,
|
|
134
|
+
stateDirectory: this.#stateDirectory,
|
|
135
|
+
});
|
|
136
|
+
installedAgent = true;
|
|
137
|
+
}
|
|
138
|
+
let adapter = await resolveAdapterExecutable(specification, discoveryOptions);
|
|
139
|
+
let installedAdapter = false;
|
|
140
|
+
if (adapter === null) {
|
|
141
|
+
await report("installing_adapter");
|
|
142
|
+
adapter = await this.#adapterInstaller.install(specification, signal);
|
|
143
|
+
installedAdapter = true;
|
|
144
|
+
this.#audit.record("agent_adapter_verified", requestId, agentId, {
|
|
145
|
+
version: specification.adapterVersion,
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
while (true) {
|
|
149
|
+
await report("checking_acp");
|
|
150
|
+
const environment = { ...this.#environment };
|
|
151
|
+
environment[specification.agentOverrideVariable] = agent.path;
|
|
152
|
+
environment[specification.adapterOverrideVariable] = adapter.path;
|
|
153
|
+
const inventory = await discoverLocalAgentInventory({
|
|
154
|
+
approvedRoot: this.#approvedRoot,
|
|
155
|
+
environment,
|
|
156
|
+
signal,
|
|
157
|
+
specifications: this.#specifications,
|
|
158
|
+
});
|
|
159
|
+
const verified = inventory.available.find((candidate) => candidate.specification.id === agentId);
|
|
160
|
+
if (verified instanceof AvailableAgent) {
|
|
161
|
+
this.#audit.record("agent_installation_acp_verified", requestId, agentId, {
|
|
162
|
+
adapterVersion: verified.agent.adapterVersion,
|
|
163
|
+
agentVersion: verified.agent.agentVersion,
|
|
164
|
+
});
|
|
165
|
+
const previous = this.#catalog.read();
|
|
166
|
+
this.#catalog.transition(inventory.readyAgents(), inventory.installable);
|
|
167
|
+
try {
|
|
168
|
+
await this.#publishCatalog(signal);
|
|
169
|
+
}
|
|
170
|
+
catch (error) {
|
|
171
|
+
this.#catalog.transition(previous.agents, previous.installableAgents);
|
|
172
|
+
throw error;
|
|
173
|
+
}
|
|
174
|
+
return;
|
|
175
|
+
}
|
|
176
|
+
const unavailable = inventory.unavailable.find((candidate) => candidate.specification.id === agentId);
|
|
177
|
+
if (unavailable === undefined) {
|
|
178
|
+
throw new InstallationManagerError("agent_verification_failed", "The complete Agent ACP path did not pass verification");
|
|
179
|
+
}
|
|
180
|
+
if (!installedAdapter && requiresAdapterReplacement(unavailable.code)) {
|
|
181
|
+
await report("installing_adapter");
|
|
182
|
+
adapter = await this.#adapterInstaller.install(specification, signal);
|
|
183
|
+
installedAdapter = true;
|
|
184
|
+
this.#audit.record("agent_adapter_verified", requestId, agentId, {
|
|
185
|
+
version: specification.adapterVersion,
|
|
186
|
+
});
|
|
187
|
+
continue;
|
|
188
|
+
}
|
|
189
|
+
if (!installedAgent &&
|
|
190
|
+
(requiresAgentReplacement(unavailable.code) ||
|
|
191
|
+
unavailable.code === "acp_incompatible")) {
|
|
192
|
+
agent = await recipe.install({
|
|
193
|
+
audit: this.#audit,
|
|
194
|
+
report,
|
|
195
|
+
requestId,
|
|
196
|
+
signal,
|
|
197
|
+
stateDirectory: this.#stateDirectory,
|
|
198
|
+
});
|
|
199
|
+
installedAgent = true;
|
|
200
|
+
continue;
|
|
201
|
+
}
|
|
202
|
+
throw new InstallationManagerError(unavailable.code, unavailable.message);
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
catch (error) {
|
|
206
|
+
if (signal.aborted) {
|
|
207
|
+
signal.throwIfAborted();
|
|
208
|
+
}
|
|
209
|
+
throw translateExecutionError(error);
|
|
210
|
+
}
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
//# sourceMappingURL=fixed-installation-executor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fixed-installation-executor.js","sourceRoot":"","sources":["../../src/agent-installation/fixed-installation-executor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"installation-grants.d.ts","sourceRoot":"","sources":["../../src/agent-installation/installation-grants.ts"],"names":[],"mappings":"AAUA,wBAAsB,iBAAiB,CACrC,cAAc,EAAE,MAAM,GACrB,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CA+C9B"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { open } from "node:fs/promises";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
const MAX_GRANT_FILE_LENGTH = 16 * 1024;
|
|
4
|
+
const AGENT_ID_PATTERN = /^[a-zA-Z0-9][a-zA-Z0-9._:-]{0,127}$/;
|
|
5
|
+
function isRecord(value) {
|
|
6
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
7
|
+
}
|
|
8
|
+
export async function readGrantedAgents(stateDirectory) {
|
|
9
|
+
const path = join(stateDirectory, "installation-grants.json");
|
|
10
|
+
let handle;
|
|
11
|
+
try {
|
|
12
|
+
handle = await open(path, "r");
|
|
13
|
+
}
|
|
14
|
+
catch (error) {
|
|
15
|
+
if (error instanceof Error && "code" in error && error.code === "ENOENT") {
|
|
16
|
+
return new Set();
|
|
17
|
+
}
|
|
18
|
+
throw error;
|
|
19
|
+
}
|
|
20
|
+
try {
|
|
21
|
+
const metadata = await handle.stat();
|
|
22
|
+
if (!metadata.isFile() ||
|
|
23
|
+
metadata.size > MAX_GRANT_FILE_LENGTH ||
|
|
24
|
+
(typeof process.getuid === "function" &&
|
|
25
|
+
metadata.uid !== process.getuid()) ||
|
|
26
|
+
(process.platform !== "win32" && (metadata.mode & 0o077) !== 0)) {
|
|
27
|
+
throw new Error("The local installation grant file is not private");
|
|
28
|
+
}
|
|
29
|
+
const encoded = await handle.readFile({ encoding: "utf8" });
|
|
30
|
+
const value = JSON.parse(encoded);
|
|
31
|
+
if (!isRecord(value) ||
|
|
32
|
+
Object.keys(value).length !== 2 ||
|
|
33
|
+
value["version"] !== 1 ||
|
|
34
|
+
!Array.isArray(value["agents"])) {
|
|
35
|
+
throw new Error("The local installation grant file is invalid");
|
|
36
|
+
}
|
|
37
|
+
const agents = new Set();
|
|
38
|
+
for (const candidate of value["agents"]) {
|
|
39
|
+
if (typeof candidate !== "string" ||
|
|
40
|
+
!AGENT_ID_PATTERN.test(candidate) ||
|
|
41
|
+
agents.has(candidate)) {
|
|
42
|
+
throw new Error("The local installation grant file is invalid");
|
|
43
|
+
}
|
|
44
|
+
agents.add(candidate);
|
|
45
|
+
}
|
|
46
|
+
return agents;
|
|
47
|
+
}
|
|
48
|
+
finally {
|
|
49
|
+
await handle.close();
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=installation-grants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"installation-grants.js","sourceRoot":"","sources":["../../src/agent-installation/installation-grants.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACxC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,MAAM,qBAAqB,GAAG,EAAE,GAAG,IAAI,CAAC;AACxC,MAAM,gBAAgB,GAAG,qCAAqC,CAAC;AAE/D,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,cAAsB;IAEtB,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc,EAAE,0BAA0B,CAAC,CAAC;IAC9D,IAAI,MAAwC,CAAC;IAC7C,IAAI,CAAC;QACH,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IACjC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,KAAK,IAAI,MAAM,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACzE,OAAO,IAAI,GAAG,EAAU,CAAC;QAC3B,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;IACD,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;QACrC,IACE,CAAC,QAAQ,CAAC,MAAM,EAAE;YAClB,QAAQ,CAAC,IAAI,GAAG,qBAAqB;YACrC,CAAC,OAAO,OAAO,CAAC,MAAM,KAAK,UAAU;gBACnC,QAAQ,CAAC,GAAG,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC;YACpC,CAAC,OAAO,CAAC,QAAQ,KAAK,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAC/D,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;QACtE,CAAC;QACD,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;QAC5D,MAAM,KAAK,GAAY,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC3C,IACE,CAAC,QAAQ,CAAC,KAAK,CAAC;YAChB,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,KAAK,CAAC;YAC/B,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC;YACtB,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,EAC/B,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;QAClE,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,GAAG,EAAU,CAAC;QACjC,KAAK,MAAM,SAAS,IAAI,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC;YACxC,IACE,OAAO,SAAS,KAAK,QAAQ;gBAC7B,CAAC,gBAAgB,CAAC,IAAI,CAAC,SAAS,CAAC;gBACjC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,EACrB,CAAC;gBACD,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;YAClE,CAAC;YACD,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACxB,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;YAAS,CAAC;QACT,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { InstallationAuthorizer } from "./agent-installation-manager.ts";
|
|
2
|
+
export declare class ConsoleInstallationAuthorizer implements InstallationAuthorizer {
|
|
3
|
+
#private;
|
|
4
|
+
constructor(stateDirectory: string);
|
|
5
|
+
readonly authorize: (agentId: string, label: string, requestId: string, signal: AbortSignal) => Promise<boolean>;
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=local-installation-authorizer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local-installation-authorizer.d.ts","sourceRoot":"","sources":["../../src/agent-installation/local-installation-authorizer.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AAG9E,qBAAa,6BAA8B,YAAW,sBAAsB;;IAG1E,YAAY,cAAc,EAAE,MAAM,EAEjC;IAED,QAAQ,CAAC,SAAS,YACP,MAAM,SACR,MAAM,aACF,MAAM,UACT,WAAW,KAClB,OAAO,CAAC,OAAO,CAAC,CAwBjB;CACH"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { createInterface } from "node:readline/promises";
|
|
2
|
+
import { readGrantedAgents } from "./installation-grants.js";
|
|
3
|
+
export class ConsoleInstallationAuthorizer {
|
|
4
|
+
#stateDirectory;
|
|
5
|
+
constructor(stateDirectory) {
|
|
6
|
+
this.#stateDirectory = stateDirectory;
|
|
7
|
+
}
|
|
8
|
+
authorize = async (agentId, label, requestId, signal) => {
|
|
9
|
+
signal.throwIfAborted();
|
|
10
|
+
const grants = await readGrantedAgents(this.#stateDirectory);
|
|
11
|
+
signal.throwIfAborted();
|
|
12
|
+
if (grants.has(agentId)) {
|
|
13
|
+
return true;
|
|
14
|
+
}
|
|
15
|
+
if (!process.stdin.isTTY || !process.stdout.isTTY) {
|
|
16
|
+
return false;
|
|
17
|
+
}
|
|
18
|
+
const prompt = createInterface({
|
|
19
|
+
input: process.stdin,
|
|
20
|
+
output: process.stdout,
|
|
21
|
+
});
|
|
22
|
+
try {
|
|
23
|
+
const answer = await prompt.question(`\nMobius Web requested installation of ${label} (${requestId}). Allow this fixed user-level recipe? [y/N] `, { signal });
|
|
24
|
+
const normalized = answer.trim().toLowerCase();
|
|
25
|
+
return normalized === "y" || normalized === "yes";
|
|
26
|
+
}
|
|
27
|
+
finally {
|
|
28
|
+
prompt.close();
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=local-installation-authorizer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local-installation-authorizer.js","sourceRoot":"","sources":["../../src/agent-installation/local-installation-authorizer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAGzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAE7D,MAAM,OAAO,6BAA6B;IAC/B,eAAe,CAAS;IAEjC,YAAY,cAAsB;QAChC,IAAI,CAAC,eAAe,GAAG,cAAc,CAAC;IACxC,CAAC;IAEQ,SAAS,GAAG,KAAK,EACxB,OAAe,EACf,KAAa,EACb,SAAiB,EACjB,MAAmB,EACD,EAAE;QACpB,MAAM,CAAC,cAAc,EAAE,CAAC;QACxB,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QAC7D,MAAM,CAAC,cAAc,EAAE,CAAC;QACxB,IAAI,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;YACxB,OAAO,IAAI,CAAC;QACd,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YAClD,OAAO,KAAK,CAAC;QACf,CAAC;QACD,MAAM,MAAM,GAAG,eAAe,CAAC;YAC7B,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,MAAM,EAAE,OAAO,CAAC,MAAM;SACvB,CAAC,CAAC;QACH,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,QAAQ,CAClC,0CAA0C,KAAK,KAAK,SAAS,+CAA+C,EAC5G,EAAE,MAAM,EAAE,CACX,CAAC;YACF,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;YAC/C,OAAO,UAAU,KAAK,GAAG,IAAI,UAAU,KAAK,KAAK,CAAC;QACpD,CAAC;gBAAS,CAAC;YACT,MAAM,CAAC,KAAK,EAAE,CAAC;QACjB,CAAC;IACH,CAAC,CAAC;CACH"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { LocalAgentSpecification } from "../agent-catalog/discover-local-agents.ts";
|
|
2
|
+
import { type ResolvedExecutable } from "../process/executable.ts";
|
|
3
|
+
export declare class ManagedAdapterInstallError extends Error {
|
|
4
|
+
readonly code: string;
|
|
5
|
+
constructor(code: string, message: string, options?: ErrorOptions);
|
|
6
|
+
}
|
|
7
|
+
export declare function validateManagedAdapter(root: string, specification: LocalAgentSpecification): Promise<ResolvedExecutable>;
|
|
8
|
+
export interface ManagedAdapterInstallerOptions {
|
|
9
|
+
readonly approvedRoot: string;
|
|
10
|
+
readonly environment: Readonly<NodeJS.ProcessEnv>;
|
|
11
|
+
readonly stateDirectory: string;
|
|
12
|
+
}
|
|
13
|
+
export interface AdapterInstallationPort {
|
|
14
|
+
readonly install: (specification: LocalAgentSpecification, signal: AbortSignal) => Promise<ResolvedExecutable>;
|
|
15
|
+
}
|
|
16
|
+
export declare class ManagedAdapterInstaller implements AdapterInstallationPort {
|
|
17
|
+
#private;
|
|
18
|
+
constructor(options: ManagedAdapterInstallerOptions);
|
|
19
|
+
readonly install: (specification: LocalAgentSpecification, signal: AbortSignal) => Promise<ResolvedExecutable>;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=managed-adapter-installer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"managed-adapter-installer.d.ts","sourceRoot":"","sources":["../../src/agent-installation/managed-adapter-installer.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,2CAA2C,CAAC;AACzF,OAAO,EAEL,KAAK,kBAAkB,EAGxB,MAAM,0BAA0B,CAAC;AAKlC,qBAAa,0BAA2B,SAAQ,KAAK;IACnD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB,YAAY,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,YAAiB,EAIpE;CACF;AAsDD,wBAAsB,sBAAsB,CAC1C,IAAI,EAAE,MAAM,EACZ,aAAa,EAAE,uBAAuB,GACrC,OAAO,CAAC,kBAAkB,CAAC,CA2C7B;AAED,MAAM,WAAW,8BAA8B;IAC7C,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,WAAW,EAAE,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IAClD,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;CACjC;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,OAAO,EAAE,CAChB,aAAa,EAAE,uBAAuB,EACtC,MAAM,EAAE,WAAW,KAChB,OAAO,CAAC,kBAAkB,CAAC,CAAC;CAClC;AAED,qBAAa,uBAAwB,YAAW,uBAAuB;;IAKrE,YAAY,OAAO,EAAE,8BAA8B,EAIlD;IAED,QAAQ,CAAC,OAAO,kBACC,uBAAuB,UAC9B,WAAW,KAClB,OAAO,CAAC,kBAAkB,CAAC,CA8F5B;CACH"}
|