@a1hvdy/cc-openclaw 0.25.4 → 0.25.6
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.
|
@@ -40,13 +40,6 @@ export interface HandlerState {
|
|
|
40
40
|
composeBuffer: ComposeBuffer;
|
|
41
41
|
}
|
|
42
42
|
export declare function createHandlerState(): HandlerState;
|
|
43
|
-
/**
|
|
44
|
-
|
|
45
|
-
*
|
|
46
|
-
* Hooked to `before_dispatch` — OpenClaw's name for the inbound-message
|
|
47
|
-
* event surface. We return `{ handled: true }` to claim the message when
|
|
48
|
-
* it's a known mirror slash command; `undefined` lets the event proceed
|
|
49
|
-
* to OpenClaw's default routing (which is what we want for non-slash
|
|
50
|
-
* user text destined for the model).
|
|
51
|
-
*/
|
|
43
|
+
/** Test-only — reset module-level subscription state. */
|
|
44
|
+
export declare function _resetSubscriptionForTests(): void;
|
|
52
45
|
export declare function registerInboundHandler(api: InboundHandlerApi, state?: HandlerState): HandlerState;
|
|
@@ -26,6 +26,8 @@ import { dispatchCommand, parseSlash, COMMAND_HANDLERS } from './commands.js';
|
|
|
26
26
|
import { sendTg, editTg } from '../../lib/telegram-bot-api.js';
|
|
27
27
|
import { CallbackMap } from './callback-mapping.js';
|
|
28
28
|
import { ComposeBuffer } from './compose-buffer.js';
|
|
29
|
+
import { TurnStateMachine } from './state-machine.js';
|
|
30
|
+
import { renderTurn } from './card-renderer.js';
|
|
29
31
|
const PLUGIN_TAG = '[cc-openclaw/telegram-mirror/inbound]';
|
|
30
32
|
/**
|
|
31
33
|
* Parse Telegram chat id out of a session key. Session keys look like
|
|
@@ -100,8 +102,38 @@ async function forwardAction(action, threadId, logger) {
|
|
|
100
102
|
* to OpenClaw's default routing (which is what we want for non-slash
|
|
101
103
|
* user text destined for the model).
|
|
102
104
|
*/
|
|
105
|
+
/**
|
|
106
|
+
* Module-scoped subscription state. OpenClaw 2026.5.x calls register(api)
|
|
107
|
+
* multiple times per process with DIFFERENT api objects (gateway-bindable
|
|
108
|
+
* runtime mode + boot/dispatch registry split). The per-api register-guard
|
|
109
|
+
* correctly re-fires the body for each new api so cross-registry hook
|
|
110
|
+
* delivery still works. But `api.on('before_dispatch', ...)` then stacks
|
|
111
|
+
* an extra listener per call → duplicate sends. We track "have I ever
|
|
112
|
+
* subscribed?" at module scope to claim the event exactly once, while
|
|
113
|
+
* still keeping the state object fresh per-api so callback/compose state
|
|
114
|
+
* doesn't get retroactively shared with already-detached api objects.
|
|
115
|
+
*
|
|
116
|
+
* Production scenario where stacking was observed (gateway 2026.5.12,
|
|
117
|
+
* 2026-05-19): `dispatched /new` logged TWICE per single inbound /new
|
|
118
|
+
* because two listeners both fired. v0.25.5 dedupes.
|
|
119
|
+
*/
|
|
120
|
+
let _subscribed = false;
|
|
121
|
+
const _states = new Set();
|
|
122
|
+
/** Test-only — reset module-level subscription state. */
|
|
123
|
+
export function _resetSubscriptionForTests() {
|
|
124
|
+
_subscribed = false;
|
|
125
|
+
_states.clear();
|
|
126
|
+
}
|
|
103
127
|
export function registerInboundHandler(api, state = createHandlerState()) {
|
|
104
128
|
const logger = (api.logger ?? console);
|
|
129
|
+
_states.add(state);
|
|
130
|
+
if (_subscribed) {
|
|
131
|
+
// Already subscribed once at module scope on a prior register() call —
|
|
132
|
+
// skip the api.on to prevent duplicate dispatch.
|
|
133
|
+
process.stderr.write(`${PLUGIN_TAG} skip-resubscribe (already armed at module scope; new api binding shares state).\n`);
|
|
134
|
+
return state;
|
|
135
|
+
}
|
|
136
|
+
_subscribed = true;
|
|
105
137
|
api.on('before_dispatch', async (...args) => {
|
|
106
138
|
const event = args[0];
|
|
107
139
|
if (!event)
|
|
@@ -156,6 +188,119 @@ export function registerInboundHandler(api, state = createHandlerState()) {
|
|
|
156
188
|
process.stderr.write(`${dispatchLog}\n`);
|
|
157
189
|
return { handled: true };
|
|
158
190
|
});
|
|
191
|
+
// v0.25.6 — TURN RENDER PIPELINE. The M2 building blocks (TurnStateMachine,
|
|
192
|
+
// renderTurn) finally wire to live events here. On a non-slash inbound,
|
|
193
|
+
// we send a "▶ Working" card immediately so the user sees the agent
|
|
194
|
+
// received their message. As tool events fire, we edit the card. On
|
|
195
|
+
// reply_dispatch / finalize, we mark the card "✓ Done".
|
|
196
|
+
//
|
|
197
|
+
// Tool event shapes vary across gateway versions — we dump each shape
|
|
198
|
+
// ONCE on first arrival to stderr, so v0.25.7 can fix extraction with
|
|
199
|
+
// ground-truth data.
|
|
200
|
+
const cardState = new Map();
|
|
201
|
+
const shapeDumped = new Set();
|
|
202
|
+
function dumpShapeOnce(eventName, event) {
|
|
203
|
+
if (shapeDumped.has(eventName))
|
|
204
|
+
return;
|
|
205
|
+
shapeDumped.add(eventName);
|
|
206
|
+
try {
|
|
207
|
+
const dump = JSON.stringify(event, (_k, v) => (typeof v === 'function' ? '[Function]' : v));
|
|
208
|
+
process.stderr.write(`[cc-openclaw/telegram-mirror/turn] ${eventName} SHAPE (once): ${dump.slice(0, 1500)}\n`);
|
|
209
|
+
}
|
|
210
|
+
catch (err) {
|
|
211
|
+
process.stderr.write(`[cc-openclaw/telegram-mirror/turn] ${eventName} shape-dump failed: ${err.message}\n`);
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
// Re-subscribe before_dispatch to send a "▶ Working" card for non-slash
|
|
215
|
+
// inbound. Distinct handler from the slash dispatcher above to keep the
|
|
216
|
+
// two responsibilities independent.
|
|
217
|
+
api.on('before_dispatch', async (...args) => {
|
|
218
|
+
const event = args[0];
|
|
219
|
+
if (!event || event.channel !== 'telegram')
|
|
220
|
+
return undefined;
|
|
221
|
+
if (event.raw?.callback_query)
|
|
222
|
+
return undefined;
|
|
223
|
+
const text = (typeof event.content === 'string' ? event.content : undefined) ??
|
|
224
|
+
event.raw?.message?.text;
|
|
225
|
+
if (typeof text !== 'string')
|
|
226
|
+
return undefined;
|
|
227
|
+
// Skip if it's a known mirror slash — those are handled by the
|
|
228
|
+
// dispatcher above and shouldn't get a working card.
|
|
229
|
+
const parsed = parseSlash(text);
|
|
230
|
+
if (parsed && MIRROR_COMMANDS.has(parsed.cmd))
|
|
231
|
+
return undefined;
|
|
232
|
+
const fromKey = chatIdFromSessionKey(event.sessionKey);
|
|
233
|
+
let chatId = fromKey.chatId || (event.senderId !== undefined ? String(event.senderId) : '');
|
|
234
|
+
if (!chatId)
|
|
235
|
+
return undefined;
|
|
236
|
+
const threadId = fromKey.threadId !== undefined ? fromKey.threadId : event.raw?.message?.message_thread_id;
|
|
237
|
+
// Start a fresh turn for this chat. Replaces any prior turn state.
|
|
238
|
+
const sm = new TurnStateMachine();
|
|
239
|
+
sm.start(chatId);
|
|
240
|
+
try {
|
|
241
|
+
const res = await sendTg(chatId, renderTurn(sm.getTurn(chatId)), threadId !== undefined ? String(threadId) : undefined);
|
|
242
|
+
const msgId = res?.result?.message_id;
|
|
243
|
+
if (typeof msgId === 'number') {
|
|
244
|
+
cardState.set(chatId, { messageId: msgId, sm });
|
|
245
|
+
process.stderr.write(`[cc-openclaw/telegram-mirror/turn] working card sent: chat=${chatId} msg=${msgId} text=${JSON.stringify(text.slice(0, 60))}\n`);
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
catch (err) {
|
|
249
|
+
process.stderr.write(`[cc-openclaw/telegram-mirror/turn] working card send failed: ${err.message}\n`);
|
|
250
|
+
}
|
|
251
|
+
// Never claim — let the model handle the user message normally.
|
|
252
|
+
return undefined;
|
|
253
|
+
});
|
|
254
|
+
// Tool-call events — dump shapes once + best-effort apply to state machine.
|
|
255
|
+
api.on('before_tool_call', async (...args) => {
|
|
256
|
+
const event = args[0];
|
|
257
|
+
dumpShapeOnce('before_tool_call', event);
|
|
258
|
+
return undefined;
|
|
259
|
+
});
|
|
260
|
+
api.on('after_tool_call', async (...args) => {
|
|
261
|
+
const event = args[0];
|
|
262
|
+
dumpShapeOnce('after_tool_call', event);
|
|
263
|
+
return undefined;
|
|
264
|
+
});
|
|
265
|
+
api.on('before_agent_finalize', async (...args) => {
|
|
266
|
+
const event = args[0];
|
|
267
|
+
dumpShapeOnce('before_agent_finalize', event);
|
|
268
|
+
return undefined;
|
|
269
|
+
});
|
|
270
|
+
// reply_dispatch — finalize the working card by editing it to "✓ Done".
|
|
271
|
+
api.on('reply_dispatch', async (...args) => {
|
|
272
|
+
const event = args[0];
|
|
273
|
+
dumpShapeOnce('reply_dispatch', event);
|
|
274
|
+
// Try to extract chatId from the event. Fall back to a best-effort
|
|
275
|
+
// search across the cardState. On real gateway data, we'll know the
|
|
276
|
+
// exact field after the shape dump.
|
|
277
|
+
const ev = event;
|
|
278
|
+
const chatCandidate = ev?.sessionKey ??
|
|
279
|
+
(ev?.senderId !== undefined ? String(ev?.senderId) : undefined);
|
|
280
|
+
let chatId;
|
|
281
|
+
if (chatCandidate) {
|
|
282
|
+
const fromKey = chatIdFromSessionKey(chatCandidate);
|
|
283
|
+
chatId = fromKey.chatId || chatCandidate;
|
|
284
|
+
}
|
|
285
|
+
// If no chatId in event, finalize ALL active cards (rare; should
|
|
286
|
+
// only happen until we know the right field name).
|
|
287
|
+
const targets = chatId ? [chatId] : Array.from(cardState.keys());
|
|
288
|
+
for (const target of targets) {
|
|
289
|
+
const card = cardState.get(target);
|
|
290
|
+
if (!card)
|
|
291
|
+
continue;
|
|
292
|
+
card.sm.end(target);
|
|
293
|
+
try {
|
|
294
|
+
await editTg(target, card.messageId, renderTurn(card.sm.getTurn(target)));
|
|
295
|
+
}
|
|
296
|
+
catch (err) {
|
|
297
|
+
process.stderr.write(`[cc-openclaw/telegram-mirror/turn] finalize edit failed: ${err.message}\n`);
|
|
298
|
+
}
|
|
299
|
+
cardState.delete(target);
|
|
300
|
+
}
|
|
301
|
+
return undefined;
|
|
302
|
+
});
|
|
303
|
+
process.stderr.write(`${PLUGIN_TAG} turn-render pipeline armed (before_tool_call, after_tool_call, before_agent_finalize, reply_dispatch).\n`);
|
|
159
304
|
logger.info(`${PLUGIN_TAG} subscribed to before_dispatch — ${MIRROR_COMMANDS.size} commands armed.`);
|
|
160
305
|
// v0.25.2 — extra stderr breadcrumb so even if logger.info is swallowed
|
|
161
306
|
// by the gateway's debug-tap wrapping, we still get proof of subscription.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"inbound-handler.js","sourceRoot":"","sources":["../../../../src/channels/telegram-mirror/inbound-handler.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,gBAAgB,EAAuB,MAAM,eAAe,CAAC;AACnG,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"inbound-handler.js","sourceRoot":"","sources":["../../../../src/channels/telegram-mirror/inbound-handler.ts"],"names":[],"mappings":"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"}
|