@openacp/cli 0.2.11 → 0.2.12

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.
@@ -1,220 +0,0 @@
1
- // src/core/log.ts
2
- var log = {
3
- info: (...args) => console.log((/* @__PURE__ */ new Date()).toISOString(), "[INFO]", ...args),
4
- warn: (...args) => console.warn((/* @__PURE__ */ new Date()).toISOString(), "[WARN]", ...args),
5
- error: (...args) => console.error((/* @__PURE__ */ new Date()).toISOString(), "[ERROR]", ...args),
6
- debug: (...args) => {
7
- if (process.env.OPENACP_DEBUG) console.log((/* @__PURE__ */ new Date()).toISOString(), "[DEBUG]", ...args);
8
- }
9
- };
10
-
11
- // src/core/config.ts
12
- import { z } from "zod";
13
- import * as fs from "fs";
14
- import * as path from "path";
15
- import * as os from "os";
16
- var BaseChannelSchema = z.object({
17
- enabled: z.boolean().default(false),
18
- adapter: z.string().optional()
19
- // package name for plugin adapters
20
- }).passthrough();
21
- var PLUGINS_DIR = path.join(os.homedir(), ".openacp", "plugins");
22
- var AgentSchema = z.object({
23
- command: z.string(),
24
- args: z.array(z.string()).default([]),
25
- workingDirectory: z.string().optional(),
26
- env: z.record(z.string(), z.string()).default({})
27
- });
28
- var ConfigSchema = z.object({
29
- channels: z.record(z.string(), BaseChannelSchema),
30
- agents: z.record(z.string(), AgentSchema),
31
- defaultAgent: z.string(),
32
- workspace: z.object({
33
- baseDir: z.string().default("~/openacp-workspace")
34
- }).default({}),
35
- security: z.object({
36
- allowedUserIds: z.array(z.string()).default([]),
37
- maxConcurrentSessions: z.number().default(5),
38
- sessionTimeoutMinutes: z.number().default(60)
39
- }).default({})
40
- });
41
- function expandHome(p) {
42
- if (p.startsWith("~")) {
43
- return path.join(os.homedir(), p.slice(1));
44
- }
45
- return p;
46
- }
47
- var DEFAULT_CONFIG = {
48
- channels: {
49
- telegram: {
50
- enabled: false,
51
- botToken: "YOUR_BOT_TOKEN_HERE",
52
- chatId: 0,
53
- notificationTopicId: null,
54
- assistantTopicId: null
55
- }
56
- },
57
- agents: {
58
- claude: { command: "claude-agent-acp", args: [], env: {} },
59
- codex: { command: "codex", args: ["--acp"], env: {} }
60
- },
61
- defaultAgent: "claude",
62
- workspace: { baseDir: "~/openacp-workspace" },
63
- security: { allowedUserIds: [], maxConcurrentSessions: 5, sessionTimeoutMinutes: 60 }
64
- };
65
- var ConfigManager = class {
66
- config;
67
- configPath;
68
- constructor() {
69
- this.configPath = process.env.OPENACP_CONFIG_PATH || expandHome("~/.openacp/config.json");
70
- }
71
- async load() {
72
- const dir = path.dirname(this.configPath);
73
- fs.mkdirSync(dir, { recursive: true });
74
- if (!fs.existsSync(this.configPath)) {
75
- fs.writeFileSync(this.configPath, JSON.stringify(DEFAULT_CONFIG, null, 2));
76
- log.info(`Config created at ${this.configPath}`);
77
- log.info("Please edit it with your Telegram bot token and chat ID, then restart.");
78
- process.exit(1);
79
- }
80
- const raw = JSON.parse(fs.readFileSync(this.configPath, "utf-8"));
81
- this.applyEnvOverrides(raw);
82
- const result = ConfigSchema.safeParse(raw);
83
- if (!result.success) {
84
- log.error("Config validation failed:");
85
- for (const issue of result.error.issues) {
86
- log.error(` ${issue.path.join(".")}: ${issue.message}`);
87
- }
88
- process.exit(1);
89
- }
90
- this.config = result.data;
91
- }
92
- get() {
93
- return this.config;
94
- }
95
- async save(updates) {
96
- const raw = JSON.parse(fs.readFileSync(this.configPath, "utf-8"));
97
- this.deepMerge(raw, updates);
98
- fs.writeFileSync(this.configPath, JSON.stringify(raw, null, 2));
99
- const result = ConfigSchema.safeParse(raw);
100
- if (result.success) {
101
- this.config = result.data;
102
- }
103
- }
104
- resolveWorkspace(input) {
105
- if (!input) {
106
- const resolved2 = expandHome(this.config.workspace.baseDir);
107
- fs.mkdirSync(resolved2, { recursive: true });
108
- return resolved2;
109
- }
110
- if (input.startsWith("/") || input.startsWith("~")) {
111
- const resolved2 = expandHome(input);
112
- fs.mkdirSync(resolved2, { recursive: true });
113
- return resolved2;
114
- }
115
- const name = input.toLowerCase();
116
- const resolved = path.join(expandHome(this.config.workspace.baseDir), name);
117
- fs.mkdirSync(resolved, { recursive: true });
118
- return resolved;
119
- }
120
- async exists() {
121
- return fs.existsSync(this.configPath);
122
- }
123
- getConfigPath() {
124
- return this.configPath;
125
- }
126
- async writeNew(config) {
127
- const dir = path.dirname(this.configPath);
128
- fs.mkdirSync(dir, { recursive: true });
129
- fs.writeFileSync(this.configPath, JSON.stringify(config, null, 2));
130
- }
131
- applyEnvOverrides(raw) {
132
- const overrides = [
133
- ["OPENACP_TELEGRAM_BOT_TOKEN", ["channels", "telegram", "botToken"]],
134
- ["OPENACP_TELEGRAM_CHAT_ID", ["channels", "telegram", "chatId"]],
135
- ["OPENACP_DEFAULT_AGENT", ["defaultAgent"]]
136
- ];
137
- for (const [envVar, configPath] of overrides) {
138
- const value = process.env[envVar];
139
- if (value !== void 0) {
140
- let target = raw;
141
- for (let i = 0; i < configPath.length - 1; i++) {
142
- if (!target[configPath[i]]) target[configPath[i]] = {};
143
- target = target[configPath[i]];
144
- }
145
- const key = configPath[configPath.length - 1];
146
- target[key] = key === "chatId" ? Number(value) : value;
147
- }
148
- }
149
- }
150
- deepMerge(target, source) {
151
- for (const key of Object.keys(source)) {
152
- if (source[key] && typeof source[key] === "object" && !Array.isArray(source[key])) {
153
- if (!target[key]) target[key] = {};
154
- this.deepMerge(target[key], source[key]);
155
- } else {
156
- target[key] = source[key];
157
- }
158
- }
159
- }
160
- };
161
-
162
- // src/core/plugin-manager.ts
163
- import { execSync } from "child_process";
164
- import * as fs2 from "fs";
165
- import * as path2 from "path";
166
- import { createRequire } from "module";
167
- function ensurePluginsDir() {
168
- fs2.mkdirSync(PLUGINS_DIR, { recursive: true });
169
- const pkgPath = path2.join(PLUGINS_DIR, "package.json");
170
- if (!fs2.existsSync(pkgPath)) {
171
- fs2.writeFileSync(pkgPath, JSON.stringify({ name: "openacp-plugins", private: true, dependencies: {} }, null, 2));
172
- }
173
- }
174
- function installPlugin(packageName) {
175
- ensurePluginsDir();
176
- log.info(`Installing ${packageName}...`);
177
- execSync(`npm install ${packageName} --prefix "${PLUGINS_DIR}"`, { stdio: "inherit" });
178
- log.info(`${packageName} installed successfully.`);
179
- }
180
- function uninstallPlugin(packageName) {
181
- ensurePluginsDir();
182
- log.info(`Uninstalling ${packageName}...`);
183
- execSync(`npm uninstall ${packageName} --prefix "${PLUGINS_DIR}"`, { stdio: "inherit" });
184
- log.info(`${packageName} uninstalled.`);
185
- }
186
- function listPlugins() {
187
- const pkgPath = path2.join(PLUGINS_DIR, "package.json");
188
- if (!fs2.existsSync(pkgPath)) return {};
189
- const pkg = JSON.parse(fs2.readFileSync(pkgPath, "utf-8"));
190
- return pkg.dependencies || {};
191
- }
192
- async function loadAdapterFactory(packageName) {
193
- try {
194
- const require2 = createRequire(path2.join(PLUGINS_DIR, "package.json"));
195
- const resolved = require2.resolve(packageName);
196
- const mod = await import(resolved);
197
- const factory = mod.adapterFactory || mod.default;
198
- if (!factory || typeof factory.createAdapter !== "function") {
199
- log.error(`Plugin ${packageName} does not export a valid AdapterFactory (needs .createAdapter())`);
200
- return null;
201
- }
202
- return factory;
203
- } catch (err) {
204
- log.error(`Failed to load plugin ${packageName}:`, err);
205
- log.error(`Run: npx openacp install ${packageName}`);
206
- return null;
207
- }
208
- }
209
-
210
- export {
211
- log,
212
- PLUGINS_DIR,
213
- expandHome,
214
- ConfigManager,
215
- installPlugin,
216
- uninstallPlugin,
217
- listPlugins,
218
- loadAdapterFactory
219
- };
220
- //# sourceMappingURL=chunk-KADEDKIM.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/core/log.ts","../../src/core/config.ts","../../src/core/plugin-manager.ts"],"sourcesContent":["export const log = {\n info: (...args: unknown[]) => console.log(new Date().toISOString(), '[INFO]', ...args),\n warn: (...args: unknown[]) => console.warn(new Date().toISOString(), '[WARN]', ...args),\n error: (...args: unknown[]) => console.error(new Date().toISOString(), '[ERROR]', ...args),\n debug: (...args: unknown[]) => {\n if (process.env.OPENACP_DEBUG) console.log(new Date().toISOString(), '[DEBUG]', ...args)\n },\n}\n","import { z } from 'zod'\nimport * as fs from 'node:fs'\nimport * as path from 'node:path'\nimport * as os from 'node:os'\nimport { log } from './log.js'\n\nconst BaseChannelSchema = z.object({\n enabled: z.boolean().default(false),\n adapter: z.string().optional(), // package name for plugin adapters\n}).passthrough()\n\nexport const PLUGINS_DIR = path.join(os.homedir(), '.openacp', 'plugins')\n\nconst AgentSchema = z.object({\n command: z.string(),\n args: z.array(z.string()).default([]),\n workingDirectory: z.string().optional(),\n env: z.record(z.string(), z.string()).default({}),\n})\n\nexport const ConfigSchema = z.object({\n channels: z.record(z.string(), BaseChannelSchema),\n agents: z.record(z.string(), AgentSchema),\n defaultAgent: z.string(),\n workspace: z.object({\n baseDir: z.string().default('~/openacp-workspace'),\n }).default({}),\n security: z.object({\n allowedUserIds: z.array(z.string()).default([]),\n maxConcurrentSessions: z.number().default(5),\n sessionTimeoutMinutes: z.number().default(60),\n }).default({}),\n})\n\nexport type Config = z.infer<typeof ConfigSchema>\n\nexport function expandHome(p: string): string {\n if (p.startsWith('~')) {\n return path.join(os.homedir(), p.slice(1))\n }\n return p\n}\n\nconst DEFAULT_CONFIG = {\n channels: {\n telegram: {\n enabled: false,\n botToken: \"YOUR_BOT_TOKEN_HERE\",\n chatId: 0,\n notificationTopicId: null,\n assistantTopicId: null\n }\n },\n agents: {\n claude: { command: \"claude-agent-acp\", args: [], env: {} },\n codex: { command: \"codex\", args: [\"--acp\"], env: {} }\n },\n defaultAgent: \"claude\",\n workspace: { baseDir: \"~/openacp-workspace\" },\n security: { allowedUserIds: [], maxConcurrentSessions: 5, sessionTimeoutMinutes: 60 }\n}\n\nexport class ConfigManager {\n private config!: Config\n private configPath: string\n\n constructor() {\n this.configPath = process.env.OPENACP_CONFIG_PATH || expandHome('~/.openacp/config.json')\n }\n\n async load(): Promise<void> {\n // 1. Ensure directory exists\n const dir = path.dirname(this.configPath)\n fs.mkdirSync(dir, { recursive: true })\n\n // 2. If config file doesn't exist, create default\n if (!fs.existsSync(this.configPath)) {\n fs.writeFileSync(this.configPath, JSON.stringify(DEFAULT_CONFIG, null, 2))\n log.info(`Config created at ${this.configPath}`)\n log.info('Please edit it with your Telegram bot token and chat ID, then restart.')\n process.exit(1)\n }\n\n // 3. Read and parse\n const raw = JSON.parse(fs.readFileSync(this.configPath, 'utf-8'))\n\n // 4. Apply env var overrides\n this.applyEnvOverrides(raw)\n\n // 5. Validate with Zod\n const result = ConfigSchema.safeParse(raw)\n if (!result.success) {\n log.error('Config validation failed:')\n for (const issue of result.error.issues) {\n log.error(` ${issue.path.join('.')}: ${issue.message}`)\n }\n process.exit(1)\n }\n this.config = result.data\n }\n\n get(): Config {\n return this.config\n }\n\n async save(updates: Record<string, unknown>): Promise<void> {\n // Read current file, merge updates, write back\n const raw = JSON.parse(fs.readFileSync(this.configPath, 'utf-8'))\n this.deepMerge(raw, updates)\n fs.writeFileSync(this.configPath, JSON.stringify(raw, null, 2))\n // Re-validate and update in-memory config\n const result = ConfigSchema.safeParse(raw)\n if (result.success) {\n this.config = result.data\n }\n }\n\n resolveWorkspace(input?: string): string {\n if (!input) {\n const resolved = expandHome(this.config.workspace.baseDir)\n fs.mkdirSync(resolved, { recursive: true })\n return resolved\n }\n if (input.startsWith('/') || input.startsWith('~')) {\n const resolved = expandHome(input)\n fs.mkdirSync(resolved, { recursive: true })\n return resolved\n }\n // Named workspace → lowercase, under baseDir\n const name = input.toLowerCase()\n const resolved = path.join(expandHome(this.config.workspace.baseDir), name)\n fs.mkdirSync(resolved, { recursive: true })\n return resolved\n }\n\n async exists(): Promise<boolean> {\n return fs.existsSync(this.configPath)\n }\n\n getConfigPath(): string {\n return this.configPath\n }\n\n async writeNew(config: Config): Promise<void> {\n const dir = path.dirname(this.configPath)\n fs.mkdirSync(dir, { recursive: true })\n fs.writeFileSync(this.configPath, JSON.stringify(config, null, 2))\n }\n\n private applyEnvOverrides(raw: Record<string, unknown>): void {\n const overrides: [string, string[]][] = [\n ['OPENACP_TELEGRAM_BOT_TOKEN', ['channels', 'telegram', 'botToken']],\n ['OPENACP_TELEGRAM_CHAT_ID', ['channels', 'telegram', 'chatId']],\n ['OPENACP_DEFAULT_AGENT', ['defaultAgent']],\n ]\n for (const [envVar, configPath] of overrides) {\n const value = process.env[envVar]\n if (value !== undefined) {\n let target = raw as Record<string, any>\n for (let i = 0; i < configPath.length - 1; i++) {\n if (!target[configPath[i]]) target[configPath[i]] = {}\n target = target[configPath[i]]\n }\n const key = configPath[configPath.length - 1]\n // Convert chatId to number\n target[key] = key === 'chatId' ? Number(value) : value\n }\n }\n }\n\n private deepMerge(target: Record<string, any>, source: Record<string, any>): void {\n for (const key of Object.keys(source)) {\n if (source[key] && typeof source[key] === 'object' && !Array.isArray(source[key])) {\n if (!target[key]) target[key] = {}\n this.deepMerge(target[key], source[key])\n } else {\n target[key] = source[key]\n }\n }\n }\n}\n","import { execSync } from 'node:child_process'\nimport * as fs from 'node:fs'\nimport * as path from 'node:path'\nimport { createRequire } from 'node:module'\nimport { PLUGINS_DIR } from './config.js'\nimport { log } from './log.js'\nimport type { ChannelAdapter } from './channel.js'\n\nexport interface AdapterFactory {\n name: string\n createAdapter(core: any, config: any): ChannelAdapter\n}\n\nfunction ensurePluginsDir(): void {\n fs.mkdirSync(PLUGINS_DIR, { recursive: true })\n const pkgPath = path.join(PLUGINS_DIR, 'package.json')\n if (!fs.existsSync(pkgPath)) {\n fs.writeFileSync(pkgPath, JSON.stringify({ name: 'openacp-plugins', private: true, dependencies: {} }, null, 2))\n }\n}\n\nexport function installPlugin(packageName: string): void {\n ensurePluginsDir()\n log.info(`Installing ${packageName}...`)\n execSync(`npm install ${packageName} --prefix \"${PLUGINS_DIR}\"`, { stdio: 'inherit' })\n log.info(`${packageName} installed successfully.`)\n}\n\nexport function uninstallPlugin(packageName: string): void {\n ensurePluginsDir()\n log.info(`Uninstalling ${packageName}...`)\n execSync(`npm uninstall ${packageName} --prefix \"${PLUGINS_DIR}\"`, { stdio: 'inherit' })\n log.info(`${packageName} uninstalled.`)\n}\n\nexport function listPlugins(): Record<string, string> {\n const pkgPath = path.join(PLUGINS_DIR, 'package.json')\n if (!fs.existsSync(pkgPath)) return {}\n const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'))\n return pkg.dependencies || {}\n}\n\nexport async function loadAdapterFactory(packageName: string): Promise<AdapterFactory | null> {\n try {\n const require = createRequire(path.join(PLUGINS_DIR, 'package.json'))\n const resolved = require.resolve(packageName)\n const mod = await import(resolved)\n\n // Plugin must export `adapterFactory` or default export conforming to AdapterFactory\n const factory: AdapterFactory | undefined = mod.adapterFactory || mod.default\n if (!factory || typeof factory.createAdapter !== 'function') {\n log.error(`Plugin ${packageName} does not export a valid AdapterFactory (needs .createAdapter())`)\n return null\n }\n return factory\n } catch (err) {\n log.error(`Failed to load plugin ${packageName}:`, err)\n log.error(`Run: npx openacp install ${packageName}`)\n return null\n }\n}\n"],"mappings":"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","names":["resolved","fs","path","require"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/main.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { ConfigManager } from './core/config.js'\nimport { OpenACPCore } from './core/core.js'\nimport { loadAdapterFactory } from './core/plugin-manager.js'\nimport { log } from './core/log.js'\nimport { TelegramAdapter } from './adapters/telegram/index.js'\n\nlet shuttingDown = false\n\nexport async function startServer() {\n // 1. Check config exists, run setup if not\n const configManager = new ConfigManager()\n const configExists = await configManager.exists()\n\n if (!configExists) {\n const { runSetup } = await import('./core/setup.js')\n const shouldStart = await runSetup(configManager)\n if (!shouldStart) process.exit(0)\n }\n\n // 2. Load config (validates with Zod)\n await configManager.load()\n const config = configManager.get()\n log.info('Config loaded from', configManager.getConfigPath())\n\n // 3. Create core\n const core = new OpenACPCore(configManager)\n\n // 4. Register adapters from config\n for (const [channelName, channelConfig] of Object.entries(config.channels)) {\n if (!channelConfig.enabled) continue\n\n if (channelName === 'telegram') {\n core.registerAdapter('telegram', new TelegramAdapter(core, channelConfig))\n log.info('Telegram adapter registered')\n } else if (channelConfig.adapter) {\n // Plugin adapter\n const factory = await loadAdapterFactory(channelConfig.adapter)\n if (factory) {\n const adapter = factory.createAdapter(core, channelConfig)\n core.registerAdapter(channelName, adapter)\n log.info(`${channelName} adapter registered (plugin: ${channelConfig.adapter})`)\n } else {\n log.error(`Skipping channel \"${channelName}\" — adapter \"${channelConfig.adapter}\" failed to load`)\n }\n } else {\n log.error(`Channel \"${channelName}\" has no built-in adapter. Set \"adapter\" field to a plugin package.`)\n }\n }\n\n if (core.adapters.size === 0) {\n log.error('No channels enabled. Enable at least one channel in config.')\n process.exit(1)\n }\n\n // 5. Start\n await core.start()\n\n // 6. Log ready\n const agents = Object.keys(config.agents).join(', ')\n log.info(`OpenACP started. Agents: ${agents}`)\n log.info('Press Ctrl+C to stop.')\n\n // 7. Graceful shutdown\n const shutdown = async (signal: string) => {\n if (shuttingDown) return\n shuttingDown = true\n log.info(`${signal} received. Shutting down...`)\n\n try {\n await core.stop()\n } catch (err) {\n log.error('Error during shutdown:', err)\n }\n\n process.exit(0)\n }\n\n process.on('SIGINT', () => shutdown('SIGINT'))\n process.on('SIGTERM', () => shutdown('SIGTERM'))\n\n process.on('uncaughtException', (err) => {\n log.error('Uncaught exception:', err)\n })\n\n process.on('unhandledRejection', (err) => {\n log.error('Unhandled rejection:', err)\n })\n}\n\n// Direct execution for dev (node packages/core/dist/main.js)\nconst isDirectExecution = process.argv[1]?.endsWith('main.js')\nif (isDirectExecution) {\n startServer().catch((err) => {\n log.error('Fatal:', err)\n process.exit(1)\n })\n}\n"],"mappings":";;;;;;;;;;;;AAQA,IAAI,eAAe;AAEnB,eAAsB,cAAc;AAElC,QAAM,gBAAgB,IAAI,cAAc;AACxC,QAAM,eAAe,MAAM,cAAc,OAAO;AAEhD,MAAI,CAAC,cAAc;AACjB,UAAM,EAAE,SAAS,IAAI,MAAM,OAAO,qBAAiB;AACnD,UAAM,cAAc,MAAM,SAAS,aAAa;AAChD,QAAI,CAAC,YAAa,SAAQ,KAAK,CAAC;AAAA,EAClC;AAGA,QAAM,cAAc,KAAK;AACzB,QAAM,SAAS,cAAc,IAAI;AACjC,MAAI,KAAK,sBAAsB,cAAc,cAAc,CAAC;AAG5D,QAAM,OAAO,IAAI,YAAY,aAAa;AAG1C,aAAW,CAAC,aAAa,aAAa,KAAK,OAAO,QAAQ,OAAO,QAAQ,GAAG;AAC1E,QAAI,CAAC,cAAc,QAAS;AAE5B,QAAI,gBAAgB,YAAY;AAC9B,WAAK,gBAAgB,YAAY,IAAI,gBAAgB,MAAM,aAAa,CAAC;AACzE,UAAI,KAAK,6BAA6B;AAAA,IACxC,WAAW,cAAc,SAAS;AAEhC,YAAM,UAAU,MAAM,mBAAmB,cAAc,OAAO;AAC9D,UAAI,SAAS;AACX,cAAM,UAAU,QAAQ,cAAc,MAAM,aAAa;AACzD,aAAK,gBAAgB,aAAa,OAAO;AACzC,YAAI,KAAK,GAAG,WAAW,gCAAgC,cAAc,OAAO,GAAG;AAAA,MACjF,OAAO;AACL,YAAI,MAAM,qBAAqB,WAAW,qBAAgB,cAAc,OAAO,kBAAkB;AAAA,MACnG;AAAA,IACF,OAAO;AACL,UAAI,MAAM,YAAY,WAAW,qEAAqE;AAAA,IACxG;AAAA,EACF;AAEA,MAAI,KAAK,SAAS,SAAS,GAAG;AAC5B,QAAI,MAAM,6DAA6D;AACvE,YAAQ,KAAK,CAAC;AAAA,EAChB;AAGA,QAAM,KAAK,MAAM;AAGjB,QAAM,SAAS,OAAO,KAAK,OAAO,MAAM,EAAE,KAAK,IAAI;AACnD,MAAI,KAAK,4BAA4B,MAAM,EAAE;AAC7C,MAAI,KAAK,uBAAuB;AAGhC,QAAM,WAAW,OAAO,WAAmB;AACzC,QAAI,aAAc;AAClB,mBAAe;AACf,QAAI,KAAK,GAAG,MAAM,6BAA6B;AAE/C,QAAI;AACF,YAAM,KAAK,KAAK;AAAA,IAClB,SAAS,KAAK;AACZ,UAAI,MAAM,0BAA0B,GAAG;AAAA,IACzC;AAEA,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,UAAQ,GAAG,UAAU,MAAM,SAAS,QAAQ,CAAC;AAC7C,UAAQ,GAAG,WAAW,MAAM,SAAS,SAAS,CAAC;AAE/C,UAAQ,GAAG,qBAAqB,CAAC,QAAQ;AACvC,QAAI,MAAM,uBAAuB,GAAG;AAAA,EACtC,CAAC;AAED,UAAQ,GAAG,sBAAsB,CAAC,QAAQ;AACxC,QAAI,MAAM,wBAAwB,GAAG;AAAA,EACvC,CAAC;AACH;AAGA,IAAM,oBAAoB,QAAQ,KAAK,CAAC,GAAG,SAAS,SAAS;AAC7D,IAAI,mBAAmB;AACrB,cAAY,EAAE,MAAM,CAAC,QAAQ;AAC3B,QAAI,MAAM,UAAU,GAAG;AACvB,YAAQ,KAAK,CAAC;AAAA,EAChB,CAAC;AACH;","names":[]}