@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.
- package/README.md +22 -0
- package/dist/agent/runner.d.ts +30 -0
- package/dist/agent/runner.d.ts.map +1 -1
- package/dist/agent/runner.js +223 -16
- package/dist/agent/runner.js.map +1 -1
- package/dist/api/apps-router.d.ts.map +1 -1
- package/dist/api/apps-router.js +7 -2
- package/dist/api/apps-router.js.map +1 -1
- package/dist/api/gateway-router.d.ts.map +1 -1
- package/dist/api/gateway-router.js +27 -0
- package/dist/api/gateway-router.js.map +1 -1
- package/dist/api/line-webhook-router.d.ts.map +1 -1
- package/dist/api/line-webhook-router.js +68 -0
- package/dist/api/line-webhook-router.js.map +1 -1
- package/dist/api/router.d.ts +2 -0
- package/dist/api/router.d.ts.map +1 -1
- package/dist/api/router.js +59 -3
- package/dist/api/router.js.map +1 -1
- package/dist/api/share-router.d.ts +11 -0
- package/dist/api/share-router.d.ts.map +1 -0
- package/dist/api/share-router.js +402 -0
- package/dist/api/share-router.js.map +1 -0
- package/dist/apps/installer.d.ts +55 -0
- package/dist/apps/installer.d.ts.map +1 -1
- package/dist/apps/installer.js +130 -0
- package/dist/apps/installer.js.map +1 -1
- package/dist/config/loader.d.ts.map +1 -1
- package/dist/config/loader.js +9 -0
- package/dist/config/loader.js.map +1 -1
- package/dist/config/public-url.d.ts +11 -0
- package/dist/config/public-url.d.ts.map +1 -0
- package/dist/config/public-url.js +41 -0
- package/dist/config/public-url.js.map +1 -0
- package/dist/config/watcher.d.ts.map +1 -1
- package/dist/config/watcher.js +1 -0
- package/dist/config/watcher.js.map +1 -1
- package/dist/history/db.d.ts +14 -0
- package/dist/history/db.d.ts.map +1 -1
- package/dist/history/db.js +48 -4
- package/dist/history/db.js.map +1 -1
- package/dist/history/types.d.ts +5 -0
- package/dist/history/types.d.ts.map +1 -1
- package/dist/session/process.d.ts.map +1 -1
- package/dist/session/process.js +17 -1
- package/dist/session/process.js.map +1 -1
- package/dist/session/store.d.ts.map +1 -1
- package/dist/session/store.js +9 -1
- package/dist/session/store.js.map +1 -1
- package/dist/share/session-image-catalog.d.ts +22 -0
- package/dist/share/session-image-catalog.d.ts.map +1 -0
- package/dist/share/session-image-catalog.js +151 -0
- package/dist/share/session-image-catalog.js.map +1 -0
- package/dist/share/share-store.d.ts +137 -0
- package/dist/share/share-store.d.ts.map +1 -0
- package/dist/share/share-store.js +340 -0
- package/dist/share/share-store.js.map +1 -0
- package/dist/types.d.ts +17 -7
- package/dist/types.d.ts.map +1 -1
- package/mcp/instructions.ts +1 -0
- package/mcp/server.ts +2 -0
- package/mcp/tools/image/module.ts +240 -26
- package/mcp/tools/line/module.ts +186 -0
- package/mcp/tools/share-image/module.ts +120 -0
- package/mcp/tools/shared/share-client.ts +197 -0
- 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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"}
|
package/dist/apps/installer.d.ts
CHANGED
|
@@ -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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"}
|