page-agent-sdk 4.12.0 → 4.13.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -0
- package/README.zh-CN.md +2 -0
- package/dist/page-agent-sdk.headless.js +756 -755
- package/package.json +2 -1
- package/types/headless.d.ts +556 -36
- package/types/index.d.ts +523 -38
package/types/headless.d.ts
CHANGED
|
@@ -5,7 +5,14 @@
|
|
|
5
5
|
* 不含 13 个 .vue 组件声明(ChatDialog/MessageContent/CodePreview/SkillPanel/ChatHeader/ChatInput/MessageList/MessageRow/QueuedBar/ApprovalBar/ConflictBar/FocusBar/DebugDrawer)。
|
|
6
6
|
* 由 types/index.d.ts 派生(删组件 declare + 去 DefineComponent import),保持与主类型同步,防漂移。
|
|
7
7
|
*/
|
|
8
|
-
|
|
8
|
+
// ===== vue 类型内联桩(E2 API 面收口,2026-09-09 audit-remediation)=====
|
|
9
|
+
// d.ts 不再 import 'vue':未装 vue 的 TS 项目(纯 headless 集成)也能完整解析本声明文件,Ref 字段不再退化为 error type。
|
|
10
|
+
// 桩形状与 vue 3.x 公开类型结构兼容(Ref = { value };InjectionKey = symbol 接口,与 vue 源码同式;DefineComponent = 构造器形态)。
|
|
11
|
+
// 已知限制:真 vue 项目把 ChatDialog 等直接塞进 SFC components:{} 时,vue-tsc 期望真 DefineComponent —— SDK 定位
|
|
12
|
+
// mount() 挂载式对话框(框架无关),直接组件复用是次级路径;需要时集成方自行 as 断言。详见 usage-guide 依赖说明。
|
|
13
|
+
type Ref<T = any> = { value: T };
|
|
14
|
+
type InjectionKey<T> = symbol & { __pgInjType?: T };
|
|
15
|
+
type DefineComponent<P = any> = { new (...args: any[]): { $props?: P; [key: string]: any } };
|
|
9
16
|
export { z } from 'zod';
|
|
10
17
|
|
|
11
18
|
// 代理连接模块(防 apiKey 泄露:proxy 代理模式 / direct 直连模式)
|
|
@@ -28,6 +35,10 @@ export interface ConstructOpts {
|
|
|
28
35
|
}
|
|
29
36
|
/** 同步构造 OpenAI 协议 LLM(仅 openai 分支;Anthropic 无同步构造,用 constructLlmFromConfig) */
|
|
30
37
|
export declare function constructOpenLlmSync(cfg: LLMConfig, opts?: ConstructOpts): import('@langchain/core/language_models/chat_models').BaseChatModel;
|
|
38
|
+
/** baseUrl 容错归一:相对路径('/llm/v1' 同源代理用法)补 location.origin 成绝对 URL(openai/anthropic SDK 的 new URL 不收相对路径);非浏览器/绝对路径原样 */
|
|
39
|
+
export declare function normalizeBaseUrl(baseUrl: string | undefined): string | undefined;
|
|
40
|
+
/** 默认 fetch 包装:剥 x-stainless-* 遥测头(严格 CORS 网关预检兼容);集成方 extraConfig.fetch 可覆盖 */
|
|
41
|
+
export declare function stripStainlessFetch(url: string | URL | Request, init?: RequestInit): Promise<Response>;
|
|
31
42
|
/** 按 provider 分支构造 LLM(openai 同步 / anthropic 动态 import @langchain/anthropic);缺省 provider → openai */
|
|
32
43
|
export declare function constructLlmFromConfig(cfg: LLMConfig, opts?: ConstructOpts): Promise<import('@langchain/core/language_models/chat_models').BaseChatModel>;
|
|
33
44
|
/** 从流式 chunk 提取文本 delta(兼容 OpenAI string content 与 Anthropic parts 数组) */
|
|
@@ -126,15 +137,33 @@ export interface AgentState {
|
|
|
126
137
|
error: string | null;
|
|
127
138
|
}
|
|
128
139
|
|
|
140
|
+
/** 流式事件,由 Agent 在流式生成过程中逐个抛出(与 src/core/types 同步;approval_request 仅流内,不进 onEvent) */
|
|
129
141
|
export type StreamEvent =
|
|
130
142
|
| { type: 'round_start'; round: number }
|
|
131
143
|
| { type: 'reasoning'; delta: string }
|
|
132
144
|
| { type: 'text'; delta: string }
|
|
133
145
|
| { type: 'tool_call'; name: string; args: any; id?: string }
|
|
134
|
-
| { type: 'tool_result'; name: string; result: string; status: 'done' | 'error'; id?: string }
|
|
135
|
-
| { type: 'subagent'; taskId: string; label: string; kind: 'tool_call' | 'tool_result'; name: string; args?: any; result?: string; status?: 'done' | 'error';
|
|
146
|
+
| { type: 'tool_result'; name: string; result: string; status: 'done' | 'error'; durationMs?: number; id?: string }
|
|
147
|
+
| { type: 'subagent'; taskId: string; label: string; kind: 'tool_call' | 'tool_result' | 'reasoning'; name: string; args?: any; result?: string; status?: 'done' | 'error'; delta?: string; toolCallId?: string }
|
|
148
|
+
| { type: 'approval_request'; toolName: string; args: any; resolve: (approved: boolean | string) => void; hold?: () => void; preview?: ApprovalWritePreview }
|
|
136
149
|
| { type: 'done'; content: string };
|
|
137
150
|
|
|
151
|
+
/** write 审批 diff 预览的单条条目(ui-quick-wins Q3;headless 补充声明供 StreamEvent 引用) */
|
|
152
|
+
export interface ApprovalPreviewItem {
|
|
153
|
+
op?: string;
|
|
154
|
+
jsonPath?: string;
|
|
155
|
+
oldSummary?: string;
|
|
156
|
+
newSummary?: string;
|
|
157
|
+
}
|
|
158
|
+
/** write 审批 diff 预览结果(三意图只读计算,dryRun 纯函数通道不落盘) */
|
|
159
|
+
export interface ApprovalWritePreview {
|
|
160
|
+
ok: boolean;
|
|
161
|
+
intent: 'set' | 'edit' | 'delete';
|
|
162
|
+
items: ApprovalPreviewItem[];
|
|
163
|
+
/** ok=false 时的校验失败说明(预览即看到会被拒的原因) */
|
|
164
|
+
error?: string;
|
|
165
|
+
}
|
|
166
|
+
|
|
138
167
|
export type StreamHandler = (event: StreamEvent) => void;
|
|
139
168
|
|
|
140
169
|
/**
|
|
@@ -147,8 +176,8 @@ export type SdkEvent =
|
|
|
147
176
|
| { type: 'reasoning'; delta: string }
|
|
148
177
|
| { type: 'text'; delta: string }
|
|
149
178
|
| { type: 'tool_call'; name: string; args: any; id?: string }
|
|
150
|
-
| { type: 'tool_result'; name: string; result: string; status: 'done' | 'error'; id?: string }
|
|
151
|
-
| { type: 'subagent'; taskId: string; label: string; kind: 'tool_call' | 'tool_result'; name: string; args?: any; result?: string; status?: 'done' | 'error'; toolCallId?: string }
|
|
179
|
+
| { type: 'tool_result'; name: string; result: string; status: 'done' | 'error'; durationMs?: number; id?: string }
|
|
180
|
+
| { type: 'subagent'; taskId: string; label: string; kind: 'tool_call' | 'tool_result' | 'reasoning'; name: string; args?: any; result?: string; status?: 'done' | 'error'; delta?: string; toolCallId?: string }
|
|
152
181
|
| { type: 'done'; content: string }
|
|
153
182
|
| { type: 'data_change'; operation: 'set' | 'edit' | 'delete' | 'restore'; value?: unknown }
|
|
154
183
|
| { type: 'message_update'; count: number }
|
|
@@ -165,6 +194,10 @@ export interface TokenUsage {
|
|
|
165
194
|
prompt_tokens?: number;
|
|
166
195
|
completion_tokens?: number;
|
|
167
196
|
total_tokens?: number;
|
|
197
|
+
/** prompt caching 命中读取的 input tokens(Anthropic;0/缺省=未命中或端点不支持缓存) */
|
|
198
|
+
cache_read_input_tokens?: number;
|
|
199
|
+
/** prompt caching 本次写入的 input tokens(Anthropic;写价格 1.25x,5m/1h TTL 内复用) */
|
|
200
|
+
cache_creation_input_tokens?: number;
|
|
168
201
|
/** 推理/思考 token 数(completion 子集,展示为占比;OpenAI 兼容可得,Anthropic 当前依赖栈不暴露则省略) */
|
|
169
202
|
reasoning_tokens?: number;
|
|
170
203
|
}
|
|
@@ -196,6 +229,8 @@ export interface DebugLog {
|
|
|
196
229
|
timestamp: number;
|
|
197
230
|
type: 'context' | 'llm_request' | 'llm_response' | 'tool_call' | 'tool_result' | 'error' | 'middleware';
|
|
198
231
|
data: any;
|
|
232
|
+
/** 日志来源(主 agent 省;子 agent 转发时为 '子:label',便于区分) */
|
|
233
|
+
source?: string;
|
|
199
234
|
}
|
|
200
235
|
|
|
201
236
|
/** ChatDialog 区块显隐控制(chatdialog-component-split):键=区块,false 关闭整块(含 slot);默认 undefined=全开 */
|
|
@@ -389,7 +424,7 @@ export interface ContextSnapshot {
|
|
|
389
424
|
/** 分类明细(按 tokens 降序) */
|
|
390
425
|
categories: ContextCategory[];
|
|
391
426
|
/** 最近一次压缩统计(复用 state.lastCompression) */
|
|
392
|
-
compression?:
|
|
427
|
+
compression?: CompressionStats;
|
|
393
428
|
}
|
|
394
429
|
/** analyzeContext 选项(context-inspector) */
|
|
395
430
|
export interface AnalyzeContextOptions {
|
|
@@ -464,7 +499,62 @@ export interface ChatContext {
|
|
|
464
499
|
export declare const chatContextKey: InjectionKey<ChatContext>;
|
|
465
500
|
export declare function createChatContext(opts?: ChatContextOptions): ChatContext;
|
|
466
501
|
export declare function useChatContext(): ChatContext;
|
|
467
|
-
|
|
502
|
+
/** useChat 选项(自定义 fetcher/持久化回调/共享 messages 引用;E1 API 面收口,与 src composables/useChat 对齐) */
|
|
503
|
+
export interface UseChatOptions {
|
|
504
|
+
fetchResponse?: (messages: AgentMessage[], signal?: AbortSignal) => Promise<string>;
|
|
505
|
+
fetchStream?: (messages: AgentMessage[], onEvent: StreamHandler, signal?: AbortSignal) => Promise<string>;
|
|
506
|
+
/** 外部共享的消息数组(持久化恢复时传入,与父级共用同一响应式引用) */
|
|
507
|
+
messages?: AgentMessage[];
|
|
508
|
+
/** 一轮对话完成后回调(用于持久化;可返回 Promise,sendMessage 会 await 确保落盘后再关 loading) */
|
|
509
|
+
onPersist?: (messages: AgentMessage[]) => void | Promise<void>;
|
|
510
|
+
/** 清空对话时回调(用于新建会话) */
|
|
511
|
+
onClear?: () => void;
|
|
512
|
+
/** stop() 清空排队任务时回调(丢弃条数与内容由消费方记日志,防无声丢失) */
|
|
513
|
+
onQueuedCleared?: (dropped: string[]) => void;
|
|
514
|
+
/** regenerate 前回调(清代码资产复用缓存,强制子 agent 重新生成而非复用工作副本) */
|
|
515
|
+
onBeforeRegenerate?: () => void;
|
|
516
|
+
/** 取当前实时焦点(排队任务开始执行时快照进 user 消息;与 invoke-freeze 生效口径一致) */
|
|
517
|
+
getFocuses?: () => Focus[];
|
|
518
|
+
}
|
|
519
|
+
/** 挂起的审批(approval 中间件 ask-first;UI 据此渲染审批条,resolveApproval 收口) */
|
|
520
|
+
export interface PendingApproval {
|
|
521
|
+
toolName: string;
|
|
522
|
+
args: any;
|
|
523
|
+
resolve: (approved: boolean | string) => void;
|
|
524
|
+
/** write 审批 diff 预览(approval_request 载荷透传;无则 undefined 走 args JSON 兜底呈现) */
|
|
525
|
+
preview?: ApprovalWritePreview;
|
|
526
|
+
}
|
|
527
|
+
/** useChat 返回(对话状态 + 操作;自建 UI 直接用) */
|
|
528
|
+
export interface UseChatReturn {
|
|
529
|
+
/** 对话状态(messages/loading/error,reactive) */
|
|
530
|
+
state: AgentState;
|
|
531
|
+
/** 消息列表容器 DOM 引用(自动滚动) */
|
|
532
|
+
scrollContainer: Ref<HTMLElement | null>;
|
|
533
|
+
/** 挂起的审批 */
|
|
534
|
+
pendingApproval: Ref<PendingApproval | null>;
|
|
535
|
+
/** 排队待发的任务内容(生成中再发 → 入队显示在排队区) */
|
|
536
|
+
queuedTasks: Ref<string[]>;
|
|
537
|
+
/** 发送(生成中再发 → 入排队区;images 需主模型多模态或 images.describe 配置,否则拒绝并 emit 结构化错误不静默丢图) */
|
|
538
|
+
sendMessage(content: string, focuses?: Focus[], images?: AgentImage[]): Promise<void>;
|
|
539
|
+
/** 手动撤销排队任务 */
|
|
540
|
+
removeQueuedTask(idx: number): void;
|
|
541
|
+
/** 清空对话(onClear 回调) */
|
|
542
|
+
clearMessages(): void;
|
|
543
|
+
/** 停止当前生成(abort 保留 partial + 清排队) */
|
|
544
|
+
stop(): void;
|
|
545
|
+
/** 重置(state 清空 + pendingApproval 收口) */
|
|
546
|
+
reset(): void;
|
|
547
|
+
/** 重试失败轮(移除失败 user/assistant 占位后重发) */
|
|
548
|
+
retry(): Promise<void>;
|
|
549
|
+
/** 重新生成最后一轮(onBeforeRegenerate 清复用缓存) */
|
|
550
|
+
regenerate(): Promise<void>;
|
|
551
|
+
/** 审批响应(true/false 或 RHC 方案 id 字符串) */
|
|
552
|
+
resolveApproval(approved: boolean | string): void;
|
|
553
|
+
/** 滚动绑定(保留给 @scroll;sticky 由 onWheel 管) */
|
|
554
|
+
onScroll(): void;
|
|
555
|
+
onWheel(e: WheelEvent): void;
|
|
556
|
+
}
|
|
557
|
+
export declare function useChat(opts?: UseChatOptions): UseChatReturn;
|
|
468
558
|
|
|
469
559
|
// ===== 框架无关 SDK(页面内 Agent)=====
|
|
470
560
|
export interface LLMConfig {
|
|
@@ -990,7 +1080,7 @@ export interface ChatSdk {
|
|
|
990
1080
|
/** 列出当前 agent 的所有历史会话(供「历史列表」UI;storage 未开启 → []) */
|
|
991
1081
|
listSessions(): Promise<SessionMeta[]>;
|
|
992
1082
|
/** 历史会话列表(响应式;switchSession/deleteSession/onClear/init 后自动 refresh;直接消费无需手动 listSessions/refresh/hook) */
|
|
993
|
-
readonly sessions:
|
|
1083
|
+
readonly sessions: Ref<SessionMeta[]>;
|
|
994
1084
|
/** 删除指定历史会话;不可删除当前会话(删当前请先 switchSession 切走);storage 未开启 → no-op + warn */
|
|
995
1085
|
deleteSession(sessionId: string): Promise<void>;
|
|
996
1086
|
/** 当前会话 id(switchSession/onClear 后实时反映;供历史列表高亮当前项) */
|
|
@@ -1147,6 +1237,8 @@ export declare function createChatSdk(options: ChatSdkOptions): ChatSdk;
|
|
|
1147
1237
|
// ============ system prompt 构建(promptBuilder,refactor-module-extraction 从 createChatSdk 抽离)============
|
|
1148
1238
|
/** 默认 systemPrompt(用户未传 systemPrompt 时用);含身份 + 能力概述 + 可靠写入规则 */
|
|
1149
1239
|
export declare const DEFAULT_SYSTEM_PROMPT: string;
|
|
1240
|
+
/** 内置默认 systemPrompt 英文版(dialog.locale:'en-US' 时 buildSystemPrompt 自动使用) */
|
|
1241
|
+
export declare const DEFAULT_SYSTEM_PROMPT_EN: string;
|
|
1150
1242
|
/** 拼接「可操作数据」段(从 data schema .describe() 自动提取注入) */
|
|
1151
1243
|
export declare function buildDataPrompt(data: DataConfig | undefined, schemaHint?: SchemaHintOptions): string;
|
|
1152
1244
|
/**
|
|
@@ -1202,6 +1294,8 @@ export declare function restoreLive(bind: any, snapshotVal: unknown): void;
|
|
|
1202
1294
|
export declare function restoreInPlace(live: Record<string, unknown> | unknown[], snapshotVal: unknown): void;
|
|
1203
1295
|
/** 深度差异对比(对象/数组递归,叶子差异),返回 {path, from, to}[];供 diff_data / verify 自纠 / 审计复用 */
|
|
1204
1296
|
export declare function diffObjects(a: unknown, b: unknown, prefix?: string): { path: string; from: unknown; to: unknown }[];
|
|
1297
|
+
/** 数组元素移动(同数组重排/跨数组移动,一步原子;write patch op 'move' 的内核纯函数) */
|
|
1298
|
+
export declare function moveByPath(root: any, jsonPath: string, toPath: unknown): string | null;
|
|
1205
1299
|
/** 收集「本次新增却被 schema strip 静默剥离」的键路径(before 已有/宿主自管键不标;数组原样元素整体跳过防 move/remove 位移误判) */
|
|
1206
1300
|
export declare function findStrippedKeys(before: unknown, after: unknown, parsed: unknown, prefix?: string): string[];
|
|
1207
1301
|
// ============ schema 白名单投影纯函数(schemaUtils,refactor-module-extraction 从 dataOps 抽离)============
|
|
@@ -1278,7 +1372,7 @@ export declare function resolveLlm(options: any): { modelCaps: any; summaryLlmIn
|
|
|
1278
1372
|
export declare function deriveTitle(msgs: AgentMessage[]): string | undefined;
|
|
1279
1373
|
// ============ 乐观锁冲突管理器(conflictManager,refactor-module-extraction 期二 从 createChatSdk 抽离)============
|
|
1280
1374
|
export interface ConflictManager {
|
|
1281
|
-
pendingConflict:
|
|
1375
|
+
pendingConflict: Ref<any | null>;
|
|
1282
1376
|
set(info: any): Promise<any>;
|
|
1283
1377
|
resolve(action: any): void;
|
|
1284
1378
|
}
|
|
@@ -1396,10 +1490,179 @@ export declare const domInspectSkill: SkillSpec;
|
|
|
1396
1490
|
export declare const fetchTools: any[];
|
|
1397
1491
|
export declare function defineDataToolset(config: DataConfig, opts?: DataOpsOptions): any[];
|
|
1398
1492
|
export declare function defineSkill(spec: SkillSpec): SkillSpec;
|
|
1399
|
-
|
|
1493
|
+
/** createAgent 选项(ReAct 循环 + 中间件 harness;createChatSdk 之下的层,集成方可直接用;E1 API 面收口) */
|
|
1494
|
+
export interface CreateAgentOptions {
|
|
1495
|
+
/** 预构造的 LLM 实例(任意 provider);提供则优先于 apiKey/model 配置 */
|
|
1496
|
+
llm?: import('@langchain/core/language_models/chat_models').BaseChatModel;
|
|
1497
|
+
apiKey?: string;
|
|
1498
|
+
baseUrl?: string;
|
|
1499
|
+
model?: string;
|
|
1500
|
+
temperature?: number;
|
|
1501
|
+
maxTokens?: number;
|
|
1502
|
+
/** 集成方显式声明模型上下文窗口(token);缺省按 model 名查表,再缺省 32K。影响 offload 阈值与压缩触发 */
|
|
1503
|
+
contextWindow?: number;
|
|
1504
|
+
/** 集成方显式声明模型最大输出(token);缺省按 model 名查表,再缺省 4K。maxTokens 未传时作其缺省 */
|
|
1505
|
+
maxOutputTokens?: number;
|
|
1506
|
+
/** 透传 modelKwargs:额外请求 body 参数(如 deepseek thinking)。仅按配置构造时生效 */
|
|
1507
|
+
extraBody?: Record<string, any>;
|
|
1508
|
+
/** 透传 configuration 额外字段(headers/timeout/customFetch),与 baseUrl 合并。仅按配置构造时生效 */
|
|
1509
|
+
extraConfig?: Record<string, any>;
|
|
1510
|
+
systemPrompt?: string;
|
|
1511
|
+
/** 用户自定义工具(与中间件贡献的工具合并) */
|
|
1512
|
+
tools?: import('@langchain/core/tools').StructuredToolInterface[];
|
|
1513
|
+
/** 中间件栈(顺序:内置在前,用户在后) */
|
|
1514
|
+
middleware?: Middleware[];
|
|
1515
|
+
maxToolRounds?: number;
|
|
1516
|
+
/** 会话是否具备子 agent 委派能力(轮次预算提醒 70% 档按此感知;false 不点名 spawn_agent 等不存在的工具) */
|
|
1517
|
+
hasSubagent?: boolean;
|
|
1518
|
+
/** 循环总迭代硬上限(防自纠死循环;默认 max(maxToolRounds*3, 30)) */
|
|
1519
|
+
maxIterations?: number;
|
|
1520
|
+
/** 模型调用失败自动重试次数(默认 2;网络/429/5xx 重试,4xx 与 abort 不重试) */
|
|
1521
|
+
maxRetries?: number;
|
|
1522
|
+
/** 重试退避基数 ms(默认 500,第 n 次重试等待 = base*2^n + jitter) */
|
|
1523
|
+
retryDelayMs?: number;
|
|
1524
|
+
/** LLM 流停滞看门狗:chunk 间隔(含等首个)超此 ms → 中断抛错。默认 90s;0 = 关闭 */
|
|
1525
|
+
stallMs?: number;
|
|
1526
|
+
/** 单次模型调用流总时长上限(防空转帧黑洞)。默认 1800s(2026-08-28 抬升:100K+ 输出长生成需 20min+);0 = 关闭 */
|
|
1527
|
+
streamMaxMs?: number;
|
|
1528
|
+
/** per-tool 看门狗:单工具执行超此 ms → recoverable 错误回灌自纠。只对集成方注入工具生效(内置/委派/冲突挂起豁免);默认 120s;0 = 关闭 */
|
|
1529
|
+
toolTimeoutMs?: number;
|
|
1530
|
+
/** 同轮多个工具调用的并发上限(默认 1 = 串行);>1 时并发执行 */
|
|
1531
|
+
maxParallelTools?: number;
|
|
1532
|
+
/** beforeReturn 自纠上限(默认 0 = 关闭,纯放行);>0 时 agent 返回前跑 beforeReturn 钩子 */
|
|
1533
|
+
maxVerifyAttempts?: number;
|
|
1534
|
+
/** 单次 invoke 的 token 预算上限(0=关;超限 → 中断收口 observable,已完成部分保留) */
|
|
1535
|
+
roundTokenBudget?: number;
|
|
1536
|
+
/** 日志下沉:每条 debugLog 产生时回调(子 agent 经此把日志转发到主 debugLogs) */
|
|
1537
|
+
onLog?: (entry: DebugLog) => void;
|
|
1538
|
+
/** 子 agent 标记(子栈门禁据此豁免:子纯文本收口是正常形态) */
|
|
1539
|
+
__pgIsSubagent?: boolean;
|
|
1540
|
+
/** LLM 运行时切换回调(setLlm 后触发,供重解析模型能力 contextWindow/maxOutputTokens) */
|
|
1541
|
+
onLlmChange?: (newLlm: import('@langchain/core/language_models/chat_models').BaseChatModel) => void;
|
|
1542
|
+
/** 显式声明主模型是否多模态识图(声明 > 查表 > 缺省 false) */
|
|
1543
|
+
vision?: boolean;
|
|
1544
|
+
/** content parts 协议形态(默认 'openai' LangChain 标准多模态格式;'anthropic' 原生 image block) */
|
|
1545
|
+
imageContentFormat?: 'openai' | 'anthropic';
|
|
1546
|
+
/** 写驱动过期读失效(默认 true);false = 主/子一致关闭 */
|
|
1547
|
+
staleReadInvalidation?: boolean;
|
|
1548
|
+
debug?: boolean;
|
|
1549
|
+
}
|
|
1550
|
+
/** createAgent 返回实例(headless/高级集成直接驱动的面) */
|
|
1551
|
+
export interface AgentInstance {
|
|
1552
|
+
/** 单次对话 invoke(完整 ReAct 循环,返回最终文本) */
|
|
1553
|
+
invoke(messages: AgentMessage[], signal?: AbortSignal, onEvent?: StreamHandler): Promise<string>;
|
|
1554
|
+
/** 流式对话(事件逐个 onEvent,返回最终文本) */
|
|
1555
|
+
stream(messages: AgentMessage[], onEvent: StreamHandler, signal?: AbortSignal): Promise<string>;
|
|
1556
|
+
/** 运行态快照(messages/todos/files/mission/focuses 等) */
|
|
1557
|
+
getState(): HarnessState;
|
|
1558
|
+
/** 全部工具(getter:setTools 后重赋值,始终取最新) */
|
|
1559
|
+
readonly allTools: import('@langchain/core/tools').StructuredToolInterface[];
|
|
1560
|
+
/** stale-read-invalidation 会话累计失效数 */
|
|
1561
|
+
getStaleReadsInvalidated(): number;
|
|
1562
|
+
/** 模型调用重试会话累计(环境故障 vs SDK 回归的第一判据) */
|
|
1563
|
+
getLlmRetries(): number;
|
|
1564
|
+
getLlmCallFailures(): number;
|
|
1565
|
+
/** 会话切换/重置时清零(stale-read + 重试/终败三计数) */
|
|
1566
|
+
resetSessionCounters(): void;
|
|
1567
|
+
/** 运行时重设用户工具(与中间件贡献工具合并) */
|
|
1568
|
+
setTools(userTools: import('@langchain/core/tools').StructuredToolInterface[]): void;
|
|
1569
|
+
/** 运行时切换 LLM 实例(替换 + rebind + onLlmChange 回调;新模型不支持 tool calling 时退裸 llm 不崩) */
|
|
1570
|
+
setLlm(newLlm: import('@langchain/core/language_models/chat_models').BaseChatModel): void;
|
|
1571
|
+
/** setLlm 后回灌模型能力(contextWindow/maxOutputTokens) */
|
|
1572
|
+
setModelCaps(newCaps: ModelCaps): void;
|
|
1573
|
+
/** 调试日志(响应式;FIFO ≤300,单条体积守卫) */
|
|
1574
|
+
debugLogs: Ref<DebugLog[]>;
|
|
1575
|
+
/** 内部权威拼装的最终 system prompt(base + Σ augmentPrompt,单一真相源) */
|
|
1576
|
+
getEffectiveSystemPrompt(): string;
|
|
1577
|
+
}
|
|
1578
|
+
export declare function createAgent(options: CreateAgentOptions): AgentInstance;
|
|
1400
1579
|
/** 检测模型把工具调用写成文本(伪 XML/标签)而非标准 tool_calls 的异常格式;主循环据此回灌 feedback 自纠 */
|
|
1401
1580
|
export declare function detectGarbledToolCall(content: string): boolean;
|
|
1402
|
-
|
|
1581
|
+
/** 剥离 garbled 工具调用文本,只保留首个强守卫标记出现前的正常 prose(wrap-up/重试耗尽路径防 DSML 原文当结论返回) */
|
|
1582
|
+
export declare function sanitizeGarbledContent(content: string): string;
|
|
1583
|
+
/** 检测过程性收口(短文本 + 过渡模式如「我先看看…稍后委派」+ 无完成动词)—— createAgent 据此有界回灌(≤2) */
|
|
1584
|
+
export declare function detectTransitionalReply(content: string): boolean;
|
|
1585
|
+
/** 子 agent LLM 配置(createSubagentMiddleware/子 agent 走 LLMConfig 构造时的模型面) */
|
|
1586
|
+
export interface SubagentLlmConfig {
|
|
1587
|
+
apiKey: string;
|
|
1588
|
+
/** provider 透传:缺省 'openai';'anthropic' 子 agent 同走 Claude 原生协议(动态 import 异步构造) */
|
|
1589
|
+
provider?: 'openai' | 'anthropic';
|
|
1590
|
+
baseUrl?: string;
|
|
1591
|
+
model?: string;
|
|
1592
|
+
temperature?: number;
|
|
1593
|
+
maxTokens?: number;
|
|
1594
|
+
/** 透传 openai configuration 额外字段(headers/fetch 等;子 agent 兜底构造时同主 LLM 生效) */
|
|
1595
|
+
extraConfig?: Record<string, any>;
|
|
1596
|
+
/** 透传 modelKwargs(如 deepseek thinking);子 agent 兜底构造时同主 LLM 生效 */
|
|
1597
|
+
extraBody?: Record<string, any>;
|
|
1598
|
+
/** Anthropic prompt caching(provider:'anthropic' 时经构造透传生效) */
|
|
1599
|
+
cacheControl?: boolean | '5m' | '1h';
|
|
1600
|
+
/** Anthropic extended thinking(provider:'anthropic');通常不手配 —— 用 thinkingMode:'deep' 自动注入 */
|
|
1601
|
+
thinking?: { type: 'enabled'; budget_tokens: number };
|
|
1602
|
+
}
|
|
1603
|
+
/** createSubagentMiddleware 选项(spawn_agent 的运行时覆盖参数是 spawn 工具 zod args,非此类型) */
|
|
1604
|
+
export interface SubagentOptions {
|
|
1605
|
+
/** 主 agent 的 LLM(配置对象或预构造实例,子 agent 复用) */
|
|
1606
|
+
llm: SubagentLlmConfig | import('@langchain/core/language_models/chat_models').BaseChatModel;
|
|
1607
|
+
/** 主 agent 全部工具(子 agent 按白名单筛选只读子集);支持 getter:setTools 动态加的工具对子 agent 立即可见 */
|
|
1608
|
+
allTools: import('@langchain/core/tools').StructuredToolInterface[] | (() => import('@langchain/core/tools').StructuredToolInterface[]);
|
|
1609
|
+
/** 子 agent 额外可用的工具名(默认仅只读主数据 + fetch) */
|
|
1610
|
+
allowedTools?: string[];
|
|
1611
|
+
/** 子 agent 默认身份(spawn 运行时的 role 优先;都缺省用兜底) */
|
|
1612
|
+
systemPrompt?: string;
|
|
1613
|
+
/** 子 agent 温度(仅 llm 配置对象时生效;覆盖主 llm 温度) */
|
|
1614
|
+
temperature?: number;
|
|
1615
|
+
/** 子 agent maxTokens(仅 llm 配置对象时生效;覆盖主) */
|
|
1616
|
+
maxTokens?: number;
|
|
1617
|
+
/** 子 agent 专属 skills(独立,不继承主 agent skills) */
|
|
1618
|
+
skills?: SkillSpec[];
|
|
1619
|
+
/** 子 agent 额外工具(直接进工具池,不经 allTools 白名单筛选;供预声明子 agent 的专属 tools) */
|
|
1620
|
+
extraTools?: import('@langchain/core/tools').StructuredToolInterface[];
|
|
1621
|
+
/** 最大递归深度(默认 1:主可 spawn,子不可再 spawn) */
|
|
1622
|
+
maxDepth?: number;
|
|
1623
|
+
/** spawn_agents 并发上限(默认 4) */
|
|
1624
|
+
maxParallel?: number;
|
|
1625
|
+
/** 子 agent 最大工具轮次(默认 6) */
|
|
1626
|
+
maxToolRounds?: number;
|
|
1627
|
+
/** 当前递归深度(内部用;主=0) */
|
|
1628
|
+
depth?: number;
|
|
1629
|
+
debug?: boolean;
|
|
1630
|
+
/** 子 agent 可写路径前缀白名单(写工具包 path guard,越界 PATH_OUT_OF_SCOPE;整体 set 禁) */
|
|
1631
|
+
writablePaths?: string[];
|
|
1632
|
+
/** 读主 agent 全部焦点(multi-focus:子 agent 继承主焦点 → 构造 initialFocuses) */
|
|
1633
|
+
getFocuses?: () => Focus[];
|
|
1634
|
+
/** 取主数据 schema getter(focus 视野收敛 + path 校验用;透传主 liveData schema) */
|
|
1635
|
+
getSchema?: () => import('zod').ZodType | null | undefined;
|
|
1636
|
+
/** 取主数据 bind getter(focus 尾部追加分判:读数组实际长度;透传主 liveData bind) */
|
|
1637
|
+
getBind?: () => unknown;
|
|
1638
|
+
/** 子 agent 自定义中间件(如给规划能力);装在 skills/递归/focus 之后,对齐主「内置→用户」序 */
|
|
1639
|
+
middleware?: Middleware[];
|
|
1640
|
+
/** 跨轮上下文压缩;true=默认索引摘要(零 LLM),或 SummarizationOptions 自配(含 llmInvoke 升级 LLM 摘要)。不传=不装 */
|
|
1641
|
+
summarization?: boolean | SummarizationOptions;
|
|
1642
|
+
/** 观察层 tracker(createChatSdk 注入共享实例;记录委派 active/history)。不传=不记录 */
|
|
1643
|
+
tracker?: SubagentTracker;
|
|
1644
|
+
/** 子栈继承的把关中间件(主 permissions/approval 同实例;序同主栈)。不传=无 guard */
|
|
1645
|
+
guardMiddleware?: Middleware[];
|
|
1646
|
+
/** 主 vfs files getter(子 offload 大结果桥接进主 vfs 共享池,子 vfs_* 回读不 404)。不传=无桥接 */
|
|
1647
|
+
getVfsFiles?: () => Record<string, VfsFile>;
|
|
1648
|
+
/** 进入数据 scope(子 agent 委派期间 autoLock 基线归属切到子 scope,防子 read 污染主基线)。返回恢复函数 */
|
|
1649
|
+
enterDataScope?: (scopeId: string) => () => void;
|
|
1650
|
+
/** 退出数据 scope(委派结束清子 scope 基线条目) */
|
|
1651
|
+
exitDataScope?: (scopeId: string) => void;
|
|
1652
|
+
/** 子流 settle 通知(内部 per-call:use_<id> 组件锁的 release 挂此点,防超时旧 wind-down 与重委派竞态) */
|
|
1653
|
+
onStreamSettled?: (p: Promise<unknown>) => void;
|
|
1654
|
+
/** 子 agent LLM usage 回传(createChatSdk 累加进 core.usage)。不传=不回传 */
|
|
1655
|
+
onUsage?: (u: TokenUsage) => void;
|
|
1656
|
+
/** 单个子 agent 执行超时 ms(超时 abort 子流 + recoverable 回灌;0/负 = 关) */
|
|
1657
|
+
timeoutMs?: number;
|
|
1658
|
+
/** beforeReturn 自纠上限(默认 0 = 关闭);>0 时子 agent 返回前跑中间件 beforeReturn 钩子(如 verify 格式门禁) */
|
|
1659
|
+
maxVerifyAttempts?: number;
|
|
1660
|
+
/** 思考深度锁定('deep' 注入 thinking / 'simple' 剥除)。仅 LLMConfig 构造路径生效;实例路径 warn + no-op */
|
|
1661
|
+
thinkingMode?: 'simple' | 'deep';
|
|
1662
|
+
/** 写驱动过期读失效透传(顶层 false 必须主/子一致;未设 = 子 agent 默认 true 与主一致) */
|
|
1663
|
+
staleReadInvalidation?: boolean;
|
|
1664
|
+
}
|
|
1665
|
+
export declare function createSubagentMiddleware(opts: SubagentOptions): Middleware;
|
|
1403
1666
|
export declare function createVerifyMiddleware(opts: VerifyMiddlewareOptions): any;
|
|
1404
1667
|
export declare function createWriteBackCheck(opts?: WriteBackCheckOptions): VerifyCheck;
|
|
1405
1668
|
export declare function createMemoryMiddleware(memory?: string | (() => string | Promise<string>)): any;
|
|
@@ -1532,7 +1795,12 @@ export declare function agentError(severity: ErrorSeverity, message: string, cod
|
|
|
1532
1795
|
|
|
1533
1796
|
// === 与 src/core/index.ts 导出对齐(消费者类型完整;复杂内部类型用宽松声明,消费者主要消费工厂返回值) ===
|
|
1534
1797
|
// 上下文压缩预设
|
|
1535
|
-
|
|
1798
|
+
/** createChatSdk/contextPreset 的压缩配置入口形态 */
|
|
1799
|
+
export interface ContextOptionsInput {
|
|
1800
|
+
contextPreset?: ContextPreset;
|
|
1801
|
+
contextOptions?: Partial<ContextManagerOptions> | false;
|
|
1802
|
+
}
|
|
1803
|
+
export declare function resolveContextOptions(options: ContextOptionsInput, modelContextWindow: number): Partial<ContextManagerOptions>;
|
|
1536
1804
|
export type ContextPreset = 'auto' | 'conservative' | 'aggressive' | 'complex';
|
|
1537
1805
|
export declare const CONTEXT_PRESETS: Record<string, any>;
|
|
1538
1806
|
|
|
@@ -1542,13 +1810,168 @@ export declare function extractText(result: any): string;
|
|
|
1542
1810
|
export type McpTransport = 'http' | 'sse' | 'websocket';
|
|
1543
1811
|
export interface McpConnection { [k: string]: any }
|
|
1544
1812
|
|
|
1545
|
-
// harness / 中间件
|
|
1546
|
-
|
|
1547
|
-
export
|
|
1548
|
-
|
|
1549
|
-
export interface
|
|
1550
|
-
|
|
1551
|
-
|
|
1813
|
+
// ===== harness / 中间件(E1 API 面收口:真实签名投射,与 src/core/harness 逐字段对齐;types-alignment Same<> 门禁锁定) =====
|
|
1814
|
+
/** todo 状态 */
|
|
1815
|
+
export type TodoStatus = 'pending' | 'in_progress' | 'completed';
|
|
1816
|
+
/** 计划项(write_todos 整表替换 + update_todo 增量更新) */
|
|
1817
|
+
export interface Todo {
|
|
1818
|
+
/** 稳定标识:write_todos 时框架按 index 生成 t-1/t-2…(LLM 也可显式传);输出必有、输入可选(向后兼容) */
|
|
1819
|
+
id: string;
|
|
1820
|
+
content: string;
|
|
1821
|
+
status: TodoStatus;
|
|
1822
|
+
/** 父 todo id(表达层级;可选) */
|
|
1823
|
+
parentId?: string;
|
|
1824
|
+
/** 依赖的 todo id 数组(必须先完成;渲染标 ✓/⏳) */
|
|
1825
|
+
deps?: string[];
|
|
1826
|
+
/** 完成标准(可选,LLM 自填) */
|
|
1827
|
+
criteria?: string;
|
|
1828
|
+
/** 完成证据(可选,如实际写入的 jsonPath) */
|
|
1829
|
+
evidence?: string;
|
|
1830
|
+
}
|
|
1831
|
+
|
|
1832
|
+
/** 虚拟工作区文件 */
|
|
1833
|
+
export interface VfsFile {
|
|
1834
|
+
content: string;
|
|
1835
|
+
mimeType?: string;
|
|
1836
|
+
updatedAt: number;
|
|
1837
|
+
}
|
|
1838
|
+
|
|
1839
|
+
/** skill 元数据(渐进式披露的索引层) */
|
|
1840
|
+
export interface SkillMeta {
|
|
1841
|
+
name: string;
|
|
1842
|
+
description: string;
|
|
1843
|
+
}
|
|
1844
|
+
|
|
1845
|
+
/** 上下文压缩事件(cutoff-event 模式:不删消息,记录截断点 + 摘要) */
|
|
1846
|
+
export interface SummarizationEvent {
|
|
1847
|
+
cutoffIndex: number;
|
|
1848
|
+
summary: string;
|
|
1849
|
+
evictedTo?: string;
|
|
1850
|
+
}
|
|
1851
|
+
|
|
1852
|
+
/** 单次 invoke 的执行进度(agent 自感知预算的数据源;中间件只读勿改) */
|
|
1853
|
+
export interface LoopProgress {
|
|
1854
|
+
/** 已消耗工具轮次 */
|
|
1855
|
+
rounds: number;
|
|
1856
|
+
/** 本 invoke 工具轮预算(maxToolRounds) */
|
|
1857
|
+
maxToolRounds: number;
|
|
1858
|
+
/** 本 invoke 累计 token 用量(每轮模型调用后累加;与 sdk.usage 会话级口径区分) */
|
|
1859
|
+
invokeUsage: { prompt_tokens: number; completion_tokens: number; total_tokens: number };
|
|
1860
|
+
/** 写工具同路径连续失败计数(path → 次数;写成功清零) */
|
|
1861
|
+
writeFailures: Record<string, number>;
|
|
1862
|
+
/** 预算提示是否已注入(每任务一次,防每轮复读刷存在感) */
|
|
1863
|
+
budgetHinted: boolean;
|
|
1864
|
+
}
|
|
1865
|
+
|
|
1866
|
+
/** Harness 运行态(中间件维护 state 字段,last-writer 合并;Deep Agents 的 agent state 同位物) */
|
|
1867
|
+
export interface HarnessState {
|
|
1868
|
+
/** 用户层对话历史(跨轮) */
|
|
1869
|
+
messages: AgentMessage[];
|
|
1870
|
+
/** 计划清单(planning 中间件维护) */
|
|
1871
|
+
todos: Todo[];
|
|
1872
|
+
/** 内存虚拟工作区(vfs 中间件维护) */
|
|
1873
|
+
files: Record<string, VfsFile>;
|
|
1874
|
+
/** 已注册 skill 的索引(name + description),注入 system prompt */
|
|
1875
|
+
skillsMetadata: SkillMeta[];
|
|
1876
|
+
/** 已加载全文的 skill 名(避免重复加载) */
|
|
1877
|
+
skillsLoaded: string[];
|
|
1878
|
+
/** AGENTS.md 风格持久指令 */
|
|
1879
|
+
memory: string;
|
|
1880
|
+
/** 上下文压缩事件(summarization 中间件维护) */
|
|
1881
|
+
summarization?: SummarizationEvent;
|
|
1882
|
+
/** 最近一次跨轮压缩统计(createAgent 写入,供 DebugDrawer 可观测) */
|
|
1883
|
+
lastCompression?: CompressionStats;
|
|
1884
|
+
/** beforeReturn 自纠计数(达 maxVerifyAttempts 强制 return 防死循环) */
|
|
1885
|
+
verifyAttempts: number;
|
|
1886
|
+
/** 子 agent 标记(spawn/use 委派建的子循环置 true;主栈门禁据此豁免) */
|
|
1887
|
+
__pgIsSubagent?: boolean;
|
|
1888
|
+
/** 会话级任务目标锚定(mission 中间件;augmentPrompt 每轮注入,天然跨压缩) */
|
|
1889
|
+
mission?: Mission;
|
|
1890
|
+
/** 跨压缩工作记忆(workingMemory 中间件;pin 最近定位 path + read hash) */
|
|
1891
|
+
workingMemory?: WorkingMemory;
|
|
1892
|
+
/** 聚焦焦点(focus=首个兼容旧读,focuses=全量数组 multi-focus) */
|
|
1893
|
+
focus?: Focus;
|
|
1894
|
+
focuses?: Focus[];
|
|
1895
|
+
/** 当前 invoke 的执行进度(createAgent 每轮更新) */
|
|
1896
|
+
loopProgress?: LoopProgress;
|
|
1897
|
+
}
|
|
1898
|
+
|
|
1899
|
+
/** 模型调用请求 */
|
|
1900
|
+
export interface ModelRequest {
|
|
1901
|
+
messages: import('@langchain/core/messages').BaseMessage[];
|
|
1902
|
+
state: HarnessState;
|
|
1903
|
+
}
|
|
1904
|
+
|
|
1905
|
+
/** 模型调用响应 */
|
|
1906
|
+
export interface ModelResponse {
|
|
1907
|
+
message: import('@langchain/core/messages').BaseMessage;
|
|
1908
|
+
toolCalls: Array<{ id?: string; name: string; args: Record<string, unknown> }>;
|
|
1909
|
+
content: string;
|
|
1910
|
+
/** 模型流被 abort(用户停止):true 时 content 为已累积的 partial,应保留并结束本轮(不再执行工具) */
|
|
1911
|
+
aborted?: boolean;
|
|
1912
|
+
}
|
|
1913
|
+
|
|
1914
|
+
/** beforeReturn 钩子上下文(agent 即将返回最终结果前) */
|
|
1915
|
+
export interface BeforeReturnContext {
|
|
1916
|
+
messages: import('@langchain/core/messages').BaseMessage[];
|
|
1917
|
+
state: HarnessState;
|
|
1918
|
+
response: ModelResponse;
|
|
1919
|
+
/** 日志下沉:写主 debugLogs(verify 对抗审查等用它记录可观察日志) */
|
|
1920
|
+
log?: (type: string, data: unknown) => void;
|
|
1921
|
+
}
|
|
1922
|
+
|
|
1923
|
+
/** beforeReturn 钩子:返回 feedback 字符串 → 回灌 user 消息继续循环(自纠);null/undefined → 放行 return */
|
|
1924
|
+
export type BeforeReturnHook = (ctx: BeforeReturnContext) => Promise<string | null> | string | null;
|
|
1925
|
+
|
|
1926
|
+
/** 中间件返回的 state 更新(last-writer 合并) */
|
|
1927
|
+
export type StateUpdate = Partial<HarnessState>;
|
|
1928
|
+
|
|
1929
|
+
/** 工具执行结果 */
|
|
1930
|
+
export interface ToolExecResult {
|
|
1931
|
+
content: string;
|
|
1932
|
+
status: 'done' | 'error';
|
|
1933
|
+
}
|
|
1934
|
+
|
|
1935
|
+
/** 工具调用上下文 */
|
|
1936
|
+
export interface ToolCallContext {
|
|
1937
|
+
id: string;
|
|
1938
|
+
name: string;
|
|
1939
|
+
args: Record<string, unknown>;
|
|
1940
|
+
state: HarnessState;
|
|
1941
|
+
/** 当前 agent 循环的 abort signal(中间件可据此感知用户停止) */
|
|
1942
|
+
signal?: AbortSignal;
|
|
1943
|
+
/** 主循环事件转发(供 spawn 把子 agent 进度冒泡到 UI;不进入主 LLM 上下文) */
|
|
1944
|
+
emit?: (event: StreamEvent) => void;
|
|
1945
|
+
/** 日志下沉(供 spawn 把子 agent 的 debugLog 转发到主;子日志带 source 标签) */
|
|
1946
|
+
logSink?: (entry: any) => void;
|
|
1947
|
+
/** per-call 注入 bag:中间件在 wrapToolCall 往 ctx 写键值,coreExecTool 经 RunnableConfig.configurable 透传到工具 fn 第二参 */
|
|
1948
|
+
callConfig?: Record<string, unknown>;
|
|
1949
|
+
}
|
|
1950
|
+
|
|
1951
|
+
export interface Middleware {
|
|
1952
|
+
name: string;
|
|
1953
|
+
/** 该中间件贡献的工具,合并进工具集 */
|
|
1954
|
+
tools?: import('@langchain/core/tools').StructuredToolInterface[];
|
|
1955
|
+
/** 追加到 system prompt 的段(每轮模型调用前收集渲染) */
|
|
1956
|
+
augmentPrompt?: (state: HarnessState) => string | undefined;
|
|
1957
|
+
/** 构建上下文前压缩历史消息(summarization 中间件用,链式) */
|
|
1958
|
+
compressInput?: (messages: AgentMessage[]) => Promise<{ messages: AgentMessage[]; stats?: unknown }> | AgentMessage[];
|
|
1959
|
+
/** agent 启动时(正序) */
|
|
1960
|
+
beforeAgent?: (state: HarnessState) => StateUpdate | void | Promise<StateUpdate | void>;
|
|
1961
|
+
/** 每次模型调用前(正序,同步),可更新 state(随后重渲染 system) */
|
|
1962
|
+
beforeModel?: (req: ModelRequest) => StateUpdate | void;
|
|
1963
|
+
/** 包裹模型调用(洋葱,可改 messages / 拦截) */
|
|
1964
|
+
wrapModelCall?: (req: ModelRequest, next: (req: ModelRequest) => Promise<ModelResponse>) => Promise<ModelResponse>;
|
|
1965
|
+
/** 模型返回后(逆序) */
|
|
1966
|
+
afterModel?: (res: ModelResponse, state: HarnessState) => StateUpdate | void;
|
|
1967
|
+
/** 包裹工具执行(洋葱) */
|
|
1968
|
+
wrapToolCall?: (ctx: ToolCallContext, next: (ctx: ToolCallContext) => Promise<ToolExecResult>) => Promise<ToolExecResult>;
|
|
1969
|
+
/** agent 结束时(逆序,必跑含早退路径) */
|
|
1970
|
+
afterAgent?: (state: HarnessState) => StateUpdate | void | Promise<StateUpdate | void>;
|
|
1971
|
+
/** agent 即将返回最终结果前(正序):feedback 触发自纠(回灌 user 消息继续循环);null 放行。受 createAgent maxVerifyAttempts 约束 */
|
|
1972
|
+
beforeReturn?: BeforeReturnHook;
|
|
1973
|
+
}
|
|
1974
|
+
|
|
1552
1975
|
|
|
1553
1976
|
// 子 agent
|
|
1554
1977
|
export declare function createSubagentsMiddleware(opts: any): any;
|
|
@@ -1558,17 +1981,6 @@ export interface SubagentsController {
|
|
|
1558
1981
|
remove(id: string): boolean;
|
|
1559
1982
|
get(): SubagentConfig[];
|
|
1560
1983
|
}
|
|
1561
|
-
/** spawn_agent / spawn_agents 运行时选项(role/tools/writablePaths 等可运行时覆盖) */
|
|
1562
|
-
export interface SubagentOptions {
|
|
1563
|
-
role?: string;
|
|
1564
|
-
tools?: string[];
|
|
1565
|
-
/** 子 agent 可写路径前缀白名单(运行时覆盖;写工具包 path guard,越界 PATH_OUT_OF_SCOPE)。subagent-writable Phase 2 */
|
|
1566
|
-
writablePaths?: string[];
|
|
1567
|
-
model?: string;
|
|
1568
|
-
[k: string]: any;
|
|
1569
|
-
}
|
|
1570
|
-
export interface SubagentLlmConfig { [k: string]: any }
|
|
1571
|
-
|
|
1572
1984
|
// 能力包(专用子 agent 工厂):RAG 多源检索 + HTML 代码组件生成(add-capability-packs)
|
|
1573
1985
|
export interface RagHit { content: string; source?: string; score?: number }
|
|
1574
1986
|
export interface RagRetrieveOptions { topK?: number }
|
|
@@ -1622,6 +2034,10 @@ export interface CreateHtmlSubagentOptions {
|
|
|
1622
2034
|
[k: string]: any;
|
|
1623
2035
|
}
|
|
1624
2036
|
export declare function createRagSubagent(options: CreateRagSubagentOptions): SubagentConfig;
|
|
2037
|
+
/** 内置完整 HTML 生成规范 skill(createHtmlSubagent 默认装;传自定义 skills 覆盖默认时,显式并回此 skill 保住生成规范/安全底线;默认快照 root='components'/codeField='code') */
|
|
2038
|
+
export declare const htmlFragmentSkill: SkillSpec;
|
|
2039
|
+
/** 构造自定义 root/codeField 的 HTML 生成规范 skill(默认装 htmlFragmentSkill 即此函数默认参产物) */
|
|
2040
|
+
export declare function buildHtmlFragmentSkill(root?: string, codeField?: string): SkillSpec;
|
|
1625
2041
|
export declare function createHtmlSubagent(options: CreateHtmlSubagentOptions): SubagentConfig;
|
|
1626
2042
|
export interface HtmlFormatIssue {
|
|
1627
2043
|
/** 行号(1 基) */
|
|
@@ -1719,11 +2135,104 @@ export interface DataAuditEntry { [k: string]: any }
|
|
|
1719
2135
|
export interface DataSnapshotEntry { [k: string]: any }
|
|
1720
2136
|
export type PermissionOp = string;
|
|
1721
2137
|
|
|
1722
|
-
// vfs
|
|
1723
|
-
|
|
2138
|
+
// vfs(E1 API 面收口:createVfs 真实签名 + 四池配置类型;与 src backends/vfs 对齐)
|
|
2139
|
+
/** vfs 持久化钩子 */
|
|
2140
|
+
export interface VfsPersist {
|
|
2141
|
+
/** 文件变更后回调(debounce 由 createChatSdk 控制落盘) */
|
|
2142
|
+
save?: (files: Record<string, VfsFile>) => void;
|
|
2143
|
+
}
|
|
2144
|
+
/** vfs 分池键(按 path 前缀路由:large_results/* / drafts/* / resources/* / 其他) */
|
|
2145
|
+
export type VfsPoolKey = 'largeResults' | 'drafts' | 'userFiles' | 'resources';
|
|
2146
|
+
/** createVfs 选项 */
|
|
2147
|
+
export interface VfsOptions {
|
|
2148
|
+
/** 持久化钩子(可选) */
|
|
2149
|
+
persist?: VfsPersist;
|
|
2150
|
+
/** 工作区总内存上限(默认 8MB,OOM 兜底;四池独立上限之和可能超过,由总上限最后约束);纯内存也生效 */
|
|
2151
|
+
maxBytes?: number;
|
|
2152
|
+
/** 单池上限(可选,覆盖默认 largeResults=4MB / drafts=2MB / userFiles=2MB / resources=4MB);四池独立 LRU 互不挤占 */
|
|
2153
|
+
poolBytes?: Partial<Record<VfsPoolKey, number>>;
|
|
2154
|
+
}
|
|
2155
|
+
/** vfs 实例(Proxy 包裹 files:变更捕获 → 记账 + LRU;读写经工具层) */
|
|
2156
|
+
export interface VfsStore {
|
|
2157
|
+
files: Record<string, VfsFile>;
|
|
2158
|
+
/** 持久化恢复:直接灌入 raw target,不触发 save(仅 persist 模式) */
|
|
2159
|
+
hydrate?: (files: Record<string, VfsFile>) => void;
|
|
2160
|
+
/** 立即落盘(清 debounce 窗口);pagehide 兜底用(仅 persist 模式) */
|
|
2161
|
+
flush?: () => void;
|
|
2162
|
+
/** 清空工作区 + 触发落盘空(新会话用,仅 persist 模式) */
|
|
2163
|
+
clear?: () => void;
|
|
2164
|
+
/** 是否有未捕获到 checkpoint 的写(供 checkpoint 增量 save 检查;非持久化模式也暴露) */
|
|
2165
|
+
isDirty?: () => boolean;
|
|
2166
|
+
/** 读后清脏标记,返回是否脏;checkpoint save 消费(脏→clone 新基线,不脏→复用上次 clone) */
|
|
2167
|
+
consumeDirty?: () => boolean;
|
|
2168
|
+
/** 设置被引用保护集(LRU 淘汰时跳过被消息引用的 large_results,防 vfs_read 404) */
|
|
2169
|
+
setProtectedRefs?: (refs: Set<string>) => void;
|
|
2170
|
+
/** path → 所属池(超池预检用) */
|
|
2171
|
+
getPoolOf?: (path: string) => string;
|
|
2172
|
+
/** 池上限字节(超池预检用) */
|
|
2173
|
+
getPoolLimit?: (pool: string) => number;
|
|
2174
|
+
}
|
|
2175
|
+
/**
|
|
2176
|
+
* 创建一个 vfs 实例。
|
|
2177
|
+
* @param initialFiles 初始文件(path → content)
|
|
2178
|
+
* @param opts.persist 持久化钩子;提供则用 Proxy 捕获 store.files 变更 → debounce save
|
|
2179
|
+
*/
|
|
2180
|
+
export declare function createVfs(initialFiles?: Record<string, string>, opts?: VfsOptions): VfsStore;
|
|
2181
|
+
|
|
2182
|
+
// 上下文管理(E1 API 面收口:与 src composables/useContextManager 对齐)
|
|
2183
|
+
export interface ContextManagerOptions {
|
|
2184
|
+
/** 滑动窗口:保留最近几轮完整对话(轮数模式用) */
|
|
2185
|
+
windowRounds: number;
|
|
2186
|
+
/** 超过多少轮触发摘要压缩(轮数模式用,含窗口内) */
|
|
2187
|
+
summaryThresholdRounds: number;
|
|
2188
|
+
/** 旧工具结果截断长度(单轮 ReAct 内) */
|
|
2189
|
+
toolResultMaxChars: number;
|
|
2190
|
+
/** 是否启用关键词召回相关历史 */
|
|
2191
|
+
enableRecall: boolean;
|
|
2192
|
+
/** 召回的最大轮次数 */
|
|
2193
|
+
recallTopK: number;
|
|
2194
|
+
/** 是否启用 LLM 增强摘要(否则用零成本索引摘要) */
|
|
2195
|
+
enableLLMSummary: boolean;
|
|
2196
|
+
/** 用于摘要的 LLM invoke 函数(可选) */
|
|
2197
|
+
llmInvoke?: (prompt: string) => Promise<string>;
|
|
2198
|
+
/** 模型上下文窗口(token);提供则按 token 触发压缩 + token 窗口,否则按轮数 */
|
|
2199
|
+
contextWindow?: number;
|
|
2200
|
+
/** 触发压缩的 token 比例(默认 0.5) */
|
|
2201
|
+
summaryThresholdRatio?: number;
|
|
2202
|
+
/** prompt 软上限(token,成本维度);窗口 ≥320K 未传时默认 160K;显式传 0 关闭 */
|
|
2203
|
+
promptSoftCapTokens?: number;
|
|
2204
|
+
/** 保留最近窗口的 token 预算比例(默认 0.4) */
|
|
2205
|
+
windowRatio?: number;
|
|
2206
|
+
/** 压缩时注入「当前可操作数据」快照(防 LLM 基于过时记忆操作已卸载/新增的动态组件) */
|
|
2207
|
+
getRegisteredData?: () => { description: string }[];
|
|
2208
|
+
/** @deprecated 旧多对象模型遗留(单对象 data 模式用 getRegisteredData);仍兼容,返回值 path 字段忽略 */
|
|
2209
|
+
getRegisteredSlots?: () => { path: string; description: string }[];
|
|
2210
|
+
/** 跨轮摘要时,对这些工具的步骤 result 额外保留摘要片段进 summaryMsg(防字段描述被摘要掉) */
|
|
2211
|
+
preserveLastToolResults?: string[];
|
|
2212
|
+
}
|
|
2213
|
+
/** 压缩决策输入(agent-driven-compression;decideInvoke 的载荷) */
|
|
2214
|
+
export interface CompressDecisionInput {
|
|
2215
|
+
/** 当前消息(供 inspect_context 组合 rounds + totalTokens) */
|
|
2216
|
+
getMessages: () => AgentMessage[];
|
|
2217
|
+
/** contextInspector 快照(可选,inspect_context 的 categories 来源) */
|
|
2218
|
+
getSnapshot?: () => ContextSnapshot | undefined;
|
|
2219
|
+
/** 模型上下文窗口(inspect_context occupancy + 决策 prompt) */
|
|
2220
|
+
contextWindow?: number;
|
|
2221
|
+
/** 压缩触发阈值比例(进 prompt 供 LLM 参考) */
|
|
2222
|
+
thresholdRatio?: number;
|
|
2223
|
+
/** 触发原因(进 prompt,如「token 超阈值」「轮数超阈值」) */
|
|
2224
|
+
triggerReason: string;
|
|
2225
|
+
/** 触发模式(决定 LLM 填 keepRounds 还是 windowRatio) */
|
|
2226
|
+
triggerMode: 'token' | 'rounds';
|
|
2227
|
+
}
|
|
2228
|
+
/** summarization 中间件选项(压缩策略;Partial<ContextManagerOptions> + LLM 决策钩子) */
|
|
2229
|
+
export interface SummarizationOptions extends Partial<ContextManagerOptions> {
|
|
2230
|
+
/** 压缩决策 invoke(agentCompression 开启时;成功 → 用决策,失败/null → 降级静态) */
|
|
2231
|
+
decideInvoke?: (input: CompressDecisionInput) => Promise<CompressDecision | null>;
|
|
2232
|
+
/** contextInspector 快照 getter(供 inspect_context 的 categories + decide) */
|
|
2233
|
+
getSnapshot?: () => ContextSnapshot | undefined;
|
|
2234
|
+
}
|
|
1724
2235
|
|
|
1725
|
-
// 上下文管理
|
|
1726
|
-
export interface ContextManagerOptions { [k: string]: any }
|
|
1727
2236
|
export interface CompressionStats {
|
|
1728
2237
|
triggered: boolean; roundsTotal: number; roundsSummarized: number; roundsRecalled: number;
|
|
1729
2238
|
originalMessages: number; compressedMessages: number; strategy: string;
|
|
@@ -1762,7 +2271,18 @@ export declare function lowCapsHint(model: string | undefined, caps: { contextWi
|
|
|
1762
2271
|
export declare function estimateTokens(text: string): number;
|
|
1763
2272
|
export declare function offloadThresholdChars(contextWindow: number): number;
|
|
1764
2273
|
export declare function offloadPassThroughChars(contextWindow: number): number;
|
|
1765
|
-
|
|
2274
|
+
/** 模型能力(集成方声明 > model 名查表 > 缺省) */
|
|
2275
|
+
export interface ModelCaps {
|
|
2276
|
+
/** 模型上下文窗口(token) */
|
|
2277
|
+
contextWindow: number;
|
|
2278
|
+
/** 模型最大输出(token) */
|
|
2279
|
+
maxOutputTokens: number;
|
|
2280
|
+
/** 是否支持多模态识图:true = user 消息 images 组装 content parts 直发;缺省 false(保守,宁走旁路/报错不误发 parts 吃 400) */
|
|
2281
|
+
vision?: boolean;
|
|
2282
|
+
/** 是否支持思考/推理模式:true = 集成方未显式配置时默认注入 thinking(deep)保质量;缺省 false(未知模型不猜,防 400) */
|
|
2283
|
+
thinking?: boolean;
|
|
2284
|
+
}
|
|
2285
|
+
|
|
1766
2286
|
|
|
1767
2287
|
// 剪贴板复制(clipboard API + execCommand 降级,兼容非 secure context / 旧浏览器)
|
|
1768
2288
|
export declare function copyText(text: string): Promise<boolean>;
|
|
@@ -1827,7 +2347,7 @@ export declare function diffReport(current: Record<string, number>, baseline: Re
|
|
|
1827
2347
|
/** harness 依赖的最小 sdk 面(结构子集;ChatSdk 满足 —— 直接传 sdk 即可) */
|
|
1828
2348
|
export interface EvalSdkLike {
|
|
1829
2349
|
messages: unknown[];
|
|
1830
|
-
debugLogs:
|
|
2350
|
+
debugLogs: Ref<DebugLog[]>;
|
|
1831
2351
|
usage?: { prompt: number; completion: number; cacheRead?: number; cacheCreate?: number };
|
|
1832
2352
|
inspect?: () => { subagent?: { active?: unknown[] } };
|
|
1833
2353
|
}
|