@0xmaxma/claude-gateway 1.3.16 → 1.3.18
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 +8 -4
- package/dist/agent/builtin-commands.d.ts +1 -1
- package/dist/agent/builtin-commands.d.ts.map +1 -1
- package/dist/agent/builtin-commands.js +5 -0
- package/dist/agent/builtin-commands.js.map +1 -1
- package/dist/agent/line-pure.d.ts +31 -0
- package/dist/agent/line-pure.d.ts.map +1 -0
- package/dist/agent/line-pure.js +99 -0
- package/dist/agent/line-pure.js.map +1 -0
- package/dist/agent/line-reply-manager.d.ts +68 -0
- package/dist/agent/line-reply-manager.d.ts.map +1 -0
- package/dist/agent/line-reply-manager.js +383 -0
- package/dist/agent/line-reply-manager.js.map +1 -0
- package/dist/agent/runner.d.ts +11 -2
- package/dist/agent/runner.d.ts.map +1 -1
- package/dist/agent/runner.js +106 -8
- package/dist/agent/runner.js.map +1 -1
- package/dist/api/gateway-router.d.ts.map +1 -1
- package/dist/api/gateway-router.js +4 -0
- package/dist/api/gateway-router.js.map +1 -1
- package/dist/api/line-access.d.ts +60 -0
- package/dist/api/line-access.d.ts.map +1 -0
- package/dist/api/line-access.js +69 -0
- package/dist/api/line-access.js.map +1 -0
- package/dist/api/line-mention.d.ts +35 -0
- package/dist/api/line-mention.d.ts.map +1 -0
- package/dist/api/line-mention.js +33 -0
- package/dist/api/line-mention.js.map +1 -0
- package/dist/api/line-pending-senders.d.ts +40 -0
- package/dist/api/line-pending-senders.d.ts.map +1 -0
- package/dist/api/line-pending-senders.js +107 -0
- package/dist/api/line-pending-senders.js.map +1 -0
- package/dist/api/line-webhook-router.d.ts +51 -0
- package/dist/api/line-webhook-router.d.ts.map +1 -0
- package/dist/api/line-webhook-router.js +416 -0
- package/dist/api/line-webhook-router.js.map +1 -0
- package/dist/api/router.d.ts.map +1 -1
- package/dist/api/router.js +244 -7
- package/dist/api/router.js.map +1 -1
- package/dist/history/types.d.ts +1 -1
- package/dist/history/types.d.ts.map +1 -1
- package/dist/session/compactor.d.ts +1 -1
- package/dist/session/compactor.d.ts.map +1 -1
- package/dist/session/compactor.js.map +1 -1
- package/dist/session/process.d.ts +2 -2
- package/dist/session/process.d.ts.map +1 -1
- package/dist/session/process.js +14 -3
- package/dist/session/process.js.map +1 -1
- package/dist/session/store.d.ts +13 -13
- package/dist/session/store.d.ts.map +1 -1
- package/dist/session/store.js.map +1 -1
- package/dist/shell/claude-pty-shell.js +12 -0
- package/dist/shell/claude-pty-shell.js.map +1 -1
- package/dist/types.d.ts +60 -0
- package/dist/types.d.ts.map +1 -1
- package/mcp/bun.lock +9 -2
- package/mcp/package.json +1 -0
- package/mcp/server.ts +2 -0
- package/mcp/tools/line/module.ts +127 -0
- package/mcp/tools/line/pure.ts +62 -0
- package/mcp/tools/telegram/receiver-server.ts +8 -5
- package/package.json +2 -1
|
@@ -0,0 +1,383 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.LineReplyManager = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* LineReplyManager — gateway-side LINE outbound + slow-LLM postback button.
|
|
6
|
+
*
|
|
7
|
+
* Direct port of hermes-agent's `plugins/platforms/line/adapter.py` slow-LLM
|
|
8
|
+
* flow (PR #18153, leepoweii), adapted to claude-gateway: the LLM runs in a
|
|
9
|
+
* subprocess and LINE inbound arrives via the webhook router, so the token
|
|
10
|
+
* lifecycle + state machine live here (one instance per LINE-enabled agent,
|
|
11
|
+
* owned by AgentRunner) instead of in the channel adapter.
|
|
12
|
+
*
|
|
13
|
+
* Why it exists: LINE reply tokens are single-use and expire ~60s after the
|
|
14
|
+
* user's message; replying with the token is FREE, push is metered. When the
|
|
15
|
+
* agent is slow, we burn the token (before it expires) to send a tappable
|
|
16
|
+
* Template Buttons bubble; tapping it delivers a fresh reply token, so the
|
|
17
|
+
* cached answer goes out free. No tap → the answer waits in cache and expires
|
|
18
|
+
* (no auto-push). Push happens only as a fallback when a reply-token send fails.
|
|
19
|
+
*
|
|
20
|
+
* Mapping to the python source:
|
|
21
|
+
* onInbound ← reply-token stash + _keep_typing timer arm
|
|
22
|
+
* fireButton ← _fire_postback (1188–1213)
|
|
23
|
+
* onAnswer ← send + _send_text_chunks (1079–1133)
|
|
24
|
+
* handlePostback ← _handle_postback_event (996–1053)
|
|
25
|
+
* markInterrupted ← interrupt_session_activity (1226–1231)
|
|
26
|
+
* RequestCache ← RequestCache (283–366)
|
|
27
|
+
*/
|
|
28
|
+
const bot_sdk_1 = require("@line/bot-sdk");
|
|
29
|
+
const logger_1 = require("../logger");
|
|
30
|
+
const line_pure_1 = require("./line-pure");
|
|
31
|
+
// hermes constants (adapter.py 114, 123–129, 309–310).
|
|
32
|
+
const REPLY_TOKEN_TTL_MS = 50000; // conservative cap below LINE's ~60s
|
|
33
|
+
const READY_TTL_MS = 3600000; // 1h for READY/ERROR/DELIVERED entries
|
|
34
|
+
const PENDING_TTL_MS = 86400000; // 24h for PENDING (button sent, LLM running)
|
|
35
|
+
const PRUNE_INTERVAL_MS = 600000; // 10 min
|
|
36
|
+
const DEFAULT_BUTTON_LABEL = 'Get answer';
|
|
37
|
+
const DEFAULT_PENDING_TEXT = '🤔 Still thinking. Tap below to fetch the answer when it\'s ready.';
|
|
38
|
+
const DEFAULT_DELIVERED_TEXT = 'Already replied ✅';
|
|
39
|
+
const DEFAULT_INTERRUPTED_TEXT = 'Run was interrupted before completion.';
|
|
40
|
+
var State;
|
|
41
|
+
(function (State) {
|
|
42
|
+
State["PENDING"] = "pending";
|
|
43
|
+
State["READY"] = "ready";
|
|
44
|
+
State["DELIVERED"] = "delivered";
|
|
45
|
+
State["ERROR"] = "error";
|
|
46
|
+
})(State || (State = {}));
|
|
47
|
+
class LineReplyManager {
|
|
48
|
+
constructor(opts) {
|
|
49
|
+
this.deliveredText = DEFAULT_DELIVERED_TEXT;
|
|
50
|
+
this.interruptedText = DEFAULT_INTERRUPTED_TEXT;
|
|
51
|
+
// Cache state machine (RequestCache).
|
|
52
|
+
this.cache = new Map();
|
|
53
|
+
this.ridSeq = 0;
|
|
54
|
+
// Per-chat runtime state.
|
|
55
|
+
this.replyTokens = new Map();
|
|
56
|
+
this.pendingButtons = new Map(); // chatId → rid
|
|
57
|
+
this.timers = new Map();
|
|
58
|
+
this.turns = new Map();
|
|
59
|
+
this.answeredTurn = new Map();
|
|
60
|
+
this.client = new bot_sdk_1.messagingApi.MessagingApiClient({
|
|
61
|
+
channelAccessToken: opts.accessToken,
|
|
62
|
+
});
|
|
63
|
+
this.logger = (0, logger_1.createLogger)(`line-reply:${opts.agentId}`, opts.logDir);
|
|
64
|
+
this.thresholdMs = Math.max(1, opts.thresholdSeconds) * 1000;
|
|
65
|
+
this.buttonLabel = (opts.buttonLabel || DEFAULT_BUTTON_LABEL).slice(0, 20) || DEFAULT_BUTTON_LABEL;
|
|
66
|
+
this.pendingText = opts.pendingText || DEFAULT_PENDING_TEXT;
|
|
67
|
+
this.pruneTimer = setInterval(() => this.prune(), PRUNE_INTERVAL_MS);
|
|
68
|
+
this.pruneTimer.unref?.();
|
|
69
|
+
}
|
|
70
|
+
// ── Inbound: new user turn ────────────────────────────────────────────────
|
|
71
|
+
/**
|
|
72
|
+
* A user message arrived: stash its reply token and (by default) arm the
|
|
73
|
+
* slow-button timer.
|
|
74
|
+
*
|
|
75
|
+
* `opts.armButton === false` stashes the token + bumps the turn counter but
|
|
76
|
+
* does NOT arm the button — used for group/room turns, where the shared-tap
|
|
77
|
+
* button is disabled but the answer must still be delivered. Crucially the
|
|
78
|
+
* reply token is still stashed so `onAnswer` can reply→push (the subprocess
|
|
79
|
+
* suppresses its own LINE send under LINE_REPLY_REFRESH, so the gateway is the
|
|
80
|
+
* only thing that delivers; skipping the stash would silently drop the answer).
|
|
81
|
+
*/
|
|
82
|
+
onInbound(chatId, replyToken, opts) {
|
|
83
|
+
if (!chatId || !replyToken)
|
|
84
|
+
return;
|
|
85
|
+
this.clearTimer(chatId);
|
|
86
|
+
// A new turn supersedes a PREVIOUS turn's button only once that turn's answer
|
|
87
|
+
// has resolved (READY/ERROR/DELIVERED): retiring it from the one-button guard
|
|
88
|
+
// lets THIS turn fire its own button so its answer isn't swallowed (a prior
|
|
89
|
+
// READY-but-untapped button would otherwise block fireButton, and onAnswer's
|
|
90
|
+
// setReady would no-op). A still-PENDING button (rapid messages, answer not
|
|
91
|
+
// yet in) is kept, preserving the one-outstanding-button invariant. The old
|
|
92
|
+
// cache entry stays intact either way, so a tap on the old bubble in chat
|
|
93
|
+
// history still resolves.
|
|
94
|
+
const prevRid = this.pendingButtons.get(chatId);
|
|
95
|
+
if (prevRid && this.cache.get(prevRid)?.state !== State.PENDING) {
|
|
96
|
+
this.pendingButtons.delete(chatId);
|
|
97
|
+
}
|
|
98
|
+
this.turns.set(chatId, (this.turns.get(chatId) ?? 0) + 1);
|
|
99
|
+
this.answeredTurn.delete(chatId);
|
|
100
|
+
this.replyTokens.set(chatId, { token: replyToken, expiresAt: Date.now() + REPLY_TOKEN_TTL_MS });
|
|
101
|
+
if (opts?.armButton === false)
|
|
102
|
+
return; // group/room: deliver via onAnswer, no button
|
|
103
|
+
const t = setTimeout(() => {
|
|
104
|
+
void this.fireButton(chatId);
|
|
105
|
+
}, this.thresholdMs);
|
|
106
|
+
t.unref?.();
|
|
107
|
+
this.timers.set(chatId, t);
|
|
108
|
+
}
|
|
109
|
+
// ── Slow path: send the Template Buttons bubble (_fire_postback) ───────────
|
|
110
|
+
async fireButton(chatId) {
|
|
111
|
+
this.timers.delete(chatId);
|
|
112
|
+
// Agent already answered (token consumed) → nothing to do.
|
|
113
|
+
if (!this.replyTokens.has(chatId))
|
|
114
|
+
return;
|
|
115
|
+
// One outstanding button per chat.
|
|
116
|
+
if (this.pendingButtons.has(chatId))
|
|
117
|
+
return;
|
|
118
|
+
const rid = this.registerPending(chatId);
|
|
119
|
+
this.pendingButtons.set(chatId, rid);
|
|
120
|
+
const token = this.consumeReplyToken(chatId);
|
|
121
|
+
if (!token) {
|
|
122
|
+
this.pendingButtons.delete(chatId);
|
|
123
|
+
this.cache.delete(rid);
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
try {
|
|
127
|
+
await this.client.replyMessage({
|
|
128
|
+
replyToken: token,
|
|
129
|
+
messages: [this.buildButtonMessage(rid)],
|
|
130
|
+
});
|
|
131
|
+
this.logger.info('LINE: sent slow-LLM postback button', { chatId, rid });
|
|
132
|
+
}
|
|
133
|
+
catch (err) {
|
|
134
|
+
this.logger.warn('LINE: postback button send failed', { error: err.message });
|
|
135
|
+
this.pendingButtons.delete(chatId);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
// ── Answer ready (send + _send_text_chunks) ───────────────────────────────
|
|
139
|
+
/** The agent produced its reply text for this turn. */
|
|
140
|
+
async onAnswer(chatId, text) {
|
|
141
|
+
if (!chatId)
|
|
142
|
+
return;
|
|
143
|
+
// Idempotency: tool_use and result can both surface the same answer.
|
|
144
|
+
const turn = this.turns.get(chatId);
|
|
145
|
+
if (turn !== undefined) {
|
|
146
|
+
if (this.answeredTurn.get(chatId) === turn)
|
|
147
|
+
return;
|
|
148
|
+
this.answeredTurn.set(chatId, turn);
|
|
149
|
+
}
|
|
150
|
+
this.clearTimer(chatId);
|
|
151
|
+
// A button is outstanding → cache the answer for the user to fetch via tap.
|
|
152
|
+
const pendingRid = this.pendingButtons.get(chatId);
|
|
153
|
+
if (pendingRid) {
|
|
154
|
+
this.setReady(pendingRid, text);
|
|
155
|
+
return;
|
|
156
|
+
}
|
|
157
|
+
await this.sendChunks(chatId, text);
|
|
158
|
+
}
|
|
159
|
+
async sendChunks(chatId, text) {
|
|
160
|
+
const chunks = (0, line_pure_1.splitForLine)((0, line_pure_1.stripMarkdownPreservingUrls)(text));
|
|
161
|
+
if (chunks.length === 0)
|
|
162
|
+
return;
|
|
163
|
+
const messages = chunks.slice(0, line_pure_1.LINE_MAX_MESSAGES_PER_REQUEST).map((c) => this.textMessage(c));
|
|
164
|
+
const token = this.consumeReplyToken(chatId);
|
|
165
|
+
if (token) {
|
|
166
|
+
try {
|
|
167
|
+
await this.client.replyMessage({ replyToken: token, messages });
|
|
168
|
+
return;
|
|
169
|
+
}
|
|
170
|
+
catch (err) {
|
|
171
|
+
this.logger.info('LINE: reply token rejected; falling back to push', {
|
|
172
|
+
error: err.message,
|
|
173
|
+
});
|
|
174
|
+
// fall through to push
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
try {
|
|
178
|
+
await this.client.pushMessage({ to: chatId, messages });
|
|
179
|
+
}
|
|
180
|
+
catch (err) {
|
|
181
|
+
this.logger.error('LINE: push send failed', { error: err.message });
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
// ── Postback tap (_handle_postback_event) ─────────────────────────────────
|
|
185
|
+
/**
|
|
186
|
+
* Handle a tapped postback. Returns true when it is OUR refresh button (so the
|
|
187
|
+
* caller must NOT forward it to the agent); false for any other postback.
|
|
188
|
+
*/
|
|
189
|
+
async handlePostback(chatId, freshToken, data) {
|
|
190
|
+
let parsed;
|
|
191
|
+
try {
|
|
192
|
+
parsed = JSON.parse(data);
|
|
193
|
+
}
|
|
194
|
+
catch {
|
|
195
|
+
return false;
|
|
196
|
+
}
|
|
197
|
+
if (parsed?.action !== 'show_response')
|
|
198
|
+
return false;
|
|
199
|
+
// From here on it's ours — never wake the agent, even if malformed/stale.
|
|
200
|
+
const requestId = parsed.request_id ?? '';
|
|
201
|
+
const entry = requestId ? this.cache.get(requestId) : undefined;
|
|
202
|
+
if (!freshToken || !entry)
|
|
203
|
+
return true;
|
|
204
|
+
if (entry.state === State.READY) {
|
|
205
|
+
const chunks = (0, line_pure_1.splitForLine)((0, line_pure_1.stripMarkdownPreservingUrls)(entry.payload));
|
|
206
|
+
const messages = chunks
|
|
207
|
+
.slice(0, line_pure_1.LINE_MAX_MESSAGES_PER_REQUEST)
|
|
208
|
+
.map((c) => this.textMessage(c));
|
|
209
|
+
// Flip to DELIVERED synchronously before any await so that a concurrent
|
|
210
|
+
// tap sees DELIVERED and short-circuits instead of double-sending.
|
|
211
|
+
this.markDelivered(requestId);
|
|
212
|
+
this.clearPendingButton(chatId, requestId);
|
|
213
|
+
try {
|
|
214
|
+
await this.client.replyMessage({ replyToken: freshToken, messages });
|
|
215
|
+
}
|
|
216
|
+
catch (err) {
|
|
217
|
+
this.logger.warn('LINE: postback reply failed; falling back to push', {
|
|
218
|
+
error: err.message,
|
|
219
|
+
});
|
|
220
|
+
try {
|
|
221
|
+
await this.client.pushMessage({ to: chatId, messages });
|
|
222
|
+
}
|
|
223
|
+
catch (err2) {
|
|
224
|
+
this.logger.error('LINE: postback push fallback failed', {
|
|
225
|
+
error: err2.message,
|
|
226
|
+
});
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
else if (entry.state === State.ERROR) {
|
|
231
|
+
await this.safeReply(freshToken, entry.payload || this.interruptedText);
|
|
232
|
+
this.markDelivered(requestId);
|
|
233
|
+
this.clearPendingButton(chatId, requestId);
|
|
234
|
+
}
|
|
235
|
+
else if (entry.state === State.DELIVERED) {
|
|
236
|
+
await this.safeReply(freshToken, this.deliveredText);
|
|
237
|
+
}
|
|
238
|
+
else if (entry.state === State.PENDING) {
|
|
239
|
+
// Still working — re-issue the wait notice; the original button stays
|
|
240
|
+
// tappable in chat history for a later tap.
|
|
241
|
+
await this.safeReply(freshToken, this.pendingText);
|
|
242
|
+
}
|
|
243
|
+
return true;
|
|
244
|
+
}
|
|
245
|
+
/** The turn was interrupted/cancelled — surface an error for any pending button. */
|
|
246
|
+
markInterrupted(chatId) {
|
|
247
|
+
this.clearTimer(chatId);
|
|
248
|
+
const rid = this.pendingButtons.get(chatId);
|
|
249
|
+
if (rid) {
|
|
250
|
+
this.setError(rid, this.interruptedText);
|
|
251
|
+
this.pendingButtons.delete(chatId);
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
disposeChat(chatId) {
|
|
255
|
+
this.clearTimer(chatId);
|
|
256
|
+
this.replyTokens.delete(chatId);
|
|
257
|
+
this.pendingButtons.delete(chatId);
|
|
258
|
+
this.turns.delete(chatId);
|
|
259
|
+
this.answeredTurn.delete(chatId);
|
|
260
|
+
}
|
|
261
|
+
disposeAll() {
|
|
262
|
+
for (const t of this.timers.values())
|
|
263
|
+
clearTimeout(t);
|
|
264
|
+
this.timers.clear();
|
|
265
|
+
clearInterval(this.pruneTimer);
|
|
266
|
+
}
|
|
267
|
+
// ── helpers ───────────────────────────────────────────────────────────────
|
|
268
|
+
clearTimer(chatId) {
|
|
269
|
+
const t = this.timers.get(chatId);
|
|
270
|
+
if (t) {
|
|
271
|
+
clearTimeout(t);
|
|
272
|
+
this.timers.delete(chatId);
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
/** Clear the chat's pending-button guard only if it still points at `rid`
|
|
276
|
+
* (so delivering/tapping a superseded button can't clear a newer one). */
|
|
277
|
+
clearPendingButton(chatId, rid) {
|
|
278
|
+
if (this.pendingButtons.get(chatId) === rid)
|
|
279
|
+
this.pendingButtons.delete(chatId);
|
|
280
|
+
}
|
|
281
|
+
consumeReplyToken(chatId) {
|
|
282
|
+
const entry = this.replyTokens.get(chatId);
|
|
283
|
+
if (!entry)
|
|
284
|
+
return '';
|
|
285
|
+
this.replyTokens.delete(chatId); // single-use
|
|
286
|
+
if (!entry.token || Date.now() >= entry.expiresAt)
|
|
287
|
+
return '';
|
|
288
|
+
return entry.token;
|
|
289
|
+
}
|
|
290
|
+
async safeReply(token, text) {
|
|
291
|
+
try {
|
|
292
|
+
await this.client.replyMessage({ replyToken: token, messages: [this.textMessage(text)] });
|
|
293
|
+
}
|
|
294
|
+
catch (err) {
|
|
295
|
+
this.logger.debug('LINE: safeReply failed', { error: err.message });
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
textMessage(text) {
|
|
299
|
+
return { type: 'text', text };
|
|
300
|
+
}
|
|
301
|
+
buildButtonMessage(rid) {
|
|
302
|
+
const truncated = this.pendingText.length <= 160 ? this.pendingText : this.pendingText.slice(0, 157) + '...';
|
|
303
|
+
const alt = this.pendingText.length <= 400 ? this.pendingText : this.pendingText.slice(0, 397) + '...';
|
|
304
|
+
return {
|
|
305
|
+
type: 'template',
|
|
306
|
+
altText: alt,
|
|
307
|
+
template: {
|
|
308
|
+
type: 'buttons',
|
|
309
|
+
text: truncated,
|
|
310
|
+
actions: [
|
|
311
|
+
{
|
|
312
|
+
type: 'postback',
|
|
313
|
+
label: this.buttonLabel,
|
|
314
|
+
data: JSON.stringify({ action: 'show_response', request_id: rid }),
|
|
315
|
+
displayText: this.buttonLabel,
|
|
316
|
+
},
|
|
317
|
+
],
|
|
318
|
+
},
|
|
319
|
+
};
|
|
320
|
+
}
|
|
321
|
+
// ── RequestCache ──────────────────────────────────────────────────────────
|
|
322
|
+
registerPending(chatId) {
|
|
323
|
+
const rid = `rr-${Date.now().toString(36)}-${(this.ridSeq++).toString(36)}`;
|
|
324
|
+
const now = Date.now();
|
|
325
|
+
this.cache.set(rid, { state: State.PENDING, payload: '', chatId, createdAt: now, updatedAt: now });
|
|
326
|
+
return rid;
|
|
327
|
+
}
|
|
328
|
+
setReady(rid, payload) {
|
|
329
|
+
const e = this.cache.get(rid);
|
|
330
|
+
if (!e || e.state !== State.PENDING)
|
|
331
|
+
return;
|
|
332
|
+
e.state = State.READY;
|
|
333
|
+
e.payload = payload;
|
|
334
|
+
e.updatedAt = Date.now();
|
|
335
|
+
}
|
|
336
|
+
setError(rid, message) {
|
|
337
|
+
const e = this.cache.get(rid);
|
|
338
|
+
if (!e || e.state !== State.PENDING)
|
|
339
|
+
return;
|
|
340
|
+
e.state = State.ERROR;
|
|
341
|
+
e.payload = message;
|
|
342
|
+
e.updatedAt = Date.now();
|
|
343
|
+
}
|
|
344
|
+
markDelivered(rid) {
|
|
345
|
+
const e = this.cache.get(rid);
|
|
346
|
+
if (!e || (e.state !== State.READY && e.state !== State.ERROR))
|
|
347
|
+
return;
|
|
348
|
+
e.state = State.DELIVERED;
|
|
349
|
+
e.payload = ''; // free the LLM answer text immediately; DELIVERED sentinel is all we need
|
|
350
|
+
e.updatedAt = Date.now();
|
|
351
|
+
}
|
|
352
|
+
prune() {
|
|
353
|
+
const now = Date.now();
|
|
354
|
+
for (const [rid, e] of this.cache) {
|
|
355
|
+
const ttl = e.state === State.PENDING ? PENDING_TTL_MS : READY_TTL_MS;
|
|
356
|
+
const stamp = e.state === State.PENDING ? e.createdAt : e.updatedAt;
|
|
357
|
+
if (now - stamp > ttl)
|
|
358
|
+
this.cache.delete(rid);
|
|
359
|
+
}
|
|
360
|
+
// Reap per-chat turn counters for chats with no live state left, so they
|
|
361
|
+
// don't grow unbounded as distinct users come and go. A chat is "active"
|
|
362
|
+
// if it still has a cached request, an armed timer, an outstanding button,
|
|
363
|
+
// or a stashed reply token. Dropping a stale counter is safe: answeredTurn
|
|
364
|
+
// is reaped in lockstep, so the next inbound restarts idempotency cleanly.
|
|
365
|
+
const active = new Set();
|
|
366
|
+
for (const e of this.cache.values())
|
|
367
|
+
active.add(e.chatId);
|
|
368
|
+
for (const id of this.timers.keys())
|
|
369
|
+
active.add(id);
|
|
370
|
+
for (const id of this.pendingButtons.keys())
|
|
371
|
+
active.add(id);
|
|
372
|
+
for (const id of this.replyTokens.keys())
|
|
373
|
+
active.add(id);
|
|
374
|
+
for (const id of this.turns.keys())
|
|
375
|
+
if (!active.has(id))
|
|
376
|
+
this.turns.delete(id);
|
|
377
|
+
for (const id of this.answeredTurn.keys())
|
|
378
|
+
if (!active.has(id))
|
|
379
|
+
this.answeredTurn.delete(id);
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
exports.LineReplyManager = LineReplyManager;
|
|
383
|
+
//# sourceMappingURL=line-reply-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"line-reply-manager.js","sourceRoot":"","sources":["../../src/agent/line-reply-manager.ts"],"names":[],"mappings":"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"}
|
package/dist/agent/runner.d.ts
CHANGED
|
@@ -22,6 +22,7 @@ export declare class AgentRunner extends EventEmitter {
|
|
|
22
22
|
private readonly channelSourceMap;
|
|
23
23
|
private receiver;
|
|
24
24
|
private discordReceiver;
|
|
25
|
+
private lineReply;
|
|
25
26
|
private readonly sessionStore;
|
|
26
27
|
private readonly idleTimeoutMs;
|
|
27
28
|
private readonly maxConcurrent;
|
|
@@ -185,12 +186,20 @@ export declare class AgentRunner extends EventEmitter {
|
|
|
185
186
|
private startIdleCleaner;
|
|
186
187
|
start(): Promise<void>;
|
|
187
188
|
updateAgentConfig(newConfig: AgentConfig): void;
|
|
189
|
+
startLineReply(): void;
|
|
190
|
+
stopLineReply(): void;
|
|
188
191
|
getAgentConfig(): AgentConfig;
|
|
189
192
|
startTelegramReceiver(): void;
|
|
190
193
|
stopTelegramReceiver(): void;
|
|
191
194
|
startDiscordReceiver(): void;
|
|
192
195
|
stopDiscordReceiver(): void;
|
|
193
196
|
stop(): Promise<void>;
|
|
197
|
+
/**
|
|
198
|
+
* Deliver a tapped LINE postback (the slow-LLM "Get answer" button).
|
|
199
|
+
* Returns true when it was our refresh button (caller must NOT forward it to
|
|
200
|
+
* the agent); false for any other postback.
|
|
201
|
+
*/
|
|
202
|
+
handleLinePostback(chatId: string, replyToken: string, data: string): Promise<boolean>;
|
|
194
203
|
private _startCleanupScheduler;
|
|
195
204
|
restart(): Promise<void>;
|
|
196
205
|
isRunning(): boolean;
|
|
@@ -262,7 +271,7 @@ export declare class AgentRunner extends EventEmitter {
|
|
|
262
271
|
getAllSessionMeta(): Promise<Map<string, {
|
|
263
272
|
name: string;
|
|
264
273
|
}>>;
|
|
265
|
-
listSessionsForChat(chatId: string, channel: 'telegram' | 'discord'): Promise<import('../types').SessionIndex>;
|
|
274
|
+
listSessionsForChat(chatId: string, channel: 'telegram' | 'discord' | 'line'): Promise<import('../types').SessionIndex>;
|
|
266
275
|
executeApiCommand(sessionId: string, chatId: string, command: string, opts?: {
|
|
267
276
|
skipPersist?: boolean;
|
|
268
277
|
}): Promise<{
|
|
@@ -286,7 +295,7 @@ export declare class AgentRunner extends EventEmitter {
|
|
|
286
295
|
* The session process receives full history context from the session JSON (Layer 1).
|
|
287
296
|
* The reply is streamed back via SSE callbacks and persisted to history DB.
|
|
288
297
|
*/
|
|
289
|
-
sendMessageToSession(rawChatId: string, channel: 'telegram' | 'discord', sessionId: string, message: string, senderName: string | undefined, callbacks: {
|
|
298
|
+
sendMessageToSession(rawChatId: string, channel: 'telegram' | 'discord' | 'line', sessionId: string, message: string, senderName: string | undefined, callbacks: {
|
|
290
299
|
onChunk: (event: StreamEvent) => void;
|
|
291
300
|
onDone: (fullText: string) => void;
|
|
292
301
|
onError: (err: Error) => void;
|
|
@@ -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;
|
|
1
|
+
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/agent/runner.ts"],"names":[],"mappings":"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"}
|