@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.
- package/config.template.json +2 -1
- package/dist/agent/runner.d.ts +3 -2
- package/dist/agent/runner.d.ts.map +1 -1
- package/dist/agent/runner.js +55 -36
- package/dist/agent/runner.js.map +1 -1
- package/dist/api/packages.js +1 -1
- package/dist/api/packages.js.map +1 -1
- package/dist/api/router.d.ts.map +1 -1
- package/dist/api/router.js +45 -11
- package/dist/api/router.js.map +1 -1
- package/dist/apps/socket-server.d.ts.map +1 -1
- package/dist/apps/socket-server.js +21 -11
- package/dist/apps/socket-server.js.map +1 -1
- package/dist/config/loader.d.ts.map +1 -1
- package/dist/config/loader.js +5 -1
- package/dist/config/loader.js.map +1 -1
- package/dist/config/migrator.d.ts +14 -1
- package/dist/config/migrator.d.ts.map +1 -1
- package/dist/config/migrator.js +97 -1
- package/dist/config/migrator.js.map +1 -1
- package/dist/history/db.d.ts +1 -1
- package/dist/history/db.d.ts.map +1 -1
- package/dist/history/db.js +10 -3
- package/dist/history/db.js.map +1 -1
- package/dist/history/types.d.ts +1 -0
- package/dist/history/types.d.ts.map +1 -1
- package/dist/index.js +73 -16
- package/dist/index.js.map +1 -1
- package/mcp/tools/telegram/receiver-server.ts +17 -8
- package/package.json +1 -1
package/config.template.json
CHANGED
|
@@ -9,11 +9,12 @@
|
|
|
9
9
|
"telegram.dmPolicy"
|
|
10
10
|
]
|
|
11
11
|
},
|
|
12
|
-
"configVersion": "1.0.
|
|
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 },
|
package/dist/agent/runner.d.ts
CHANGED
|
@@ -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
|
|
170
|
-
*
|
|
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":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAMtC,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,EAAW,WAAW,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAQhH,OAAO,EAA0C,KAAK,aAAa,EAAE,MAAM,WAAW,CAAC;AAEvF,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAQ1C,eAAO,MAAM,oBAAoB,QAAmB,CAAC;AAErD,eAAO,MAAM,cAAc,EAAE,WAAW,EAMvC,CAAC;AAoDF,qBAAa,WAAY,SAAQ,YAAY;IAC3C,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAgB;IAC9C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,cAAc,CAA4B;IAClD,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAA6B;IAC9D,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAqB;IACrD,OAAO,CAAC,SAAS,CAAoC;IAErD,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;IACjC,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAEvC,OAAO,CAAC,UAAU;IAKlB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAqC;IAC9D,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAA6C;IAC9E,OAAO,CAAC,QAAQ,CAAiC;IACjD,OAAO,CAAC,eAAe,CAAgC;IACvD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAe;IAC5C,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,gBAAgB,CAA+C;IAGvE,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAqB;IAGxD,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAA8C;IAGhF,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAA+B;IAGjE,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAA+B;IAGrE,OAAO,CAAC,aAAa,CAAwC;IAG7D,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IAGpC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAY;IAGtC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IAEvC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAGlC,OAAO,CAAC,aAAa,CAA6B;gBAEtC,WAAW,EAAE,WAAW,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,CAAC,EAAE,MAAM;IAsBnF;;OAEG;IACH,gBAAgB,CAAC,QAAQ,EAAE,aAAa,GAAG,IAAI;IAI/C,gBAAgB,IAAI,aAAa;IAIjC,IAAI,aAAa,IAAI,MAAM,CAE1B;IAED;;;OAGG;YACW,mBAAmB;IAuJjC;;;OAGG;YACW,oBAAoB;
|
|
1
|
+
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/agent/runner.ts"],"names":[],"mappings":"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"}
|
package/dist/agent/runner.js
CHANGED
|
@@ -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
|
|
1426
|
-
*
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
1558
|
-
|
|
1559
|
-
|
|
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
|
-
|
|
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
|
-
|
|
1757
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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')
|