UNPKG

autosnippet

Version:

Extract code patterns into a knowledge base for AI coding assistants

274 lines (273 loc) 8.49 kB
/** * Policies — Agent 执行约束 (横切关注点) * * Policy 不改变 Agent 做什么,而是约束 Agent 如何做。 * 多个 Policy 可叠加,形成复合约束。 * * 三类 Policy: * 1. BudgetPolicy — 资源预算 (迭代次数 / Token / 时间) * 2. SafetyPolicy — 安全沙箱 (命令黑名单 / 文件范围 / 发送者鉴权) * 3. QualityGatePolicy — 质量门控 (证据数量 / 分析深度) * * 这就是为什么"飞书远程执行"不需要独立 Agent: * 它只是 Conversation + SystemInteraction + SafetyPolicy 的组合。 * SafetyPolicy 提供命令沙箱,而不是由 LarkBridgeAgent 硬编码。 * * @module policies */ /** 执行前校验的上下文 */ export interface PolicyContext { message?: { sender?: { id?: string; }; }; [key: string]: unknown; } /** 执行步骤状态 */ export interface StepState { iteration: number; startTime: number; [key: string]: unknown; } /** Agent 执行结果 */ export interface PolicyResult { reply?: string; toolCalls?: unknown[]; [key: string]: unknown; } /** SafetyPolicy 构造选项 */ export interface SafetyPolicyOptions { fileScope?: string; allowedSenders?: string[]; commandBlacklist?: RegExp[]; requireApprovalFor?: string[]; } /** QualityGatePolicy 构造选项 */ export interface QualityGatePolicyOptions { minEvidenceLength?: number; minFileRefs?: number; minToolCalls?: number; customValidator?: (result: PolicyResult) => { ok: boolean; reason?: string; }; } /** Policy 基类 — 所有约束的抽象接口 */ export declare class Policy { /** 策略名称 */ get name(): string; /** 执行前校验 — 拒绝不满足条件的请求 */ validateBefore(_context: PolicyContext): { ok: boolean; reason?: string; }; /** 执行中校验 — 每轮 ReAct 步骤后检查 */ validateDuring(_stepState: StepState): { ok: boolean; action?: string; reason?: string; }; /** 执行后校验 — 对最终结果质量把关 */ validateAfter(_result: PolicyResult): { ok: boolean; reason?: string; }; /** 修改配置 — 在执行前注入额外约束 */ applyToConfig(config: Record<string, unknown>): Record<string, unknown>; } /** * 控制 Agent 的资源消耗上限。 * * 适用于所有场景,不同 Preset 配置不同预算: * - 聊天: { maxIterations: 8, timeoutMs: 120_000 } * - 深度分析: { maxIterations: 24, timeoutMs: 300_000 } * - 冷启动: { maxIterations: 24, timeoutMs: 600_000 } * - 远程执行: { maxIterations: 6, timeoutMs: 60_000 } */ export declare class BudgetPolicy extends Policy { #private; constructor({ maxIterations, maxTokens, timeoutMs, temperature, }?: { maxIterations?: number | undefined; maxTokens?: number | undefined; timeoutMs?: number | undefined; temperature?: number | undefined; }); get name(): string; get maxIterations(): number; get maxTokens(): number; get timeoutMs(): number; get temperature(): number; validateDuring(stepState: StepState): { ok: boolean; action: string; reason: string; } | { ok: boolean; action: string; reason?: undefined; }; applyToConfig(config: Record<string, unknown>): { budget: { maxIterations: number; maxTokens: number; timeoutMs: number; temperature: number; }; }; } /** * 安全约束: 命令过滤、文件范围限制、发送者鉴权。 * * 这取代了旧 LarkBridgeAgent 中硬编码的安全逻辑: * - SafetyPolicy 是可组合的、可配置的、可复用的 * - 任何需要安全约束的场景都可以叠加这个 Policy * - 不局限于飞书场景 — CLI 远程执行同样适用 */ export declare class SafetyPolicy extends Policy { #private; /** 危险命令正则黑名单 */ static DANGEROUS_COMMANDS: readonly RegExp[]; /** 安全命令前缀白名单 */ static SAFE_COMMANDS: readonly string[]; /** * @param [opts.fileScope] 文件操作范围 (目录路径) * @param [opts.allowedSenders] 允许的发送者 ID (空=不限制) * @param [opts.commandBlacklist] 额外命令黑名单 * @param [opts.requireApprovalFor] 需要人工确认的工具名 */ constructor({ fileScope, allowedSenders, commandBlacklist, requireApprovalFor, }?: SafetyPolicyOptions); get name(): string; validateBefore(context: PolicyContext): { ok: boolean; reason: string; } | { ok: boolean; reason?: undefined; }; /** * 检查命令是否安全 * @returns } */ checkCommand(command: string): { safe: boolean; reason: string; } | { safe: boolean; reason?: undefined; }; /** * 检查文件路径是否在允许范围内 * @returns } */ checkFilePath(filePath: string): { safe: boolean; reason?: undefined; } | { safe: boolean; reason: string; }; /** 是否需要人工确认 */ needsApproval(toolName: string): boolean; applyToConfig(config: Record<string, unknown>): Record<string, unknown>; } /** * 评估 Agent 输出质量,决定是否接受结果。 * * 用于 Pipeline 的 gate 阶段,也可用于最终结果校验。 * 取代了旧 BootstrapOrchestrator 中硬编码的 qualityCheck。 */ export declare class QualityGatePolicy extends Policy { #private; /** * @param [opts.minEvidenceLength=500] 分析文本最小长度 * @param [opts.minFileRefs=3] 最少文件引用数 * @param [opts.minToolCalls=2] 最少工具调用数 * @param [opts.customValidator] 自定义校验 (result) => { ok, reason } */ constructor({ minEvidenceLength, minFileRefs, minToolCalls, customValidator, }?: QualityGatePolicyOptions); get name(): string; validateAfter(result: PolicyResult): { ok: boolean; reason?: undefined; } | { ok: boolean; reason: string; }; /** 导出为 PipelineStrategy gate 配置格式 */ toGateConfig(): { minEvidenceLength: number; minFileRefs: number; minToolCalls: number; custom: ((result: PolicyResult) => { ok: boolean; reason?: string; }) | null; }; } /** * 组合多个 Policy 并统一执行校验。 * * @example * const engine = new PolicyEngine([ * new BudgetPolicy({ maxIterations: 8 }), * new SafetyPolicy({ fileScope: '/project' }), * ]); * engine.validateBefore(context); // 所有 policy 依次检查 */ export declare class PolicyEngine { #private; constructor(policies?: Policy[]); get policies(): Policy[]; /** * 获取特定类型的 Policy * @template T */ get<T extends Policy>(PolicyClass: abstract new (...args: never[]) => T): T | null; validateBefore(context: PolicyContext): { ok: boolean; reason?: string; }; validateDuring(stepState: StepState): { ok: boolean; action?: string; reason?: string; }; validateAfter(result: PolicyResult): { ok: boolean; reason?: string; }; applyToConfig(config: Record<string, unknown>): Record<string, unknown>; /** 获取合并后的 Budget (从 BudgetPolicy) */ getBudget(): { maxIterations: number; maxTokens: number; timeoutMs: number; temperature: number; } | null; /** * 工具执行前的安全校验 — 在 reactLoop 中每次工具调用前自动触发 * * 对有副作用的工具 (run_safe_command, write_project_file) 执行安全检查。 * 委托给 SafetyPolicy,如果没有加载 SafetyPolicy 则放行。 * * @param toolName 工具名称 * @param args 工具参数 * @returns } */ validateToolCall(toolName: string, args: Record<string, unknown>): { ok: boolean; reason?: undefined; } | { ok: boolean; reason: string; }; } declare const _default: { Policy: typeof Policy; BudgetPolicy: typeof BudgetPolicy; SafetyPolicy: typeof SafetyPolicy; QualityGatePolicy: typeof QualityGatePolicy; PolicyEngine: typeof PolicyEngine; }; export default _default;