@songsid/agend 2.0.11-beta.2 → 2.0.11-beta.20

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 (42) hide show
  1. package/dist/channel/adapters/discord.d.ts +2 -0
  2. package/dist/channel/adapters/discord.js +38 -34
  3. package/dist/channel/adapters/discord.js.map +1 -1
  4. package/dist/channel/factory.d.ts +4 -0
  5. package/dist/channel/factory.js +1 -0
  6. package/dist/channel/factory.js.map +1 -1
  7. package/dist/channel/mcp-tools.js +3 -0
  8. package/dist/channel/mcp-tools.js.map +1 -1
  9. package/dist/channel/tool-router.js +29 -2
  10. package/dist/channel/tool-router.js.map +1 -1
  11. package/dist/classic-channel-manager.d.ts +59 -12
  12. package/dist/classic-channel-manager.js +121 -30
  13. package/dist/classic-channel-manager.js.map +1 -1
  14. package/dist/cli.js +83 -13
  15. package/dist/cli.js.map +1 -1
  16. package/dist/config-validator.d.ts +20 -0
  17. package/dist/config-validator.js +146 -0
  18. package/dist/config-validator.js.map +1 -0
  19. package/dist/daemon.js +25 -3
  20. package/dist/daemon.js.map +1 -1
  21. package/dist/fleet-manager.d.ts +27 -5
  22. package/dist/fleet-manager.js +311 -166
  23. package/dist/fleet-manager.js.map +1 -1
  24. package/dist/instance-lifecycle.d.ts +1 -1
  25. package/dist/instance-lifecycle.js +4 -4
  26. package/dist/instance-lifecycle.js.map +1 -1
  27. package/dist/outbound-schemas.d.ts +1 -0
  28. package/dist/outbound-schemas.js +1 -0
  29. package/dist/outbound-schemas.js.map +1 -1
  30. package/dist/quickstart.js +226 -21
  31. package/dist/quickstart.js.map +1 -1
  32. package/dist/service-installer.js +1 -7
  33. package/dist/service-installer.js.map +1 -1
  34. package/dist/settings-api.d.ts +33 -0
  35. package/dist/settings-api.js +283 -0
  36. package/dist/settings-api.js.map +1 -0
  37. package/dist/ui/settings.html +397 -0
  38. package/dist/ui/view.html +464 -0
  39. package/dist/view-api.d.ts +29 -0
  40. package/dist/view-api.js +361 -0
  41. package/dist/view-api.js.map +1 -0
  42. package/package.json +1 -3
@@ -0,0 +1,361 @@
1
+ /**
2
+ * Read-only Web View (`/view`) — a terminal-streaming page plus editable
3
+ * instance profiles. Separate from the operator Web UI (`/ui`):
4
+ *
5
+ * GET /view → static page (no token)
6
+ * GET /api/pane/:instance → `tmux capture-pane -ep` output (ANSI text)
7
+ * GET /api/profiles → merged roster (live status + config + profile)
8
+ * GET /api/profile/:instance → one profile row
9
+ * POST /api/profile/:instance → upsert profile (web.token only)
10
+ * GET /api/avatar/:instance → avatar image
11
+ * POST /api/avatar/:instance → upload avatar (web.token only)
12
+ *
13
+ * Auth: GET routes are open (read-only dashboard, no token); POST routes require
14
+ * the (read-write) web.token. Instance names are whitelisted against fleet config
15
+ * and tmux is invoked via execFile (no shell) to prevent command injection.
16
+ */
17
+ import { readFileSync, writeFileSync, existsSync, mkdirSync, readdirSync } from "node:fs";
18
+ import { join, dirname } from "node:path";
19
+ import { fileURLToPath } from "node:url";
20
+ import { execFile } from "node:child_process";
21
+ import { promisify } from "node:util";
22
+ import Database from "better-sqlite3";
23
+ import { getTmuxSession } from "./config.js";
24
+ import { getTmuxSocketName } from "./paths.js";
25
+ const execFileP = promisify(execFile);
26
+ const __dirname = dirname(fileURLToPath(import.meta.url));
27
+ // Lazy per-dataDir SQLite handle for instance profiles.
28
+ let _db = null;
29
+ let _dbPath = "";
30
+ function profileDb(dataDir) {
31
+ const p = join(dataDir, "profiles.db");
32
+ if (_db && _dbPath === p)
33
+ return _db;
34
+ const db = new Database(p);
35
+ db.pragma("journal_mode = WAL");
36
+ db.exec(`CREATE TABLE IF NOT EXISTS instance_profile (
37
+ instance_name TEXT PRIMARY KEY,
38
+ display_name TEXT,
39
+ avatar_path TEXT,
40
+ role TEXT,
41
+ description TEXT,
42
+ updated_at INTEGER
43
+ );`);
44
+ db.exec(`CREATE TABLE IF NOT EXISTS view_sort_order (
45
+ item_type TEXT NOT NULL, -- 'group' or 'instance'
46
+ item_name TEXT NOT NULL,
47
+ sort_index INTEGER NOT NULL,
48
+ group_name TEXT, -- owning group (for instances)
49
+ PRIMARY KEY (item_type, item_name)
50
+ );`);
51
+ _db = db;
52
+ _dbPath = p;
53
+ return db;
54
+ }
55
+ const IMAGE_MIME = {
56
+ ".png": "image/png", ".jpg": "image/jpeg", ".jpeg": "image/jpeg",
57
+ ".gif": "image/gif", ".webp": "image/webp",
58
+ };
59
+ function extForMime(mime) {
60
+ if (mime.includes("png"))
61
+ return ".png";
62
+ if (mime.includes("jpeg") || mime.includes("jpg"))
63
+ return ".jpg";
64
+ if (mime.includes("gif"))
65
+ return ".gif";
66
+ if (mime.includes("webp"))
67
+ return ".webp";
68
+ return null;
69
+ }
70
+ function tokenFrom(req, url) {
71
+ const h = req.headers["x-agend-token"];
72
+ return url.searchParams.get("token") ?? (typeof h === "string" ? h : null);
73
+ }
74
+ function json(res, code, body) {
75
+ res.writeHead(code, { "Content-Type": "application/json" });
76
+ res.end(JSON.stringify(body));
77
+ }
78
+ /** All instance names the view knows about: fleet-config + dynamic classic. */
79
+ function allInstanceNames(ctx) {
80
+ const s = new Set(Object.keys(ctx.fleetConfig?.instances ?? {}));
81
+ for (const c of ctx.classicChannels?.getAll() ?? [])
82
+ s.add(c.instanceName);
83
+ return s;
84
+ }
85
+ /** Safe instance name that also exists as a fleet or classic instance. The
86
+ * exact-match against the known-instances set IS the whitelist (a traversal or
87
+ * injected name simply won't be in it), so we only additionally block path
88
+ * separators / null bytes — the previous ASCII-only regex wrongly rejected
89
+ * legitimate non-ASCII names (e.g. `classic-鬥破串接-1843`). */
90
+ function knownInstance(ctx, name) {
91
+ return /^[^\\/\x00]+$/.test(name) && allInstanceNames(ctx).has(name);
92
+ }
93
+ function readBody(req, maxBytes) {
94
+ return new Promise((resolve, reject) => {
95
+ const chunks = [];
96
+ let size = 0;
97
+ req.on("data", (c) => {
98
+ size += c.length;
99
+ if (size > maxBytes) {
100
+ reject(new Error("payload too large"));
101
+ req.destroy();
102
+ return;
103
+ }
104
+ chunks.push(c);
105
+ });
106
+ req.on("end", () => resolve(Buffer.concat(chunks)));
107
+ req.on("error", reject);
108
+ });
109
+ }
110
+ /** Capture a pane's current contents (with ANSI escapes) for an instance. */
111
+ async function capturePane(ctx, name) {
112
+ const widFile = join(ctx.dataDir, "instances", name, "window-id");
113
+ if (!existsSync(widFile))
114
+ return "";
115
+ const wid = readFileSync(widFile, "utf-8").trim();
116
+ if (!wid)
117
+ return "";
118
+ const socket = getTmuxSocketName();
119
+ const args = [
120
+ ...(socket ? ["-L", socket] : []),
121
+ "capture-pane", "-p", "-e", "-t", `${getTmuxSession()}:${wid}`,
122
+ ];
123
+ const { stdout } = await execFileP("tmux", args, { maxBuffer: 8 * 1024 * 1024 });
124
+ return stdout;
125
+ }
126
+ /** True if the path belongs to the view feature (so the caller can skip the
127
+ * global web-token gate and let this module do its own token checks). */
128
+ export function isViewPath(path) {
129
+ return path === "/view"
130
+ || path.startsWith("/api/pane/")
131
+ || path === "/api/profiles"
132
+ || path.startsWith("/api/profile/")
133
+ || path.startsWith("/api/avatar/")
134
+ || path === "/api/sort-order";
135
+ }
136
+ /**
137
+ * Handle a `/view` feature request. Returns true if the request was a view
138
+ * route (and has been answered), false if it isn't ours.
139
+ */
140
+ export function handleViewRequest(req, res, url, ctx) {
141
+ const path = url.pathname;
142
+ if (!isViewPath(path))
143
+ return false;
144
+ const method = req.method ?? "GET";
145
+ const token = tokenFrom(req, url);
146
+ // GET routes are open (read-only dashboard); writes still require the web token.
147
+ const canWrite = !!token && token === ctx.webToken;
148
+ // ── GET /view — static page ──
149
+ if (method === "GET" && path === "/view") {
150
+ try {
151
+ const html = readFileSync(join(__dirname, "ui", "view.html"), "utf-8");
152
+ res.writeHead(200, { "Content-Type": "text/html; charset=utf-8" });
153
+ res.end(html);
154
+ }
155
+ catch {
156
+ json(res, 500, { error: "view.html not found" });
157
+ }
158
+ return true;
159
+ }
160
+ // ── GET /api/pane/:instance ──
161
+ if (method === "GET" && path.startsWith("/api/pane/")) {
162
+ const name = decodeURIComponent(path.slice("/api/pane/".length));
163
+ if (!knownInstance(ctx, name)) {
164
+ json(res, 404, { error: "unknown instance" });
165
+ return true;
166
+ }
167
+ capturePane(ctx, name)
168
+ .then(text => { res.writeHead(200, { "Content-Type": "text/plain; charset=utf-8" }); res.end(text); })
169
+ .catch(err => { ctx.logger.debug({ err, name }, "capture-pane failed"); res.writeHead(200, { "Content-Type": "text/plain" }); res.end(""); });
170
+ return true;
171
+ }
172
+ // ── GET /api/profiles — merged roster ──
173
+ if (method === "GET" && path === "/api/profiles") {
174
+ const ui = ctx.getUiStatus();
175
+ const live = new Map(ui.instances.map(i => [i.name, i]));
176
+ const db = profileDb(ctx.dataDir);
177
+ const profiles = new Map(db.prepare("SELECT * FROM instance_profile").all().map(r => [r.instance_name, r]));
178
+ // Merge fleet-config instances with dynamically-created classic instances
179
+ // (which have tmux windows + status but aren't in fleet.yaml).
180
+ const classicByName = new Map((ctx.classicChannels?.getAll() ?? []).map(c => [c.instanceName, c]));
181
+ const roster = [...allInstanceNames(ctx)].map(name => {
182
+ const cfg = ctx.fleetConfig?.instances[name];
183
+ const classic = classicByName.get(name);
184
+ const l = live.get(name);
185
+ const p = profiles.get(name);
186
+ return {
187
+ instance_name: name,
188
+ status: l?.status ?? ctx.getInstanceStatus(name),
189
+ context_pct: l?.context_pct ?? 0,
190
+ model: l?.model ?? "",
191
+ backend: cfg?.backend ?? (classic ? ctx.classicChannels.getBackendByInstance(name) : "claude-code"),
192
+ tags: cfg?.tags ?? (classic ? ["classic"] : []),
193
+ display_name: p?.display_name ?? null,
194
+ role: p?.role ?? null,
195
+ avatar_path: p?.avatar_path ?? null,
196
+ description: p?.description ?? cfg?.description ?? null,
197
+ has_avatar: !!p?.avatar_path,
198
+ };
199
+ });
200
+ json(res, 200, roster);
201
+ return true;
202
+ }
203
+ // ── /api/sort-order — sidebar drag-sort override ──
204
+ if (path === "/api/sort-order") {
205
+ if (method === "GET") {
206
+ const db = profileDb(ctx.dataDir);
207
+ const rows = db.prepare("SELECT item_type, item_name, sort_index, group_name FROM view_sort_order ORDER BY sort_index").all();
208
+ json(res, 200, rows);
209
+ return true;
210
+ }
211
+ if (method === "POST") {
212
+ if (!canWrite) {
213
+ json(res, 401, { error: "Unauthorized (web token required)" });
214
+ return true;
215
+ }
216
+ readBody(req, 512 * 1024).then(buf => {
217
+ let body;
218
+ try {
219
+ body = JSON.parse(buf.toString("utf-8") || "[]");
220
+ }
221
+ catch {
222
+ json(res, 400, { error: "invalid JSON" });
223
+ return;
224
+ }
225
+ if (!Array.isArray(body)) {
226
+ json(res, 400, { error: "expected an array" });
227
+ return;
228
+ }
229
+ const db = profileDb(ctx.dataDir);
230
+ // Replace the whole ordering atomically — the client always sends the
231
+ // complete order, so a full swap keeps the table consistent.
232
+ const replace = db.transaction((rows) => {
233
+ db.prepare("DELETE FROM view_sort_order").run();
234
+ const ins = db.prepare("INSERT OR REPLACE INTO view_sort_order (item_type, item_name, sort_index, group_name) VALUES (@t, @n, @i, @g)");
235
+ for (const r of rows) {
236
+ if (r.item_type !== "group" && r.item_type !== "instance")
237
+ continue;
238
+ if (typeof r.item_name !== "string")
239
+ continue;
240
+ ins.run({ t: r.item_type, n: r.item_name, i: Number(r.sort_index) || 0, g: r.group_name ?? null });
241
+ }
242
+ });
243
+ replace(body);
244
+ json(res, 200, { ok: true, count: body.length });
245
+ }).catch(err => json(res, 400, { error: err.message }));
246
+ return true;
247
+ }
248
+ json(res, 405, { error: "method not allowed" });
249
+ return true;
250
+ }
251
+ // ── /api/profile/:instance ──
252
+ if (path.startsWith("/api/profile/")) {
253
+ const name = decodeURIComponent(path.slice("/api/profile/".length));
254
+ if (!knownInstance(ctx, name)) {
255
+ json(res, 404, { error: "unknown instance" });
256
+ return true;
257
+ }
258
+ if (method === "GET") {
259
+ const db = profileDb(ctx.dataDir);
260
+ const row = db.prepare("SELECT * FROM instance_profile WHERE instance_name = ?").get(name)
261
+ ?? { instance_name: name, display_name: null, avatar_path: null, role: null, description: null, updated_at: 0 };
262
+ json(res, 200, row);
263
+ return true;
264
+ }
265
+ if (method === "POST") {
266
+ if (!canWrite) {
267
+ json(res, 401, { error: "Unauthorized (web token required)" });
268
+ return true;
269
+ }
270
+ readBody(req, 256 * 1024).then(buf => {
271
+ let body;
272
+ try {
273
+ body = JSON.parse(buf.toString("utf-8") || "{}");
274
+ }
275
+ catch {
276
+ json(res, 400, { error: "invalid JSON" });
277
+ return;
278
+ }
279
+ const db = profileDb(ctx.dataDir);
280
+ // avatar_path is managed by the avatar upload route — don't clobber it here.
281
+ db.prepare(`INSERT INTO instance_profile (instance_name, display_name, role, description, updated_at)
282
+ VALUES (@n, @d, @r, @desc, @t)
283
+ ON CONFLICT(instance_name) DO UPDATE SET
284
+ display_name = @d, role = @r, description = @desc, updated_at = @t`)
285
+ .run({ n: name, d: body.display_name ?? null, r: body.role ?? null, desc: body.description ?? null, t: Date.now() });
286
+ json(res, 200, { ok: true });
287
+ }).catch(err => json(res, 400, { error: err.message }));
288
+ return true;
289
+ }
290
+ json(res, 405, { error: "method not allowed" });
291
+ return true;
292
+ }
293
+ // ── /api/avatar/:instance ──
294
+ if (path.startsWith("/api/avatar/")) {
295
+ const name = decodeURIComponent(path.slice("/api/avatar/".length));
296
+ if (!knownInstance(ctx, name)) {
297
+ json(res, 404, { error: "unknown instance" });
298
+ return true;
299
+ }
300
+ if (method === "GET") {
301
+ const db = profileDb(ctx.dataDir);
302
+ const row = db.prepare("SELECT avatar_path FROM instance_profile WHERE instance_name = ?").get(name);
303
+ const file = row?.avatar_path;
304
+ if (!file || !existsSync(file)) {
305
+ json(res, 404, { error: "no avatar" });
306
+ return true;
307
+ }
308
+ const ext = (file.match(/\.[^.]+$/)?.[0] ?? "").toLowerCase();
309
+ try {
310
+ const data = readFileSync(file);
311
+ res.writeHead(200, { "Content-Type": IMAGE_MIME[ext] ?? "application/octet-stream", "Cache-Control": "no-cache" });
312
+ res.end(data);
313
+ }
314
+ catch {
315
+ json(res, 404, { error: "avatar unreadable" });
316
+ }
317
+ return true;
318
+ }
319
+ if (method === "POST") {
320
+ if (!canWrite) {
321
+ json(res, 401, { error: "Unauthorized (web token required)" });
322
+ return true;
323
+ }
324
+ const ext = extForMime(String(req.headers["content-type"] ?? ""));
325
+ if (!ext) {
326
+ json(res, 400, { error: "unsupported image type (png/jpeg/gif/webp)" });
327
+ return true;
328
+ }
329
+ readBody(req, 4 * 1024 * 1024).then(buf => {
330
+ if (buf.length === 0) {
331
+ json(res, 400, { error: "empty body" });
332
+ return;
333
+ }
334
+ const dir = join(ctx.dataDir, "avatars");
335
+ mkdirSync(dir, { recursive: true });
336
+ // Remove any prior avatar for this instance (different extension).
337
+ for (const f of (existsSync(dir) ? readdirSync(dir) : [])) {
338
+ if (f.startsWith(`${name}.`)) {
339
+ try {
340
+ writeFileSync(join(dir, f), "");
341
+ }
342
+ catch { /* best effort */ }
343
+ }
344
+ }
345
+ const dest = join(dir, `${name}${ext}`);
346
+ writeFileSync(dest, buf, { mode: 0o600 });
347
+ const db = profileDb(ctx.dataDir);
348
+ db.prepare(`INSERT INTO instance_profile (instance_name, avatar_path, updated_at)
349
+ VALUES (@n, @a, @t)
350
+ ON CONFLICT(instance_name) DO UPDATE SET avatar_path = @a, updated_at = @t`)
351
+ .run({ n: name, a: dest, t: Date.now() });
352
+ json(res, 200, { ok: true, avatar_path: dest });
353
+ }).catch(err => json(res, 400, { error: err.message }));
354
+ return true;
355
+ }
356
+ json(res, 405, { error: "method not allowed" });
357
+ return true;
358
+ }
359
+ return false;
360
+ }
361
+ //# sourceMappingURL=view-api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"view-api.js","sourceRoot":"","sources":["../src/view-api.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAC1F,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAGtC,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAE/C,MAAM,SAAS,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AACtC,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AA0B1D,wDAAwD;AACxD,IAAI,GAAG,GAA6B,IAAI,CAAC;AACzC,IAAI,OAAO,GAAG,EAAE,CAAC;AACjB,SAAS,SAAS,CAAC,OAAe;IAChC,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;IACvC,IAAI,GAAG,IAAI,OAAO,KAAK,CAAC;QAAE,OAAO,GAAG,CAAC;IACrC,MAAM,EAAE,GAAG,IAAI,QAAQ,CAAC,CAAC,CAAC,CAAC;IAC3B,EAAE,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;IAChC,EAAE,CAAC,IAAI,CAAC;;;;;;;KAOL,CAAC,CAAC;IACL,EAAE,CAAC,IAAI,CAAC;;;;;;KAML,CAAC,CAAC;IACL,GAAG,GAAG,EAAE,CAAC;IACT,OAAO,GAAG,CAAC,CAAC;IACZ,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,MAAM,UAAU,GAA2B;IACzC,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,YAAY;IAChE,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,YAAY;CAC3C,CAAC;AACF,SAAS,UAAU,CAAC,IAAY;IAC9B,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,MAAM,CAAC;IACxC,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,MAAM,CAAC;IACjE,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,MAAM,CAAC;IACxC,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,OAAO,CAAC;IAC1C,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,SAAS,CAAC,GAAoB,EAAE,GAAQ;IAC/C,MAAM,CAAC,GAAG,GAAG,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;IACvC,OAAO,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;AAC7E,CAAC;AACD,SAAS,IAAI,CAAC,GAAmB,EAAE,IAAY,EAAE,IAAa;IAC5D,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;IAC5D,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;AAChC,CAAC;AAED,+EAA+E;AAC/E,SAAS,gBAAgB,CAAC,GAAmB;IAC3C,MAAM,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,SAAS,IAAI,EAAE,CAAC,CAAC,CAAC;IACjE,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,eAAe,EAAE,MAAM,EAAE,IAAI,EAAE;QAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;IAC3E,OAAO,CAAC,CAAC;AACX,CAAC;AAED;;;;4DAI4D;AAC5D,SAAS,aAAa,CAAC,GAAmB,EAAE,IAAY;IACtD,OAAO,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,gBAAgB,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AACvE,CAAC;AAED,SAAS,QAAQ,CAAC,GAAoB,EAAE,QAAgB;IACtD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,IAAI,IAAI,GAAG,CAAC,CAAC;QACb,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,CAAS,EAAE,EAAE;YAC3B,IAAI,IAAI,CAAC,CAAC,MAAM,CAAC;YACjB,IAAI,IAAI,GAAG,QAAQ,EAAE,CAAC;gBAAC,MAAM,CAAC,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC,CAAC;gBAAC,GAAG,CAAC,OAAO,EAAE,CAAC;gBAAC,OAAO;YAAC,CAAC;YACvF,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACjB,CAAC,CAAC,CAAC;QACH,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACpD,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAC1B,CAAC,CAAC,CAAC;AACL,CAAC;AAED,6EAA6E;AAC7E,KAAK,UAAU,WAAW,CAAC,GAAmB,EAAE,IAAY;IAC1D,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC;IAClE,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;QAAE,OAAO,EAAE,CAAC;IACpC,MAAM,GAAG,GAAG,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;IAClD,IAAI,CAAC,GAAG;QAAE,OAAO,EAAE,CAAC;IACpB,MAAM,MAAM,GAAG,iBAAiB,EAAE,CAAC;IACnC,MAAM,IAAI,GAAG;QACX,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACjC,cAAc,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,cAAc,EAAE,IAAI,GAAG,EAAE;KAC/D,CAAC;IACF,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,SAAS,EAAE,CAAC,GAAG,IAAI,GAAG,IAAI,EAAE,CAAC,CAAC;IACjF,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;yEACyE;AACzE,MAAM,UAAU,UAAU,CAAC,IAAY;IACrC,OAAO,IAAI,KAAK,OAAO;WAClB,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC;WAC7B,IAAI,KAAK,eAAe;WACxB,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC;WAChC,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC;WAC/B,IAAI,KAAK,iBAAiB,CAAC;AAClC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAC/B,GAAoB,EACpB,GAAmB,EACnB,GAAQ,EACR,GAAmB;IAEnB,MAAM,IAAI,GAAG,GAAG,CAAC,QAAQ,CAAC;IAC1B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IAEpC,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,IAAI,KAAK,CAAC;IACnC,MAAM,KAAK,GAAG,SAAS,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAClC,iFAAiF;IACjF,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,IAAI,KAAK,KAAK,GAAG,CAAC,QAAQ,CAAC;IAEnD,gCAAgC;IAChC,IAAI,MAAM,KAAK,KAAK,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;QACzC,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,WAAW,CAAC,EAAE,OAAO,CAAC,CAAC;YACvE,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,0BAA0B,EAAE,CAAC,CAAC;YACnE,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAChB,CAAC;QAAC,MAAM,CAAC;YACP,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,qBAAqB,EAAE,CAAC,CAAC;QACnD,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,gCAAgC;IAChC,IAAI,MAAM,KAAK,KAAK,IAAI,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QACtD,MAAM,IAAI,GAAG,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC;QACjE,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,CAAC;YAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,kBAAkB,EAAE,CAAC,CAAC;YAAC,OAAO,IAAI,CAAC;QAAC,CAAC;QAC9F,WAAW,CAAC,GAAG,EAAE,IAAI,CAAC;aACnB,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,2BAA2B,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;aACrG,KAAK,CAAC,GAAG,CAAC,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,qBAAqB,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAChJ,OAAO,IAAI,CAAC;IACd,CAAC;IAED,0CAA0C;IAC1C,IAAI,MAAM,KAAK,KAAK,IAAI,IAAI,KAAK,eAAe,EAAE,CAAC;QACjD,MAAM,EAAE,GAAG,GAAG,CAAC,WAAW,EAAgG,CAAC;QAC3H,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QACzD,MAAM,EAAE,GAAG,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAClC,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAE,EAAE,CAAC,OAAO,CAAC,gCAAgC,CAAC,CAAC,GAAG,EAAmB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9H,0EAA0E;QAC1E,+DAA+D;QAC/D,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,eAAe,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QACnG,MAAM,MAAM,GAAG,CAAC,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;YACnD,MAAM,GAAG,GAAG,GAAG,CAAC,WAAW,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;YAC7C,MAAM,OAAO,GAAG,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACxC,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACzB,MAAM,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAC7B,OAAO;gBACL,aAAa,EAAE,IAAI;gBACnB,MAAM,EAAE,CAAC,EAAE,MAAM,IAAI,GAAG,CAAC,iBAAiB,CAAC,IAAI,CAAC;gBAChD,WAAW,EAAE,CAAC,EAAE,WAAW,IAAI,CAAC;gBAChC,KAAK,EAAE,CAAC,EAAE,KAAK,IAAI,EAAE;gBACrB,OAAO,EAAE,GAAG,EAAE,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,eAAgB,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC;gBACpG,IAAI,EAAE,GAAG,EAAE,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC/C,YAAY,EAAE,CAAC,EAAE,YAAY,IAAI,IAAI;gBACrC,IAAI,EAAE,CAAC,EAAE,IAAI,IAAI,IAAI;gBACrB,WAAW,EAAE,CAAC,EAAE,WAAW,IAAI,IAAI;gBACnC,WAAW,EAAE,CAAC,EAAE,WAAW,IAAI,GAAG,EAAE,WAAW,IAAI,IAAI;gBACvD,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,WAAW;aAC7B,CAAC;QACJ,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;QACvB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,qDAAqD;IACrD,IAAI,IAAI,KAAK,iBAAiB,EAAE,CAAC;QAC/B,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;YACrB,MAAM,EAAE,GAAG,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAClC,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,8FAA8F,CAAC,CAAC,GAAG,EAAE,CAAC;YAC9H,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;YACrB,OAAO,IAAI,CAAC;QACd,CAAC;QACD,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;YACtB,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,mCAAmC,EAAE,CAAC,CAAC;gBAAC,OAAO,IAAI,CAAC;YAAC,CAAC;YAC/F,QAAQ,CAAC,GAAG,EAAE,GAAG,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;gBACnC,IAAI,IAAqG,CAAC;gBAC1G,IAAI,CAAC;oBAAC,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,CAAC;gBAAC,CAAC;gBAAC,MAAM,CAAC;oBAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC,CAAC;oBAAC,OAAO;gBAAC,CAAC;gBACtH,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;oBAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,mBAAmB,EAAE,CAAC,CAAC;oBAAC,OAAO;gBAAC,CAAC;gBACrF,MAAM,EAAE,GAAG,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;gBAClC,sEAAsE;gBACtE,6DAA6D;gBAC7D,MAAM,OAAO,GAAG,EAAE,CAAC,WAAW,CAAC,CAAC,IAAiB,EAAE,EAAE;oBACnD,EAAE,CAAC,OAAO,CAAC,6BAA6B,CAAC,CAAC,GAAG,EAAE,CAAC;oBAChD,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,+GAA+G,CAAC,CAAC;oBACxI,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;wBACrB,IAAI,CAAC,CAAC,SAAS,KAAK,OAAO,IAAI,CAAC,CAAC,SAAS,KAAK,UAAU;4BAAE,SAAS;wBACpE,IAAI,OAAO,CAAC,CAAC,SAAS,KAAK,QAAQ;4BAAE,SAAS;wBAC9C,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,UAAU,IAAI,IAAI,EAAE,CAAC,CAAC;oBACrG,CAAC;gBACH,CAAC,CAAC,CAAC;gBACH,OAAO,CAAC,IAAI,CAAC,CAAC;gBACd,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;YACnD,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAG,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;YACnE,OAAO,IAAI,CAAC;QACd,CAAC;QACD,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,oBAAoB,EAAE,CAAC,CAAC;QAChD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,+BAA+B;IAC/B,IAAI,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;QACrC,MAAM,IAAI,GAAG,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC;QACpE,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,CAAC;YAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,kBAAkB,EAAE,CAAC,CAAC;YAAC,OAAO,IAAI,CAAC;QAAC,CAAC;QAE9F,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;YACrB,MAAM,EAAE,GAAG,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAClC,MAAM,GAAG,GAAI,EAAE,CAAC,OAAO,CAAC,wDAAwD,CAAC,CAAC,GAAG,CAAC,IAAI,CAA4B;mBACjH,EAAE,aAAa,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC;YAClH,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;YACpB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;YACtB,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,mCAAmC,EAAE,CAAC,CAAC;gBAAC,OAAO,IAAI,CAAC;YAAC,CAAC;YAC/F,QAAQ,CAAC,GAAG,EAAE,GAAG,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;gBACnC,IAAI,IAAoE,CAAC;gBACzE,IAAI,CAAC;oBAAC,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,CAAC;gBAAC,CAAC;gBACzD,MAAM,CAAC;oBAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC,CAAC;oBAAC,OAAO;gBAAC,CAAC;gBAC5D,MAAM,EAAE,GAAG,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;gBAClC,6EAA6E;gBAC7E,EAAE,CAAC,OAAO,CAAC;;;+EAG4D,CAAC;qBACrE,GAAG,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC,YAAY,IAAI,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC,IAAI,IAAI,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,WAAW,IAAI,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;gBACvH,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;YAC/B,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAG,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;YACnE,OAAO,IAAI,CAAC;QACd,CAAC;QACD,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,oBAAoB,EAAE,CAAC,CAAC;QAChD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,8BAA8B;IAC9B,IAAI,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;QACpC,MAAM,IAAI,GAAG,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC;QACnE,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,CAAC;YAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,kBAAkB,EAAE,CAAC,CAAC;YAAC,OAAO,IAAI,CAAC;QAAC,CAAC;QAE9F,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;YACrB,MAAM,EAAE,GAAG,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAClC,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,kEAAkE,CAAC,CAAC,GAAG,CAAC,IAAI,CAA+C,CAAC;YACnJ,MAAM,IAAI,GAAG,GAAG,EAAE,WAAW,CAAC;YAC9B,IAAI,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;gBAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC;gBAAC,OAAO,IAAI,CAAC;YAAC,CAAC;YACxF,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;YAC9D,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;gBAChC,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,UAAU,CAAC,GAAG,CAAC,IAAI,0BAA0B,EAAE,eAAe,EAAE,UAAU,EAAE,CAAC,CAAC;gBACnH,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAChB,CAAC;YAAC,MAAM,CAAC;gBAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,mBAAmB,EAAE,CAAC,CAAC;YAAC,CAAC;YAC3D,OAAO,IAAI,CAAC;QACd,CAAC;QAED,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;YACtB,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,mCAAmC,EAAE,CAAC,CAAC;gBAAC,OAAO,IAAI,CAAC;YAAC,CAAC;YAC/F,MAAM,GAAG,GAAG,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;YAClE,IAAI,CAAC,GAAG,EAAE,CAAC;gBAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,4CAA4C,EAAE,CAAC,CAAC;gBAAC,OAAO,IAAI,CAAC;YAAC,CAAC;YACnG,QAAQ,CAAC,GAAG,EAAE,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;gBACxC,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC,CAAC;oBAAC,OAAO;gBAAC,CAAC;gBAC1E,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;gBACzC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;gBACpC,mEAAmE;gBACnE,KAAK,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;oBAC1D,IAAI,CAAC,CAAC,UAAU,CAAC,GAAG,IAAI,GAAG,CAAC,EAAE,CAAC;wBAAC,IAAI,CAAC;4BAAC,aAAa,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;wBAAC,CAAC;wBAAC,MAAM,CAAC,CAAC,iBAAiB,CAAC,CAAC;oBAAC,CAAC;gBACxG,CAAC;gBACD,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,GAAG,GAAG,EAAE,CAAC,CAAC;gBACxC,aAAa,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;gBAC1C,MAAM,EAAE,GAAG,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;gBAClC,EAAE,CAAC,OAAO,CAAC;;qFAEkE,CAAC;qBAC3E,GAAG,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;gBAC5C,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;YAClD,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAG,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;YACnE,OAAO,IAAI,CAAC;QACd,CAAC;QACD,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,oBAAoB,EAAE,CAAC,CAAC;QAChD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@songsid/agend",
3
- "version": "2.0.11-beta.2",
3
+ "version": "2.0.11-beta.20",
4
4
  "description": "Multi-agent fleet daemon — run any coding CLI (Claude, Gemini, Codex, OpenCode) from Telegram",
5
5
  "type": "module",
6
6
  "bin": {
@@ -31,8 +31,6 @@
31
31
  "type": "git",
32
32
  "url": "https://github.com/songsid/AgEnD.git"
33
33
  },
34
- "homepage": "https://github.com/songsid/AgEnD#readme",
35
- "bugs": "https://github.com/songsid/AgEnD/issues",
36
34
  "keywords": [
37
35
  "agend",
38
36
  "agent",