@0xmaxma/claude-gateway 1.2.23 → 1.2.31

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.
@@ -9,11 +9,12 @@
9
9
  "telegram.dmPolicy"
10
10
  ]
11
11
  },
12
- "configVersion": "1.0.5",
12
+ "configVersion": "1.0.7",
13
13
  "gateway": {
14
14
  "logDir": "~/.claude-gateway/logs",
15
15
  "timezone": "Asia/Bangkok",
16
16
  "models": [
17
+ { "id": "claude-fable-5", "label": "Fable 5", "alias": "fable", "contextWindow": 1000000 },
17
18
  { "id": "claude-opus-4-8", "label": "Opus 4.8", "alias": "opus", "contextWindow": 1000000 },
18
19
  { "id": "claude-opus-4-7", "label": "Opus 4.7", "alias": "opus47", "contextWindow": 1000000 },
19
20
  { "id": "claude-opus-4-6", "label": "Opus 4.6", "alias": "opus46", "contextWindow": 1000000 },
@@ -166,8 +166,8 @@ export declare class AgentRunner extends EventEmitter {
166
166
  /**
167
167
  * Send a message to an API session and stream back events via callbacks.
168
168
  *
169
- * Returns a cleanup function that removes all listeners and frees the session slot.
170
- * The caller MUST invoke cleanup on client disconnect or when done.
169
+ * Returns a disconnect handler for the caller to wire to the SSE close event.
170
+ * On client disconnect the stream continues server-side until the result is saved to DB.
171
171
  */
172
172
  sendApiMessageStream(sessionId: string, chatId: string, message: string, callbacks: {
173
173
  onChunk: (event: StreamEvent) => void;
@@ -207,6 +207,7 @@ export declare class AgentRunner extends EventEmitter {
207
207
  setModel(newModel: string): Promise<void>;
208
208
  listApiSessions(chatId: string): Promise<import('../types').SessionIndex>;
209
209
  createApiSession(chatId: string, prompt?: string, name?: string): Promise<import('../types').SessionMeta>;
210
+ private generateSessionNameInBackground;
210
211
  getApiSessionInfo(chatId: string, sessionId: string): Promise<Record<string, unknown> | null>;
211
212
  updateApiSession(chatId: string, sessionId: string, updates: {
212
213
  sessionName?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/agent/runner.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/agent/runner.ts"],"names":[],"mappings":"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"}
@@ -325,6 +325,11 @@ class AgentRunner extends events_1.EventEmitter {
325
325
  respond({ model: this.agentConfig.claude.model });
326
326
  return;
327
327
  }
328
+ if (command === 'get_models') {
329
+ const availableModels = this.gatewayConfig.gateway.models ?? exports.DEFAULT_MODELS;
330
+ respond({ models: availableModels.map(m => ({ id: m.id, label: m.label })) });
331
+ return;
332
+ }
328
333
  if (command === 'set_model') {
329
334
  const newModel = typeof body.payload?.model === 'string' ? body.payload.model : '';
330
335
  try {
@@ -1422,8 +1427,8 @@ class AgentRunner extends events_1.EventEmitter {
1422
1427
  /**
1423
1428
  * Send a message to an API session and stream back events via callbacks.
1424
1429
  *
1425
- * Returns a cleanup function that removes all listeners and frees the session slot.
1426
- * The caller MUST invoke cleanup on client disconnect or when done.
1430
+ * Returns a disconnect handler for the caller to wire to the SSE close event.
1431
+ * On client disconnect the stream continues server-side until the result is saved to DB.
1427
1432
  */
1428
1433
  async sendApiMessageStream(sessionId, chatId, message, callbacks, opts) {
1429
1434
  if (this.pendingApiSessions.has(sessionId)) {
@@ -1465,6 +1470,7 @@ class AgentRunner extends events_1.EventEmitter {
1465
1470
  session.touch();
1466
1471
  const buffer = [];
1467
1472
  let settled = false;
1473
+ let clientGone = false;
1468
1474
  // Track partial message text for delta computation (--include-partial-messages)
1469
1475
  let lastPartialText = '';
1470
1476
  // Accumulate tool_use blocks from stream_event (content_block_start → delta → stop)
@@ -1475,7 +1481,7 @@ class AgentRunner extends events_1.EventEmitter {
1475
1481
  settled = true;
1476
1482
  cleanup();
1477
1483
  const attachments = this.popApiAttachments(sessionId);
1478
- // Persist assistant reply
1484
+ // Persist assistant reply regardless of whether the SSE client is still connected
1479
1485
  if (result.trim()) {
1480
1486
  const streamAssistantTs = Date.now();
1481
1487
  this.sessionStore
@@ -1508,6 +1514,9 @@ class AgentRunner extends events_1.EventEmitter {
1508
1514
  session.off('output', onOutput);
1509
1515
  this.pendingApiSessions.delete(sessionId);
1510
1516
  };
1517
+ // Called when the SSE client disconnects. Marks clientGone so SSE writes
1518
+ // fail silently, but keeps onOutput listening so the result is still saved to DB.
1519
+ const onClientDisconnect = () => { clientGone = true; };
1511
1520
  const onOutput = (line) => {
1512
1521
  try {
1513
1522
  const obj = JSON.parse(line);
@@ -1524,7 +1533,8 @@ class AgentRunner extends events_1.EventEmitter {
1524
1533
  if (fullText.length > lastPartialText.length) {
1525
1534
  const delta = fullText.slice(lastPartialText.length);
1526
1535
  buffer.push(delta);
1527
- callbacks.onChunk({ type: 'text_delta', text: delta });
1536
+ if (!clientGone)
1537
+ callbacks.onChunk({ type: 'text_delta', text: delta });
1528
1538
  }
1529
1539
  lastPartialText = fullText;
1530
1540
  }
@@ -1534,30 +1544,34 @@ class AgentRunner extends events_1.EventEmitter {
1534
1544
  const text = obj['text'] ?? '';
1535
1545
  if (text) {
1536
1546
  buffer.push(text);
1537
- callbacks.onChunk({ type: 'text_delta', text });
1547
+ if (!clientGone)
1548
+ callbacks.onChunk({ type: 'text_delta', text });
1538
1549
  }
1539
1550
  }
1540
1551
  // stream_event from --output-format stream-json (tool_use + text_delta)
1541
- this._applyStreamEvent(obj, toolBlocks, callbacks.onChunk, (text) => {
1552
+ this._applyStreamEvent(obj, toolBlocks, clientGone ? () => { } : callbacks.onChunk, (text) => {
1542
1553
  buffer.push(text);
1543
1554
  // Update lastPartialText so the final 'assistant' message won't re-send the full text
1544
1555
  lastPartialText += text;
1545
- callbacks.onChunk({ type: 'text_delta', text });
1556
+ if (!clientGone)
1557
+ callbacks.onChunk({ type: 'text_delta', text });
1546
1558
  });
1547
1559
  // Text from delta field (other formats)
1548
1560
  if (obj['type'] !== 'assistant' && obj['type'] !== 'text' && obj['type'] !== 'result' && obj['type'] !== 'stream_event') {
1549
1561
  const deltaText = obj['delta']?.['text'];
1550
1562
  if (deltaText) {
1551
1563
  buffer.push(deltaText);
1552
- callbacks.onChunk({ type: 'text_delta', text: deltaText });
1564
+ if (!clientGone)
1565
+ callbacks.onChunk({ type: 'text_delta', text: deltaText });
1553
1566
  }
1554
1567
  }
1555
1568
  // Thinking
1556
1569
  if (obj['type'] === 'thinking') {
1557
- callbacks.onChunk({
1558
- type: 'thinking',
1559
- text: obj['text'] ?? '',
1560
- });
1570
+ if (!clientGone)
1571
+ callbacks.onChunk({
1572
+ type: 'thinking',
1573
+ text: obj['text'] ?? '',
1574
+ });
1561
1575
  }
1562
1576
  // Result = end of turn
1563
1577
  if (obj['type'] === 'result') {
@@ -1602,13 +1616,7 @@ class AgentRunner extends events_1.EventEmitter {
1602
1616
  (skillInvocationStream ? `\n${(0, skills_1.formatSkillContext)(skillInvocationStream)}` : '');
1603
1617
  session.setProcessing(true);
1604
1618
  session.sendMessage(channelXml);
1605
- // Return cleanup function for client disconnect
1606
- return () => {
1607
- if (!settled) {
1608
- settled = true;
1609
- cleanup();
1610
- }
1611
- };
1619
+ return onClientDisconnect;
1612
1620
  }
1613
1621
  /**
1614
1622
  * Check if a session has a pending API request (for preflight conflict check).
@@ -1753,21 +1761,32 @@ class AgentRunner extends events_1.EventEmitter {
1753
1761
  return this.sessionStore.listSessions(this.agentConfig.id, chatId, 'api');
1754
1762
  }
1755
1763
  async createApiSession(chatId, prompt, name) {
1756
- let sessionName = name;
1757
- if (!sessionName && prompt) {
1764
+ const sessionName = name ?? (prompt
1765
+ ? (prompt.length > 60 ? `${prompt.slice(0, 60)}...` : prompt)
1766
+ : undefined);
1767
+ const meta = await this.sessionStore.createTelegramSession(this.agentConfig.id, chatId, sessionName, 'api');
1768
+ if (!name && prompt) {
1769
+ this.generateSessionNameInBackground(chatId, meta.id, prompt);
1770
+ }
1771
+ return meta;
1772
+ }
1773
+ generateSessionNameInBackground(chatId, sessionId, prompt) {
1774
+ (async () => {
1758
1775
  try {
1759
1776
  const { execFile } = await Promise.resolve().then(() => __importStar(require('child_process')));
1760
1777
  const { promisify } = await Promise.resolve().then(() => __importStar(require('util')));
1761
1778
  const execFileAsync = promisify(execFile);
1762
1779
  const titlePrompt = `Summarise in 3-5 words as a session title (no punctuation, no quotes): ${prompt}`;
1763
1780
  const { stdout } = await execFileAsync('claude', ['-p', titlePrompt, '--output-format', 'text', '--model', 'claude-haiku-4-5-20251001'], { timeout: 15000, encoding: 'utf-8' });
1764
- sessionName = stdout.trim().slice(0, 60) || undefined;
1781
+ const aiName = stdout.trim().slice(0, 60) || undefined;
1782
+ if (aiName) {
1783
+ await this.sessionStore.updateSessionMeta(this.agentConfig.id, chatId, sessionId, { name: aiName }, 'api');
1784
+ }
1765
1785
  }
1766
- catch {
1767
- sessionName = undefined;
1786
+ catch (err) {
1787
+ this.logger.warn('Background session name generation failed', { sessionId, error: err.message });
1768
1788
  }
1769
- }
1770
- return this.sessionStore.createTelegramSession(this.agentConfig.id, chatId, sessionName, 'api');
1789
+ })();
1771
1790
  }
1772
1791
  async getApiSessionInfo(chatId, sessionId) {
1773
1792
  const index = await this.sessionStore.listSessions(this.agentConfig.id, chatId, 'api').catch(() => null);
@@ -1837,6 +1856,7 @@ class AgentRunner extends events_1.EventEmitter {
1837
1856
  });
1838
1857
  const buffer = [];
1839
1858
  let settled = false;
1859
+ let clientGone = false;
1840
1860
  let lastPartialText = '';
1841
1861
  const toolBlocks = new Map();
1842
1862
  const done = (result) => {
@@ -1875,6 +1895,7 @@ class AgentRunner extends events_1.EventEmitter {
1875
1895
  clearTimeout(globalTimer);
1876
1896
  session.off('output', onOutput);
1877
1897
  };
1898
+ const onClientDisconnect = () => { clientGone = true; };
1878
1899
  const onOutput = (line) => {
1879
1900
  try {
1880
1901
  const obj = JSON.parse(line);
@@ -1889,7 +1910,8 @@ class AgentRunner extends events_1.EventEmitter {
1889
1910
  if (fullText.length > lastPartialText.length) {
1890
1911
  const delta = fullText.slice(lastPartialText.length);
1891
1912
  buffer.push(delta);
1892
- callbacks.onChunk({ type: 'text_delta', text: delta });
1913
+ if (!clientGone)
1914
+ callbacks.onChunk({ type: 'text_delta', text: delta });
1893
1915
  }
1894
1916
  lastPartialText = fullText;
1895
1917
  }
@@ -1898,15 +1920,17 @@ class AgentRunner extends events_1.EventEmitter {
1898
1920
  const text = obj['text'] ?? '';
1899
1921
  if (text) {
1900
1922
  buffer.push(text);
1901
- callbacks.onChunk({ type: 'text_delta', text });
1923
+ if (!clientGone)
1924
+ callbacks.onChunk({ type: 'text_delta', text });
1902
1925
  }
1903
1926
  }
1904
1927
  // stream_event from --output-format stream-json (tool_use + text_delta)
1905
- this._applyStreamEvent(obj, toolBlocks, callbacks.onChunk, (text) => {
1928
+ this._applyStreamEvent(obj, toolBlocks, clientGone ? () => { } : callbacks.onChunk, (text) => {
1906
1929
  buffer.push(text);
1907
1930
  // Update lastPartialText so the final 'assistant' message won't re-send the full text
1908
1931
  lastPartialText += text;
1909
- callbacks.onChunk({ type: 'text_delta', text });
1932
+ if (!clientGone)
1933
+ callbacks.onChunk({ type: 'text_delta', text });
1910
1934
  });
1911
1935
  if (obj['type'] === 'result') {
1912
1936
  session.setProcessing(false);
@@ -1926,12 +1950,7 @@ class AgentRunner extends events_1.EventEmitter {
1926
1950
  `user="${AgentRunner.escapeXmlAttr(senderName ?? 'ui')}" ts="${new Date().toISOString()}">\n${message}\n</channel>`;
1927
1951
  session.setProcessing(true);
1928
1952
  session.sendMessage(channelXml);
1929
- return () => {
1930
- if (!settled) {
1931
- settled = true;
1932
- cleanup();
1933
- }
1934
- };
1953
+ return onClientDisconnect;
1935
1954
  }
1936
1955
  _applyStreamEvent(obj, toolBlocks, onChunk, onTextDelta) {
1937
1956
  if (obj['type'] !== 'stream_event')