@0xmaxma/claude-gateway 1.8.8 → 1.8.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +32 -5
- package/dist/agent/runner.d.ts +14 -1
- package/dist/agent/runner.d.ts.map +1 -1
- package/dist/agent/runner.js +96 -3
- package/dist/agent/runner.js.map +1 -1
- package/dist/api/router.d.ts.map +1 -1
- package/dist/api/router.js +37 -3
- package/dist/api/router.js.map +1 -1
- package/dist/api/share-router.d.ts.map +1 -1
- package/dist/api/share-router.js +24 -0
- package/dist/api/share-router.js.map +1 -1
- package/dist/cli/args.d.ts +34 -0
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js +55 -0
- package/dist/cli/args.js.map +1 -1
- package/dist/cli/commands/app.d.ts +28 -0
- package/dist/cli/commands/app.d.ts.map +1 -0
- package/dist/cli/commands/app.js +411 -0
- package/dist/cli/commands/app.js.map +1 -0
- package/dist/cli/commands/doctor.d.ts.map +1 -1
- package/dist/cli/commands/doctor.js +77 -16
- package/dist/cli/commands/doctor.js.map +1 -1
- package/dist/cli/commands/service.d.ts.map +1 -1
- package/dist/cli/commands/service.js +373 -56
- package/dist/cli/commands/service.js.map +1 -1
- package/dist/cli/commands/update.d.ts.map +1 -1
- package/dist/cli/commands/update.js +1 -17
- package/dist/cli/commands/update.js.map +1 -1
- package/dist/cli/http-client.d.ts +8 -0
- package/dist/cli/http-client.d.ts.map +1 -1
- package/dist/cli/http-client.js +5 -2
- package/dist/cli/http-client.js.map +1 -1
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +16 -4
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/prompt.d.ts +17 -2
- package/dist/cli/prompt.d.ts.map +1 -1
- package/dist/cli/prompt.js +33 -2
- package/dist/cli/prompt.js.map +1 -1
- package/dist/config/loader.d.ts +8 -0
- package/dist/config/loader.d.ts.map +1 -1
- package/dist/config/loader.js +15 -4
- package/dist/config/loader.js.map +1 -1
- package/dist/config/watcher.d.ts.map +1 -1
- package/dist/config/watcher.js +12 -0
- package/dist/config/watcher.js.map +1 -1
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -1
- package/dist/session/store.d.ts +3 -2
- package/dist/session/store.d.ts.map +1 -1
- package/dist/session/store.js +1 -1
- package/dist/session/store.js.map +1 -1
- package/dist/share/session-video-catalog.d.ts +19 -0
- package/dist/share/session-video-catalog.d.ts.map +1 -0
- package/dist/share/session-video-catalog.js +119 -0
- package/dist/share/session-video-catalog.js.map +1 -0
- package/dist/types.d.ts +25 -0
- package/dist/types.d.ts.map +1 -1
- package/mcp/instructions.ts +14 -1
- package/mcp/server.ts +11 -5
- package/mcp/tools/image/module.ts +8 -71
- package/mcp/tools/shared/media.ts +76 -0
- package/mcp/tools/telegram/receiver-server.ts +15 -8
- package/mcp/tools/telegram/reply-attachment.ts +81 -0
- package/mcp/tools/video/module.ts +681 -0
- package/package.json +1 -1
|
@@ -0,0 +1,119 @@
|
|
|
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.computeSessionVideoCatalog = computeSessionVideoCatalog;
|
|
37
|
+
const fs = __importStar(require("fs"));
|
|
38
|
+
const db_1 = require("../history/db");
|
|
39
|
+
const media_store_1 = require("../history/media-store");
|
|
40
|
+
/**
|
|
41
|
+
* Session VIDEO catalog — the deterministic list of every video clip in ONE
|
|
42
|
+
* chat session, oldest first. The direct analogue of session-image-catalog (#72)
|
|
43
|
+
* for the Media panel's video gallery: derived fresh on every call from the same
|
|
44
|
+
* append-only message media_files, so the panel shows exactly the clips the
|
|
45
|
+
* session produced without a new table or a reconciliation job.
|
|
46
|
+
*
|
|
47
|
+
* Deliberately SEPARATE from the image catalog: the image catalog also backs the
|
|
48
|
+
* agent's `generate_image list_refs` / "Image N" reference resolution, and a video
|
|
49
|
+
* must never leak into that surface (it is not a valid image reference). Keeping
|
|
50
|
+
* videos in their own endpoint means image ordinals are untouched.
|
|
51
|
+
*/
|
|
52
|
+
/**
|
|
53
|
+
* Clip containers the web renders with <video>. MUST stay byte-identical to the
|
|
54
|
+
* web's AGENT_VIDEO_URL_RE (getpod apps/web: assistant.tsx + use-modal-chat.ts) —
|
|
55
|
+
* they live in separate repos, so there is no shared source to enforce it. A
|
|
56
|
+
* mismatch silently drops a clip the web can play (catalog too narrow) or lists
|
|
57
|
+
* one it cannot render (catalog too wide). Generated clips are always .mp4, so
|
|
58
|
+
* this only bites uploaded containers.
|
|
59
|
+
*/
|
|
60
|
+
const VIDEO_EXT_RE = /\.(mp4|webm|mov|m4v)$/i;
|
|
61
|
+
/** Cap catalog descriptions — they describe, they are not a transcript. */
|
|
62
|
+
const MAX_DESC_CHARS = 200;
|
|
63
|
+
/** Channel receivers persist bare placeholders ("(video)") for captionless media
|
|
64
|
+
* — those describe nothing, so they don't become a desc. */
|
|
65
|
+
const PLACEHOLDER_CONTENT_RE = /^\((?:photo|image|video|file|sticker|audio|voice)\)$/i;
|
|
66
|
+
function toDesc(text) {
|
|
67
|
+
const t = (text ?? '').trim();
|
|
68
|
+
if (!t || PLACEHOLDER_CONTENT_RE.test(t))
|
|
69
|
+
return undefined;
|
|
70
|
+
return t.length > MAX_DESC_CHARS ? `${t.slice(0, MAX_DESC_CHARS)}…` : t;
|
|
71
|
+
}
|
|
72
|
+
/** History stores media as `media/<chat>/<file>`; normalise to the media-ROOT-
|
|
73
|
+
* relative `<chat>/<file>` so the same file recorded either way dedupes to one
|
|
74
|
+
* ordinal. MediaStore.resolvePath accepts both, so the emitted path stays usable. */
|
|
75
|
+
function toMediaRootRelative(p) {
|
|
76
|
+
return p.startsWith('media/') ? p.slice(6) : p;
|
|
77
|
+
}
|
|
78
|
+
/** available = the bytes are still on disk. A path that cannot even be resolved
|
|
79
|
+
* (traversal, escaped symlink) is not addressable, so it is unavailable too. */
|
|
80
|
+
function isOnDisk(agentsBaseDir, agentId, relativePath) {
|
|
81
|
+
try {
|
|
82
|
+
return fs.existsSync(media_store_1.MediaStore.resolvePath(agentsBaseDir, agentId, relativePath));
|
|
83
|
+
}
|
|
84
|
+
catch {
|
|
85
|
+
return false;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
function computeSessionVideoCatalog(opts) {
|
|
89
|
+
const { agentsBaseDir, agentId, sessionId } = opts;
|
|
90
|
+
const rows = db_1.HistoryDB.forAgent(agentsBaseDir, agentId).listSessionMedia(sessionId);
|
|
91
|
+
const items = [];
|
|
92
|
+
const seen = new Set();
|
|
93
|
+
for (const row of rows) {
|
|
94
|
+
// Anything the agent produced is a generation; everything else is an upload.
|
|
95
|
+
const origin = row.role === 'assistant' ? 'generated' : 'upload';
|
|
96
|
+
for (const raw of row.mediaFiles) {
|
|
97
|
+
if (typeof raw !== 'string' || !raw.trim())
|
|
98
|
+
continue;
|
|
99
|
+
const relativePath = toMediaRootRelative(raw.trim());
|
|
100
|
+
if (!VIDEO_EXT_RE.test(relativePath))
|
|
101
|
+
continue;
|
|
102
|
+
// First appearance owns the ordinal forever.
|
|
103
|
+
if (seen.has(relativePath))
|
|
104
|
+
continue;
|
|
105
|
+
seen.add(relativePath);
|
|
106
|
+
const desc = toDesc(row.content);
|
|
107
|
+
items.push({
|
|
108
|
+
index: items.length + 1,
|
|
109
|
+
relative_path: relativePath,
|
|
110
|
+
origin,
|
|
111
|
+
ts: row.ts,
|
|
112
|
+
available: isOnDisk(agentsBaseDir, agentId, relativePath),
|
|
113
|
+
...(desc ? { desc } : {}),
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
return items;
|
|
118
|
+
}
|
|
119
|
+
//# sourceMappingURL=session-video-catalog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-video-catalog.js","sourceRoot":"","sources":["../../src/share/session-video-catalog.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -528,6 +528,10 @@ export interface SessionMeta {
|
|
|
528
528
|
* can restore the composer selection on reload; the agent's own context is the
|
|
529
529
|
* functional source of truth. Updated whenever a send carries image_params. */
|
|
530
530
|
imageConfig?: ImageParams;
|
|
531
|
+
/** Last composer video options sent for this session. Mirrors imageConfig —
|
|
532
|
+
* persisted so the web can restore the composer selection on reload. Updated
|
|
533
|
+
* whenever a send carries video_params. */
|
|
534
|
+
videoConfig?: VideoParams;
|
|
531
535
|
/** Real model from Claude stream, updated per turn (e.g. "claude-opus-4-8"). */
|
|
532
536
|
model?: string;
|
|
533
537
|
}
|
|
@@ -561,6 +565,27 @@ export type ImageParams = {
|
|
|
561
565
|
image_refs?: string[];
|
|
562
566
|
n?: number;
|
|
563
567
|
};
|
|
568
|
+
/**
|
|
569
|
+
* Video-generation options selected in the web composer (per-session), passed
|
|
570
|
+
* through the chat send body as `video_params` and surfaced to the agent so it
|
|
571
|
+
* calls the `generate_video` MCP tool with these exact values. Mirrors ImageParams.
|
|
572
|
+
* Without this bridge the agent receives no composer context for video and invents
|
|
573
|
+
* duration/aspect (e.g. a non-existent 10s cap, an 8+8 scene split, or a landscape
|
|
574
|
+
* clip when 9:16 was selected).
|
|
575
|
+
*/
|
|
576
|
+
export type VideoParams = {
|
|
577
|
+
model?: string;
|
|
578
|
+
resolution?: string;
|
|
579
|
+
aspect_ratio?: string;
|
|
580
|
+
/** Discrete clip length in seconds (model-specific, e.g. 6/10/15). */
|
|
581
|
+
duration?: number;
|
|
582
|
+
/**
|
|
583
|
+
* Source frame for image-to-video, if the composer selected one. A `ref` value
|
|
584
|
+
* (media-relative path or `artifact:<id>`) passed as the generate_video `image`
|
|
585
|
+
* argument. When present the source frame's own aspect wins over aspect_ratio.
|
|
586
|
+
*/
|
|
587
|
+
image_ref?: string;
|
|
588
|
+
};
|
|
564
589
|
export type StreamEvent = {
|
|
565
590
|
type: 'text_delta';
|
|
566
591
|
text: string;
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/mcp/instructions.ts
CHANGED
|
@@ -19,7 +19,16 @@ const IMAGE_INSTRUCTION = [
|
|
|
19
19
|
'• NEVER tell the user to install an app or set up an MCP server for images.',
|
|
20
20
|
].join('\n');
|
|
21
21
|
|
|
22
|
-
|
|
22
|
+
const VIDEO_INSTRUCTION = [
|
|
23
|
+
'VIDEO GENERATION IS BUILT IN — you can create short video clips yourself; no app install or API-key setup is needed.',
|
|
24
|
+
'• To make ANY video you MUST use the generate_video tool. When the user asks to create / generate / make / animate a video or clip, call generate_video with action="list" to see the models, then action="generate".',
|
|
25
|
+
'• Video generation legitimately takes MINUTES. A "running" status (including the "still generating, call again with action=status" note) is normal, not stuck — keep polling with action="status" and the SAME task_id until it resolves to done/failed. Do NOT start a second generate for the same request while one is still running (you would pay for two clips).',
|
|
26
|
+
'• ONE clip, sent ONCE, then STOP: as soon as a generate SUCCEEDS, deliver that single mp4 with your reply tool exactly ONE time (files: ["/abs/path.mp4"]) and briefly mention the model. Do NOT re-generate or resend.',
|
|
27
|
+
'• IMAGE-TO-VIDEO: to animate an existing image, pass it in "image". If the user points at an earlier image ("animate image 2"), call action="list_refs" FIRST and use that item\'s "ref" — never count images from your own memory.',
|
|
28
|
+
'• If generation fails or no video model is available, tell the user PLAINLY — do NOT invent app-install / MCP-setup steps, and do NOT pretend a video was created.',
|
|
29
|
+
].join('\n');
|
|
30
|
+
|
|
31
|
+
export function buildChannelInstructions(imageEnabled: boolean, videoEnabled = false): string {
|
|
23
32
|
const lines = [
|
|
24
33
|
'The sender reads Telegram, not this session. Anything you want them to see must go through the reply tool — your transcript output never reaches their chat.',
|
|
25
34
|
'',
|
|
@@ -38,5 +47,9 @@ export function buildChannelInstructions(imageEnabled: boolean): string {
|
|
|
38
47
|
lines.push('', IMAGE_INSTRUCTION);
|
|
39
48
|
}
|
|
40
49
|
|
|
50
|
+
if (videoEnabled) {
|
|
51
|
+
lines.push('', VIDEO_INSTRUCTION);
|
|
52
|
+
}
|
|
53
|
+
|
|
41
54
|
return lines.join('\n');
|
|
42
55
|
}
|
package/mcp/server.ts
CHANGED
|
@@ -21,6 +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 { VideoModule } from './tools/video/module';
|
|
24
25
|
import { ShareFileModule } from './tools/share-file/module';
|
|
25
26
|
import { AppsModule } from './tools/apps/module';
|
|
26
27
|
import { ApiModule } from './tools/api/module';
|
|
@@ -46,6 +47,7 @@ const modules: AnyModule[] = [
|
|
|
46
47
|
new AgentModule(),
|
|
47
48
|
new BrowserModule(),
|
|
48
49
|
new ImageModule(),
|
|
50
|
+
new VideoModule(),
|
|
49
51
|
new ShareFileModule(),
|
|
50
52
|
new AppsModule(),
|
|
51
53
|
new ApiModule(),
|
|
@@ -85,6 +87,7 @@ for (const mod of modules) {
|
|
|
85
87
|
const shutdownController = new AbortController();
|
|
86
88
|
|
|
87
89
|
const imageEnabled = visibleTools.some((t) => t.name === 'generate_image');
|
|
90
|
+
const videoEnabled = visibleTools.some((t) => t.name === 'generate_video');
|
|
88
91
|
|
|
89
92
|
const mcp = new Server(
|
|
90
93
|
{ name: 'gateway', version: '1.0.0' },
|
|
@@ -96,7 +99,7 @@ const mcp = new Server(
|
|
|
96
99
|
'claude/channel/permission': {},
|
|
97
100
|
},
|
|
98
101
|
},
|
|
99
|
-
instructions: buildChannelInstructions(imageEnabled),
|
|
102
|
+
instructions: buildChannelInstructions(imageEnabled, videoEnabled),
|
|
100
103
|
},
|
|
101
104
|
);
|
|
102
105
|
|
|
@@ -136,10 +139,13 @@ mcp.setRequestHandler(CallToolRequestSchema, async (req, extra) => {
|
|
|
136
139
|
await mcp.connect(new StdioServerTransport());
|
|
137
140
|
|
|
138
141
|
// Graceful shutdown — used by stdin-close, SIGINT, and SIGTERM paths.
|
|
139
|
-
// Awaits any in-flight
|
|
140
|
-
// actually stops generating when the user presses Stop, rather than the
|
|
142
|
+
// Awaits any in-flight cancel (E3) on the media modules before exiting so the
|
|
143
|
+
// provider actually stops generating when the user presses Stop, rather than the
|
|
141
144
|
// process dying mid-request and the cancel call never reaching the server.
|
|
142
|
-
const
|
|
145
|
+
const drainableModules = modules.filter(
|
|
146
|
+
(m): m is AnyModule & { drainCancel: () => Promise<void> } =>
|
|
147
|
+
typeof (m as { drainCancel?: unknown }).drainCancel === 'function',
|
|
148
|
+
);
|
|
143
149
|
let shuttingDown = false;
|
|
144
150
|
function shutdown(): void {
|
|
145
151
|
if (shuttingDown) return;
|
|
@@ -156,7 +162,7 @@ function shutdown(): void {
|
|
|
156
162
|
// Give the event loop one tick so the poll loop's sleep() onAbort listener
|
|
157
163
|
// fires and cancelledResult() sets activeCancelPromise before we try to drain it.
|
|
158
164
|
setImmediate(async () => {
|
|
159
|
-
try { await
|
|
165
|
+
try { await Promise.all(drainableModules.map((m) => m.drainCancel())); } catch { /* non-fatal */ }
|
|
160
166
|
clearTimeout(forceExit);
|
|
161
167
|
process.exit(0);
|
|
162
168
|
});
|
|
@@ -14,6 +14,7 @@ import {
|
|
|
14
14
|
type ShareRef,
|
|
15
15
|
type ShareItem,
|
|
16
16
|
} from '../shared/share-client';
|
|
17
|
+
import { sleep, sanitize, readCapped, baseUrlIsSecure } from '../shared/media';
|
|
17
18
|
|
|
18
19
|
/**
|
|
19
20
|
* Image-generation tool module (#184, Track B).
|
|
@@ -515,7 +516,12 @@ export class ImageModule implements ToolModule {
|
|
|
515
516
|
// which the share API only fills when gateway.publicUrl is configured.
|
|
516
517
|
if (minted.some((m) => !m.url)) {
|
|
517
518
|
await revokeSharesBestEffort(minted.map((m) => m.share_id));
|
|
518
|
-
return fail(
|
|
519
|
+
return fail(
|
|
520
|
+
'generate_image: image reference sharing requires gateway.publicUrl to be configured ' +
|
|
521
|
+
'(set it in ~/.claude-gateway/config.json to your externally reachable base URL ending ' +
|
|
522
|
+
'in /gateway, then restart the gateway). As a workaround, pass a publicly reachable ' +
|
|
523
|
+
'https:// image URL instead of a local path or artifact ref.',
|
|
524
|
+
);
|
|
519
525
|
}
|
|
520
526
|
}
|
|
521
527
|
// Merge back preserving the caller's order. taskIds/priorPrompts are
|
|
@@ -661,7 +667,7 @@ export class ImageModule implements ToolModule {
|
|
|
661
667
|
await assertSafeImageUrl(item);
|
|
662
668
|
const res = await fetch(item, { signal: AbortSignal.timeout(30_000), redirect: 'error' });
|
|
663
669
|
if (!res.ok) throw new Error(`download image failed: HTTP ${res.status}`);
|
|
664
|
-
buf = await readCapped(res, DOWNLOAD_MAX_BYTES);
|
|
670
|
+
buf = await readCapped(res, DOWNLOAD_MAX_BYTES, 'image');
|
|
665
671
|
} else {
|
|
666
672
|
// Base64 bytes (openai / gemini / stability / hf) — tolerate a data: URI
|
|
667
673
|
// wrapper as well as raw base64.
|
|
@@ -791,25 +797,6 @@ export class ImageModule implements ToolModule {
|
|
|
791
797
|
}
|
|
792
798
|
}
|
|
793
799
|
|
|
794
|
-
// Resolves early (without rejecting) on abort — the poll loop re-checks
|
|
795
|
-
// signal.aborted itself right after, so this only needs to shorten the wait.
|
|
796
|
-
// The abort listener is removed when the timer fires normally: sleep() is called
|
|
797
|
-
// once per poll iteration against the SAME long-lived signal (up to ~75 times for
|
|
798
|
-
// the default 150s/2s budget), so leaving { once: true } listeners around on the
|
|
799
|
-
// non-abort path would pile them onto that one signal and trip Node's
|
|
800
|
-
// MaxListenersExceededWarning.
|
|
801
|
-
function sleep(ms: number, signal?: AbortSignal): Promise<void> {
|
|
802
|
-
return new Promise((r) => {
|
|
803
|
-
const onAbort = () => { clearTimeout(t); r(); };
|
|
804
|
-
const t = setTimeout(() => { signal?.removeEventListener('abort', onAbort); r(); }, ms);
|
|
805
|
-
signal?.addEventListener('abort', onAbort, { once: true });
|
|
806
|
-
});
|
|
807
|
-
}
|
|
808
|
-
|
|
809
|
-
function sanitize(s: string): string {
|
|
810
|
-
return s.replace(/[^a-zA-Z0-9_-]/g, '').slice(0, 48) || 'default';
|
|
811
|
-
}
|
|
812
|
-
|
|
813
800
|
// SSRF guard for provider image URLs. Require https, then resolve the host and
|
|
814
801
|
// reject if ANY resolved address is private / loopback / link-local / metadata —
|
|
815
802
|
// so a compromised provider response can't make the gateway fetch internal or
|
|
@@ -873,29 +860,6 @@ function isBlockedAddress(ip: string): boolean {
|
|
|
873
860
|
return true; // not a valid IP → block
|
|
874
861
|
}
|
|
875
862
|
|
|
876
|
-
// Read a response body into a Buffer with a hard byte ceiling: reject early on a
|
|
877
|
-
// too-large Content-Length, and stream-count actual bytes so a chunked response
|
|
878
|
-
// without Content-Length can't blow past the cap (OOM guard).
|
|
879
|
-
async function readCapped(res: Response, cap: number): Promise<Buffer> {
|
|
880
|
-
const declared = Number(res.headers.get('content-length'));
|
|
881
|
-
if (Number.isFinite(declared) && declared > cap) {
|
|
882
|
-
throw new Error(`download image too large: ${declared} bytes (max ${cap})`);
|
|
883
|
-
}
|
|
884
|
-
if (!res.body) {
|
|
885
|
-
const ab = await res.arrayBuffer();
|
|
886
|
-
if (ab.byteLength > cap) throw new Error(`download image too large (max ${cap} bytes)`);
|
|
887
|
-
return Buffer.from(ab);
|
|
888
|
-
}
|
|
889
|
-
const chunks: Buffer[] = [];
|
|
890
|
-
let total = 0;
|
|
891
|
-
for await (const chunk of res.body as unknown as AsyncIterable<Uint8Array>) {
|
|
892
|
-
total += chunk.length;
|
|
893
|
-
if (total > cap) throw new Error(`download image exceeded ${cap} bytes`);
|
|
894
|
-
chunks.push(Buffer.from(chunk));
|
|
895
|
-
}
|
|
896
|
-
return Buffer.concat(chunks);
|
|
897
|
-
}
|
|
898
|
-
|
|
899
863
|
function defaultCodeForStatus(status: number): string {
|
|
900
864
|
switch (status) {
|
|
901
865
|
case 400: return 'invalid_model';
|
|
@@ -923,33 +887,6 @@ function detectImageExt(buf: Buffer): string | null {
|
|
|
923
887
|
return null;
|
|
924
888
|
}
|
|
925
889
|
|
|
926
|
-
// https is required for a PUBLIC image endpoint (the Bearer proxy_secret is sent on
|
|
927
|
-
// every call); http is tolerated only for a local/internal host — a trusted hop such
|
|
928
|
-
// as host.docker.internal in dev, where cleartext never leaves the machine/network.
|
|
929
|
-
function baseUrlIsSecure(raw: string): boolean {
|
|
930
|
-
if (!raw) return false;
|
|
931
|
-
let u: URL;
|
|
932
|
-
try {
|
|
933
|
-
u = new URL(raw);
|
|
934
|
-
} catch {
|
|
935
|
-
return false;
|
|
936
|
-
}
|
|
937
|
-
if (u.protocol === 'https:') return true;
|
|
938
|
-
if (u.protocol !== 'http:') return false;
|
|
939
|
-
const h = u.hostname.toLowerCase();
|
|
940
|
-
return (
|
|
941
|
-
h === 'localhost' ||
|
|
942
|
-
h === 'host.docker.internal' ||
|
|
943
|
-
h.endsWith('.internal') ||
|
|
944
|
-
h.endsWith('.local') ||
|
|
945
|
-
/^127\./.test(h) ||
|
|
946
|
-
h === '::1' ||
|
|
947
|
-
/^10\./.test(h) ||
|
|
948
|
-
/^192\.168\./.test(h) ||
|
|
949
|
-
/^172\.(1[6-9]|2[0-9]|3[01])\./.test(h)
|
|
950
|
-
);
|
|
951
|
-
}
|
|
952
|
-
|
|
953
890
|
const imageToolDefs: McpToolDefinition[] = [
|
|
954
891
|
{
|
|
955
892
|
name: 'generate_image',
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Media-download/poll helpers shared by the image and video MCP tool modules.
|
|
3
|
+
* Self-contained on purpose, like share-client.ts: mcp/** ships as source
|
|
4
|
+
* without src/**, so this module must not import from src/ (see
|
|
5
|
+
* tests/unit/mcp-no-src-imports.test.ts).
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
// Resolves early (without rejecting) on abort — a poll loop re-checks
|
|
9
|
+
// signal.aborted itself right after, so this only needs to shorten the wait.
|
|
10
|
+
// The abort listener is removed when the timer fires normally: sleep() is called
|
|
11
|
+
// once per poll iteration against the SAME long-lived signal (up to dozens of
|
|
12
|
+
// times for a multi-minute poll budget), so leaving { once: true } listeners
|
|
13
|
+
// around on the non-abort path would pile them onto that one signal and trip
|
|
14
|
+
// Node's MaxListenersExceededWarning.
|
|
15
|
+
export function sleep(ms: number, signal?: AbortSignal): Promise<void> {
|
|
16
|
+
return new Promise((r) => {
|
|
17
|
+
const onAbort = () => { clearTimeout(t); r(); };
|
|
18
|
+
const t = setTimeout(() => { signal?.removeEventListener('abort', onAbort); r(); }, ms);
|
|
19
|
+
signal?.addEventListener('abort', onAbort, { once: true });
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export function sanitize(s: string): string {
|
|
24
|
+
return s.replace(/[^a-zA-Z0-9_-]/g, '').slice(0, 48) || 'default';
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
// Read a response body into a Buffer with a hard byte ceiling: reject early on a
|
|
28
|
+
// too-large Content-Length, and stream-count actual bytes so a chunked response
|
|
29
|
+
// without Content-Length can't blow past the cap (OOM guard). `label` (e.g.
|
|
30
|
+
// "image"/"video") only shapes the error message.
|
|
31
|
+
export async function readCapped(res: Response, cap: number, label = 'file'): Promise<Buffer> {
|
|
32
|
+
const declared = Number(res.headers.get('content-length'));
|
|
33
|
+
if (Number.isFinite(declared) && declared > cap) {
|
|
34
|
+
throw new Error(`download ${label} too large: ${declared} bytes (max ${cap})`);
|
|
35
|
+
}
|
|
36
|
+
if (!res.body) {
|
|
37
|
+
const ab = await res.arrayBuffer();
|
|
38
|
+
if (ab.byteLength > cap) throw new Error(`download ${label} too large (max ${cap} bytes)`);
|
|
39
|
+
return Buffer.from(ab);
|
|
40
|
+
}
|
|
41
|
+
const chunks: Buffer[] = [];
|
|
42
|
+
let total = 0;
|
|
43
|
+
for await (const chunk of res.body as unknown as AsyncIterable<Uint8Array>) {
|
|
44
|
+
total += chunk.length;
|
|
45
|
+
if (total > cap) throw new Error(`download ${label} exceeded ${cap} bytes`);
|
|
46
|
+
chunks.push(Buffer.from(chunk));
|
|
47
|
+
}
|
|
48
|
+
return Buffer.concat(chunks);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
// https is required for a PUBLIC endpoint (a Bearer proxy_secret is sent on
|
|
52
|
+
// every call); http is tolerated only for a local/internal host — a trusted hop
|
|
53
|
+
// such as host.docker.internal in dev, where cleartext never leaves the network.
|
|
54
|
+
export function baseUrlIsSecure(raw: string): boolean {
|
|
55
|
+
if (!raw) return false;
|
|
56
|
+
let u: URL;
|
|
57
|
+
try {
|
|
58
|
+
u = new URL(raw);
|
|
59
|
+
} catch {
|
|
60
|
+
return false;
|
|
61
|
+
}
|
|
62
|
+
if (u.protocol === 'https:') return true;
|
|
63
|
+
if (u.protocol !== 'http:') return false;
|
|
64
|
+
const h = u.hostname.toLowerCase();
|
|
65
|
+
return (
|
|
66
|
+
h === 'localhost' ||
|
|
67
|
+
h === 'host.docker.internal' ||
|
|
68
|
+
h.endsWith('.internal') ||
|
|
69
|
+
h.endsWith('.local') ||
|
|
70
|
+
/^127\./.test(h) ||
|
|
71
|
+
h === '::1' ||
|
|
72
|
+
/^10\./.test(h) ||
|
|
73
|
+
/^192\.168\./.test(h) ||
|
|
74
|
+
/^172\.(1[6-9]|2[0-9]|3[01])\./.test(h)
|
|
75
|
+
);
|
|
76
|
+
}
|
|
@@ -30,6 +30,7 @@ import { homedir } from 'os'
|
|
|
30
30
|
import { join, extname, sep } from 'path'
|
|
31
31
|
import { execFileSync } from 'child_process'
|
|
32
32
|
import { createWorkingStateManager, drainOrphanForwards, chunkText, htmlToPlain } from './typing'
|
|
33
|
+
import { extractRepliedAttachment, safeName } from './reply-attachment'
|
|
33
34
|
// Import compiled dist/, not raw src/ — src/ is not published (files: ["mcp/"]),
|
|
34
35
|
// so a src/ import crashes this bun-run receiver on installed packages (the bug
|
|
35
36
|
// that silenced every bot on systemd installs). Enforced by
|
|
@@ -587,7 +588,7 @@ const mcp = new Server(
|
|
|
587
588
|
instructions: [
|
|
588
589
|
'The sender reads Telegram, not this session. Anything you want them to see must go through the reply tool — your transcript output never reaches their chat.',
|
|
589
590
|
'',
|
|
590
|
-
'Messages from Telegram arrive as <channel source="telegram" chat_id="..." message_id="..." user="..." ts="...">. If the tag has an image_path attribute, Read that file — it is a photo the sender attached. If the tag has attachment_file_id, call download_attachment with that file_id to fetch the file, then Read the returned path. Reply with the reply tool — pass chat_id back. Use reply_to (set to a message_id) only when replying to an earlier message; the latest message doesn\'t need a quote-reply, omit reply_to for normal responses.',
|
|
591
|
+
'Messages from Telegram arrive as <channel source="telegram" chat_id="..." message_id="..." user="..." ts="...">. If the tag has an image_path attribute, Read that file — it is a photo the sender attached. If the tag has attachment_file_id, call download_attachment with that file_id to fetch the file, then Read the returned path. A nested <replied> block quotes an earlier message; it may carry replied_image_path (Read it) or replied_attachment_file_id (pass to download_attachment) when the quoted message held a photo or file. Reply with the reply tool — pass chat_id back. Use reply_to (set to a message_id) only when replying to an earlier message; the latest message doesn\'t need a quote-reply, omit reply_to for normal responses.',
|
|
591
592
|
'',
|
|
592
593
|
'reply accepts file paths (files: ["/abs/path.png"]) for attachments. Use react to add emoji reactions, and edit_message for interim progress updates. Edits don\'t trigger push notifications — when a long task completes, send a new reply so the user\'s device pings.',
|
|
593
594
|
'',
|
|
@@ -926,13 +927,6 @@ const CALLBACK_URL_BASE = (() => {
|
|
|
926
927
|
|
|
927
928
|
// ─── Message helpers (shared across all polling modes) ───────────────────────
|
|
928
929
|
|
|
929
|
-
// Filenames and titles are uploader-controlled. They land inside the <channel>
|
|
930
|
-
// notification — delimiter chars would let the uploader break out of the tag
|
|
931
|
-
// or forge a second meta entry.
|
|
932
|
-
function safeName(s: string | undefined): string | undefined {
|
|
933
|
-
return s?.replace(/[<>\[\]\r\n;]/g, '_')
|
|
934
|
-
}
|
|
935
|
-
|
|
936
930
|
type AttachmentMeta = {
|
|
937
931
|
kind: string
|
|
938
932
|
file_id: string
|
|
@@ -1048,6 +1042,12 @@ async function handleInbound(
|
|
|
1048
1042
|
} catch {}
|
|
1049
1043
|
}
|
|
1050
1044
|
|
|
1045
|
+
// A replied-to message may also carry a non-photo attachment (document, video,
|
|
1046
|
+
// audio, …). Photos become an image_path above; everything else is surfaced by
|
|
1047
|
+
// file_id so the agent can fetch it with download_attachment — without this a
|
|
1048
|
+
// quote-reply of e.g. a CSV dropped the file entirely.
|
|
1049
|
+
const repliedAttachment = extractRepliedAttachment(replyMsg)
|
|
1050
|
+
|
|
1051
1051
|
// image_path goes in meta only — an in-content "[image attached — read: PATH]"
|
|
1052
1052
|
// annotation is forgeable by any allowlisted sender typing that string.
|
|
1053
1053
|
const channelParams = {
|
|
@@ -1074,6 +1074,13 @@ async function handleInbound(
|
|
|
1074
1074
|
replied_user: replyMsg.from?.username ?? String(replyMsg.from?.id ?? ''),
|
|
1075
1075
|
...(replyMsg.text ? { replied_text: replyMsg.text } : {}),
|
|
1076
1076
|
...(repliedImagePath ? { replied_image_path: repliedImagePath } : {}),
|
|
1077
|
+
...(repliedAttachment ? {
|
|
1078
|
+
replied_attachment_kind: repliedAttachment.kind,
|
|
1079
|
+
replied_attachment_file_id: repliedAttachment.file_id,
|
|
1080
|
+
...(repliedAttachment.size != null ? { replied_attachment_size: String(repliedAttachment.size) } : {}),
|
|
1081
|
+
...(repliedAttachment.mime ? { replied_attachment_mime: repliedAttachment.mime } : {}),
|
|
1082
|
+
...(repliedAttachment.name ? { replied_attachment_name: repliedAttachment.name } : {}),
|
|
1083
|
+
} : {}),
|
|
1077
1084
|
} : {}),
|
|
1078
1085
|
},
|
|
1079
1086
|
}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import type { Message } from 'grammy/types'
|
|
2
|
+
|
|
3
|
+
/** Non-photo attachment metadata lifted off a message, mirroring the shape the
|
|
4
|
+
* live-message handlers build for `attachment_*`. Photos are handled separately
|
|
5
|
+
* (downloaded to an image_path); everything else is surfaced by file_id so the
|
|
6
|
+
* agent can fetch it on demand via download_attachment. */
|
|
7
|
+
export type RepliedAttachment = {
|
|
8
|
+
kind: string
|
|
9
|
+
file_id: string
|
|
10
|
+
size?: number
|
|
11
|
+
mime?: string
|
|
12
|
+
name?: string
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
// Filenames and titles are uploader-controlled. They land inside the <channel>
|
|
16
|
+
// notification — delimiter chars would let the uploader break out of the tag
|
|
17
|
+
// or forge a second meta entry.
|
|
18
|
+
export function safeName(s: string | undefined): string | undefined {
|
|
19
|
+
return s?.replace(/[<>\[\]\r\n;]/g, '_')
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Extract a non-photo attachment from the message being replied to.
|
|
24
|
+
*
|
|
25
|
+
* A quote-reply carries the full replied-to message, including any document /
|
|
26
|
+
* video / audio / voice / video_note / sticker it held — but the receiver only
|
|
27
|
+
* ever downloaded a replied *photo*. So replying to (say) a CSV dropped the file
|
|
28
|
+
* entirely: the agent saw `<replied>` with no way to reach the attachment. This
|
|
29
|
+
* returns that attachment's metadata so the reply path can surface a
|
|
30
|
+
* `replied_attachment_file_id` the agent can pass to download_attachment.
|
|
31
|
+
*
|
|
32
|
+
* Returns undefined when the replied message has no such attachment (plain text,
|
|
33
|
+
* or a photo — which the caller handles as an image_path).
|
|
34
|
+
*/
|
|
35
|
+
export function extractRepliedAttachment(msg: Message | undefined): RepliedAttachment | undefined {
|
|
36
|
+
if (!msg) return undefined
|
|
37
|
+
if (msg.document)
|
|
38
|
+
return {
|
|
39
|
+
kind: 'document',
|
|
40
|
+
file_id: msg.document.file_id,
|
|
41
|
+
size: msg.document.file_size,
|
|
42
|
+
mime: msg.document.mime_type,
|
|
43
|
+
name: safeName(msg.document.file_name),
|
|
44
|
+
}
|
|
45
|
+
if (msg.video)
|
|
46
|
+
return {
|
|
47
|
+
kind: 'video',
|
|
48
|
+
file_id: msg.video.file_id,
|
|
49
|
+
size: msg.video.file_size,
|
|
50
|
+
mime: msg.video.mime_type,
|
|
51
|
+
name: safeName(msg.video.file_name),
|
|
52
|
+
}
|
|
53
|
+
if (msg.audio)
|
|
54
|
+
return {
|
|
55
|
+
kind: 'audio',
|
|
56
|
+
file_id: msg.audio.file_id,
|
|
57
|
+
size: msg.audio.file_size,
|
|
58
|
+
mime: msg.audio.mime_type,
|
|
59
|
+
name: safeName(msg.audio.file_name),
|
|
60
|
+
}
|
|
61
|
+
if (msg.voice)
|
|
62
|
+
return {
|
|
63
|
+
kind: 'voice',
|
|
64
|
+
file_id: msg.voice.file_id,
|
|
65
|
+
size: msg.voice.file_size,
|
|
66
|
+
mime: msg.voice.mime_type,
|
|
67
|
+
}
|
|
68
|
+
if (msg.video_note)
|
|
69
|
+
return {
|
|
70
|
+
kind: 'video_note',
|
|
71
|
+
file_id: msg.video_note.file_id,
|
|
72
|
+
size: msg.video_note.file_size,
|
|
73
|
+
}
|
|
74
|
+
if (msg.sticker)
|
|
75
|
+
return {
|
|
76
|
+
kind: 'sticker',
|
|
77
|
+
file_id: msg.sticker.file_id,
|
|
78
|
+
size: msg.sticker.file_size,
|
|
79
|
+
}
|
|
80
|
+
return undefined
|
|
81
|
+
}
|