@ai-zen/agents-host 0.0.0-stage → 0.1.0-alpha.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/CHANGELOG.md +39 -0
- package/LICENSE +21 -0
- package/README.md +759 -2
- package/dist/app.d.ts +384 -0
- package/dist/app.js +1148 -0
- package/dist/cli.d.ts +21 -0
- package/dist/cli.js +353 -0
- package/dist/config.d.ts +97 -0
- package/dist/config.js +171 -0
- package/dist/handlers/agentHandlers.d.ts +18 -0
- package/dist/handlers/agentHandlers.js +20 -0
- package/dist/handlers/assetHandlers.d.ts +29 -0
- package/dist/handlers/assetHandlers.js +35 -0
- package/dist/handlers/capabilities.d.ts +26 -0
- package/dist/handlers/capabilities.js +138 -0
- package/dist/handlers/completionHandlers.d.ts +18 -0
- package/dist/handlers/completionHandlers.js +13 -0
- package/dist/handlers/configHandlers.d.ts +31 -0
- package/dist/handlers/configHandlers.js +59 -0
- package/dist/handlers/conversationHandlers.d.ts +118 -0
- package/dist/handlers/conversationHandlers.js +314 -0
- package/dist/handlers/handoffHandlers.d.ts +17 -0
- package/dist/handlers/handoffHandlers.js +14 -0
- package/dist/handlers/hostHandlers.d.ts +39 -0
- package/dist/handlers/hostHandlers.js +56 -0
- package/dist/handlers/index.d.ts +128 -0
- package/dist/handlers/index.js +92 -0
- package/dist/handlers/messageHandlers.d.ts +11 -0
- package/dist/handlers/messageHandlers.js +10 -0
- package/dist/handlers/modelHandlers.d.ts +17 -0
- package/dist/handlers/modelHandlers.js +19 -0
- package/dist/handlers/noticeHandlers.d.ts +24 -0
- package/dist/handlers/noticeHandlers.js +24 -0
- package/dist/handlers/questionHandlers.d.ts +16 -0
- package/dist/handlers/questionHandlers.js +16 -0
- package/dist/handlers/searchHandlers.d.ts +12 -0
- package/dist/handlers/searchHandlers.js +12 -0
- package/dist/handlers/workspaceHandlers.d.ts +29 -0
- package/dist/handlers/workspaceHandlers.js +47 -0
- package/dist/i18n/en.d.ts +243 -0
- package/dist/i18n/en.js +270 -0
- package/dist/i18n/index.d.ts +43 -0
- package/dist/i18n/index.js +72 -0
- package/dist/i18n/zh.d.ts +240 -0
- package/dist/i18n/zh.js +257 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.js +15 -0
- package/dist/net/UploadReceiver.d.ts +186 -0
- package/dist/net/UploadReceiver.js +494 -0
- package/dist/net/WsHub.d.ts +231 -0
- package/dist/net/WsHub.js +689 -0
- package/dist/net/auth.d.ts +73 -0
- package/dist/net/auth.js +74 -0
- package/dist/net/discovery.d.ts +72 -0
- package/dist/net/discovery.js +171 -0
- package/dist/net/index.d.ts +14 -0
- package/dist/net/index.js +10 -0
- package/dist/runtime/ChatRunner.d.ts +374 -0
- package/dist/runtime/ChatRunner.js +1204 -0
- package/dist/runtime/ConversationDrafts.d.ts +43 -0
- package/dist/runtime/ConversationDrafts.js +47 -0
- package/dist/runtime/RunRegistry.d.ts +79 -0
- package/dist/runtime/RunRegistry.js +108 -0
- package/dist/runtime/ScopeRegistry.d.ts +153 -0
- package/dist/runtime/ScopeRegistry.js +259 -0
- package/dist/runtime/TransientRunner.d.ts +90 -0
- package/dist/runtime/TransientRunner.js +179 -0
- package/dist/runtime/index.d.ts +14 -0
- package/dist/runtime/index.js +10 -0
- package/dist/services/AgentService.d.ts +150 -0
- package/dist/services/AgentService.js +718 -0
- package/dist/services/AssetService.d.ts +338 -0
- package/dist/services/AssetService.js +739 -0
- package/dist/services/AutoNaming.d.ts +92 -0
- package/dist/services/AutoNaming.js +235 -0
- package/dist/services/CompletionService.d.ts +122 -0
- package/dist/services/CompletionService.js +442 -0
- package/dist/services/ConfigService.d.ts +171 -0
- package/dist/services/ConfigService.js +695 -0
- package/dist/services/ConversationService.d.ts +274 -0
- package/dist/services/ConversationService.js +902 -0
- package/dist/services/CredentialService.d.ts +33 -0
- package/dist/services/CredentialService.js +86 -0
- package/dist/services/DiscoveryService.d.ts +182 -0
- package/dist/services/DiscoveryService.js +998 -0
- package/dist/services/HandoffService.d.ts +189 -0
- package/dist/services/HandoffService.js +414 -0
- package/dist/services/Logger.d.ts +130 -0
- package/dist/services/Logger.js +256 -0
- package/dist/services/MessageService.d.ts +88 -0
- package/dist/services/MessageService.js +280 -0
- package/dist/services/ModelService.d.ts +89 -0
- package/dist/services/ModelService.js +489 -0
- package/dist/services/NoticeService.d.ts +93 -0
- package/dist/services/NoticeService.js +217 -0
- package/dist/services/QuestionService.d.ts +184 -0
- package/dist/services/QuestionService.js +457 -0
- package/dist/services/SearchService.d.ts +54 -0
- package/dist/services/SearchService.js +117 -0
- package/dist/services/WorkspaceService.d.ts +96 -0
- package/dist/services/WorkspaceService.js +213 -0
- package/dist/services/imageSize.d.ts +41 -0
- package/dist/services/imageSize.js +146 -0
- package/dist/services/index.d.ts +20 -0
- package/dist/services/index.js +15 -0
- package/dist/services/secretMask.d.ts +24 -0
- package/dist/services/secretMask.js +34 -0
- package/dist/storage/AssetRepository.d.ts +87 -0
- package/dist/storage/AssetRepository.js +180 -0
- package/dist/storage/ConversationRepository.d.ts +55 -0
- package/dist/storage/ConversationRepository.js +128 -0
- package/dist/storage/CredentialRepository.d.ts +28 -0
- package/dist/storage/CredentialRepository.js +47 -0
- package/dist/storage/Database.d.ts +95 -0
- package/dist/storage/Database.js +180 -0
- package/dist/storage/MessageRepository.d.ts +104 -0
- package/dist/storage/MessageRepository.js +323 -0
- package/dist/storage/MetaRepository.d.ts +21 -0
- package/dist/storage/MetaRepository.js +33 -0
- package/dist/storage/NoticeRepository.d.ts +31 -0
- package/dist/storage/NoticeRepository.js +89 -0
- package/dist/storage/QuestionRepository.d.ts +34 -0
- package/dist/storage/QuestionRepository.js +96 -0
- package/dist/storage/WorkspaceRepository.d.ts +25 -0
- package/dist/storage/WorkspaceRepository.js +44 -0
- package/dist/storage/dbWorker.d.ts +10 -0
- package/dist/storage/dbWorker.js +132 -0
- package/dist/storage/index.d.ts +20 -0
- package/dist/storage/index.js +16 -0
- package/dist/storage/migrations.d.ts +26 -0
- package/dist/storage/migrations.js +207 -0
- package/dist/storage/types.d.ts +298 -0
- package/dist/storage/types.js +14 -0
- package/dist/wire/errors.d.ts +105 -0
- package/dist/wire/errors.js +143 -0
- package/dist/wire/events.d.ts +102 -0
- package/dist/wire/events.js +13 -0
- package/dist/wire/frames.d.ts +106 -0
- package/dist/wire/frames.js +156 -0
- package/dist/wire/index.d.ts +31 -0
- package/dist/wire/index.js +31 -0
- package/dist/wire/methods.d.ts +1896 -0
- package/dist/wire/methods.js +99 -0
- package/dist/wire/states.d.ts +487 -0
- package/dist/wire/states.js +61 -0
- package/package.json +63 -3
|
@@ -0,0 +1,374 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `ChatRunner` —— 一轮对话的执行者(architecture §4 那张时序)。
|
|
3
|
+
*
|
|
4
|
+
* ## 一轮的骨架
|
|
5
|
+
*
|
|
6
|
+
* ```
|
|
7
|
+
* RunRegistry.start(忙即拒,PRD D14)
|
|
8
|
+
* → 借 Scope(ScopeRegistry.acquire:懒创建或复用,依赖 +1)
|
|
9
|
+
* → 分配两个消息 id 并落库(用户消息 + 助手占位,PRD L6:id 在请求发出前就有)
|
|
10
|
+
* → 装配 agent(可注入的工厂;跑完即弃,PRD D28)
|
|
11
|
+
* → 流式:每片增量推 `message.delta`;同一时刻更新六态并推 `run.state`;同一条消息边流边写(D15)
|
|
12
|
+
* → 内循环结束:写一次最终版(F-C2)→ 释放 agent → RunRegistry.finish → ScopeRegistry.release
|
|
13
|
+
* → 推结算态 `run.state` + `usage`
|
|
14
|
+
* ```
|
|
15
|
+
*
|
|
16
|
+
* ## 三处刻意交给 core 的事
|
|
17
|
+
*
|
|
18
|
+
* 1. **消息与增量不重新定义**:`AgentNS.Message` / `AgentNS.Delta` / `AgentNS.MessageStatus` /
|
|
19
|
+
* `Usage` 全部原样用 core 的导出;攒消息用 core 的 `applyChunk`,求和用 core 的 `sumUsage`,
|
|
20
|
+
* 中止修复用 core 的 `reconcileAbortedToolRounds` / `reconcileAbortedMessages`。
|
|
21
|
+
* 2. **agent 循环不重写**:装配好的 agent 由 core 的 `send()` 驱动(内循环、工具并行、中止、
|
|
22
|
+
* 收尾归一都在 core 里)。本文件只订阅它广播出来的事件,把「发生了什么」变成持久化与推送。
|
|
23
|
+
* 3. **状态不存两处**:运行中的消息以内存(core 手里那份 `agent.messages`)为真相,库里的行是
|
|
24
|
+
* 快照;`isRunning` 只在 `RunRegistry` 一处。
|
|
25
|
+
*
|
|
26
|
+
* ## 为什么要认领 core 追加的消息 id
|
|
27
|
+
*
|
|
28
|
+
* 消息 id 由宿主分配(PRD L6),而 assistant 占位是 core 在 `run()` 里自己 `append` 的
|
|
29
|
+
* (它的 `Message` 构造会自己生成 id)。所以本文件在 `message` 事件里把「这一轮头两条」认领成
|
|
30
|
+
* 宿主已经发给客户端的 id —— 客户端的 `message.delta` 与 `message.list` 才接得上同一条消息。
|
|
31
|
+
* 后续工具轮次里 core 追加的消息同样在这一处被换成宿主分配的 id(`id` 不参与 core 的任何
|
|
32
|
+
* 判断,换掉只会让它对客户端更一致)。
|
|
33
|
+
*/
|
|
34
|
+
import type { AgentNS } from "@ai-zen/agents-core";
|
|
35
|
+
import type { AppConfig, HandoffService, Model, ModelParams, ReasoningPresets, Scope } from "@ai-zen/agents-sdk";
|
|
36
|
+
import type { Language } from "../i18n/index.js";
|
|
37
|
+
import type { Conversation, MessageUpsertInput, StoredMessage } from "../storage/types.js";
|
|
38
|
+
import type { EventMap, EventName } from "../wire/events.js";
|
|
39
|
+
import type { AttachmentOutcome, MessageInput, ProblemFact, RunOutcome, RunState, UsageSnapshot } from "../wire/states.js";
|
|
40
|
+
import type { RunRegistry } from "./RunRegistry.js";
|
|
41
|
+
import type { Clock, ScopeRegistry } from "./ScopeRegistry.js";
|
|
42
|
+
/** 消息仓储里本文件用到的部分(`MessageRepository` 结构上满足) */
|
|
43
|
+
export interface MessageStore {
|
|
44
|
+
upsert(input: MessageUpsertInput): Promise<void>;
|
|
45
|
+
upsertMany(inputs: MessageUpsertInput[]): Promise<void>;
|
|
46
|
+
/**
|
|
47
|
+
* 按对话取主线消息。
|
|
48
|
+
*
|
|
49
|
+
* 历史装载传 `includeHidden`(`hidden` 的消息也在模型的上下文里,只是不给人看);
|
|
50
|
+
* 其余用途默认只要用户看得到的那部分。
|
|
51
|
+
*/
|
|
52
|
+
listByConversation(conversationId: string, after?: string, options?: {
|
|
53
|
+
includeHidden?: boolean;
|
|
54
|
+
}): Promise<StoredMessage[]>;
|
|
55
|
+
}
|
|
56
|
+
/** 对话仓储里本文件用到的部分(`ConversationRepository` 结构上满足) */
|
|
57
|
+
export interface ConversationStore {
|
|
58
|
+
get(id: string): Promise<Conversation | undefined>;
|
|
59
|
+
}
|
|
60
|
+
/** 推事件:接线层把它变成 JSON-RPC 通知(`WsHub.push`) */
|
|
61
|
+
export type ChatEventEmitter = <E extends EventName>(name: E, payload: EventMap[E]) => void;
|
|
62
|
+
/**
|
|
63
|
+
* 装配 agent 时交给工厂的事实。
|
|
64
|
+
*
|
|
65
|
+
* 模型和助手的解析口径在 SDK 里(`createAgent` 三级解析:会话级 > 助手定义 > 全局兜底),
|
|
66
|
+
* 所以这里只给 id 与 Scope,不给「用哪个模型」的结论。
|
|
67
|
+
*/
|
|
68
|
+
export interface AgentBuildContext {
|
|
69
|
+
conversationId: string;
|
|
70
|
+
workspaceId: string;
|
|
71
|
+
/** 这段对话创建时定死的助手(PRD L7) */
|
|
72
|
+
agentId: string;
|
|
73
|
+
/** 这段会话现在用的模型(存在会话行上);`null` 时交给 SDK 三级解析 */
|
|
74
|
+
modelId: string | null;
|
|
75
|
+
/**
|
|
76
|
+
* 这段会话选的思考档位名(存在会话行上);`null` = 跟随助手定义上的那份参数。
|
|
77
|
+
*
|
|
78
|
+
* 存名不存参数:档位属于模型,同名档位在不同模型的策略表里对应不同参数,展开在装配这一刻做。
|
|
79
|
+
*/
|
|
80
|
+
thinkingLevel: string | null;
|
|
81
|
+
scope: Scope;
|
|
82
|
+
/** 这一轮开始前的历史(core 原样消息),工厂可以把它当作给 agent 的初始消息 */
|
|
83
|
+
history: AgentNS.Message[];
|
|
84
|
+
}
|
|
85
|
+
/** 造 agent。测试注入假 agent,生产用 `createSdkAgentFactory()` */
|
|
86
|
+
export type AgentFactory = (context: AgentBuildContext) => Promise<ChatAgent>;
|
|
87
|
+
/**
|
|
88
|
+
* 交接服务(SDK 口径)按这一轮的装配事实现场取一个。
|
|
89
|
+
*
|
|
90
|
+
* 给 `undefined` 就是「这一轮不装交接线插件」(R50:装配处会推一条警告,不静默)。
|
|
91
|
+
*/
|
|
92
|
+
export type HandoffProvider = (context: AgentBuildContext) => HandoffService | undefined;
|
|
93
|
+
/**
|
|
94
|
+
* 本文件驱动的那部分 agent 表面。
|
|
95
|
+
*
|
|
96
|
+
* core 的 `Agent` 与 SDK 的 `SdkAgent` 都满足它;测试里的假 agent 也满足它,
|
|
97
|
+
* 于是「一轮怎么跑」的用例不必真的连模型。
|
|
98
|
+
*/
|
|
99
|
+
export interface ChatAgent {
|
|
100
|
+
/** 这一轮的消息数组(内存真相;本文件只往里追加历史、读它算用量) */
|
|
101
|
+
messages: AgentNS.Message[];
|
|
102
|
+
append(message: AgentNS.Message): AgentNS.Message;
|
|
103
|
+
/** core 的 `send()`:跑完整组内循环(含多轮工具调用)后返回消息数组 */
|
|
104
|
+
send(content: AgentNS.MessageContent): Promise<AgentNS.Message[]>;
|
|
105
|
+
abort(): void;
|
|
106
|
+
/** 事件广播口(core 的 `EventBus`);本文件只用 `on` */
|
|
107
|
+
events: {
|
|
108
|
+
on(name: string, handler: (...args: never[]) => void): unknown;
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
/** 把已上传的素材变成真正发出去的内容段(PRD F-H7);不给就原样用 `input.content` */
|
|
112
|
+
export interface AttachmentPreparation {
|
|
113
|
+
/** 真正发给模型的内容(已按实发模型换成文件引用 / 内联 / 文字) */
|
|
114
|
+
content: AgentNS.MessageContent;
|
|
115
|
+
attachments: AttachmentOutcome[];
|
|
116
|
+
/**
|
|
117
|
+
* 落库用的内容(消息里只存我们自己的引用:段上的 `__asset_id`)。
|
|
118
|
+
*
|
|
119
|
+
* 不给时落库的就是 `content`:不是每个注入方都有“厂商产物不能进库”这回事。
|
|
120
|
+
*/
|
|
121
|
+
storedContent?: AgentNS.MessageContent;
|
|
122
|
+
}
|
|
123
|
+
export type AttachmentPreparer = (context: {
|
|
124
|
+
conversationId: string;
|
|
125
|
+
agentId: string;
|
|
126
|
+
modelId: string | null;
|
|
127
|
+
input: MessageInput;
|
|
128
|
+
}) => Promise<AttachmentPreparation>;
|
|
129
|
+
/**
|
|
130
|
+
* 历史里的素材引用还原成当前模型能吃的内容段(PRD F-H7):每轮发送之前跑一次。
|
|
131
|
+
*
|
|
132
|
+
* 每轮都要跑一次:能不能吃跟着实发模型 / 端点变,而历史里存的是与端点无关的 `__asset_id`。
|
|
133
|
+
* 不给就原样把历史交给 agent。
|
|
134
|
+
*/ export type AttachmentHistoryResolver = (context: {
|
|
135
|
+
conversationId: string;
|
|
136
|
+
modelId: string | null;
|
|
137
|
+
messages: AgentNS.Message[];
|
|
138
|
+
}) => Promise<AgentNS.Message[]>;
|
|
139
|
+
/**
|
|
140
|
+
* 消息落库那一刻登记「这条消息引用了哪些素材」(`conversation_assets` 关系行)。
|
|
141
|
+
*
|
|
142
|
+
* 扫的是**落库的那一份内容**(段上的 `__asset_id`),所以调用点紧跟用户消息的 upsert;
|
|
143
|
+
* 不注入时关系行就不记(引用计数少一份,删字节会晚一步)。
|
|
144
|
+
*/
|
|
145
|
+
export type MessageAssetLinker = (context: {
|
|
146
|
+
conversationId: string;
|
|
147
|
+
messageId: string;
|
|
148
|
+
content: AgentNS.MessageContent | undefined;
|
|
149
|
+
}) => Promise<number>;
|
|
150
|
+
/** 一轮的入参(`conversation.send` 的 params 去掉 wire 外壳) */
|
|
151
|
+
export interface ChatRunParams {
|
|
152
|
+
conversationId: string;
|
|
153
|
+
input: MessageInput;
|
|
154
|
+
/** 这一轮是哪条连接发起的语言(D8;缺省用注入的默认语言) */
|
|
155
|
+
language?: Language;
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* 一轮结算之后的事实(R59:交接线问题由宿主自己在这个时机问)。
|
|
159
|
+
*
|
|
160
|
+
* 「到交接线了没有」只在宿主算得出来:`promptTokens` 是这一轮实际用量,`handoffTokens`
|
|
161
|
+
* 是生效模型上配的那条线(0 表示这个模型没配)。带着 `language` 一起给,是因为问用户的话
|
|
162
|
+
* 要按发起这条连接的语言渲染(D8)。
|
|
163
|
+
*/
|
|
164
|
+
export interface TurnSettledFacts {
|
|
165
|
+
conversationId: string;
|
|
166
|
+
outcome: RunOutcome;
|
|
167
|
+
/** 这一轮的 `prompt_tokens`(结算快照里的本轮用量) */
|
|
168
|
+
promptTokens: number;
|
|
169
|
+
/** 生效模型的交接线;`0` 表示没配 */
|
|
170
|
+
handoffTokens: number;
|
|
171
|
+
language: Language;
|
|
172
|
+
}
|
|
173
|
+
/** 受理之后立刻给客户端的东西(PRD F-I12 / L6) */
|
|
174
|
+
export interface ChatTurn {
|
|
175
|
+
conversationId: string;
|
|
176
|
+
userMessageId: string;
|
|
177
|
+
assistantMessageId: string;
|
|
178
|
+
/** 每个附件这一轮最后是怎么走的 */
|
|
179
|
+
attachments: AttachmentOutcome[];
|
|
180
|
+
/** 受理时刻(ISO 8601) */
|
|
181
|
+
acceptedAt: string;
|
|
182
|
+
/** 结算之后 resolve(写库、释放 agent 与 Scope、推结算态都已完成) */
|
|
183
|
+
readonly done: Promise<TurnSettlement>;
|
|
184
|
+
/** 中止这一轮(与 `conversation.abort` 走同一条路:用户显式动作,PRD D14) */
|
|
185
|
+
abort(reason?: string): void;
|
|
186
|
+
/**
|
|
187
|
+
* 此刻的现场快照(六态、子 Agent、用量)。
|
|
188
|
+
*
|
|
189
|
+
* 重连的客户端拉 `conversation.state` 时用这一份(PRD L5);它读的是这一轮自己的内存,
|
|
190
|
+
* 不是第二份「谁在跑」:那个事实只在 `RunRegistry`。
|
|
191
|
+
*/
|
|
192
|
+
runState(): RunState;
|
|
193
|
+
}
|
|
194
|
+
/** 一轮的结局 */
|
|
195
|
+
export interface TurnSettlement {
|
|
196
|
+
conversationId: string;
|
|
197
|
+
assistantMessageId: string;
|
|
198
|
+
outcome: RunOutcome;
|
|
199
|
+
problem: ProblemFact | null;
|
|
200
|
+
/** 这一轮结束后内存里的全部消息(历史 + 本轮产出,core 原样) */
|
|
201
|
+
messages: AgentNS.Message[];
|
|
202
|
+
/** 这一轮产出的消息(写进库里的就是这些) */
|
|
203
|
+
produced: AgentNS.Message[];
|
|
204
|
+
usage: UsageSnapshot;
|
|
205
|
+
run: RunState;
|
|
206
|
+
}
|
|
207
|
+
/** 装载/重启后的修复结果 */
|
|
208
|
+
export interface ReconcileResult {
|
|
209
|
+
/** 修好之后的消息(顺序即对话顺序,core 原样) */
|
|
210
|
+
messages: AgentNS.Message[];
|
|
211
|
+
/** 被改写的消息 id(状态或 `omit` 变了) */
|
|
212
|
+
repairedIds: string[];
|
|
213
|
+
}
|
|
214
|
+
export interface ChatRunnerOptions {
|
|
215
|
+
messages: MessageStore;
|
|
216
|
+
conversations: ConversationStore;
|
|
217
|
+
scopes: ScopeRegistry;
|
|
218
|
+
runs: RunRegistry;
|
|
219
|
+
/** 造 agent 的工厂;不注入时按 SDK 口径装配(交接服务由 `handoff` 提供) */
|
|
220
|
+
createAgent?: AgentFactory;
|
|
221
|
+
/**
|
|
222
|
+
* 交接服务:注入之后每一轮都装交接线插件(R59 / R50);不注入时那个插件就不装。
|
|
223
|
+
*
|
|
224
|
+
* 只在不注入 `createAgent` 时生效(两边都注入时以 `createAgent` 为准)。
|
|
225
|
+
*/
|
|
226
|
+
handoff?: HandoffProvider;
|
|
227
|
+
emit: ChatEventEmitter;
|
|
228
|
+
clock?: Clock;
|
|
229
|
+
/** 宿主分配消息 id;缺省用 `crypto.randomUUID` */
|
|
230
|
+
newId?: () => string;
|
|
231
|
+
/** 边流边写的节流时长(毫秒);0 表示每到一片就写一次 */
|
|
232
|
+
streamWriteIntervalMs?: number;
|
|
233
|
+
prepareAttachments?: AttachmentPreparer;
|
|
234
|
+
/**
|
|
235
|
+
* 历史里的素材引用 → 当前模型能吃的段(F-H7)。不给时历史原样交给 agent。
|
|
236
|
+
*
|
|
237
|
+
* 与 `prepareAttachments` 分开两个注入点,是因为它们错在不同时机:一个在受理时算一次,
|
|
238
|
+
* 一个是每次装配 agent 之前按当时的模型 / 端点算。
|
|
239
|
+
*/
|
|
240
|
+
prepareHistory?: AttachmentHistoryResolver;
|
|
241
|
+
/**
|
|
242
|
+
* 用户消息落库那一刻登记素材关系行(`conversation_assets`)。不注入就不记。
|
|
243
|
+
*/
|
|
244
|
+
linkMessageAssets?: MessageAssetLinker;
|
|
245
|
+
/** 这一轮没带语言时用哪种语言渲染宿主注入的那段话(D8) */
|
|
246
|
+
defaultLanguage?: Language;
|
|
247
|
+
/** 一轮结算之后的回调(R59:交接线问题由它触发) */
|
|
248
|
+
onTurnSettled?: (facts: TurnSettledFacts) => void;
|
|
249
|
+
/** 内部错误的去处(写库失败、回收失败等);缺省忽略 */
|
|
250
|
+
onError?: (error: unknown, context: string) => void;
|
|
251
|
+
}
|
|
252
|
+
/** 边流边写的缺省节流:200ms 一次,兼顾「客户端断了丢得少」与「写盘次数」 */
|
|
253
|
+
export declare const DEFAULT_STREAM_WRITE_INTERVAL_MS = 200;
|
|
254
|
+
/**
|
|
255
|
+
* 会话创建时那条 cwd 消息的正文(PRD F-D9:告诉模型「当前目录是哪儿」)。
|
|
256
|
+
*
|
|
257
|
+
* 这条消息在对话落库时写一次,之后不再重写、也不随每轮拼接(说了两遍模型会以为目录变了)。
|
|
258
|
+
* 目录取的是这个对话所属项目的 cwd(不是进程工作目录);句子用的是「这是宿主加的,不是
|
|
259
|
+
* 用户输入的」那条文案(R21:不新造消息类型)。
|
|
260
|
+
*/
|
|
261
|
+
export declare function injectedContextOf(cwd: string, language: Language): string;
|
|
262
|
+
export declare class ChatRunner {
|
|
263
|
+
private readonly options;
|
|
264
|
+
private readonly clock;
|
|
265
|
+
/**
|
|
266
|
+
* 正在跑的轮次(对话 id → 那一轮的现场)。
|
|
267
|
+
*
|
|
268
|
+
* 存的是**这一轮自己的内存对象**,供 `conversation.state` 拿到流中的六态与用量;
|
|
269
|
+
* 「有没有在跑」仍然只问 `RunRegistry.isRunning`,两张表不由这里合并。
|
|
270
|
+
*/
|
|
271
|
+
private readonly turns;
|
|
272
|
+
constructor(options: ChatRunnerOptions);
|
|
273
|
+
/** 宿主分配消息 id(PRD L6):缺省 `crypto.randomUUID`,测试可注入递增 id */
|
|
274
|
+
private newId;
|
|
275
|
+
/** 缺省的 agent 工厂(不注入 `createAgent` 时用):按 SDK 口径装配,交接服务来自 `handoff` */
|
|
276
|
+
private agentFactory;
|
|
277
|
+
/**
|
|
278
|
+
* 受理一轮:占位、落两条消息、把执行放到后台,然后把两个 id 还给调用方(PRD L6 / F-I12)。
|
|
279
|
+
*
|
|
280
|
+
* 忙即拒(`HostError("busy")`,D14);对话不存在则 `not_found`。任何一种失败都不会
|
|
281
|
+
* 留下一个占着不动的轮次,也不会让 Scope 的依赖计数多算一次。
|
|
282
|
+
*/
|
|
283
|
+
run(params: ChatRunParams): Promise<ChatTurn>;
|
|
284
|
+
/**
|
|
285
|
+
* 历史装载完之后的第一件事情:把里面的 `__asset_id` 还原成当前模型能吃的段(F-H7)。
|
|
286
|
+
*
|
|
287
|
+
* 还原失败不让整轮发不出去:打一条日志、带着原样的历史继续。
|
|
288
|
+
*/
|
|
289
|
+
private resolveHistory;
|
|
290
|
+
/**
|
|
291
|
+
* 用户消息落库之后登记素材关系行(`conversation_assets`)。
|
|
292
|
+
*
|
|
293
|
+
* 记不下来不让这一轮失败(消息已经发出去了):打一条日志继续 —— 后果只是这份素材的
|
|
294
|
+
* 引用计数少一行,删字节会晚一步。
|
|
295
|
+
*/
|
|
296
|
+
private linkMessageAssets;
|
|
297
|
+
/** 这一段对话正在跑的那一轮(没有就 `undefined`):拉现场用 */
|
|
298
|
+
turn(conversationId: string): ChatTurn | undefined;
|
|
299
|
+
/** 中止(转发给 `RunRegistry`:中止的唯一入口在那里) */
|
|
300
|
+
abort(conversationId: string, reason?: string): boolean;
|
|
301
|
+
/**
|
|
302
|
+
* 对话(或它所在的项目)被删之后,把这一轮的内存现场丢掉。
|
|
303
|
+
*
|
|
304
|
+
* 正在跑的那一轮会先被要求停下,再等它自己结算写库(删对话的人已经先确认过代价)。
|
|
305
|
+
*/
|
|
306
|
+
forget(conversationId: string): void;
|
|
307
|
+
/**
|
|
308
|
+
* 装载/重启后修复(PRD D15)。
|
|
309
|
+
*
|
|
310
|
+
* 两步:
|
|
311
|
+
* 1. 在途(`pending` / `writing`)消息当作被中断 —— 进程是在写它们的时候没的;
|
|
312
|
+
* 2. 交 core 的两支归一:工具轮次 `fill`(整轮进出,补上未完成的原因)、
|
|
313
|
+
* 被中断的 assistant `keep`(已输出的内容留在上下文里,模型下一轮能接着半截说)。
|
|
314
|
+
*
|
|
315
|
+
* 只写回状态/`omit` 真的变了的那些行,于是「启动时扫一遍」不会把整段历史重写一次。
|
|
316
|
+
*/
|
|
317
|
+
reconcile(conversationId: string): Promise<ReconcileResult>;
|
|
318
|
+
private prepare;
|
|
319
|
+
}
|
|
320
|
+
export interface SdkAgentFactoryOptions {
|
|
321
|
+
/**
|
|
322
|
+
* 交接服务(写交接文档 + 迁移)。给了才装交接线插件(`AutoMigratePlugin`);
|
|
323
|
+
* 交接服务自己会在交接回合往 agent 上装工具守卫。
|
|
324
|
+
*/
|
|
325
|
+
handoff?: HandoffProvider;
|
|
326
|
+
/**
|
|
327
|
+
* 工具刷新时机;缺省读 SDK 配置的 `autoRefreshTools`,再缺省 `inner-loop-start`。
|
|
328
|
+
*
|
|
329
|
+
* 取值直接用 SDK `AppConfig` 里那一字段的类型,不在这里再定义一份(`off` 表示不装插件)。
|
|
330
|
+
*/
|
|
331
|
+
autoRefreshTools?: AppConfig["autoRefreshTools"];
|
|
332
|
+
/**
|
|
333
|
+
* 思考策略表(档位名 → 参数补丁)的现读入口。
|
|
334
|
+
*
|
|
335
|
+
* 装配是异步的,所以这里给一个取快照的函数而不是快照本身:接线层在配置变更后会重新
|
|
336
|
+
* 读一次表(`refreshThinkingPresets`),拿旧快照会把已删掉的档位展开成空补丁。
|
|
337
|
+
*/
|
|
338
|
+
thinkingPresets?: () => ReasoningPresets | null;
|
|
339
|
+
}
|
|
340
|
+
/**
|
|
341
|
+
* 这一段会话该带哪些模型参数(PRD F-B6)。
|
|
342
|
+
*
|
|
343
|
+
* 两件事合在这里:
|
|
344
|
+
* 1. 助手定义上的 `modelParams`(用户给这个助手配的参数,也是「跟随默认」所指的那份);
|
|
345
|
+
* 2. 会话行上的思考档位展开出的补丁(档位名 → 参数),盖在 1 上面。
|
|
346
|
+
*
|
|
347
|
+
* 只在「会话定的模型就是助手定义那个模型」时才叠上 1:会话把模型换掉之后,定义上那份参数
|
|
348
|
+
* 是配给旧模型的(可能带着旧模型才认的键),发给新模型只会换来一句 400。换模型时档位会被
|
|
349
|
+
* 清空,所以那之后这里通常什么都不带,让模型走自己的出厂参数。
|
|
350
|
+
*/
|
|
351
|
+
export declare function conversationModelParams(input: {
|
|
352
|
+
/** 会话行上的模型(从 `scope.config` 里找到的那个;找不到时为空) */
|
|
353
|
+
model: Model | undefined;
|
|
354
|
+
/** 助手定义上的模型 id(未绑定时为 `undefined`) */
|
|
355
|
+
agentModelId: string | undefined;
|
|
356
|
+
/** 配置里的兜底模型(`AppConfig.defaultModel`) */
|
|
357
|
+
defaultModelId: string | undefined;
|
|
358
|
+
/** 助手定义上的参数(`AgentDefinition.modelParams`) */
|
|
359
|
+
agentParams: ModelParams | undefined;
|
|
360
|
+
/** 会话行上的思考档位名;`null` = 跟随助手定义 */
|
|
361
|
+
thinkingLevel: string | null;
|
|
362
|
+
presets: ReasoningPresets | null;
|
|
363
|
+
}): ModelParams | undefined;
|
|
364
|
+
/**
|
|
365
|
+
* 造一个按 SDK 口径装配的 agent 工厂。
|
|
366
|
+
*
|
|
367
|
+
* 装的东西与阈值来源(PRD D27:阈值属 SDK 的 `AppConfig` / 模型配置,不在这里另起一套):
|
|
368
|
+
* - `ContextGuardPlugin`:硬线,`tokenThresholds.guard`;
|
|
369
|
+
* - `SubAgentGuardInstallerPlugin`:同一个硬线递归装到子 Agent 与孙级(PRD F-D8);
|
|
370
|
+
* - `AutoMigratePlugin`:交接线,`tokenThresholds.handoff`(需注入交接服务);
|
|
371
|
+
* - `AutoRefreshToolsPlugin`:改完能力不用重启(PRD F-E2);
|
|
372
|
+
* - `UnknownToolHintPlugin`:未知工具时给出 MCP 场景的引导。
|
|
373
|
+
*/
|
|
374
|
+
export declare function createSdkAgentFactory(options?: SdkAgentFactoryOptions): AgentFactory;
|