@alfe.ai/openclaw-chat 0.0.8 → 0.0.10

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/dist/plugin.d.ts CHANGED
@@ -236,7 +236,7 @@ declare const plugin: {
236
236
  description: string;
237
237
  version: string;
238
238
  activate(api: PluginApi): void;
239
- deactivate(api: PluginApi): void;
239
+ deactivate(api: PluginApi): Promise<void>;
240
240
  };
241
241
  //#endregion
242
242
  export { AlfeResolvedAccount as a, AlfePluginConfig as i, createAlfeChannelPlugin as n, AlfeChannelConfig as r, plugin as t };
package/dist/plugin2.js CHANGED
@@ -324,6 +324,7 @@ function resolveOpenClawSdk(log) {
324
324
  }
325
325
  let pluginRuntime = null;
326
326
  let chatClient = null;
327
+ let connectingPromise = null;
327
328
  async function handleAgentRequest(request, log) {
328
329
  const runtime = pluginRuntime;
329
330
  if (!runtime) {
@@ -341,13 +342,18 @@ async function handleAgentRequest(request, log) {
341
342
  }
342
343
  const senderId = userId ?? `anon-${legacySessionKey.slice(0, 12)}`;
343
344
  const cfg = runtime.config.loadConfig();
344
- let resolvedSessionKey = legacySessionKey;
345
+ const sessionId = conversationId ?? legacySessionKey;
346
+ if (!await getSession(sessionId)) await createSession(sessionId, "", "alfe", tenantId, userId);
347
+ await addMessage(sessionId, "user", message);
348
+ let resolvedOpenClawKey = null;
345
349
  const unsubscribe = runtime.events.onAgentEvent((evt) => {
346
350
  if (!evt.sessionKey) return;
347
- if (resolvedSessionKey && evt.sessionKey !== resolvedSessionKey) return;
348
- if (evt.stream === "assistant") chatClient?.sendEvent("chat", {
351
+ if (evt.stream !== "assistant") return;
352
+ resolvedOpenClawKey ??= evt.sessionKey;
353
+ if (evt.sessionKey !== resolvedOpenClawKey) return;
354
+ chatClient?.sendEvent("chat", {
349
355
  runId: evt.runId,
350
- sessionKey: evt.sessionKey,
356
+ sessionKey: legacySessionKey,
351
357
  seq: evt.seq,
352
358
  state: "delta",
353
359
  message: evt.data
@@ -355,7 +361,7 @@ async function handleAgentRequest(request, log) {
355
361
  });
356
362
  try {
357
363
  const conversationLabel = userId ? `Chat with ${userId}` : `Alfe chat`;
358
- resolvedSessionKey = (await dispatchInbound({
364
+ resolvedOpenClawKey = (await dispatchInbound({
359
365
  cfg,
360
366
  runtime: { channel: runtime.channel },
361
367
  channel: "alfe",
@@ -377,12 +383,13 @@ async function handleAgentRequest(request, log) {
377
383
  ...clientType ? { ClientType: clientType } : {},
378
384
  ...conversationId ? { ConversationId: conversationId } : {}
379
385
  },
380
- deliver: (payload) => {
386
+ deliver: async (payload) => {
387
+ const responseText = payload.text ?? "";
388
+ await addMessage(sessionId, "assistant", responseText);
381
389
  chatClient?.sendResponse(request.id, true, {
382
- text: payload.text ?? "",
383
- sessionKey: resolvedSessionKey
390
+ text: responseText,
391
+ sessionKey: resolvedOpenClawKey ?? legacySessionKey
384
392
  });
385
- return Promise.resolve();
386
393
  },
387
394
  onRecordError: (err) => {
388
395
  log.error(`Session record error: ${err instanceof Error ? err.message : String(err)}`);
@@ -391,7 +398,7 @@ async function handleAgentRequest(request, log) {
391
398
  log.error(`Dispatch error (${info.kind}): ${err instanceof Error ? err.message : String(err)}`);
392
399
  }
393
400
  })).route.sessionKey;
394
- log.info(`Agent dispatch complete: sessionKey=${resolvedSessionKey}`);
401
+ log.info(`Agent dispatch complete: sessionKey=${resolvedOpenClawKey}`);
395
402
  } catch (err) {
396
403
  const errMsg = err instanceof Error ? err.message : String(err);
397
404
  log.error(`Agent dispatch failed: ${errMsg}`);
@@ -400,6 +407,49 @@ async function handleAgentRequest(request, log) {
400
407
  unsubscribe();
401
408
  }
402
409
  }
410
+ async function handleSessionsList(request, log) {
411
+ try {
412
+ const params = request.params;
413
+ const sessions = await listSessions({
414
+ channel: params.channel,
415
+ tenantId: params.tenantId
416
+ });
417
+ chatClient?.sendResponse(request.id, true, { sessions });
418
+ } catch (err) {
419
+ const errMsg = err instanceof Error ? err.message : String(err);
420
+ log.error(`sessions.list failed: ${errMsg}`);
421
+ chatClient?.sendResponse(request.id, false, { message: errMsg });
422
+ }
423
+ }
424
+ async function handleSessionsGet(request, log) {
425
+ try {
426
+ const params = request.params;
427
+ const session = await getSession(params.sessionId);
428
+ if (!session) {
429
+ chatClient?.sendResponse(request.id, true, {
430
+ ok: false,
431
+ error: "Session not found"
432
+ });
433
+ return;
434
+ }
435
+ chatClient?.sendResponse(request.id, true, {
436
+ sessionId: session.sessionId,
437
+ agentId: session.agentId,
438
+ channel: session.channel,
439
+ createdAt: session.createdAt,
440
+ messages: session.messages.map((m) => ({
441
+ id: `msg-${String(m.timestamp)}`,
442
+ role: m.role,
443
+ content: m.content,
444
+ timestamp: m.timestamp
445
+ }))
446
+ });
447
+ } catch (err) {
448
+ const errMsg = err instanceof Error ? err.message : String(err);
449
+ log.error(`sessions.get failed: ${errMsg}`);
450
+ chatClient?.sendResponse(request.id, false, { message: errMsg });
451
+ }
452
+ }
403
453
  const plugin = {
404
454
  id: "@alfe.ai/openclaw-chat",
405
455
  name: "Alfe Chat Plugin",
@@ -419,7 +469,7 @@ const plugin = {
419
469
  api.registerChannel(alfeChannel);
420
470
  log.info(`Registered channel: ${alfeChannel.id}`);
421
471
  const pluginConfig = (((api.config ?? {}).plugins?.entries)?.["@alfe.ai/openclaw-chat"] ?? {}).config ?? {};
422
- (async () => {
472
+ connectingPromise = (async () => {
423
473
  try {
424
474
  const { apiKey, chatWsUrl } = await resolveAlfeChat({
425
475
  apiKey: pluginConfig.apiKey,
@@ -432,6 +482,9 @@ const plugin = {
432
482
  apiKey,
433
483
  onRequest: (request) => {
434
484
  if (request.method === "agent") handleAgentRequest(request, log);
485
+ else if (request.method === "sessions.list") handleSessionsList(request, log);
486
+ else if (request.method === "sessions.get") handleSessionsGet(request, log);
487
+ else chatClient?.sendResponse(request.id, false, { message: `Unknown method: ${request.method}` });
435
488
  },
436
489
  onConnectionChange: (connected) => {
437
490
  log.info(`Chat service connection: ${connected ? "connected" : "disconnected"}`);
@@ -449,7 +502,6 @@ const plugin = {
449
502
  api.registerGatewayMethod("sessions.list", async (...args) => {
450
503
  const params = args[0];
451
504
  return { sessions: await listSessions({
452
- agentId: params.agentId,
453
505
  channel: params.channel,
454
506
  tenantId: params.tenantId
455
507
  }) };
@@ -478,14 +530,14 @@ const plugin = {
478
530
  }
479
531
  api.on("session_start", async (...eventArgs) => {
480
532
  const key = eventArgs[0].sessionKey;
481
- if (!key || !isAlfeSessionKey(key)) return;
482
- log.info(`Alfe chat session starting: ${key}`);
533
+ if (!key || isAlfeSessionKey(key)) return;
534
+ log.info(`Chat session starting: ${key}`);
483
535
  await createSession(key, "", "alfe");
484
536
  }, { priority: 50 });
485
537
  api.on("message", async (...eventArgs) => {
486
538
  const event = eventArgs[0];
487
539
  const key = event.sessionKey;
488
- if (!key || !isAlfeSessionKey(key)) return;
540
+ if (!key || isAlfeSessionKey(key)) return;
489
541
  await addMessage(key, event.role, event.content);
490
542
  });
491
543
  api.on("session_end", (...eventArgs) => {
@@ -495,10 +547,16 @@ const plugin = {
495
547
  });
496
548
  log.info("Alfe Chat plugin registered");
497
549
  },
498
- deactivate(api) {
550
+ async deactivate(api) {
499
551
  globalThis.__alfeChatPluginActivated = false;
500
552
  const log = api.logger;
501
553
  log.info("Alfe Chat plugin deactivating...");
554
+ if (connectingPromise) {
555
+ await connectingPromise.catch((err) => {
556
+ api.logger.debug(`Connection attempt failed: ${err instanceof Error ? err.message : String(err)}`);
557
+ });
558
+ connectingPromise = null;
559
+ }
502
560
  if (chatClient) {
503
561
  chatClient.stop();
504
562
  chatClient = null;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@alfe.ai/openclaw-chat",
3
- "version": "0.0.8",
3
+ "version": "0.0.10",
4
4
  "description": "OpenClaw chat plugin for Alfe — web widget and mobile app channels",
5
5
  "type": "module",
6
6
  "main": "./dist/plugin.js",