跳转至

Announce 队列

子 agent 向父 session 推送通知的专用队列,带指数退避。

源文件: src/agents/subagent-announce-queue.ts (306 行)


架构

sequenceDiagram
    participant Sub as 子 Agent
    participant AQ as AnnounceQueueState
    participant Parent as 父 Session

    Sub->>AQ: enqueue(announceItem)
    AQ->>AQ: shouldDefer? (父 session 忙?)
    alt 父 session 忙
        AQ->>AQ: 等待 MAX_DEFER_WHILE_BUSY_MS (15s)
    end
    AQ->>Parent: send(item)
    alt 发送失败
        AQ->>AQ: consecutiveFailures++
        AQ->>AQ: 指数退避 (最大 60s)
        AQ->>Parent: 重试
    end

核心数据结构

src/agents/subagent-announce-queue.ts L19-57:

export type AnnounceQueueItem = {
  announceId?: string;
  prompt: string;
  summaryLine?: string;
  internalEvents?: AgentInternalEvent[];
  enqueuedAt: number;
  sessionKey: string;
  origin?: DeliveryContext;
  sourceSessionKey?: string;
  sourceChannel?: string;
  sourceTool?: string;
};

type AnnounceQueueState = {
  items: AnnounceQueueItem[];
  draining: boolean;
  lastEnqueuedAt: number;
  mode: QueueMode;
  debounceMs: number;
  cap: number;
  dropPolicy: QueueDropPolicy;
  send: (item: AnnounceQueueItem) => Promise<void>;
  shouldDefer?: (item: AnnounceQueueItem) => boolean;
  consecutiveFailures: number;  // 驱动指数退避
};

关键特性

  • per-session 隔离:每个父 session 独立队列
  • 延迟发送shouldDefer 检查父 session 是否忙,最大等 15s
  • 指数退避:失败后退避重试,最大 60s
  • 与 Followup 队列共享工具函数beginQueueDrainwaitForQueueDebounce