fix: Chat SDK bridge delivery and typing for non-Discord adapters

- Use platformId directly as thread ID in deliver() and setTyping()
  instead of calling encodeThreadId with Discord-shaped args — platformId
  is already in the adapter's encoded format (e.g. "telegram:6037840640")
- Add triggerTyping() in delivery.ts, call from router on message route
- Enable Telegram channel in barrel
- Verified E2E: Telegram message in → agent → typing indicator → response

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
gavrielc
2026-04-09 13:36:45 +03:00
parent 57a6491c7e
commit d656b5ccc1
6 changed files with 23 additions and 8 deletions

View File

@@ -1,6 +1,6 @@
# Andy # Main
You are Andy, a personal assistant. You help with tasks, answer questions, and can schedule reminders. You are Main, a personal assistant. You help with tasks, answer questions, and can schedule reminders.
## What You Can Do ## What You Can Do

View File

@@ -1,6 +1,6 @@
# Andy # Main
You are Andy, a personal assistant. You help with tasks, answer questions, and can schedule reminders. You are Main, a personal assistant. You help with tasks, answer questions, and can schedule reminders.
## What You Can Do ## What You Can Do

View File

@@ -162,7 +162,9 @@ export function createChatSdkBridge(config: ChatSdkBridgeConfig): ChannelAdapter
}, },
async deliver(platformId: string, threadId: string | null, message) { async deliver(platformId: string, threadId: string | null, message) {
const tid = threadId ?? adapter.encodeThreadId({ guildId: '', channelId: platformId } as never); // platformId is already in the adapter's encoded format (e.g. "telegram:6037840640",
// "discord:guildId:channelId") — use it directly as the thread ID
const tid = threadId ?? platformId;
const content = message.content as Record<string, unknown>; const content = message.content as Record<string, unknown>;
if (content.operation === 'edit' && content.messageId) { if (content.operation === 'edit' && content.messageId) {
@@ -210,7 +212,7 @@ export function createChatSdkBridge(config: ChatSdkBridgeConfig): ChannelAdapter
}, },
async setTyping(platformId: string, threadId: string | null) { async setTyping(platformId: string, threadId: string | null) {
const tid = threadId ?? adapter.encodeThreadId({ guildId: '', channelId: platformId } as never); const tid = threadId ?? platformId;
await adapter.startTyping(tid); await adapter.startTyping(tid);
}, },

View File

@@ -8,7 +8,7 @@ import './discord.js';
// import './slack.js'; // import './slack.js';
// telegram // telegram
// import './telegram.js'; import './telegram.js';
// github // github
// import './github.js'; // import './github.js';

View File

@@ -42,6 +42,15 @@ export function setDeliveryAdapter(adapter: ChannelDeliveryAdapter): void {
deliveryAdapter = adapter; deliveryAdapter = adapter;
} }
/** Show typing indicator on a channel. Called when a message is routed to the agent. */
export async function triggerTyping(channelType: string, platformId: string, threadId: string | null): Promise<void> {
try {
await deliveryAdapter?.setTyping?.(channelType, platformId, threadId);
} catch {
// Typing is best-effort — don't fail routing if it errors
}
}
/** Start the active container poll loop (~1s). */ /** Start the active container poll loop (~1s). */
export function startActiveDeliveryPoll(): void { export function startActiveDeliveryPoll(): void {
if (activePolling) return; if (activePolling) return;

View File

@@ -5,6 +5,7 @@
* → resolve/create session → write messages_in → wake container * → resolve/create session → write messages_in → wake container
*/ */
import { getMessagingGroupByPlatform, createMessagingGroup, getMessagingGroupAgents } from './db/messaging-groups.js'; import { getMessagingGroupByPlatform, createMessagingGroup, getMessagingGroupAgents } from './db/messaging-groups.js';
import { triggerTyping } from './delivery.js';
import { log } from './log.js'; import { log } from './log.js';
import { resolveSession, writeSessionMessage } from './session-manager.js'; import { resolveSession, writeSessionMessage } from './session-manager.js';
import { wakeContainer } from './container-runner.js'; import { wakeContainer } from './container-runner.js';
@@ -99,7 +100,10 @@ export async function routeInbound(event: InboundEvent): Promise<void> {
created, created,
}); });
// 5. Wake container // 5. Show typing indicator while agent processes
triggerTyping(event.channelType, event.platformId, event.threadId);
// 6. Wake container
const freshSession = getSession(session.id); const freshSession = getSession(session.id);
if (freshSession) { if (freshSession) {
await wakeContainer(freshSession); await wakeContainer(freshSession);