UNPKG

autosnippet

Version:

Extract code patterns into a knowledge base for AI coding assistants

183 lines (182 loc) 5.98 kB
/** * BootstrapTaskManager 冷启动异步任务管理器 * * 核心职责: * 1. 管理 bootstrap 异步任务的生命周期(skeleton filling completed) * 2. 通过 EventBus 发射进度事件 * 3. 通过 RealtimeService 推送进度到前端 (Socket.io) * 4. 支持查询当前 bootstrap 会话状态 * * 任务状态流: * skeleton filling completed / failed * * 事件类型: * bootstrap:started 冷启动开始,携带任务清单 * bootstrap:task-started 单个维度/Skill 开始填充 * bootstrap:task-completed 单个维度/Skill 填充完成 * bootstrap:task-failed 单个任务失败 * bootstrap:all-completed 全部任务完成 */ import type { EventBus } from '../../infrastructure/event/EventBus.js'; import type { SignalBus } from '../../infrastructure/signal/SignalBus.js'; interface TaskMeta { type?: string; dimId?: string; label?: string; skillWorthy?: boolean; [key: string]: unknown; } interface TaskInfo { id: string; status: string; meta: TaskMeta; startedAt: number | null; completedAt: number | null; result: Record<string, unknown> | null; error: string | null; } interface TaskDef { id: string; meta: TaskMeta; } interface BootstrapTaskManagerOpts { eventBus?: EventBus | null; signalBus?: SignalBus | null; getRealtimeService?: (() => { broadcastEvent(name: string, data: unknown): void; } | null) | null; } /** 任务状态枚举 */ export declare const TaskStatus: Readonly<{ SKELETON: "skeleton"; FILLING: "filling"; COMPLETED: "completed"; FAILED: "failed"; }>; /** 单个 Bootstrap 会话(一次冷启动的全部上下文) */ declare class BootstrapSession { completedAt: number | null; id: string; startedAt: number; status: string; summary: Record<string, unknown> | null; tasks: Map<string, TaskInfo>; constructor(sessionId: string); addTask(taskId: string, meta: TaskMeta): void; getTask(taskId: string): TaskInfo | undefined; get totalTasks(): number; get completedTasks(): number; get failedTasks(): number; get fillingTasks(): number; get skeletonTasks(): number; get isAllDone(): boolean; get totalToolCalls(): number; get progress(): number; toJSON(): { id: string; status: string; startedAt: number; completedAt: number | null; progress: number; total: number; completed: number; failed: number; filling: number; skeleton: number; totalToolCalls: number; tasks: { id: string; status: string; meta: TaskMeta; startedAt: number | null; completedAt: number | null; result: Record<string, unknown> | null; error: string | null; }[]; summary: Record<string, unknown> | null; }; } export declare class BootstrapTaskManager { #private; constructor({ eventBus, signalBus, getRealtimeService }?: BootstrapTaskManagerOpts); /** * 启动新的 bootstrap 会话 * * 如果上一个会话仍在运行,自动 abort 后再创建新会话(防止重复触发产出重复 Candidate)。 * * @param taskDefs 任务定义列表 */ startSession(taskDefs: TaskDef[]): BootstrapSession; /** * 中止当前 bootstrap 会话 * * 将所有未完成的任务标记为 failed,并将 session 标记为 aborted。 * 异步填充函数通过 `isSessionValid(sessionId)` 检测到 session 已变更后自动退出。 * * @param [reason='Aborted by user'] */ abortSession(reason?: string): void; /** * 获取当前 session AbortSignal * * 用于传入 AgentRuntime.execute(),使得 abortSession() 可以立即中断正在执行的 AI 调用, * 而不是等到下一个维度边界才检测到取消。 */ getSessionAbortSignal(): AbortSignal | null; /** * 验证 sessionId 是否仍然是活跃 session * * 用于异步填充函数在每次循环迭代前检测:如果 session 已被新请求覆盖, * 则当前异步填充应立即停止,避免产出重复内容。 */ isSessionValid(sessionId: string): boolean; /** 标记单个任务开始填充 */ markTaskFilling(taskId: string): void; /** * 标记单个任务完成 * @param result 填充结果摘要 { created, items, ... } */ markTaskCompleted(taskId: string, result?: Record<string, unknown>): void; /** 标记单个任务失败 */ markTaskFailed(taskId: string, error: unknown): void; /** 获取当前 session 状态(供 HTTP 轮询) */ getSessionStatus(): { id: string; status: string; startedAt: number; completedAt: number | null; progress: number; total: number; completed: number; failed: number; filling: number; skeleton: number; totalToolCalls: number; tasks: { id: string; status: string; meta: TaskMeta; startedAt: number | null; completedAt: number | null; result: Record<string, unknown> | null; error: string | null; }[]; summary: Record<string, unknown> | null; } | { status: string; message: string; }; /** 是否有正在进行的 bootstrap */ get isRunning(): boolean; /** * EventBus + Socket.io 发射任意进度事件 * * 用途:不走 bootstrap session 模型的长操作(如 AI 润色)也能复用 * 同一套 EventBus + RealtimeService 双通道推送。 * * @param eventName 事件名(如 'refine:started' * @param data 事件负载 */ emitProgress(eventName: string, data: unknown): void; } export {};