autosnippet
Version:
Extract code patterns into a knowledge base for AI coding assistants
183 lines (182 loc) • 5.98 kB
TypeScript
/**
* 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 {};