From 752f765132bc5bf54c14e9cb4b8f6196af2dc2ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=8F=E5=A2=A8?= Date: Mon, 13 Apr 2026 08:07:58 +0000 Subject: [PATCH] feat(dispatcher): object name mapping for human-readable summaries MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Config adds names: { '3': '小墨 🖊️', '5': '小橘 🍊' } Summary now shows '由 小墨 🖊️ 创建' instead of 'agent:3' Added task_assigned and task_commented to summary format --- packages/dispatcher/src/scheduler.ts | 19 +++++++++++++++++-- packages/dispatcher/src/types.ts | 1 + 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/packages/dispatcher/src/scheduler.ts b/packages/dispatcher/src/scheduler.ts index 83d3cb1..111ba01 100644 --- a/packages/dispatcher/src/scheduler.ts +++ b/packages/dispatcher/src/scheduler.ts @@ -11,6 +11,7 @@ function ts(): string { export class OcScheduler { private running = false; private timer: ReturnType | null = null; + private readonly names: Record; constructor( private readonly config: DispatcherConfig, @@ -18,7 +19,9 @@ export class OcScheduler { private readonly pending: Map, /** Agent clients for pushing events */ private readonly agentClients: AgentClient[], - ) {} + ) { + this.names = config.names ?? {}; + } start(): void { if (this.running) return; @@ -151,6 +154,12 @@ export class OcScheduler { } } + /** Resolve object id to human-readable name */ + private resolveName(id: unknown): string { + const key = String(id); + return this.names[key] ?? `#${key}`; + } + private buildEventSummary(entries: PendingEntry[], events: OGraphEvent[]): string { const lines: string[] = ['📋 OGraph Event Stream Updates']; @@ -160,10 +169,16 @@ export class OcScheduler { // Format based on event type if (event.type_name === 'task_created') { const payload = event.payload as any; - lines.push(`📋 新任务: #${payload.subject} ${payload.title || '(无标题)'} (${payload.priority || 'normal'}) — 由 agent:${payload.creator || '?'} 创建`); + lines.push(`📋 新任务: #${payload.subject} ${payload.title || '(无标题)'} (${payload.priority || 'normal'}) — 由 ${this.resolveName(payload.creator)} 创建`); + } else if (event.type_name === 'task_assigned') { + const payload = event.payload as any; + lines.push(`📋 任务 #${payload.subject} 分配给 ${this.resolveName(payload.assignee)}`); } else if (event.type_name === 'task_status_changed') { const payload = event.payload as any; lines.push(`📋 #${payload.subject} 状态更新: → ${payload.status}`); + } else if (event.type_name === 'task_commented') { + const payload = event.payload as any; + lines.push(`💬 ${this.resolveName(payload.author)} 评论了任务 #${payload.subject}: 「${payload.content}」`); } else { lines.push(`• ${event.type_name} #${event.id} (${age}s ago)`); } diff --git a/packages/dispatcher/src/types.ts b/packages/dispatcher/src/types.ts index 30960e1..1af28f8 100644 --- a/packages/dispatcher/src/types.ts +++ b/packages/dispatcher/src/types.ts @@ -29,6 +29,7 @@ export interface DispatcherConfig { minAvailable: number; // 最少空闲槽位(默认 2) }; agents?: AgentConfig[]; // 新的 AgentClient 配置 + names?: Record; // object id → 可读名字(如 "3": "小墨 🖊️") intervals: { watcherIdle: number; // 无变化时 poll 间隔 ms(默认 30000) watcherActive: number; // 有变化时 poll 间隔 ms(默认 5000)