@songsid/agend 2.0.11-beta.1 → 2.0.11-beta.10
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/channel/adapters/discord.d.ts +2 -0
- package/dist/channel/adapters/discord.js +38 -34
- package/dist/channel/adapters/discord.js.map +1 -1
- package/dist/channel/factory.d.ts +4 -0
- package/dist/channel/factory.js +1 -0
- package/dist/channel/factory.js.map +1 -1
- package/dist/cli.js +32 -6
- package/dist/cli.js.map +1 -1
- package/dist/daemon.js +25 -3
- package/dist/daemon.js.map +1 -1
- package/dist/fleet-manager.d.ts +10 -2
- package/dist/fleet-manager.js +83 -14
- package/dist/fleet-manager.js.map +1 -1
- package/dist/quickstart.js +11 -12
- package/dist/quickstart.js.map +1 -1
- package/dist/service-installer.js +1 -7
- package/dist/service-installer.js.map +1 -1
- package/dist/ui/view.html +319 -0
- package/dist/view-api.d.ts +29 -0
- package/dist/view-api.js +321 -0
- package/dist/view-api.js.map +1 -0
- package/package.json +1 -3
package/dist/view-api.js
ADDED
|
@@ -0,0 +1,321 @@
|
|
|
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 (view.token or web.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 accept view.token OR web.token; POST routes require the
|
|
14
|
+
* (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 = db;
|
|
45
|
+
_dbPath = p;
|
|
46
|
+
return db;
|
|
47
|
+
}
|
|
48
|
+
const IMAGE_MIME = {
|
|
49
|
+
".png": "image/png", ".jpg": "image/jpeg", ".jpeg": "image/jpeg",
|
|
50
|
+
".gif": "image/gif", ".webp": "image/webp",
|
|
51
|
+
};
|
|
52
|
+
function extForMime(mime) {
|
|
53
|
+
if (mime.includes("png"))
|
|
54
|
+
return ".png";
|
|
55
|
+
if (mime.includes("jpeg") || mime.includes("jpg"))
|
|
56
|
+
return ".jpg";
|
|
57
|
+
if (mime.includes("gif"))
|
|
58
|
+
return ".gif";
|
|
59
|
+
if (mime.includes("webp"))
|
|
60
|
+
return ".webp";
|
|
61
|
+
return null;
|
|
62
|
+
}
|
|
63
|
+
function tokenFrom(req, url) {
|
|
64
|
+
const h = req.headers["x-agend-token"];
|
|
65
|
+
return url.searchParams.get("token") ?? (typeof h === "string" ? h : null);
|
|
66
|
+
}
|
|
67
|
+
function json(res, code, body) {
|
|
68
|
+
res.writeHead(code, { "Content-Type": "application/json" });
|
|
69
|
+
res.end(JSON.stringify(body));
|
|
70
|
+
}
|
|
71
|
+
/** All instance names the view knows about: fleet-config + dynamic classic. */
|
|
72
|
+
function allInstanceNames(ctx) {
|
|
73
|
+
const s = new Set(Object.keys(ctx.fleetConfig?.instances ?? {}));
|
|
74
|
+
for (const c of ctx.classicChannels?.getAll() ?? [])
|
|
75
|
+
s.add(c.instanceName);
|
|
76
|
+
return s;
|
|
77
|
+
}
|
|
78
|
+
/** Safe instance name that also exists as a fleet or classic instance. */
|
|
79
|
+
function knownInstance(ctx, name) {
|
|
80
|
+
return /^[A-Za-z0-9._-]+$/.test(name) && allInstanceNames(ctx).has(name);
|
|
81
|
+
}
|
|
82
|
+
function readBody(req, maxBytes) {
|
|
83
|
+
return new Promise((resolve, reject) => {
|
|
84
|
+
const chunks = [];
|
|
85
|
+
let size = 0;
|
|
86
|
+
req.on("data", (c) => {
|
|
87
|
+
size += c.length;
|
|
88
|
+
if (size > maxBytes) {
|
|
89
|
+
reject(new Error("payload too large"));
|
|
90
|
+
req.destroy();
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
chunks.push(c);
|
|
94
|
+
});
|
|
95
|
+
req.on("end", () => resolve(Buffer.concat(chunks)));
|
|
96
|
+
req.on("error", reject);
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
/** Capture a pane's current contents (with ANSI escapes) for an instance. */
|
|
100
|
+
async function capturePane(ctx, name) {
|
|
101
|
+
const widFile = join(ctx.dataDir, "instances", name, "window-id");
|
|
102
|
+
if (!existsSync(widFile))
|
|
103
|
+
return "";
|
|
104
|
+
const wid = readFileSync(widFile, "utf-8").trim();
|
|
105
|
+
if (!wid)
|
|
106
|
+
return "";
|
|
107
|
+
const socket = getTmuxSocketName();
|
|
108
|
+
const args = [
|
|
109
|
+
...(socket ? ["-L", socket] : []),
|
|
110
|
+
"capture-pane", "-p", "-e", "-t", `${getTmuxSession()}:${wid}`,
|
|
111
|
+
];
|
|
112
|
+
const { stdout } = await execFileP("tmux", args, { maxBuffer: 8 * 1024 * 1024 });
|
|
113
|
+
return stdout;
|
|
114
|
+
}
|
|
115
|
+
/** True if the path belongs to the view feature (so the caller can skip the
|
|
116
|
+
* global web-token gate and let this module do its own token checks). */
|
|
117
|
+
export function isViewPath(path) {
|
|
118
|
+
return path === "/view"
|
|
119
|
+
|| path.startsWith("/api/pane/")
|
|
120
|
+
|| path === "/api/profiles"
|
|
121
|
+
|| path.startsWith("/api/profile/")
|
|
122
|
+
|| path.startsWith("/api/avatar/");
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Handle a `/view` feature request. Returns true if the request was a view
|
|
126
|
+
* route (and has been answered), false if it isn't ours.
|
|
127
|
+
*/
|
|
128
|
+
export function handleViewRequest(req, res, url, ctx) {
|
|
129
|
+
const path = url.pathname;
|
|
130
|
+
if (!isViewPath(path))
|
|
131
|
+
return false;
|
|
132
|
+
const method = req.method ?? "GET";
|
|
133
|
+
const token = tokenFrom(req, url);
|
|
134
|
+
const canRead = !!token && (token === ctx.viewToken || token === ctx.webToken);
|
|
135
|
+
const canWrite = !!token && token === ctx.webToken;
|
|
136
|
+
// ── GET /view — static page ──
|
|
137
|
+
if (method === "GET" && path === "/view") {
|
|
138
|
+
if (!canRead) {
|
|
139
|
+
json(res, 401, { error: "Unauthorized" });
|
|
140
|
+
return true;
|
|
141
|
+
}
|
|
142
|
+
try {
|
|
143
|
+
const html = readFileSync(join(__dirname, "ui", "view.html"), "utf-8");
|
|
144
|
+
res.writeHead(200, { "Content-Type": "text/html; charset=utf-8" });
|
|
145
|
+
res.end(html);
|
|
146
|
+
}
|
|
147
|
+
catch {
|
|
148
|
+
json(res, 500, { error: "view.html not found" });
|
|
149
|
+
}
|
|
150
|
+
return true;
|
|
151
|
+
}
|
|
152
|
+
// ── GET /api/pane/:instance ──
|
|
153
|
+
if (method === "GET" && path.startsWith("/api/pane/")) {
|
|
154
|
+
if (!canRead) {
|
|
155
|
+
json(res, 401, { error: "Unauthorized" });
|
|
156
|
+
return true;
|
|
157
|
+
}
|
|
158
|
+
const name = decodeURIComponent(path.slice("/api/pane/".length));
|
|
159
|
+
if (!knownInstance(ctx, name)) {
|
|
160
|
+
json(res, 404, { error: "unknown instance" });
|
|
161
|
+
return true;
|
|
162
|
+
}
|
|
163
|
+
capturePane(ctx, name)
|
|
164
|
+
.then(text => { res.writeHead(200, { "Content-Type": "text/plain; charset=utf-8" }); res.end(text); })
|
|
165
|
+
.catch(err => { ctx.logger.debug({ err, name }, "capture-pane failed"); res.writeHead(200, { "Content-Type": "text/plain" }); res.end(""); });
|
|
166
|
+
return true;
|
|
167
|
+
}
|
|
168
|
+
// ── GET /api/profiles — merged roster ──
|
|
169
|
+
if (method === "GET" && path === "/api/profiles") {
|
|
170
|
+
if (!canRead) {
|
|
171
|
+
json(res, 401, { error: "Unauthorized" });
|
|
172
|
+
return true;
|
|
173
|
+
}
|
|
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/profile/:instance ──
|
|
204
|
+
if (path.startsWith("/api/profile/")) {
|
|
205
|
+
const name = decodeURIComponent(path.slice("/api/profile/".length));
|
|
206
|
+
if (!knownInstance(ctx, name)) {
|
|
207
|
+
json(res, 404, { error: "unknown instance" });
|
|
208
|
+
return true;
|
|
209
|
+
}
|
|
210
|
+
if (method === "GET") {
|
|
211
|
+
if (!canRead) {
|
|
212
|
+
json(res, 401, { error: "Unauthorized" });
|
|
213
|
+
return true;
|
|
214
|
+
}
|
|
215
|
+
const db = profileDb(ctx.dataDir);
|
|
216
|
+
const row = db.prepare("SELECT * FROM instance_profile WHERE instance_name = ?").get(name)
|
|
217
|
+
?? { instance_name: name, display_name: null, avatar_path: null, role: null, description: null, updated_at: 0 };
|
|
218
|
+
json(res, 200, row);
|
|
219
|
+
return true;
|
|
220
|
+
}
|
|
221
|
+
if (method === "POST") {
|
|
222
|
+
if (!canWrite) {
|
|
223
|
+
json(res, 401, { error: "Unauthorized (web token required)" });
|
|
224
|
+
return true;
|
|
225
|
+
}
|
|
226
|
+
readBody(req, 256 * 1024).then(buf => {
|
|
227
|
+
let body;
|
|
228
|
+
try {
|
|
229
|
+
body = JSON.parse(buf.toString("utf-8") || "{}");
|
|
230
|
+
}
|
|
231
|
+
catch {
|
|
232
|
+
json(res, 400, { error: "invalid JSON" });
|
|
233
|
+
return;
|
|
234
|
+
}
|
|
235
|
+
const db = profileDb(ctx.dataDir);
|
|
236
|
+
// avatar_path is managed by the avatar upload route — don't clobber it here.
|
|
237
|
+
db.prepare(`INSERT INTO instance_profile (instance_name, display_name, role, description, updated_at)
|
|
238
|
+
VALUES (@n, @d, @r, @desc, @t)
|
|
239
|
+
ON CONFLICT(instance_name) DO UPDATE SET
|
|
240
|
+
display_name = @d, role = @r, description = @desc, updated_at = @t`)
|
|
241
|
+
.run({ n: name, d: body.display_name ?? null, r: body.role ?? null, desc: body.description ?? null, t: Date.now() });
|
|
242
|
+
json(res, 200, { ok: true });
|
|
243
|
+
}).catch(err => json(res, 400, { error: err.message }));
|
|
244
|
+
return true;
|
|
245
|
+
}
|
|
246
|
+
json(res, 405, { error: "method not allowed" });
|
|
247
|
+
return true;
|
|
248
|
+
}
|
|
249
|
+
// ── /api/avatar/:instance ──
|
|
250
|
+
if (path.startsWith("/api/avatar/")) {
|
|
251
|
+
const name = decodeURIComponent(path.slice("/api/avatar/".length));
|
|
252
|
+
if (!knownInstance(ctx, name)) {
|
|
253
|
+
json(res, 404, { error: "unknown instance" });
|
|
254
|
+
return true;
|
|
255
|
+
}
|
|
256
|
+
if (method === "GET") {
|
|
257
|
+
if (!canRead) {
|
|
258
|
+
json(res, 401, { error: "Unauthorized" });
|
|
259
|
+
return true;
|
|
260
|
+
}
|
|
261
|
+
const db = profileDb(ctx.dataDir);
|
|
262
|
+
const row = db.prepare("SELECT avatar_path FROM instance_profile WHERE instance_name = ?").get(name);
|
|
263
|
+
const file = row?.avatar_path;
|
|
264
|
+
if (!file || !existsSync(file)) {
|
|
265
|
+
json(res, 404, { error: "no avatar" });
|
|
266
|
+
return true;
|
|
267
|
+
}
|
|
268
|
+
const ext = (file.match(/\.[^.]+$/)?.[0] ?? "").toLowerCase();
|
|
269
|
+
try {
|
|
270
|
+
const data = readFileSync(file);
|
|
271
|
+
res.writeHead(200, { "Content-Type": IMAGE_MIME[ext] ?? "application/octet-stream", "Cache-Control": "no-cache" });
|
|
272
|
+
res.end(data);
|
|
273
|
+
}
|
|
274
|
+
catch {
|
|
275
|
+
json(res, 404, { error: "avatar unreadable" });
|
|
276
|
+
}
|
|
277
|
+
return true;
|
|
278
|
+
}
|
|
279
|
+
if (method === "POST") {
|
|
280
|
+
if (!canWrite) {
|
|
281
|
+
json(res, 401, { error: "Unauthorized (web token required)" });
|
|
282
|
+
return true;
|
|
283
|
+
}
|
|
284
|
+
const ext = extForMime(String(req.headers["content-type"] ?? ""));
|
|
285
|
+
if (!ext) {
|
|
286
|
+
json(res, 400, { error: "unsupported image type (png/jpeg/gif/webp)" });
|
|
287
|
+
return true;
|
|
288
|
+
}
|
|
289
|
+
readBody(req, 4 * 1024 * 1024).then(buf => {
|
|
290
|
+
if (buf.length === 0) {
|
|
291
|
+
json(res, 400, { error: "empty body" });
|
|
292
|
+
return;
|
|
293
|
+
}
|
|
294
|
+
const dir = join(ctx.dataDir, "avatars");
|
|
295
|
+
mkdirSync(dir, { recursive: true });
|
|
296
|
+
// Remove any prior avatar for this instance (different extension).
|
|
297
|
+
for (const f of (existsSync(dir) ? readdirSync(dir) : [])) {
|
|
298
|
+
if (f.startsWith(`${name}.`)) {
|
|
299
|
+
try {
|
|
300
|
+
writeFileSync(join(dir, f), "");
|
|
301
|
+
}
|
|
302
|
+
catch { /* best effort */ }
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
const dest = join(dir, `${name}${ext}`);
|
|
306
|
+
writeFileSync(dest, buf, { mode: 0o600 });
|
|
307
|
+
const db = profileDb(ctx.dataDir);
|
|
308
|
+
db.prepare(`INSERT INTO instance_profile (instance_name, avatar_path, updated_at)
|
|
309
|
+
VALUES (@n, @a, @t)
|
|
310
|
+
ON CONFLICT(instance_name) DO UPDATE SET avatar_path = @a, updated_at = @t`)
|
|
311
|
+
.run({ n: name, a: dest, t: Date.now() });
|
|
312
|
+
json(res, 200, { ok: true, avatar_path: dest });
|
|
313
|
+
}).catch(err => json(res, 400, { error: err.message }));
|
|
314
|
+
return true;
|
|
315
|
+
}
|
|
316
|
+
json(res, 405, { error: "method not allowed" });
|
|
317
|
+
return true;
|
|
318
|
+
}
|
|
319
|
+
return false;
|
|
320
|
+
}
|
|
321
|
+
//# 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,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,0EAA0E;AAC1E,SAAS,aAAa,CAAC,GAAmB,EAAE,IAAY;IACtD,OAAO,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,gBAAgB,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AAC3E,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,CAAC;AACvC,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,MAAM,OAAO,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,KAAK,KAAK,GAAG,CAAC,SAAS,IAAI,KAAK,KAAK,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC/E,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,OAAO,EAAE,CAAC;YAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC,CAAC;YAAC,OAAO,IAAI,CAAC;QAAC,CAAC;QACzE,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,IAAI,CAAC,OAAO,EAAE,CAAC;YAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC,CAAC;YAAC,OAAO,IAAI,CAAC;QAAC,CAAC;QACzE,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,IAAI,CAAC,OAAO,EAAE,CAAC;YAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC,CAAC;YAAC,OAAO,IAAI,CAAC;QAAC,CAAC;QACzE,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,+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,IAAI,CAAC,OAAO,EAAE,CAAC;gBAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC,CAAC;gBAAC,OAAO,IAAI,CAAC;YAAC,CAAC;YACzE,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,IAAI,CAAC,OAAO,EAAE,CAAC;gBAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC,CAAC;gBAAC,OAAO,IAAI,CAAC;YAAC,CAAC;YACzE,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.
|
|
3
|
+
"version": "2.0.11-beta.10",
|
|
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",
|