@songsid/agend 2.0.11-beta.3 → 2.0.11-beta.30
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 +39 -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/channel/mcp-tools.js +3 -0
- package/dist/channel/mcp-tools.js.map +1 -1
- package/dist/channel/tool-router.js +29 -2
- package/dist/channel/tool-router.js.map +1 -1
- package/dist/classic-channel-manager.d.ts +59 -12
- package/dist/classic-channel-manager.js +121 -30
- package/dist/classic-channel-manager.js.map +1 -1
- package/dist/cli.js +94 -7
- package/dist/cli.js.map +1 -1
- package/dist/config-validator.d.ts +20 -0
- package/dist/config-validator.js +154 -0
- package/dist/config-validator.js.map +1 -0
- package/dist/fleet-manager.d.ts +27 -5
- package/dist/fleet-manager.js +360 -168
- package/dist/fleet-manager.js.map +1 -1
- package/dist/instance-lifecycle.d.ts +1 -1
- package/dist/instance-lifecycle.js +7 -6
- package/dist/instance-lifecycle.js.map +1 -1
- package/dist/outbound-schemas.d.ts +1 -0
- package/dist/outbound-schemas.js +1 -0
- package/dist/outbound-schemas.js.map +1 -1
- package/dist/quickstart.js +245 -16
- package/dist/quickstart.js.map +1 -1
- package/dist/service-installer.d.ts +1 -0
- package/dist/service-installer.js +2 -1
- package/dist/service-installer.js.map +1 -1
- package/dist/settings-api.d.ts +33 -0
- package/dist/settings-api.js +283 -0
- package/dist/settings-api.js.map +1 -0
- package/dist/topic-commands.d.ts +14 -0
- package/dist/topic-commands.js +63 -2
- package/dist/topic-commands.js.map +1 -1
- package/dist/ui/settings.html +457 -0
- package/dist/ui/view.html +477 -0
- package/dist/view-api.d.ts +29 -0
- package/dist/view-api.js +370 -0
- package/dist/view-api.js.map +1 -0
- package/package.json +1 -1
- package/templates/systemd.service.ejs +2 -1
package/dist/view-api.js
ADDED
|
@@ -0,0 +1,370 @@
|
|
|
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, unlinkSync } from "node:fs";
|
|
18
|
+
import { join, dirname, basename } 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
|
+
if (!row?.avatar_path) {
|
|
304
|
+
json(res, 404, { error: "no avatar" });
|
|
305
|
+
return true;
|
|
306
|
+
}
|
|
307
|
+
// Resolve by filename under the current dataDir/avatars — robust to a
|
|
308
|
+
// stored ABSOLUTE path from a different dataDir resolution (the cause of
|
|
309
|
+
// "avatar gone after restart"). basename() handles legacy absolute paths.
|
|
310
|
+
const file = join(ctx.dataDir, "avatars", basename(row.avatar_path));
|
|
311
|
+
if (!existsSync(file)) {
|
|
312
|
+
json(res, 404, { error: "no avatar" });
|
|
313
|
+
return true;
|
|
314
|
+
}
|
|
315
|
+
const ext = (file.match(/\.[^.]+$/)?.[0] ?? "").toLowerCase();
|
|
316
|
+
try {
|
|
317
|
+
const data = readFileSync(file);
|
|
318
|
+
res.writeHead(200, { "Content-Type": IMAGE_MIME[ext] ?? "application/octet-stream", "Cache-Control": "no-cache" });
|
|
319
|
+
res.end(data);
|
|
320
|
+
}
|
|
321
|
+
catch {
|
|
322
|
+
json(res, 404, { error: "avatar unreadable" });
|
|
323
|
+
}
|
|
324
|
+
return true;
|
|
325
|
+
}
|
|
326
|
+
if (method === "POST") {
|
|
327
|
+
if (!canWrite) {
|
|
328
|
+
json(res, 401, { error: "Unauthorized (web token required)" });
|
|
329
|
+
return true;
|
|
330
|
+
}
|
|
331
|
+
const ext = extForMime(String(req.headers["content-type"] ?? ""));
|
|
332
|
+
if (!ext) {
|
|
333
|
+
json(res, 400, { error: "unsupported image type (png/jpeg/gif/webp)" });
|
|
334
|
+
return true;
|
|
335
|
+
}
|
|
336
|
+
readBody(req, 4 * 1024 * 1024).then(buf => {
|
|
337
|
+
if (buf.length === 0) {
|
|
338
|
+
json(res, 400, { error: "empty body" });
|
|
339
|
+
return;
|
|
340
|
+
}
|
|
341
|
+
const dir = join(ctx.dataDir, "avatars");
|
|
342
|
+
mkdirSync(dir, { recursive: true });
|
|
343
|
+
// Remove any prior avatar for this instance (incl. a different extension).
|
|
344
|
+
for (const f of (existsSync(dir) ? readdirSync(dir) : [])) {
|
|
345
|
+
if (f.startsWith(`${name}.`)) {
|
|
346
|
+
try {
|
|
347
|
+
unlinkSync(join(dir, f));
|
|
348
|
+
}
|
|
349
|
+
catch { /* best effort */ }
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
const filename = `${name}${ext}`;
|
|
353
|
+
writeFileSync(join(dir, filename), buf, { mode: 0o600 });
|
|
354
|
+
const db = profileDb(ctx.dataDir);
|
|
355
|
+
// Store the FILENAME only (not an absolute path) so it resolves against
|
|
356
|
+
// whatever dataDir the fleet runs under after a restart.
|
|
357
|
+
db.prepare(`INSERT INTO instance_profile (instance_name, avatar_path, updated_at)
|
|
358
|
+
VALUES (@n, @a, @t)
|
|
359
|
+
ON CONFLICT(instance_name) DO UPDATE SET avatar_path = @a, updated_at = @t`)
|
|
360
|
+
.run({ n: name, a: filename, t: Date.now() });
|
|
361
|
+
json(res, 200, { ok: true, avatar_path: filename });
|
|
362
|
+
}).catch(err => json(res, 400, { error: err.message }));
|
|
363
|
+
return true;
|
|
364
|
+
}
|
|
365
|
+
json(res, 405, { error: "method not allowed" });
|
|
366
|
+
return true;
|
|
367
|
+
}
|
|
368
|
+
return false;
|
|
369
|
+
}
|
|
370
|
+
//# sourceMappingURL=view-api.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"view-api.js","sourceRoot":"","sources":["../src/view-api.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -10,7 +10,8 @@ WatchdogSec=60
|
|
|
10
10
|
ExecStart=<%= execPath %> fleet start
|
|
11
11
|
Environment=PATH=<%= path %>
|
|
12
12
|
Environment=TERM=xterm-256color
|
|
13
|
-
|
|
13
|
+
<% if (isRoot) { %>Environment=IS_SANDBOX=1
|
|
14
|
+
<% } %>WorkingDirectory=<%= workingDirectory %>
|
|
14
15
|
Restart=on-failure
|
|
15
16
|
RestartSec=5
|
|
16
17
|
TimeoutStopSec=300
|