@0xmaxma/claude-gateway 1.5.8 → 1.6.0

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 (65) hide show
  1. package/README.md +22 -0
  2. package/dist/agent/runner.d.ts +30 -0
  3. package/dist/agent/runner.d.ts.map +1 -1
  4. package/dist/agent/runner.js +223 -16
  5. package/dist/agent/runner.js.map +1 -1
  6. package/dist/api/apps-router.d.ts.map +1 -1
  7. package/dist/api/apps-router.js +7 -2
  8. package/dist/api/apps-router.js.map +1 -1
  9. package/dist/api/gateway-router.d.ts.map +1 -1
  10. package/dist/api/gateway-router.js +27 -0
  11. package/dist/api/gateway-router.js.map +1 -1
  12. package/dist/api/line-webhook-router.d.ts.map +1 -1
  13. package/dist/api/line-webhook-router.js +68 -0
  14. package/dist/api/line-webhook-router.js.map +1 -1
  15. package/dist/api/router.d.ts +2 -0
  16. package/dist/api/router.d.ts.map +1 -1
  17. package/dist/api/router.js +59 -3
  18. package/dist/api/router.js.map +1 -1
  19. package/dist/api/share-router.d.ts +11 -0
  20. package/dist/api/share-router.d.ts.map +1 -0
  21. package/dist/api/share-router.js +402 -0
  22. package/dist/api/share-router.js.map +1 -0
  23. package/dist/apps/installer.d.ts +55 -0
  24. package/dist/apps/installer.d.ts.map +1 -1
  25. package/dist/apps/installer.js +130 -0
  26. package/dist/apps/installer.js.map +1 -1
  27. package/dist/config/loader.d.ts.map +1 -1
  28. package/dist/config/loader.js +9 -0
  29. package/dist/config/loader.js.map +1 -1
  30. package/dist/config/public-url.d.ts +11 -0
  31. package/dist/config/public-url.d.ts.map +1 -0
  32. package/dist/config/public-url.js +41 -0
  33. package/dist/config/public-url.js.map +1 -0
  34. package/dist/config/watcher.d.ts.map +1 -1
  35. package/dist/config/watcher.js +1 -0
  36. package/dist/config/watcher.js.map +1 -1
  37. package/dist/history/db.d.ts +14 -0
  38. package/dist/history/db.d.ts.map +1 -1
  39. package/dist/history/db.js +48 -4
  40. package/dist/history/db.js.map +1 -1
  41. package/dist/history/types.d.ts +5 -0
  42. package/dist/history/types.d.ts.map +1 -1
  43. package/dist/session/process.d.ts.map +1 -1
  44. package/dist/session/process.js +17 -1
  45. package/dist/session/process.js.map +1 -1
  46. package/dist/session/store.d.ts.map +1 -1
  47. package/dist/session/store.js +9 -1
  48. package/dist/session/store.js.map +1 -1
  49. package/dist/share/session-image-catalog.d.ts +22 -0
  50. package/dist/share/session-image-catalog.d.ts.map +1 -0
  51. package/dist/share/session-image-catalog.js +151 -0
  52. package/dist/share/session-image-catalog.js.map +1 -0
  53. package/dist/share/share-store.d.ts +137 -0
  54. package/dist/share/share-store.d.ts.map +1 -0
  55. package/dist/share/share-store.js +340 -0
  56. package/dist/share/share-store.js.map +1 -0
  57. package/dist/types.d.ts +17 -7
  58. package/dist/types.d.ts.map +1 -1
  59. package/mcp/instructions.ts +1 -0
  60. package/mcp/server.ts +2 -0
  61. package/mcp/tools/image/module.ts +240 -26
  62. package/mcp/tools/line/module.ts +186 -0
  63. package/mcp/tools/share-image/module.ts +120 -0
  64. package/mcp/tools/shared/share-client.ts +197 -0
  65. package/package.json +3 -1
@@ -0,0 +1,402 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.createSharesPublicRouter = createSharesPublicRouter;
37
+ exports.createSharesPrivateRouter = createSharesPrivateRouter;
38
+ const express_1 = require("express");
39
+ const fs = __importStar(require("fs"));
40
+ const auth_1 = require("./auth");
41
+ const router_1 = require("./router");
42
+ const media_store_1 = require("../history/media-store");
43
+ const share_store_1 = require("../share/share-store");
44
+ const session_image_catalog_1 = require("../share/session-image-catalog");
45
+ const PURPOSE_RE = /^[a-z][a-z0-9_]{0,31}$/;
46
+ const MIN_TTL_SECONDS = 10;
47
+ const MAX_TTL_SECONDS = 86400;
48
+ const MAX_ARTIFACT_FILES = 10;
49
+ const MAX_ARTIFACT_PROMPT_CHARS = 500;
50
+ const DEFAULT_PUBLIC_RATE_PER_MIN = 60;
51
+ function errStatus(code) {
52
+ switch (code) {
53
+ case 'image_ref_not_found': return 404;
54
+ case 'image_too_large': return 413;
55
+ case 'total_size_exceeded': return 413;
56
+ case 'unsupported_image_type': return 415;
57
+ default: return 400;
58
+ }
59
+ }
60
+ /** Uniform public 404 — identical body for unknown / expired / revoked /
61
+ * deleted / forbidden so the response never leaks WHY (§11). */
62
+ function publicNotFound(res) {
63
+ res.status(404).type('text/plain').send('Not Found');
64
+ }
65
+ function createSharesPublicRouter(store, agentsBaseDir, opts = {}) {
66
+ const router = (0, express_1.Router)();
67
+ const envRate = Number(process.env.IMAGE_SHARE_PUBLIC_RATE_PER_MIN);
68
+ const ratePerMinute = opts.ratePerMinute ?? (Number.isFinite(envRate) && envRate > 0 ? envRate : DEFAULT_PUBLIC_RATE_PER_MIN);
69
+ const limits = (0, share_store_1.shareLimitsFromEnv)();
70
+ // Fixed-window per-IP limiter. This endpoint is unauthenticated and shares
71
+ // the event loop with the chat API, so a cheap 404-flood must be shed here
72
+ // before it reaches the SQLite lookup (§11).
73
+ const rateMap = new Map();
74
+ // Throttle the lazy expiry sweep: a token miss triggers a full-table DELETE,
75
+ // so an unauthenticated 404-flood must not turn every miss into a table write.
76
+ // Sweep at most once per minute (the rows are only garbage-collected, never
77
+ // served, so a minute of staleness is harmless).
78
+ let lastSweepMs = 0;
79
+ const SWEEP_THROTTLE_MS = 60000;
80
+ const allow = (ip) => {
81
+ const now = Date.now();
82
+ const entry = rateMap.get(ip);
83
+ if (!entry || now >= entry.resetAt) {
84
+ // Opportunistic prune keeps the map bounded without a timer.
85
+ if (rateMap.size > 10000) {
86
+ for (const [k, v] of rateMap)
87
+ if (now >= v.resetAt)
88
+ rateMap.delete(k);
89
+ }
90
+ rateMap.set(ip, { count: 1, resetAt: now + 60000 });
91
+ return true;
92
+ }
93
+ if (entry.count >= ratePerMinute)
94
+ return false;
95
+ entry.count++;
96
+ return true;
97
+ };
98
+ // /shared is the path after production Traefik strips /gateway.
99
+ // /gateway/shared is the direct-path alias used by localhost Docker E2E.
100
+ router.all(['/shared/:token', '/gateway/shared/:token'], (req, res) => {
101
+ if (req.method !== 'GET' && req.method !== 'HEAD') {
102
+ res.status(405).set('Allow', 'GET, HEAD').type('text/plain').send('Method Not Allowed');
103
+ return;
104
+ }
105
+ if (!allow(req.ip ?? 'unknown')) {
106
+ res.status(429).type('text/plain').send('Too Many Requests');
107
+ return;
108
+ }
109
+ const token = req.params.token ?? '';
110
+ const share = store.lookupByToken(token);
111
+ if (!share) {
112
+ const nowMs = Date.now();
113
+ if (nowMs - lastSweepMs >= SWEEP_THROTTLE_MS) {
114
+ lastSweepMs = nowMs;
115
+ store.cleanupExpired(); // throttled lazy expiry sweep (≤1×/min)
116
+ }
117
+ publicNotFound(res);
118
+ return;
119
+ }
120
+ // Re-resolve and revalidate at GET time (§12.9): containment + symlink
121
+ // checks again, then open a file descriptor FIRST and validate through it
122
+ // (fstat regular-file + size + magic) to shrink the TOCTOU window (§12.10).
123
+ let fd;
124
+ try {
125
+ const abs = media_store_1.MediaStore.resolvePath(agentsBaseDir, share.agentId, share.relativePath);
126
+ fd = fs.openSync(abs, 'r');
127
+ const stat = fs.fstatSync(fd);
128
+ if (!stat.isFile() || stat.size > limits.maxFileBytes)
129
+ throw new Error('invalid file');
130
+ const header = Buffer.alloc(12);
131
+ fs.readSync(fd, header, 0, 12, 0);
132
+ const mime = (0, share_store_1.detectImageMime)(header);
133
+ if (!mime)
134
+ throw new Error('unsupported type');
135
+ res.status(200).set({
136
+ 'Content-Type': mime,
137
+ 'Content-Length': String(stat.size),
138
+ 'Content-Disposition': 'inline',
139
+ 'X-Content-Type-Options': 'nosniff',
140
+ 'Cache-Control': 'private, no-store',
141
+ });
142
+ if (req.method === 'HEAD') {
143
+ fs.closeSync(fd);
144
+ res.end();
145
+ }
146
+ else {
147
+ // createReadStream owns the fd from here (autoClose defaults true).
148
+ const stream = fs.createReadStream('', { fd, start: 0 });
149
+ stream.on('error', () => {
150
+ try {
151
+ res.destroy();
152
+ }
153
+ catch { /* already gone */ }
154
+ });
155
+ stream.pipe(res);
156
+ }
157
+ console.log(`[share] fetch ok share=${share.shareId} purpose=${share.purpose} bytes=${stat.size}`);
158
+ }
159
+ catch {
160
+ if (fd !== undefined) {
161
+ try {
162
+ fs.closeSync(fd);
163
+ }
164
+ catch { /* already closed */ }
165
+ }
166
+ // File deleted / replaced by a non-image / traversal — same uniform 404.
167
+ publicNotFound(res);
168
+ }
169
+ });
170
+ return router;
171
+ }
172
+ function createSharesPrivateRouter(store, apiKeys, agentsBaseDir, publicBaseUrl, limitsOverride) {
173
+ const router = (0, express_1.Router)();
174
+ const auth = (0, auth_1.createApiAuthMiddleware)(apiKeys);
175
+ const limits = limitsOverride ?? (0, share_store_1.shareLimitsFromEnv)();
176
+ const defaultTtl = (() => {
177
+ const n = Number(process.env.IMAGE_SHARE_CODEX_TTL_SECONDS);
178
+ return Number.isFinite(n) && n > 0 ? Math.floor(n) : share_store_1.DEFAULT_SHARE_TTL_SECONDS;
179
+ })();
180
+ /**
181
+ * POST /api/v1/shares — mint one or more shares (§10).
182
+ * Body: { agent_id, session_id, purpose?, ttl_seconds?, refs: [{artifact_id}|{path}] }
183
+ * Response: { items: [{ share_id, token, url?, expires_at }] } — order preserved.
184
+ * `token` is always present (host-agnostic capability); `url` is a convenience
185
+ * built from `gateway.publicUrl` and is omitted when that is unset — callers
186
+ * with their own public base (e.g. LINE) build the URL from `token`.
187
+ */
188
+ router.post('/v1/shares', auth, (req, res) => {
189
+ const apiKey = req.apiKey;
190
+ const body = req.body;
191
+ const agentId = typeof body.agent_id === 'string' ? body.agent_id.trim() : '';
192
+ const sessionId = typeof body.session_id === 'string' ? body.session_id.trim() : '';
193
+ if (!(0, router_1.isValidAgentId)(agentId) || !(0, router_1.isValidSessionId)(sessionId)) {
194
+ res.status(400).json({ error: 'agent_id and session_id must be valid identifiers' });
195
+ return;
196
+ }
197
+ if (!(0, auth_1.canAccessAgent)(apiKey, agentId)) {
198
+ res.status(403).json({ error: `API key has no access to agent '${agentId}'` });
199
+ return;
200
+ }
201
+ const purpose = body.purpose === undefined ? 'codex_ref' : (typeof body.purpose === 'string' ? body.purpose : '');
202
+ if (!PURPOSE_RE.test(purpose)) {
203
+ res.status(400).json({ error: 'purpose must match [a-z][a-z0-9_]{0,31}' });
204
+ return;
205
+ }
206
+ let ttlSeconds = defaultTtl;
207
+ if (body.ttl_seconds !== undefined) {
208
+ if (typeof body.ttl_seconds !== 'number' || !Number.isFinite(body.ttl_seconds)) {
209
+ res.status(400).json({ error: 'ttl_seconds must be a number' });
210
+ return;
211
+ }
212
+ ttlSeconds = Math.min(Math.max(Math.floor(body.ttl_seconds), MIN_TTL_SECONDS), MAX_TTL_SECONDS);
213
+ }
214
+ const refs = body.refs;
215
+ if (!Array.isArray(refs) || refs.length === 0) {
216
+ res.status(400).json({ error: 'refs must be a non-empty array' });
217
+ return;
218
+ }
219
+ if (refs.length > limits.maxRefs) {
220
+ res.status(400).json({ error: `too many refs (max ${limits.maxRefs})`, code: 'too_many_refs' });
221
+ return;
222
+ }
223
+ const resolved = [];
224
+ const seen = new Set();
225
+ let totalBytes = 0;
226
+ for (const raw of refs) {
227
+ if (typeof raw !== 'object' || raw === null) {
228
+ res.status(400).json({ error: 'each ref must be an object with artifact_id or path' });
229
+ return;
230
+ }
231
+ const ref = raw;
232
+ let dedupeRef;
233
+ let candidatePath;
234
+ if (typeof ref.artifact_id === 'string' && ref.artifact_id.trim()) {
235
+ const artifact = store.resolveArtifact(agentId, sessionId, ref.artifact_id.trim());
236
+ if (!artifact) {
237
+ res.status(404).json({ error: 'referenced artifact was not found in this agent/session', code: 'image_ref_not_found' });
238
+ return;
239
+ }
240
+ dedupeRef = `artifact:${artifact.artifactId}`;
241
+ candidatePath = artifact.relativePath;
242
+ }
243
+ else if (typeof ref.path === 'string' && ref.path.trim()) {
244
+ candidatePath = ref.path.trim();
245
+ dedupeRef = ''; // filled after validation with the canonical relative path
246
+ }
247
+ else {
248
+ res.status(400).json({ error: 'each ref must carry artifact_id or path' });
249
+ return;
250
+ }
251
+ let validated;
252
+ try {
253
+ validated = (0, share_store_1.validateShareFile)(agentsBaseDir, agentId, candidatePath, limits.maxFileBytes);
254
+ }
255
+ catch (err) {
256
+ if (err instanceof share_store_1.ShareError) {
257
+ res.status(errStatus(err.code)).json({ error: err.message, code: err.code });
258
+ return;
259
+ }
260
+ res.status(400).json({ error: 'invalid ref', code: 'invalid_path' });
261
+ return;
262
+ }
263
+ if (!dedupeRef)
264
+ dedupeRef = `path:${validated.relativePath}`;
265
+ if (seen.has(dedupeRef)) {
266
+ res.status(400).json({ error: 'duplicate ref', code: 'duplicate_ref' });
267
+ return;
268
+ }
269
+ seen.add(dedupeRef);
270
+ totalBytes += validated.size;
271
+ resolved.push({ dedupeRef, relativePath: validated.relativePath, size: validated.size });
272
+ }
273
+ if (totalBytes > limits.maxTotalBytes) {
274
+ res.status(413).json({ error: `total reference size exceeds ${limits.maxTotalBytes} bytes`, code: 'total_size_exceeded' });
275
+ return;
276
+ }
277
+ const items = resolved.map((r) => {
278
+ const mint = store.mintShare({
279
+ agentId,
280
+ sessionId,
281
+ relativePath: r.relativePath,
282
+ dedupeRef: r.dedupeRef,
283
+ purpose,
284
+ ttlSeconds,
285
+ });
286
+ console.log(`[share] mint share=${mint.shareId} purpose=${purpose} deduped=${mint.deduped}`);
287
+ return {
288
+ share_id: mint.shareId,
289
+ token: mint.token,
290
+ ...(publicBaseUrl ? { url: `${publicBaseUrl}/shared/${mint.token}` } : {}),
291
+ expires_at: new Date(mint.expiresAtMs).toISOString(),
292
+ };
293
+ });
294
+ res.status(201).json({ items });
295
+ });
296
+ /**
297
+ * DELETE /api/v1/shares/:shareId — revoke (§10). Only a key with
298
+ * access to the owning agent (or admin) may revoke; anything else is a
299
+ * uniform 404 so share ids are not confirmable cross-tenant.
300
+ */
301
+ router.delete('/v1/shares/:shareId', auth, (req, res) => {
302
+ const apiKey = req.apiKey;
303
+ const shareId = req.params.shareId ?? '';
304
+ const owner = store.getShareOwner(shareId);
305
+ if (!owner || !(0, auth_1.canAccessAgent)(apiKey, owner.agentId)) {
306
+ res.status(404).json({ error: 'share not found' });
307
+ return;
308
+ }
309
+ store.revokeShare(shareId);
310
+ console.log(`[share] revoke share=${shareId} purpose=${owner.purpose}`);
311
+ res.json({ revoked: true });
312
+ });
313
+ /**
314
+ * POST /api/v1/image-artifacts — register generated images as private
315
+ * artifacts (§8). Body: { agent_id, session_id, provider, model, task_id?, prompt?, files: [path] }.
316
+ * Registration never makes a file public — shares are minted separately.
317
+ */
318
+ router.post('/v1/image-artifacts', auth, (req, res) => {
319
+ const apiKey = req.apiKey;
320
+ const body = req.body;
321
+ const agentId = typeof body.agent_id === 'string' ? body.agent_id.trim() : '';
322
+ const sessionId = typeof body.session_id === 'string' ? body.session_id.trim() : '';
323
+ if (!(0, router_1.isValidAgentId)(agentId) || !(0, router_1.isValidSessionId)(sessionId)) {
324
+ res.status(400).json({ error: 'agent_id and session_id must be valid identifiers' });
325
+ return;
326
+ }
327
+ if (!(0, auth_1.canAccessAgent)(apiKey, agentId)) {
328
+ res.status(403).json({ error: `API key has no access to agent '${agentId}'` });
329
+ return;
330
+ }
331
+ const files = body.files;
332
+ if (!Array.isArray(files) || files.length === 0 || files.some((f) => typeof f !== 'string' || !f.trim())) {
333
+ res.status(400).json({ error: 'files must be a non-empty array of strings' });
334
+ return;
335
+ }
336
+ if (files.length > MAX_ARTIFACT_FILES) {
337
+ res.status(400).json({ error: `too many files (max ${MAX_ARTIFACT_FILES})` });
338
+ return;
339
+ }
340
+ const provider = typeof body.provider === 'string' && body.provider.trim() ? body.provider.trim() : 'unknown';
341
+ const model = typeof body.model === 'string' && body.model.trim() ? body.model.trim() : 'unknown';
342
+ const taskId = typeof body.task_id === 'string' && body.task_id.trim() ? body.task_id.trim() : undefined;
343
+ // Generation prompt, kept as catalog metadata (`desc`) so a later turn can
344
+ // resolve "the dog picture" style references. Capped — it describes, it is
345
+ // not a transcript.
346
+ const prompt = typeof body.prompt === 'string' && body.prompt.trim()
347
+ ? body.prompt.trim().slice(0, MAX_ARTIFACT_PROMPT_CHARS)
348
+ : undefined;
349
+ const items = [];
350
+ for (let index = 0; index < files.length; index++) {
351
+ const file = files[index];
352
+ let validated;
353
+ try {
354
+ validated = (0, share_store_1.validateShareFile)(agentsBaseDir, agentId, file, limits.maxFileBytes);
355
+ }
356
+ catch (err) {
357
+ const code = err instanceof share_store_1.ShareError ? err.code : 'invalid_path';
358
+ res.status(errStatus(code)).json({ error: err instanceof Error ? err.message : 'invalid file', code });
359
+ return;
360
+ }
361
+ const artifactId = store.registerArtifact({
362
+ agentId,
363
+ sessionId,
364
+ relativePath: validated.relativePath,
365
+ provider,
366
+ model,
367
+ taskId,
368
+ imageIndex: index,
369
+ prompt,
370
+ });
371
+ items.push({ artifact_id: artifactId, artifact_ref: `artifact:${artifactId}`, index, path: file });
372
+ }
373
+ console.log(`[share] artifacts registered count=${items.length} provider=${provider}`);
374
+ res.status(201).json({ items });
375
+ });
376
+ /**
377
+ * GET /api/v1/image-catalog?agent_id=...&session_id=... — the deterministic
378
+ * image list of one session, oldest first (#72). Response:
379
+ * { items: [{ index, ref, relative_path, origin, ts, available }] }.
380
+ *
381
+ * Read-only: it mints nothing and returns no token, so "the agent can look up
382
+ * image N" never widens the share surface. Same trust model as the mint
383
+ * endpoint (caller holds a gateway key scoped to the agent).
384
+ */
385
+ router.get('/v1/image-catalog', auth, (req, res) => {
386
+ const apiKey = req.apiKey;
387
+ const agentId = typeof req.query.agent_id === 'string' ? req.query.agent_id.trim() : '';
388
+ const sessionId = typeof req.query.session_id === 'string' ? req.query.session_id.trim() : '';
389
+ if (!(0, router_1.isValidAgentId)(agentId) || !(0, router_1.isValidSessionId)(sessionId)) {
390
+ res.status(400).json({ error: 'agent_id and session_id must be valid identifiers' });
391
+ return;
392
+ }
393
+ if (!(0, auth_1.canAccessAgent)(apiKey, agentId)) {
394
+ res.status(403).json({ error: `API key has no access to agent '${agentId}'` });
395
+ return;
396
+ }
397
+ const items = (0, session_image_catalog_1.computeSessionImageCatalog)({ agentsBaseDir, store, agentId, sessionId });
398
+ res.json({ items });
399
+ });
400
+ return router;
401
+ }
402
+ //# sourceMappingURL=share-router.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"share-router.js","sourceRoot":"","sources":["../../src/api/share-router.ts"],"names":[],"mappings":"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"}
@@ -144,6 +144,38 @@ export declare class AppInstaller {
144
144
  reconfigure(appName: string, options: ReconfigureOptions): string;
145
145
  uninstall(appName: string): Promise<void>;
146
146
  startStopRestart(appName: string, action: 'start' | 'stop' | 'restart'): Promise<void>;
147
+ /**
148
+ * Reconcile one app's stored status against the live Docker runtime and
149
+ * return the entry with a fresh status. The stored status in `apps.json` is
150
+ * only written at install/start/stop/reconfigure time, so a container that
151
+ * crashed, was OOM-killed, or was stopped from outside the gateway leaves the
152
+ * registry stuck on `running`. This queries the actual container state and
153
+ * corrects the record.
154
+ *
155
+ * Best-effort and fail-safe: if the runtime cannot be queried (docker
156
+ * unreachable, compose file gone, non-zero exit) the entry is returned
157
+ * unchanged, so a transient daemon hiccup never fabricates a false `stopped`.
158
+ * An app in the `building` state is skipped so an in-flight install — which
159
+ * owns the status and will set `running` on completion — is not clobbered.
160
+ *
161
+ * When the live status differs from the stored one it is persisted back to
162
+ * `apps.json` before returning, so subsequent reads and the boot-time restore
163
+ * see the truth.
164
+ */
165
+ reconcileStatus(entry: AppEntry): Promise<AppEntry>;
166
+ /** Reconcile a list of entries against the Docker runtime, in parallel. See {@link reconcileStatus}. */
167
+ reconcileStatuses(entries: AppEntry[]): Promise<AppEntry[]>;
168
+ /**
169
+ * Query the live Docker state for one app and map it to an AppEntry status.
170
+ * Returns the stored status unchanged when the runtime cannot be determined
171
+ * (see {@link reconcileStatus} for the fail-safe rationale).
172
+ *
173
+ * Uses the async (non-blocking) spawn seam, not spawnSync: this runs on the
174
+ * read path (`GET /apps`, possibly polled), so it must not freeze the gateway
175
+ * event loop while `docker compose ps` runs. reconcileStatuses() therefore
176
+ * genuinely parallelises across apps.
177
+ */
178
+ private queryRuntimeStatus;
147
179
  /**
148
180
  * Bring up containers for every app marked `running` in the registry.
149
181
  *
@@ -260,5 +292,28 @@ export declare class AppInstaller {
260
292
  private log;
261
293
  private failJob;
262
294
  }
295
+ /** One container's runtime facts, distilled from `docker compose ps` JSON. */
296
+ export interface ComposePsContainer {
297
+ /** Lower-cased compose state: running | restarting | exited | dead | created | paused | … */
298
+ state: string;
299
+ /** Process exit code (0 when still running or absent). */
300
+ exitCode: number;
301
+ }
302
+ /**
303
+ * Parse `docker compose ps -a --format json` stdout into a flat container list.
304
+ * Handles both output shapes compose has shipped: newline-delimited JSON
305
+ * objects (v2.21+) and a single JSON array (older). Malformed lines and entries
306
+ * without a string `State` are skipped rather than throwing — a best-effort
307
+ * parse must never crash the read path.
308
+ */
309
+ export declare function parseComposePs(stdout: string): ComposePsContainer[];
310
+ /**
311
+ * Map an app's compose-project container states to a single AppEntry status:
312
+ * - no containers → stopped
313
+ * - any running / restarting → running
314
+ * - any dead, or exited with a non-zero exit code → error (crash)
315
+ * - else (clean exit / created / paused) → stopped
316
+ */
317
+ export declare function mapContainerStatesToAppStatus(containers: ComposePsContainer[]): AppEntry['status'];
263
318
  export {};
264
319
  //# sourceMappingURL=installer.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"installer.d.ts","sourceRoot":"","sources":["../../src/apps/installer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"installer.d.ts","sourceRoot":"","sources":["../../src/apps/installer.ts"],"names":[],"mappings":"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"}