@0xmaxma/claude-gateway 1.8.4 → 1.8.6
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 +11 -2
- package/config.template.json +5 -3
- package/dist/agent/model-catalog.d.ts.map +1 -1
- package/dist/agent/model-catalog.js +5 -13
- package/dist/agent/model-catalog.js.map +1 -1
- package/dist/agent/runner.d.ts +1 -1
- package/dist/agent/runner.d.ts.map +1 -1
- package/dist/agent/runner.js +22 -3
- package/dist/agent/runner.js.map +1 -1
- package/dist/api/apps-router.d.ts.map +1 -1
- package/dist/api/apps-router.js +31 -9
- package/dist/api/apps-router.js.map +1 -1
- package/dist/api/gateway-router.js +1 -1
- package/dist/api/gateway-router.js.map +1 -1
- package/dist/api/packages.d.ts.map +1 -1
- package/dist/api/packages.js +17 -1
- package/dist/api/packages.js.map +1 -1
- package/dist/api/share-router.d.ts +8 -0
- package/dist/api/share-router.d.ts.map +1 -1
- package/dist/api/share-router.js +100 -10
- package/dist/api/share-router.js.map +1 -1
- package/dist/apps/agent-manager.d.ts +35 -2
- package/dist/apps/agent-manager.d.ts.map +1 -1
- package/dist/apps/agent-manager.js +131 -15
- package/dist/apps/agent-manager.js.map +1 -1
- package/dist/apps/installer.d.ts +49 -1
- package/dist/apps/installer.d.ts.map +1 -1
- package/dist/apps/installer.js +74 -17
- package/dist/apps/installer.js.map +1 -1
- package/dist/cli/args.d.ts +6 -0
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js +9 -1
- package/dist/cli/args.js.map +1 -1
- package/dist/cli/commands/logs.d.ts.map +1 -1
- package/dist/cli/commands/logs.js +91 -18
- package/dist/cli/commands/logs.js.map +1 -1
- package/dist/cli/commands/service.d.ts.map +1 -1
- package/dist/cli/commands/service.js +61 -7
- package/dist/cli/commands/service.js.map +1 -1
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +12 -3
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/output.d.ts +34 -0
- package/dist/cli/output.d.ts.map +1 -1
- package/dist/cli/output.js +56 -10
- package/dist/cli/output.js.map +1 -1
- package/dist/config/claude-settings.d.ts +41 -0
- package/dist/config/claude-settings.d.ts.map +1 -0
- package/dist/config/claude-settings.js +102 -0
- package/dist/config/claude-settings.js.map +1 -0
- package/dist/index.js +10 -1
- package/dist/index.js.map +1 -1
- package/dist/session/process.d.ts +43 -1
- package/dist/session/process.d.ts.map +1 -1
- package/dist/session/process.js +154 -9
- package/dist/session/process.js.map +1 -1
- package/dist/share/share-store.d.ts +45 -4
- package/dist/share/share-store.d.ts.map +1 -1
- package/dist/share/share-store.js +127 -23
- package/dist/share/share-store.js.map +1 -1
- package/dist/shutdown-signals.d.ts +18 -0
- package/dist/shutdown-signals.d.ts.map +1 -1
- package/dist/shutdown-signals.js +33 -2
- package/dist/shutdown-signals.js.map +1 -1
- package/mcp/server.ts +2 -2
- package/mcp/tools/image/module.ts +10 -3
- package/mcp/tools/share-file/module.ts +169 -0
- package/mcp/tools/shared/share-client.ts +8 -4
- package/mcp/tools/telegram/receiver-server.ts +12 -2
- package/package.json +1 -1
- package/mcp/tools/share-image/module.ts +0 -120
|
@@ -33,9 +33,13 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
33
33
|
};
|
|
34
34
|
})();
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
-
exports.ShareStore = exports.ShareError = exports.ARTIFACT_RETENTION_MS = exports.DEFAULT_MAX_TOTAL_BYTES = exports.DEFAULT_MAX_FILE_BYTES = exports.DEFAULT_MAX_REFS = exports.DEFAULT_SHARE_TTL_SECONDS = exports.MINT_DEDUPE_WINDOW_MS = exports.SHARE_TOKEN_RE = void 0;
|
|
36
|
+
exports.ShareStore = exports.SHARE_ALLOW_KINDS = exports.ShareError = exports.ARTIFACT_RETENTION_MS = exports.DEFAULT_MAX_TOTAL_BYTES = exports.DEFAULT_MAX_FILE_BYTES = exports.DEFAULT_MAX_REFS = exports.DEFAULT_SHARE_TTL_SECONDS = exports.MINT_DEDUPE_WINDOW_MS = exports.SHARE_TOKEN_RE = void 0;
|
|
37
|
+
exports.shareEnv = shareEnv;
|
|
37
38
|
exports.shareLimitsFromEnv = shareLimitsFromEnv;
|
|
38
39
|
exports.detectImageMime = detectImageMime;
|
|
40
|
+
exports.isShareAllowKind = isShareAllowKind;
|
|
41
|
+
exports.detectShareMime = detectShareMime;
|
|
42
|
+
exports.mimeDetectorFor = mimeDetectorFor;
|
|
39
43
|
exports.validateShareFile = validateShareFile;
|
|
40
44
|
const fs = __importStar(require("fs"));
|
|
41
45
|
const path = __importStar(require("path"));
|
|
@@ -67,15 +71,26 @@ exports.DEFAULT_MAX_TOTAL_BYTES = 50 * 1024 * 1024; // 50 MiB
|
|
|
67
71
|
* TTL (max 24h) and any live session, so removal never breaks an active ref. */
|
|
68
72
|
exports.ARTIFACT_RETENTION_MS = 30 * 24 * 60 * 60 * 1000; // 30 days
|
|
69
73
|
const ARTIFACT_PRUNE_THROTTLE_MS = 60 * 60 * 1000; // sweep at most once/hour
|
|
74
|
+
/**
|
|
75
|
+
* Read a share setting, preferring the neutral `SHARE_*` name and falling back
|
|
76
|
+
* to the legacy `IMAGE_SHARE_*` one (#444). Both names are forwarded to session
|
|
77
|
+
* subprocesses, so an operator who set either keeps working. An empty value
|
|
78
|
+
* counts as unset — `src/session/process.ts` forwards unset vars as `''`, and
|
|
79
|
+
* without this an empty new name would shadow a real legacy one.
|
|
80
|
+
*/
|
|
81
|
+
function shareEnv(suffix) {
|
|
82
|
+
const pick = (v) => (v !== undefined && v !== '' ? v : undefined);
|
|
83
|
+
return pick(process.env[`SHARE_${suffix}`]) ?? pick(process.env[`IMAGE_SHARE_${suffix}`]);
|
|
84
|
+
}
|
|
70
85
|
function shareLimitsFromEnv() {
|
|
71
86
|
const num = (v, dflt) => {
|
|
72
87
|
const n = Number(v);
|
|
73
88
|
return Number.isFinite(n) && n > 0 ? Math.floor(n) : dflt;
|
|
74
89
|
};
|
|
75
90
|
return {
|
|
76
|
-
maxRefs: num(
|
|
77
|
-
maxFileBytes: num(
|
|
78
|
-
maxTotalBytes: num(
|
|
91
|
+
maxRefs: num(shareEnv('MAX_REFS'), exports.DEFAULT_MAX_REFS),
|
|
92
|
+
maxFileBytes: num(shareEnv('MAX_FILE_BYTES'), exports.DEFAULT_MAX_FILE_BYTES),
|
|
93
|
+
maxTotalBytes: num(shareEnv('MAX_TOTAL_BYTES'), exports.DEFAULT_MAX_TOTAL_BYTES),
|
|
79
94
|
};
|
|
80
95
|
}
|
|
81
96
|
/** Typed error with a stable machine-readable code (used for HTTP mapping). */
|
|
@@ -86,7 +101,10 @@ class ShareError extends Error {
|
|
|
86
101
|
}
|
|
87
102
|
}
|
|
88
103
|
exports.ShareError = ShareError;
|
|
89
|
-
/**
|
|
104
|
+
/** Raster image formats: PNG / JPEG / WebP (§11). GIF/SVG/PDF are NOT images
|
|
105
|
+
* here — callers that genuinely need "is this an image" (LINE image messages,
|
|
106
|
+
* provider image-edit refs, the session image catalog) must keep using this
|
|
107
|
+
* one rather than the wider detectShareMime below. */
|
|
90
108
|
function detectImageMime(header) {
|
|
91
109
|
if (header.length >= 3 && header[0] === 0xff && header[1] === 0xd8 && header[2] === 0xff)
|
|
92
110
|
return 'image/jpeg';
|
|
@@ -98,14 +116,40 @@ function detectImageMime(header) {
|
|
|
98
116
|
return 'image/webp';
|
|
99
117
|
return null;
|
|
100
118
|
}
|
|
119
|
+
exports.SHARE_ALLOW_KINDS = ['image', 'any'];
|
|
120
|
+
function isShareAllowKind(v) {
|
|
121
|
+
return typeof v === 'string' && exports.SHARE_ALLOW_KINDS.includes(v);
|
|
122
|
+
}
|
|
123
|
+
/** `%PDF-` — the only non-image format on the share allowlist (#444). */
|
|
124
|
+
function isPdf(header) {
|
|
125
|
+
return (header.length >= 5 &&
|
|
126
|
+
header[0] === 0x25 && header[1] === 0x50 && header[2] === 0x44 && header[3] === 0x46 && header[4] === 0x2d);
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* The full share allowlist: the three raster image types plus PDF. Deliberately
|
|
130
|
+
* limited to inert binary formats — `text/html`, `image/svg+xml` and
|
|
131
|
+
* `application/octet-stream` are NOT here and must not be added, because the
|
|
132
|
+
* share origin serves them to a browser and they would turn it into an XSS
|
|
133
|
+
* surface (§11).
|
|
134
|
+
*/
|
|
135
|
+
function detectShareMime(header) {
|
|
136
|
+
return detectImageMime(header) ?? (isPdf(header) ? 'application/pdf' : null);
|
|
137
|
+
}
|
|
138
|
+
/** Pick the sniffer that matches a share's allow-kind. */
|
|
139
|
+
function mimeDetectorFor(allow) {
|
|
140
|
+
return allow === 'any' ? detectShareMime : detectImageMime;
|
|
141
|
+
}
|
|
101
142
|
/**
|
|
102
143
|
* Validate a local ref (absolute or media-relative path) for sharing (§12):
|
|
103
144
|
* canonicalize, require containment in the agent's media root, reject symlink
|
|
104
145
|
* escapes, require a regular file, validate magic bytes and the per-file cap.
|
|
105
146
|
* Returns only the media-root-relative path — client-supplied absolute paths
|
|
106
147
|
* are never persisted. Throws ShareError with a stable code.
|
|
148
|
+
*
|
|
149
|
+
* `allow` defaults to 'image' so every existing caller keeps today's behaviour;
|
|
150
|
+
* only a caller that has explicitly opted into documents passes 'any' (#444).
|
|
107
151
|
*/
|
|
108
|
-
function validateShareFile(agentsBaseDir, agentId, ref, maxFileBytes = exports.DEFAULT_MAX_FILE_BYTES) {
|
|
152
|
+
function validateShareFile(agentsBaseDir, agentId, ref, maxFileBytes = exports.DEFAULT_MAX_FILE_BYTES, allow = 'image') {
|
|
109
153
|
const root = media_store_1.MediaStore.agentMediaRoot(agentsBaseDir, agentId);
|
|
110
154
|
let resolved;
|
|
111
155
|
try {
|
|
@@ -131,13 +175,13 @@ function validateShareFile(agentsBaseDir, agentId, ref, maxFileBytes = exports.D
|
|
|
131
175
|
stat = fs.lstatSync(resolved); // realpath already followed links; lstat guards devices/FIFOs
|
|
132
176
|
}
|
|
133
177
|
catch {
|
|
134
|
-
throw new ShareError('
|
|
178
|
+
throw new ShareError('share_ref_not_found', 'referenced file does not exist');
|
|
135
179
|
}
|
|
136
180
|
if (!stat.isFile()) {
|
|
137
181
|
throw new ShareError('invalid_path', 'referenced path is not a regular file');
|
|
138
182
|
}
|
|
139
183
|
if (stat.size > maxFileBytes) {
|
|
140
|
-
throw new ShareError('
|
|
184
|
+
throw new ShareError('file_too_large', `file exceeds ${maxFileBytes} bytes`);
|
|
141
185
|
}
|
|
142
186
|
const header = Buffer.alloc(12);
|
|
143
187
|
const fd = fs.openSync(resolved, 'r');
|
|
@@ -147,9 +191,11 @@ function validateShareFile(agentsBaseDir, agentId, ref, maxFileBytes = exports.D
|
|
|
147
191
|
finally {
|
|
148
192
|
fs.closeSync(fd);
|
|
149
193
|
}
|
|
150
|
-
const mime =
|
|
194
|
+
const mime = mimeDetectorFor(allow)(header);
|
|
151
195
|
if (!mime) {
|
|
152
|
-
throw new ShareError('
|
|
196
|
+
throw new ShareError('unsupported_file_type', allow === 'any'
|
|
197
|
+
? 'only PNG, JPEG, WebP and PDF can be shared'
|
|
198
|
+
: 'only PNG, JPEG and WebP can be shared');
|
|
153
199
|
}
|
|
154
200
|
const relativePath = path.relative(root, resolved);
|
|
155
201
|
if (relativePath.startsWith('..') || path.isAbsolute(relativePath)) {
|
|
@@ -169,8 +215,22 @@ class ShareStore {
|
|
|
169
215
|
this.db.exec('PRAGMA journal_mode=WAL');
|
|
170
216
|
this.db.exec('PRAGMA busy_timeout=5000');
|
|
171
217
|
this.db.exec('PRAGMA foreign_keys=ON');
|
|
218
|
+
// #444: the table was `image_shares` back when the bridge could only carry
|
|
219
|
+
// images. Rename in place — and BEFORE the CREATE TABLE IF NOT EXISTS
|
|
220
|
+
// below, which would otherwise create an empty `file_shares` beside the
|
|
221
|
+
// real data and silently 404 every live share. Shares are ephemeral (TTL
|
|
222
|
+
// <= 24h, swept by cleanupExpired) so nothing durable is at stake, but
|
|
223
|
+
// renaming keeps shares minted before the upgrade resolving after it.
|
|
224
|
+
const hasTable = (name) => !!this.db.prepare(`SELECT name FROM sqlite_master WHERE type = 'table' AND name = ?`).get(name);
|
|
225
|
+
if (hasTable('image_shares') && !hasTable('file_shares')) {
|
|
226
|
+
this.db.exec('ALTER TABLE image_shares RENAME TO file_shares');
|
|
227
|
+
// RENAME TO carries indexes over under their OLD names, so drop the old
|
|
228
|
+
// one rather than let CREATE INDEX IF NOT EXISTS add a duplicate.
|
|
229
|
+
this.db.exec('DROP INDEX IF EXISTS image_shares_expiry');
|
|
230
|
+
console.log('[share] renamed legacy image_shares table to file_shares');
|
|
231
|
+
}
|
|
172
232
|
this.db.exec(`
|
|
173
|
-
CREATE TABLE IF NOT EXISTS
|
|
233
|
+
CREATE TABLE IF NOT EXISTS file_shares (
|
|
174
234
|
id TEXT PRIMARY KEY,
|
|
175
235
|
token_hash BLOB NOT NULL UNIQUE,
|
|
176
236
|
agent_id TEXT NOT NULL,
|
|
@@ -179,9 +239,10 @@ class ShareStore {
|
|
|
179
239
|
purpose TEXT NOT NULL,
|
|
180
240
|
created_at INTEGER NOT NULL,
|
|
181
241
|
expires_at INTEGER NOT NULL,
|
|
182
|
-
revoked_at INTEGER
|
|
242
|
+
revoked_at INTEGER,
|
|
243
|
+
allow_kind TEXT NOT NULL DEFAULT 'image'
|
|
183
244
|
);
|
|
184
|
-
CREATE INDEX IF NOT EXISTS
|
|
245
|
+
CREATE INDEX IF NOT EXISTS file_shares_expiry ON file_shares(expires_at);
|
|
185
246
|
|
|
186
247
|
CREATE TABLE IF NOT EXISTS image_artifacts (
|
|
187
248
|
id TEXT PRIMARY KEY,
|
|
@@ -205,6 +266,43 @@ class ShareStore {
|
|
|
205
266
|
if (!cols.some((c) => c.name === 'prompt')) {
|
|
206
267
|
this.db.exec('ALTER TABLE image_artifacts ADD COLUMN prompt TEXT');
|
|
207
268
|
}
|
|
269
|
+
// Same story for `allow_kind` (#444): DBs minted before documents were
|
|
270
|
+
// allowed carry image-only shares, and 'image' is exactly their existing
|
|
271
|
+
// behaviour, so the default backfills them correctly.
|
|
272
|
+
const shareCols = this.db.prepare(`PRAGMA table_info(file_shares)`).all();
|
|
273
|
+
if (!shareCols.some((c) => c.name === 'allow_kind')) {
|
|
274
|
+
this.db.exec(`ALTER TABLE file_shares ADD COLUMN allow_kind TEXT NOT NULL DEFAULT 'image'`);
|
|
275
|
+
}
|
|
276
|
+
// `image_shares` surviving THIS far means a downgrade recreated it (the
|
|
277
|
+
// pre-#444 release runs its own CREATE TABLE IF NOT EXISTS) and minted
|
|
278
|
+
// into it, and we have now rolled forward. The rename guard above no
|
|
279
|
+
// longer fires — both tables exist — so without this those shares would
|
|
280
|
+
// 404 until their TTL ran out while the orphan table stayed in the file
|
|
281
|
+
// forever. Fold the rows in (they are image-only by definition: the
|
|
282
|
+
// release that wrote them knew nothing else) and drop the orphan, so the
|
|
283
|
+
// migration is idempotent across a rollback rather than one-shot. Runs
|
|
284
|
+
// after the ALTER above so `allow_kind` is guaranteed to exist.
|
|
285
|
+
if (hasTable('image_shares')) {
|
|
286
|
+
const legacy = this.db.prepare(`SELECT COUNT(*) AS n FROM image_shares`).get();
|
|
287
|
+
const before = this.db.prepare(`SELECT COUNT(*) AS n FROM file_shares`).get();
|
|
288
|
+
this.db.exec(`
|
|
289
|
+
INSERT OR IGNORE INTO file_shares
|
|
290
|
+
(id, token_hash, agent_id, session_id, relative_path, purpose, created_at, expires_at, revoked_at, allow_kind)
|
|
291
|
+
SELECT id, token_hash, agent_id, session_id, relative_path, purpose, created_at, expires_at, revoked_at, 'image'
|
|
292
|
+
FROM image_shares
|
|
293
|
+
`);
|
|
294
|
+
const after = this.db.prepare(`SELECT COUNT(*) AS n FROM file_shares`).get();
|
|
295
|
+
// DROP TABLE takes the table's indexes with it.
|
|
296
|
+
this.db.exec('DROP TABLE image_shares');
|
|
297
|
+
// Say so. Reaching here at all means this deployment was rolled back
|
|
298
|
+
// across #444 and rolled forward again — rare, and worth a line in the
|
|
299
|
+
// log rather than a database that quietly changed shape. `skipped` is
|
|
300
|
+
// non-zero only when OR IGNORE hit the token_hash UNIQUE, i.e. the same
|
|
301
|
+
// token exists in both tables; the file_shares row wins because it is the
|
|
302
|
+
// one this build minted. No token or path is logged (§19).
|
|
303
|
+
const folded = after.n - before.n;
|
|
304
|
+
console.log(`[share] migrated legacy image_shares: rows=${legacy.n} folded=${folded} skipped=${legacy.n - folded}`);
|
|
305
|
+
}
|
|
208
306
|
}
|
|
209
307
|
// ── artifacts (§8) ────────────────────────────────────────────────────────
|
|
210
308
|
registerArtifact(a) {
|
|
@@ -261,11 +359,14 @@ class ShareStore {
|
|
|
261
359
|
/**
|
|
262
360
|
* Mint a share. `dedupeRef` is the caller-facing identity of the ref
|
|
263
361
|
* (e.g. "artifact:img_x" or "path:<relative>") — an identical mint for the
|
|
264
|
-
* same (agent, session, ref, purpose) within MINT_DEDUPE_WINDOW_MS
|
|
265
|
-
* the SAME token (§17.4) so provider-side dedupe keeps working.
|
|
362
|
+
* same (agent, session, ref, purpose, allowKind) within MINT_DEDUPE_WINDOW_MS
|
|
363
|
+
* returns the SAME token (§17.4) so provider-side dedupe keeps working.
|
|
364
|
+
* `allowKind` is part of the key because two mints of the same file under
|
|
365
|
+
* different allow-kinds are different capabilities and must not collapse.
|
|
266
366
|
*/
|
|
267
367
|
mintShare(a) {
|
|
268
|
-
const
|
|
368
|
+
const allowKind = a.allowKind ?? 'image';
|
|
369
|
+
const key = [a.agentId, a.sessionId, a.dedupeRef, a.purpose, allowKind].join('\0');
|
|
269
370
|
const now = Date.now();
|
|
270
371
|
const cached = this.mintCache.get(key);
|
|
271
372
|
if (cached && now - cached.mintedAtMs < exports.MINT_DEDUPE_WINDOW_MS && cached.expiresAtMs > now) {
|
|
@@ -275,8 +376,8 @@ class ShareStore {
|
|
|
275
376
|
const tokenHash = (0, crypto_1.createHash)('sha256').update(token).digest();
|
|
276
377
|
const shareId = `shr_${(0, crypto_1.randomBytes)(9).toString('base64url')}`;
|
|
277
378
|
const expiresAtMs = now + a.ttlSeconds * 1000;
|
|
278
|
-
this.db.prepare(`INSERT INTO
|
|
279
|
-
VALUES (?, ?, ?, ?, ?, ?, ?, ?)`).run(shareId, tokenHash, a.agentId, a.sessionId, a.relativePath, a.purpose, now, expiresAtMs);
|
|
379
|
+
this.db.prepare(`INSERT INTO file_shares (id, token_hash, agent_id, session_id, relative_path, purpose, created_at, expires_at, allow_kind)
|
|
380
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(shareId, tokenHash, a.agentId, a.sessionId, a.relativePath, a.purpose, now, expiresAtMs, allowKind);
|
|
280
381
|
this.mintCache.set(key, { shareId, token, expiresAtMs, deduped: false, mintedAtMs: now });
|
|
281
382
|
this.pruneMintCache(now);
|
|
282
383
|
return { shareId, token, expiresAtMs, deduped: false };
|
|
@@ -286,8 +387,8 @@ class ShareStore {
|
|
|
286
387
|
if (!exports.SHARE_TOKEN_RE.test(token))
|
|
287
388
|
return null;
|
|
288
389
|
const tokenHash = (0, crypto_1.createHash)('sha256').update(token).digest();
|
|
289
|
-
const row = this.db.prepare(`SELECT id, agent_id, session_id, relative_path, purpose
|
|
290
|
-
FROM
|
|
390
|
+
const row = this.db.prepare(`SELECT id, agent_id, session_id, relative_path, purpose, allow_kind
|
|
391
|
+
FROM file_shares
|
|
291
392
|
WHERE token_hash = ? AND revoked_at IS NULL AND expires_at > ?`).get(tokenHash, Date.now());
|
|
292
393
|
if (!row)
|
|
293
394
|
return null;
|
|
@@ -297,16 +398,19 @@ class ShareStore {
|
|
|
297
398
|
sessionId: row.session_id,
|
|
298
399
|
relativePath: row.relative_path,
|
|
299
400
|
purpose: row.purpose,
|
|
401
|
+
// Anything unrecognised (or a legacy NULL) falls back to the strictest
|
|
402
|
+
// kind — an unknown value must never widen what a share can serve.
|
|
403
|
+
allowKind: isShareAllowKind(row.allow_kind) ? row.allow_kind : 'image',
|
|
300
404
|
};
|
|
301
405
|
}
|
|
302
406
|
getShareOwner(shareId) {
|
|
303
|
-
const row = this.db.prepare(`SELECT agent_id, session_id, purpose FROM
|
|
407
|
+
const row = this.db.prepare(`SELECT agent_id, session_id, purpose FROM file_shares WHERE id = ? AND revoked_at IS NULL`).get(shareId);
|
|
304
408
|
return row ? { agentId: row.agent_id, sessionId: row.session_id, purpose: row.purpose } : null;
|
|
305
409
|
}
|
|
306
410
|
/** Revoke a share by id. Also evicts any idempotency-cache entry pointing at
|
|
307
411
|
* it so a post-revoke mint issues a FRESH token. Returns false when unknown. */
|
|
308
412
|
revokeShare(shareId) {
|
|
309
|
-
const res = this.db.prepare(`UPDATE
|
|
413
|
+
const res = this.db.prepare(`UPDATE file_shares SET revoked_at = ? WHERE id = ? AND revoked_at IS NULL`).run(Date.now(), shareId);
|
|
310
414
|
for (const [key, entry] of this.mintCache) {
|
|
311
415
|
if (entry.shareId === shareId)
|
|
312
416
|
this.mintCache.delete(key);
|
|
@@ -316,7 +420,7 @@ class ShareStore {
|
|
|
316
420
|
/** Lazy cleanup — delete expired rows. Safe to call opportunistically. */
|
|
317
421
|
cleanupExpired() {
|
|
318
422
|
try {
|
|
319
|
-
this.db.prepare(`DELETE FROM
|
|
423
|
+
this.db.prepare(`DELETE FROM file_shares WHERE expires_at <= ?`).run(Date.now());
|
|
320
424
|
}
|
|
321
425
|
catch {
|
|
322
426
|
/* best-effort */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"share-store.js","sourceRoot":"","sources":["../../src/share/share-store.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyCA,gDAUC;AAYD,0CASC;AAgBD,8CAkDC;AA1ID,uCAAyB;AACzB,2CAA6B;AAC7B,mCAAiD;AACjD,6CAA2C;AAC3C,wDAAoD;AAEpD;;;;;;;;;GASG;AAEH,8DAA8D;AACjD,QAAA,cAAc,GAAG,qBAAqB,CAAC;AAEpD;;;uDAGuD;AAC1C,QAAA,qBAAqB,GAAG,KAAM,CAAC;AAE/B,QAAA,yBAAyB,GAAG,IAAI,CAAC,CAAC,iBAAiB;AACnD,QAAA,gBAAgB,GAAG,CAAC,CAAC;AACrB,QAAA,sBAAsB,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,SAAS;AACpD,QAAA,uBAAuB,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,SAAS;AAClE;iFACiF;AACpE,QAAA,qBAAqB,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,UAAU;AACzE,MAAM,0BAA0B,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,0BAA0B;AAQ7E,SAAgB,kBAAkB;IAChC,MAAM,GAAG,GAAG,CAAC,CAAqB,EAAE,IAAY,EAAU,EAAE;QAC1D,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QACpB,OAAO,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC5D,CAAC,CAAC;IACF,OAAO;QACL,OAAO,EAAE,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,oBAAoB,EAAE,wBAAgB,CAAC;QAChE,YAAY,EAAE,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,0BAA0B,EAAE,8BAAsB,CAAC;QACjF,aAAa,EAAE,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,2BAA2B,EAAE,+BAAuB,CAAC;KACrF,CAAC;AACJ,CAAC;AAED,+EAA+E;AAC/E,MAAa,UAAW,SAAQ,KAAK;IAEnC,YAAY,IAAY,EAAE,OAAe;QACvC,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;CACF;AAND,gCAMC;AAED,+EAA+E;AAC/E,SAAgB,eAAe,CAAC,MAAc;IAC5C,IAAI,MAAM,CAAC,MAAM,IAAI,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI;QAAE,OAAO,YAAY,CAAC;IAC9G,IAAI,MAAM,CAAC,MAAM,IAAI,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI;QAAE,OAAO,WAAW,CAAC;IACnI,IACE,MAAM,CAAC,MAAM,IAAI,EAAE;QACnB,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI;QACpF,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,MAAM,CAAC,EAAE,CAAC,KAAK,IAAI,IAAI,MAAM,CAAC,EAAE,CAAC,KAAK,IAAI;QACtF,OAAO,YAAY,CAAC;IACtB,OAAO,IAAI,CAAC;AACd,CAAC;AASD;;;;;;GAMG;AACH,SAAgB,iBAAiB,CAC/B,aAAqB,EACrB,OAAe,EACf,GAAW,EACX,eAAuB,8BAAsB;IAE7C,MAAM,IAAI,GAAG,wBAAU,CAAC,cAAc,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;IAC/D,IAAI,QAAgB,CAAC;IACrB,IAAI,CAAC;QACH,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACzB,wEAAwE;YACxE,gDAAgD;YAChD,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YAC9B,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;YAC5E,QAAQ,GAAG,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;YAC3D,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;QACnF,CAAC;aAAM,CAAC;YACN,QAAQ,GAAG,wBAAU,CAAC,WAAW,CAAC,aAAa,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC;QACjE,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,UAAU,CAAC,cAAc,EAAE,sCAAsC,CAAC,CAAC;IAC/E,CAAC;IACD,IAAI,IAAc,CAAC;IACnB,IAAI,CAAC;QACH,IAAI,GAAG,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,8DAA8D;IAC/F,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,UAAU,CAAC,qBAAqB,EAAE,sCAAsC,CAAC,CAAC;IACtF,CAAC;IACD,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;QACnB,MAAM,IAAI,UAAU,CAAC,cAAc,EAAE,uCAAuC,CAAC,CAAC;IAChF,CAAC;IACD,IAAI,IAAI,CAAC,IAAI,GAAG,YAAY,EAAE,CAAC;QAC7B,MAAM,IAAI,UAAU,CAAC,iBAAiB,EAAE,iBAAiB,YAAY,QAAQ,CAAC,CAAC;IACjF,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAChC,MAAM,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;IACtC,IAAI,CAAC;QACH,EAAE,CAAC,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;IACpC,CAAC;YAAS,CAAC;QACT,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;IACnB,CAAC;IACD,MAAM,IAAI,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;IACrC,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,IAAI,UAAU,CAAC,wBAAwB,EAAE,uCAAuC,CAAC,CAAC;IAC1F,CAAC;IACD,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IACnD,IAAI,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QACnE,MAAM,IAAI,UAAU,CAAC,cAAc,EAAE,sCAAsC,CAAC,CAAC;IAC/E,CAAC;IACD,OAAO,EAAE,YAAY,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;AACjD,CAAC;AAuCD,MAAa,UAAU;IAQrB,YAAY,MAAc;QAN1B;kFAC0E;QACzD,cAAS,GAAG,IAAI,GAAG,EAAgD,CAAC;QACrF,oFAAoF;QAC5E,wBAAmB,GAAG,CAAC,CAAC;QAG9B,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACxD,IAAI,CAAC,EAAE,GAAG,IAAI,0BAAY,CAAC,MAAM,CAAC,CAAC;QACnC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;QACxC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;QACzC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;QACvC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;KA4BZ,CAAC,CAAC;QACH,sEAAsE;QACtE,yEAAyE;QACzE,+CAA+C;QAC/C,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,oCAAoC,CAAC,CAAC,GAAG,EAA6B,CAAC;QACpG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,EAAE,CAAC;YAC3C,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,oDAAoD,CAAC,CAAC;QACrE,CAAC;IACH,CAAC;IAED,6EAA6E;IAE7E,gBAAgB,CAAC,CAShB;QACC,MAAM,EAAE,GAAG,OAAO,IAAA,oBAAW,EAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;QACzD,IAAI,CAAC,EAAE,CAAC,OAAO,CACb;6CACuC,CACxC,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,MAAM,IAAI,IAAI,EAAE,CAAC,CAAC,UAAU,IAAI,CAAC,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,MAAM,IAAI,IAAI,CAAC,CAAC;QAC1I,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACzB,OAAO,EAAE,CAAC;IACZ,CAAC;IAED;uFACmF;IAC3E,iBAAiB;QACvB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,IAAI,GAAG,GAAG,IAAI,CAAC,mBAAmB,GAAG,0BAA0B;YAAE,OAAO;QACxE,IAAI,CAAC,mBAAmB,GAAG,GAAG,CAAC;QAC/B,IAAI,CAAC;YACH,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,mDAAmD,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG,6BAAqB,CAAC,CAAC;QACxG,CAAC;QAAC,MAAM,CAAC;YACP,iBAAiB;QACnB,CAAC;IACH,CAAC;IAED;uEACmE;IACnE,eAAe,CAAC,OAAe,EAAE,SAAiB,EAAE,UAAkB;QACpE,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CACzB;6EACuE,CACxE,CAAC,GAAG,CAAC,UAAU,EAAE,OAAO,EAAE,SAAS,CAWvB,CAAC;QACd,IAAI,CAAC,GAAG;YAAE,OAAO,IAAI,CAAC;QACtB,OAAO;YACL,UAAU,EAAE,GAAG,CAAC,EAAE;YAClB,OAAO,EAAE,GAAG,CAAC,QAAQ;YACrB,SAAS,EAAE,GAAG,CAAC,UAAU;YACzB,YAAY,EAAE,GAAG,CAAC,aAAa;YAC/B,QAAQ,EAAE,GAAG,CAAC,QAAQ;YACtB,KAAK,EAAE,GAAG,CAAC,KAAK;YAChB,MAAM,EAAE,GAAG,CAAC,OAAO,IAAI,EAAE;YACzB,MAAM,EAAE,GAAG,CAAC,MAAM,IAAI,EAAE;SACzB,CAAC;IACJ,CAAC;IAED;;;;iEAI6D;IAC7D,kBAAkB,CAChB,OAAe,EACf,SAAiB,EACjB,YAAoB;QAEpB,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CACzB;;oDAE8C,CAC/C,CAAC,GAAG,CAAC,OAAO,EAAE,SAAS,EAAE,YAAY,CAAsD,CAAC;QAC7F,OAAO,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IACzD,CAAC;IAED,6EAA6E;IAE7E;;;;;OAKG;IACH,SAAS,CAAC,CAOT;QACC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACvE,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACvC,IAAI,MAAM,IAAI,GAAG,GAAG,MAAM,CAAC,UAAU,GAAG,6BAAqB,IAAI,MAAM,CAAC,WAAW,GAAG,GAAG,EAAE,CAAC;YAC1F,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,WAAW,EAAE,MAAM,CAAC,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC1G,CAAC;QACD,MAAM,KAAK,GAAG,IAAA,oBAAW,EAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;QACpD,MAAM,SAAS,GAAG,IAAA,mBAAU,EAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,CAAC;QAC9D,MAAM,OAAO,GAAG,OAAO,IAAA,oBAAW,EAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;QAC9D,MAAM,WAAW,GAAG,GAAG,GAAG,CAAC,CAAC,UAAU,GAAG,IAAI,CAAC;QAC9C,IAAI,CAAC,EAAE,CAAC,OAAO,CACb;uCACiC,CAClC,CAAC,GAAG,CAAC,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC,OAAO,EAAE,GAAG,EAAE,WAAW,CAAC,CAAC;QAC/F,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC;QAC1F,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;QACzB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IACzD,CAAC;IAED,sEAAsE;IACtE,aAAa,CAAC,KAAa;QACzB,IAAI,CAAC,sBAAc,CAAC,IAAI,CAAC,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QAC7C,MAAM,SAAS,GAAG,IAAA,mBAAU,EAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,CAAC;QAC9D,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CACzB;;sEAEgE,CACjE,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,CAEd,CAAC;QACd,IAAI,CAAC,GAAG;YAAE,OAAO,IAAI,CAAC;QACtB,OAAO;YACL,OAAO,EAAE,GAAG,CAAC,EAAE;YACf,OAAO,EAAE,GAAG,CAAC,QAAQ;YACrB,SAAS,EAAE,GAAG,CAAC,UAAU;YACzB,YAAY,EAAE,GAAG,CAAC,aAAa;YAC/B,OAAO,EAAE,GAAG,CAAC,OAAO;SACrB,CAAC;IACJ,CAAC;IAED,aAAa,CAAC,OAAe;QAC3B,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CACzB,4FAA4F,CAC7F,CAAC,GAAG,CAAC,OAAO,CAA0E,CAAC;QACxF,OAAO,GAAG,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,QAAQ,EAAE,SAAS,EAAE,GAAG,CAAC,UAAU,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IACjG,CAAC;IAED;qFACiF;IACjF,WAAW,CAAC,OAAe;QACzB,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CACzB,4EAA4E,CAC7E,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,OAAO,CAAC,CAAC;QAC3B,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YAC1C,IAAI,KAAK,CAAC,OAAO,KAAK,OAAO;gBAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC5D,CAAC;QACD,OAAO,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACjC,CAAC;IAED,0EAA0E;IAC1E,cAAc;QACZ,IAAI,CAAC;YACH,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,gDAAgD,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;QACpF,CAAC;QAAC,MAAM,CAAC;YACP,iBAAiB;QACnB,CAAC;IACH,CAAC;IAED,KAAK;QACH,IAAI,CAAC;YACH,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;QAClB,CAAC;QAAC,MAAM,CAAC;YACP,oBAAoB;QACtB,CAAC;IACH,CAAC;IAEO,cAAc,CAAC,GAAW;QAChC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YAC1C,IAAI,GAAG,GAAG,KAAK,CAAC,UAAU,IAAI,6BAAqB,IAAI,KAAK,CAAC,WAAW,IAAI,GAAG,EAAE,CAAC;gBAChF,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC7B,CAAC;QACH,CAAC;IACH,CAAC;CACF;AA1OD,gCA0OC"}
|
|
1
|
+
{"version":3,"file":"share-store.js","sourceRoot":"","sources":["../../src/share/share-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -24,6 +24,24 @@
|
|
|
24
24
|
* hand-run process is stopped, and its default action skips handlers entirely.
|
|
25
25
|
*/
|
|
26
26
|
export declare const SHUTDOWN_SIGNALS: readonly NodeJS.Signals[];
|
|
27
|
+
/**
|
|
28
|
+
* sysexits.h `EX_TEMPFAIL` — "temporary failure, user is invited to retry".
|
|
29
|
+
* Used by callers that trigger their own shutdown (see `requestExitCode`) but
|
|
30
|
+
* need `Restart=on-failure` systemd units to treat the exit as failure-worth-
|
|
31
|
+
* restarting, rather than the default clean-shutdown code 0. See issue #450:
|
|
32
|
+
* an API-triggered update SIGTERMs the gateway itself expecting the
|
|
33
|
+
* supervisor to bring it back, but `on-failure` only restarts on a non-zero
|
|
34
|
+
* exit or a signal kill, not on a graceful `exit(0)`.
|
|
35
|
+
*/
|
|
36
|
+
export declare const EX_TEMPFAIL = 75;
|
|
37
|
+
/**
|
|
38
|
+
* Overrides the exit code the *next* signal-driven shutdown uses, then resets
|
|
39
|
+
* to 0 (the default clean-exit code) once consumed — so a caller that
|
|
40
|
+
* triggers its own shutdown (e.g. the package updater sending itself
|
|
41
|
+
* SIGTERM) can request `on-failure` supervisors restart it, without pinning
|
|
42
|
+
* every future shutdown to the same code.
|
|
43
|
+
*/
|
|
44
|
+
export declare function requestExitCode(code: number): void;
|
|
27
45
|
export interface ShutdownSignalOptions {
|
|
28
46
|
/** The teardown itself. Invoked at most once, no matter how many signals arrive. */
|
|
29
47
|
run: (signal: string) => Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shutdown-signals.d.ts","sourceRoot":"","sources":["../src/shutdown-signals.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH;;;;;;GAMG;AACH,eAAO,MAAM,gBAAgB,EAAE,SAAS,MAAM,CAAC,OAAO,EAAoC,CAAC;AAE3F,MAAM,WAAW,qBAAqB;IACpC,oFAAoF;IACpF,GAAG,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACvC,0EAA0E;IAC1E,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,kEAAkE;IAClE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9B,yDAAyD;IACzD,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,IAAI,CAAC;IACjC,6DAA6D;IAC7D,MAAM,CAAC,EAAE;QAAE,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,IAAI,GAAG,OAAO,CAAA;KAAE,CAAC;CAC/D;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,qBAAqB,GAC1B,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"shutdown-signals.d.ts","sourceRoot":"","sources":["../src/shutdown-signals.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH;;;;;;GAMG;AACH,eAAO,MAAM,gBAAgB,EAAE,SAAS,MAAM,CAAC,OAAO,EAAoC,CAAC;AAE3F;;;;;;;;GAQG;AACH,eAAO,MAAM,WAAW,KAAK,CAAC;AAI9B;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAElD;AAED,MAAM,WAAW,qBAAqB;IACpC,oFAAoF;IACpF,GAAG,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACvC,0EAA0E;IAC1E,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,kEAAkE;IAClE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9B,yDAAyD;IACzD,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,IAAI,CAAC;IACjC,6DAA6D;IAC7D,MAAM,CAAC,EAAE;QAAE,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,IAAI,GAAG,OAAO,CAAA;KAAE,CAAC;CAC/D;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,qBAAqB,GAC1B,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAyCnC"}
|
package/dist/shutdown-signals.js
CHANGED
|
@@ -18,7 +18,8 @@
|
|
|
18
18
|
* graceful path exists to avoid.
|
|
19
19
|
*/
|
|
20
20
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
21
|
-
exports.SHUTDOWN_SIGNALS = void 0;
|
|
21
|
+
exports.EX_TEMPFAIL = exports.SHUTDOWN_SIGNALS = void 0;
|
|
22
|
+
exports.requestExitCode = requestExitCode;
|
|
22
23
|
exports.registerShutdownSignals = registerShutdownSignals;
|
|
23
24
|
/**
|
|
24
25
|
* Every signal that means "wind down cleanly".
|
|
@@ -28,6 +29,27 @@ exports.registerShutdownSignals = registerShutdownSignals;
|
|
|
28
29
|
* hand-run process is stopped, and its default action skips handlers entirely.
|
|
29
30
|
*/
|
|
30
31
|
exports.SHUTDOWN_SIGNALS = ['SIGTERM', 'SIGINT', 'SIGHUP'];
|
|
32
|
+
/**
|
|
33
|
+
* sysexits.h `EX_TEMPFAIL` — "temporary failure, user is invited to retry".
|
|
34
|
+
* Used by callers that trigger their own shutdown (see `requestExitCode`) but
|
|
35
|
+
* need `Restart=on-failure` systemd units to treat the exit as failure-worth-
|
|
36
|
+
* restarting, rather than the default clean-shutdown code 0. See issue #450:
|
|
37
|
+
* an API-triggered update SIGTERMs the gateway itself expecting the
|
|
38
|
+
* supervisor to bring it back, but `on-failure` only restarts on a non-zero
|
|
39
|
+
* exit or a signal kill, not on a graceful `exit(0)`.
|
|
40
|
+
*/
|
|
41
|
+
exports.EX_TEMPFAIL = 75;
|
|
42
|
+
let pendingExitCode = 0;
|
|
43
|
+
/**
|
|
44
|
+
* Overrides the exit code the *next* signal-driven shutdown uses, then resets
|
|
45
|
+
* to 0 (the default clean-exit code) once consumed — so a caller that
|
|
46
|
+
* triggers its own shutdown (e.g. the package updater sending itself
|
|
47
|
+
* SIGTERM) can request `on-failure` supervisors restart it, without pinning
|
|
48
|
+
* every future shutdown to the same code.
|
|
49
|
+
*/
|
|
50
|
+
function requestExitCode(code) {
|
|
51
|
+
pendingExitCode = code;
|
|
52
|
+
}
|
|
31
53
|
/**
|
|
32
54
|
* Register a handler for every shutdown signal and return the deduplicated
|
|
33
55
|
* shutdown function, so callers (e.g. the crash handlers) can trigger the same
|
|
@@ -38,9 +60,18 @@ function registerShutdownSignals(opts) {
|
|
|
38
60
|
const onError = opts.onError ?? ((err) => console.error('[gateway] Shutdown failed:', err));
|
|
39
61
|
const target = opts.target ?? process;
|
|
40
62
|
let inFlight = null;
|
|
63
|
+
// Captured once, by whichever signal actually starts the teardown — not
|
|
64
|
+
// re-read when it resolves. A second signal that merely joins an
|
|
65
|
+
// already-in-flight shutdown (e.g. an operator's own `kill <pid>` landing
|
|
66
|
+
// while an update-triggered self-restart is still draining connections)
|
|
67
|
+
// must not let an unrelated `requestExitCode()` call made in that window
|
|
68
|
+
// change the exit code of a shutdown it didn't start.
|
|
69
|
+
let exitCode = 0;
|
|
41
70
|
const shutdown = (signal) => {
|
|
42
71
|
if (inFlight)
|
|
43
72
|
return inFlight;
|
|
73
|
+
exitCode = pendingExitCode;
|
|
74
|
+
pendingExitCode = 0;
|
|
44
75
|
opts.onBegin?.(signal);
|
|
45
76
|
inFlight = opts.run(signal);
|
|
46
77
|
return inFlight;
|
|
@@ -51,7 +82,7 @@ function registerShutdownSignals(opts) {
|
|
|
51
82
|
// rejection skipped `.then(exit)` entirely and the gateway hung on the
|
|
52
83
|
// signal — holding its port and its children — which is a worse outcome
|
|
53
84
|
// than an unclean exit. Exit non-zero so the failure stays visible.
|
|
54
|
-
void shutdown(signal).then(() => exit(
|
|
85
|
+
void shutdown(signal).then(() => exit(exitCode), (err) => {
|
|
55
86
|
onError(err);
|
|
56
87
|
exit(1);
|
|
57
88
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shutdown-signals.js","sourceRoot":"","sources":["../src/shutdown-signals.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;GAiBG;;;
|
|
1
|
+
{"version":3,"file":"shutdown-signals.js","sourceRoot":"","sources":["../src/shutdown-signals.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;GAiBG;;;AA+BH,0CAEC;AAoBD,0DA2CC;AA9FD;;;;;;GAMG;AACU,QAAA,gBAAgB,GAA8B,CAAC,SAAS,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;AAE3F;;;;;;;;GAQG;AACU,QAAA,WAAW,GAAG,EAAE,CAAC;AAE9B,IAAI,eAAe,GAAG,CAAC,CAAC;AAExB;;;;;;GAMG;AACH,SAAgB,eAAe,CAAC,IAAY;IAC1C,eAAe,GAAG,IAAI,CAAC;AACzB,CAAC;AAeD;;;;GAIG;AACH,SAAgB,uBAAuB,CACrC,IAA2B;IAE3B,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,IAAY,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACjE,MAAM,OAAO,GACX,IAAI,CAAC,OAAO,IAAI,CAAC,CAAC,GAAY,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,4BAA4B,EAAE,GAAG,CAAC,CAAC,CAAC;IACvF,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,OAAO,CAAC;IAEtC,IAAI,QAAQ,GAAyB,IAAI,CAAC;IAC1C,wEAAwE;IACxE,iEAAiE;IACjE,0EAA0E;IAC1E,wEAAwE;IACxE,yEAAyE;IACzE,sDAAsD;IACtD,IAAI,QAAQ,GAAG,CAAC,CAAC;IAEjB,MAAM,QAAQ,GAAG,CAAC,MAAc,EAAiB,EAAE;QACjD,IAAI,QAAQ;YAAE,OAAO,QAAQ,CAAC;QAC9B,QAAQ,GAAG,eAAe,CAAC;QAC3B,eAAe,GAAG,CAAC,CAAC;QACpB,IAAI,CAAC,OAAO,EAAE,CAAC,MAAM,CAAC,CAAC;QACvB,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAC5B,OAAO,QAAQ,CAAC;IAClB,CAAC,CAAC;IAEF,KAAK,MAAM,MAAM,IAAI,wBAAgB,EAAE,CAAC;QACtC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE;YACrB,0EAA0E;YAC1E,uEAAuE;YACvE,wEAAwE;YACxE,oEAAoE;YACpE,KAAK,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CACxB,GAAG,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,EACpB,CAAC,GAAG,EAAE,EAAE;gBACN,OAAO,CAAC,GAAG,CAAC,CAAC;gBACb,IAAI,CAAC,CAAC,CAAC,CAAC;YACV,CAAC,CACF,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC"}
|
package/mcp/server.ts
CHANGED
|
@@ -21,7 +21,7 @@ import { SkillsModule } from './tools/skills/module';
|
|
|
21
21
|
import { AgentModule } from './tools/agent/module';
|
|
22
22
|
import { BrowserModule } from './tools/browser/module';
|
|
23
23
|
import { ImageModule } from './tools/image/module';
|
|
24
|
-
import {
|
|
24
|
+
import { ShareFileModule } from './tools/share-file/module';
|
|
25
25
|
import { AppsModule } from './tools/apps/module';
|
|
26
26
|
import { ApiModule } from './tools/api/module';
|
|
27
27
|
import { MemoryModule } from './tools/memory/module';
|
|
@@ -46,7 +46,7 @@ const modules: AnyModule[] = [
|
|
|
46
46
|
new AgentModule(),
|
|
47
47
|
new BrowserModule(),
|
|
48
48
|
new ImageModule(),
|
|
49
|
-
new
|
|
49
|
+
new ShareFileModule(),
|
|
50
50
|
new AppsModule(),
|
|
51
51
|
new ApiModule(),
|
|
52
52
|
new MemoryModule(),
|
|
@@ -456,7 +456,11 @@ export class ImageModule implements ToolModule {
|
|
|
456
456
|
error: { content: [{ type: 'text', text }], isError: true },
|
|
457
457
|
});
|
|
458
458
|
const maxRefs = (() => {
|
|
459
|
-
|
|
459
|
+
// #444: the neutral SHARE_* name wins; IMAGE_SHARE_* is the legacy
|
|
460
|
+
// fallback. Both are forwarded to this subprocess, and unset vars arrive
|
|
461
|
+
// as '' — so treat empty as unset rather than letting it shadow the other.
|
|
462
|
+
const raw = process.env.SHARE_MAX_REFS || process.env.IMAGE_SHARE_MAX_REFS;
|
|
463
|
+
const n = Number(raw);
|
|
460
464
|
return Number.isFinite(n) && n > 0 ? Math.floor(n) : 5;
|
|
461
465
|
})();
|
|
462
466
|
if (refs.length > maxRefs) {
|
|
@@ -493,8 +497,11 @@ export class ImageModule implements ToolModule {
|
|
|
493
497
|
minted = await createShares(localRefs.map((e) => e.ref), { purpose: 'codex_ref' });
|
|
494
498
|
} catch (err) {
|
|
495
499
|
if (err instanceof ShareClientError) {
|
|
496
|
-
|
|
497
|
-
|
|
500
|
+
// #444 renamed this gateway error code image_ref_not_found ->
|
|
501
|
+
// share_ref_not_found. Match both: this subprocess can be talking to
|
|
502
|
+
// a gateway that predates the rename.
|
|
503
|
+
if (err.code === 'share_ref_not_found' || err.code === 'image_ref_not_found') {
|
|
504
|
+
return fail(`generate_image: ${err.code}: the referenced image/artifact does not exist in this session.`);
|
|
498
505
|
}
|
|
499
506
|
return fail(`generate_image: ${err.code}: ${err.message}`);
|
|
500
507
|
}
|