@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.
Files changed (66) hide show
  1. package/README.md +32 -5
  2. package/dist/agent/runner.d.ts +14 -1
  3. package/dist/agent/runner.d.ts.map +1 -1
  4. package/dist/agent/runner.js +96 -3
  5. package/dist/agent/runner.js.map +1 -1
  6. package/dist/api/router.d.ts.map +1 -1
  7. package/dist/api/router.js +37 -3
  8. package/dist/api/router.js.map +1 -1
  9. package/dist/api/share-router.d.ts.map +1 -1
  10. package/dist/api/share-router.js +24 -0
  11. package/dist/api/share-router.js.map +1 -1
  12. package/dist/cli/args.d.ts +34 -0
  13. package/dist/cli/args.d.ts.map +1 -1
  14. package/dist/cli/args.js +55 -0
  15. package/dist/cli/args.js.map +1 -1
  16. package/dist/cli/commands/app.d.ts +28 -0
  17. package/dist/cli/commands/app.d.ts.map +1 -0
  18. package/dist/cli/commands/app.js +411 -0
  19. package/dist/cli/commands/app.js.map +1 -0
  20. package/dist/cli/commands/doctor.d.ts.map +1 -1
  21. package/dist/cli/commands/doctor.js +77 -16
  22. package/dist/cli/commands/doctor.js.map +1 -1
  23. package/dist/cli/commands/service.d.ts.map +1 -1
  24. package/dist/cli/commands/service.js +373 -56
  25. package/dist/cli/commands/service.js.map +1 -1
  26. package/dist/cli/commands/update.d.ts.map +1 -1
  27. package/dist/cli/commands/update.js +1 -17
  28. package/dist/cli/commands/update.js.map +1 -1
  29. package/dist/cli/http-client.d.ts +8 -0
  30. package/dist/cli/http-client.d.ts.map +1 -1
  31. package/dist/cli/http-client.js +5 -2
  32. package/dist/cli/http-client.js.map +1 -1
  33. package/dist/cli/index.d.ts.map +1 -1
  34. package/dist/cli/index.js +16 -4
  35. package/dist/cli/index.js.map +1 -1
  36. package/dist/cli/prompt.d.ts +17 -2
  37. package/dist/cli/prompt.d.ts.map +1 -1
  38. package/dist/cli/prompt.js +33 -2
  39. package/dist/cli/prompt.js.map +1 -1
  40. package/dist/config/loader.d.ts +8 -0
  41. package/dist/config/loader.d.ts.map +1 -1
  42. package/dist/config/loader.js +15 -4
  43. package/dist/config/loader.js.map +1 -1
  44. package/dist/config/watcher.d.ts.map +1 -1
  45. package/dist/config/watcher.js +12 -0
  46. package/dist/config/watcher.js.map +1 -1
  47. package/dist/index.js +8 -0
  48. package/dist/index.js.map +1 -1
  49. package/dist/session/store.d.ts +3 -2
  50. package/dist/session/store.d.ts.map +1 -1
  51. package/dist/session/store.js +1 -1
  52. package/dist/session/store.js.map +1 -1
  53. package/dist/share/session-video-catalog.d.ts +19 -0
  54. package/dist/share/session-video-catalog.d.ts.map +1 -0
  55. package/dist/share/session-video-catalog.js +119 -0
  56. package/dist/share/session-video-catalog.js.map +1 -0
  57. package/dist/types.d.ts +25 -0
  58. package/dist/types.d.ts.map +1 -1
  59. package/mcp/instructions.ts +14 -1
  60. package/mcp/server.ts +11 -5
  61. package/mcp/tools/image/module.ts +8 -71
  62. package/mcp/tools/shared/media.ts +76 -0
  63. package/mcp/tools/telegram/receiver-server.ts +15 -8
  64. package/mcp/tools/telegram/reply-attachment.ts +81 -0
  65. package/mcp/tools/video/module.ts +681 -0
  66. 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;
@@ -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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"}
@@ -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
- export function buildChannelInstructions(imageEnabled: boolean): string {
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 image cancel (E3) before exiting so the provider
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 imageModuleRef = modules.find((m) => m.id === 'image') as { drainCancel?: () => Promise<void> } | undefined;
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 imageModuleRef?.drainCancel?.(); } catch { /* non-fatal */ }
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('generate_image: image reference sharing requires gateway.publicUrl to be configured.');
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
+ }