clawrelay 0.3.6 → 0.3.8

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "clawrelay",
3
- "version": "0.3.6",
3
+ "version": "0.3.8",
4
4
  "description": "Channel relay plugin for OpenClaw — receives messages from an always-on relay proxy",
5
5
  "main": "src/index.ts",
6
6
  "type": "module",
@@ -23,7 +23,7 @@ export function createRelayInboundHandler(api: any) {
23
23
  respond: (ok: boolean, payload?: unknown, error?: unknown) => void;
24
24
  context: any;
25
25
  }) => {
26
- const { params, client, respond } = opts;
26
+ const { params, client, respond, context } = opts;
27
27
 
28
28
  const message = params.message as RelayInboundMessage | undefined;
29
29
  if (!message || !message.messageId || !message.content) {
@@ -63,13 +63,23 @@ export function createRelayInboundHandler(api: any) {
63
63
 
64
64
  const streaming = params.streaming === true;
65
65
 
66
+ // Helper to send an event to the calling client via the gateway broadcast API
67
+ const sendEventToClient = (event: string, payload: unknown) => {
68
+ if (!client?.connId) {
69
+ logger.warn(`[clawrelay] Cannot send event ${event}: no client connId`);
70
+ return;
71
+ }
72
+ logger.info(`[clawrelay] sendEventToClient: ${event} connId=${client.connId}`);
73
+ context.broadcastToConnIds(event, payload, new Set([client.connId]));
74
+ };
75
+
66
76
  if (streaming) {
67
77
  // Streaming mode: ack immediately, then send deltas via events
68
78
  respond(true, { messageId: message.messageId, streaming: true });
69
79
 
70
80
  const streamCallback = (text: string) => {
71
81
  try {
72
- client.sendEvent('relay.stream.delta', {
82
+ sendEventToClient('relay.stream.delta', {
73
83
  messageId: message.messageId,
74
84
  text,
75
85
  kind: 'deliver',
@@ -88,14 +98,14 @@ export function createRelayInboundHandler(api: any) {
88
98
  streamCallback,
89
99
  });
90
100
 
91
- client.sendEvent('relay.stream.done', {
101
+ sendEventToClient('relay.stream.done', {
92
102
  messageId: message.messageId,
93
103
  text: responseContent,
94
104
  });
95
105
  } catch (err) {
96
106
  const errMsg = err instanceof Error ? err.message : String(err);
97
107
  logger.error(`[clawrelay] Failed to process inbound (streaming): ${errMsg}`);
98
- client.sendEvent('relay.stream.done', {
108
+ sendEventToClient('relay.stream.done', {
99
109
  messageId: message.messageId,
100
110
  text: '',
101
111
  error: `Error processing message: ${errMsg}`,
@@ -224,13 +234,16 @@ async function processRelayMessage(params: {
224
234
 
225
235
  // Dispatch reply — collect all deliver() calls into a single buffer
226
236
  const parts: string[] = [];
237
+ let deliverCount = 0;
227
238
 
228
239
  await core.channel.reply.dispatchReplyWithBufferedBlockDispatcher({
229
240
  ctx: ctxPayload,
230
241
  cfg: config,
231
242
  dispatcherOptions: {
232
- deliver: async (payload: { text?: string }) => {
243
+ deliver: async (payload: { text?: string }, info?: { kind?: string }) => {
244
+ deliverCount++;
233
245
  const text = payload.text ?? '';
246
+ log?.info(`[clawrelay] deliver #${deliverCount} kind=${info?.kind ?? 'unknown'} len=${text.length} preview="${text.slice(0, 80)}"`);
234
247
  if (text.trim()) {
235
248
  parts.push(text);
236
249
  streamCallback?.(text);
@@ -242,7 +255,7 @@ async function processRelayMessage(params: {
242
255
  },
243
256
  });
244
257
 
245
- log?.info(`[clawrelay] Processed message ${message.messageId} from ${message.senderName}`);
258
+ log?.info(`[clawrelay] Processed message ${message.messageId} from ${message.senderName} (${deliverCount} delivers, ${parts.length} parts, total=${parts.join('\n').length} chars)`);
246
259
 
247
260
  return parts.join('\n');
248
261
  }