@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,1896 @@
|
|
|
1
|
+
import type { AbortedMessageStrategy, AbortedToolRoundStrategy, AgentNS } from "@ai-zen/agents-core";
|
|
2
|
+
import type { AgentDefinition, McpServerConfig, TokenThresholds } from "@ai-zen/agents-sdk";
|
|
3
|
+
import type { Language } from "../i18n/index.js";
|
|
4
|
+
import type { AssetRef, AttachmentOutcome, ContextState, ConversationState, FolderFact, LocalizedText, MessageInput, ModelState, NoticeLevel, NoticeView, ProblemFact, QuestionState, QuestionView, RunState, SubAgentSnapshot, ThinkingState } from "./states.js";
|
|
5
|
+
/**
|
|
6
|
+
* 方法表:方法名 → 入参 / 出参。
|
|
7
|
+
*
|
|
8
|
+
* 命名按 `<域>.<动作>`(architecture §6)。每一段前的注释写清它服务 PRD §4 的哪条能力
|
|
9
|
+
* 编号,以及那条能力的落点为什么在宿主 —— 这是接线与前端对齐时唯一的索引。
|
|
10
|
+
*
|
|
11
|
+
* 两条贯穿全表的口径:
|
|
12
|
+
* 1. 出参只给**结构化事实**,需要句子时给 `LocalizedText`;不把句子当数据结构(PRD §3 尺子 ④⑤)。
|
|
13
|
+
* 2. 各域的「读」返回完整对象、「写」返回写后的完整对象,这样客户端拿到响应就能直接替换本地状态。
|
|
14
|
+
*
|
|
15
|
+
* 消息相关的出参用的就是 core 的类型:消息本体 `AgentNS.Message`、内容 `AgentNS.MessageContent` /
|
|
16
|
+
* `AgentNS.MessageContentSection`、增量 `AgentNS.Delta`、用量 `AgentNS.Usage`。这里只包外壳
|
|
17
|
+
* (哪个对话、哪个工作站、受理了什么)。
|
|
18
|
+
*/
|
|
19
|
+
/** 协议版本:宿主与客户端同一版发布(PRD L1),版本号用来挡掉错配的连接 */
|
|
20
|
+
export declare const PROTOCOL_VERSION = "1";
|
|
21
|
+
/** 无入参的方法用这个类型;调用时 `params` 可以省 */
|
|
22
|
+
export type NoParams = Record<string, never>;
|
|
23
|
+
/** 客户端自报的身份(`hello` 带上来,用于连接列表与日志) */
|
|
24
|
+
export interface ClientInfo {
|
|
25
|
+
/** 客户端名,如 `cli`、`desktop` */
|
|
26
|
+
name: string;
|
|
27
|
+
version: string;
|
|
28
|
+
/** 运行平台(可选,仅供展示) */
|
|
29
|
+
platform?: string;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* 能力清单里的一项(PRD F-E5 帮助由能力清单渲染、F-E6 阻塞是能力属性、F-F9 二次确认)。
|
|
33
|
+
*
|
|
34
|
+
* `id` 用 PRD 的能力编号(如 `F-C8`),因为那份清单是「要为用户做到什么」的唯一真相;
|
|
35
|
+
* 客户端据此接线,不必再维护第三份清单。
|
|
36
|
+
*/
|
|
37
|
+
export interface CapabilityView {
|
|
38
|
+
/** 稳定能力编号(PRD §4 的编号,如 `F-C8`) */
|
|
39
|
+
id: string;
|
|
40
|
+
domain: MethodDomain;
|
|
41
|
+
title: LocalizedText;
|
|
42
|
+
description: LocalizedText;
|
|
43
|
+
/** 对应的方法名;纯事实类能力(如生成六态)没有方法,为空 */
|
|
44
|
+
method: MethodName | null;
|
|
45
|
+
/** 执行期间会阻塞对话(PRD F-E6:界面要能显示「正在执行什么」) */
|
|
46
|
+
blocking: boolean;
|
|
47
|
+
/** 有不可撤销的后果(PRD F-F9:需要二次确认) */
|
|
48
|
+
destructive: boolean;
|
|
49
|
+
}
|
|
50
|
+
/** 方法的域(方法名的第一段) */
|
|
51
|
+
export type MethodDomain = "host" | "workspace" | "conversation" | "message" | "question" | "notice" | "config" | "agent" | "model" | "asset" | "completion" | "handoff" | "search";
|
|
52
|
+
/**
|
|
53
|
+
* 一次删除的代价(PRD D11「删前明说代价」/ D17「先警告」/ F-F9「二次确认」)。
|
|
54
|
+
*
|
|
55
|
+
* 客户端把 `dryRun: true` 的结果摆给用户看,用户确认后再发一次真删 —— 代价是宿主算的
|
|
56
|
+
* 账,客户端不需要自己拼。
|
|
57
|
+
*/
|
|
58
|
+
export interface RemovalConsequences {
|
|
59
|
+
conversations: number;
|
|
60
|
+
messages: number;
|
|
61
|
+
assets: number;
|
|
62
|
+
}
|
|
63
|
+
/** 「还有谁引用它」:删除被拦住时列出引用者(PRD F-F2 / F-F5 / F-F7) */
|
|
64
|
+
export interface ReferenceList {
|
|
65
|
+
/** 是否有引用(有则不能删) */
|
|
66
|
+
referenced: boolean;
|
|
67
|
+
/** 引用者:类型 + id + 显示名 */
|
|
68
|
+
items: {
|
|
69
|
+
kind: string;
|
|
70
|
+
id: string;
|
|
71
|
+
name: string;
|
|
72
|
+
}[];
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* `hello` 入参(architecture §6:首帧 `hello`,凭证不放 URL 查询串)。
|
|
76
|
+
*
|
|
77
|
+
* `language` 挂在连接上、断开即忘(PRD D8);缺省用配置里的默认语言。
|
|
78
|
+
*/
|
|
79
|
+
export interface HostHelloParams {
|
|
80
|
+
token: string;
|
|
81
|
+
/** 可选语言,认不出来回落默认语言(`normalizeLanguage`) */
|
|
82
|
+
language?: string;
|
|
83
|
+
clientInfo: ClientInfo;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* `hello` 出参。
|
|
87
|
+
*
|
|
88
|
+
* 除了握手成功本身,还把「这条连接以后说哪种语言」「宿主是什么版本」「有哪些能力」
|
|
89
|
+
* 一次给全:客户端连上就能把界面语言定下来(D8)。能力只给 id 列表(R57):握手这一帧
|
|
90
|
+
* 要小,完整清单(标题、说明、阻塞与不可撤销)走 `host.capabilities`,那一份按连接语言渲染。
|
|
91
|
+
*/
|
|
92
|
+
export interface HostHelloResult {
|
|
93
|
+
/** 这条连接协商出的语言;后续这条连接上的文案都按它渲染 */
|
|
94
|
+
language: Language;
|
|
95
|
+
hostVersion: string;
|
|
96
|
+
protocolVersion: string;
|
|
97
|
+
/** 宿主进程启动时间 */
|
|
98
|
+
startedAt: string;
|
|
99
|
+
/**
|
|
100
|
+
* 能力 id 列表(PRD F-E5 / R57)
|
|
101
|
+
*
|
|
102
|
+
* 每一串就是 `host.capabilities` 里那一项 `CapabilityView.id`,顺序与那份清单一致。
|
|
103
|
+
*/
|
|
104
|
+
capabilities: string[];
|
|
105
|
+
/** 附件上限等客户端要先知道的事实(PRD D5) */
|
|
106
|
+
limits: TransferLimits;
|
|
107
|
+
}
|
|
108
|
+
/** 与传输有关的固定上限(PRD D5 / F-H8) */
|
|
109
|
+
export interface TransferLimits {
|
|
110
|
+
/** 单张图片字节上限 */
|
|
111
|
+
maxAssetBytes: number;
|
|
112
|
+
/** 一条消息最多几张图片 */
|
|
113
|
+
maxAssetsPerMessage: number;
|
|
114
|
+
}
|
|
115
|
+
/** `version` 出参:版本与运行事实(升级判定要用磁盘版本对比,PRD D4 / F-E3) */
|
|
116
|
+
export interface HostVersionResult {
|
|
117
|
+
version: string;
|
|
118
|
+
protocolVersion: string;
|
|
119
|
+
startedAt: string;
|
|
120
|
+
/** 进程 id(发现文件里也有,客户端排查时方便对齐) */
|
|
121
|
+
pid: number;
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* `upgrade` 入参。
|
|
125
|
+
*
|
|
126
|
+
* `targetVersion` 不传表示「升到磁盘上装好的那个版本」:宿主只读到磁盘版本变了就重启,
|
|
127
|
+
* 不自己装包(PRD D4 / F-E3)。
|
|
128
|
+
*/
|
|
129
|
+
export interface HostUpgradeParams {
|
|
130
|
+
targetVersion?: string;
|
|
131
|
+
}
|
|
132
|
+
/** `upgrade` 的三种结论:已经最新 / 已安排重启 / 没有可升的东西 */
|
|
133
|
+
export type HostUpgradeState = "already_latest" | "restart_scheduled" | "not_available";
|
|
134
|
+
/** `upgrade` 出参(PRD F-E3:确认升级真的完成后立即重启,不等在跑的轮次) */
|
|
135
|
+
export interface HostUpgradeResult {
|
|
136
|
+
state: HostUpgradeState;
|
|
137
|
+
/** 当前运行的版本 */
|
|
138
|
+
currentVersion: string;
|
|
139
|
+
/** 磁盘上的版本(读不到时为空) */
|
|
140
|
+
diskVersion: string | null;
|
|
141
|
+
/** 这次要升到的版本 */
|
|
142
|
+
targetVersion: string | null;
|
|
143
|
+
}
|
|
144
|
+
/** `shutdown` 入参(PRD F-E1 里的「退出」能力) */
|
|
145
|
+
export interface HostShutdownParams {
|
|
146
|
+
reason?: string;
|
|
147
|
+
}
|
|
148
|
+
/** `shutdown` 出参:已受理(进程随后按 L4 的条件收尾) */
|
|
149
|
+
export interface HostShutdownResult {
|
|
150
|
+
accepted: boolean;
|
|
151
|
+
}
|
|
152
|
+
/** `capabilities` 出参(PRD F-E5:帮助与指令菜单都从这一份渲染) */
|
|
153
|
+
export interface HostCapabilitiesResult {
|
|
154
|
+
capabilities: CapabilityView[];
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* `host.reload` 能重载的范围(PRD F-E1 命令清单里的「重载」)。
|
|
158
|
+
*
|
|
159
|
+
* 每一档对应「哪一类能力要重新装配」:改的是磁盘上的东西(配置文件 / 助手定义 / 技能目录 /
|
|
160
|
+
* MCP 文件),所以重载不写盘,只让宿主重新读一遍。不给 `scope` 表示全部。
|
|
161
|
+
*/
|
|
162
|
+
export type HostReloadScope = "config" | "agents" | "tools" | "skills" | "mcp";
|
|
163
|
+
/** `host.reload` 入参:只重载某一类能力,或全部(不给) */
|
|
164
|
+
export interface HostReloadParams {
|
|
165
|
+
scope?: HostReloadScope;
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* `host.reload` 出参:与 `config.patch` 同一份形状(`config` + `applied`)。
|
|
169
|
+
*
|
|
170
|
+
* `config` 是重载之后读到的配置(密钥仍是掩码),`applied` 说明重载了什么、哪些项目的 Scope
|
|
171
|
+
* 被回收(随后按需重建)、合成的那一条通知是谁。客户端因此可以用与改配置同一套提示。
|
|
172
|
+
*/
|
|
173
|
+
export interface HostReloadResult {
|
|
174
|
+
config: ConfigView;
|
|
175
|
+
applied: ConfigApplyReport;
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* `setLanguage` 入参(PRD D8 / F-E4:`/lang` 是连接级动作)。
|
|
179
|
+
*
|
|
180
|
+
* 语言挂在连接上,所以这是「这条连接以后说哪种语言」,不是账号偏好。
|
|
181
|
+
*/
|
|
182
|
+
export interface HostSetLanguageParams {
|
|
183
|
+
language: string;
|
|
184
|
+
}
|
|
185
|
+
/** `setLanguage` 出参 */
|
|
186
|
+
export interface HostSetLanguageResult {
|
|
187
|
+
language: Language;
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* 一个 Workspace(PRD D9 / D12)。
|
|
191
|
+
*
|
|
192
|
+
* `folder.exists` 是「目录还在不在」这个事实;目录没了对话照常能看,是否只读由客户端判断(D12)。
|
|
193
|
+
*/
|
|
194
|
+
export interface WorkspaceView {
|
|
195
|
+
id: string;
|
|
196
|
+
name: string;
|
|
197
|
+
/** cwd 不可变(PRD D9):创建时定死,这里只读 */
|
|
198
|
+
folder: FolderFact;
|
|
199
|
+
createdAt: string;
|
|
200
|
+
updatedAt: string;
|
|
201
|
+
conversationCount: number;
|
|
202
|
+
/** 最近一次有对话活动的时间(没有则为空) */
|
|
203
|
+
lastActivityAt: string | null;
|
|
204
|
+
}
|
|
205
|
+
/** `workspace.list` 入参 */
|
|
206
|
+
export interface WorkspaceListParams {
|
|
207
|
+
/** 是否连目录已不存在的也列出来(默认列,PRD D12:照常可看) */
|
|
208
|
+
includeMissingFolders?: boolean;
|
|
209
|
+
}
|
|
210
|
+
/** `workspace.list` 出参(PRD D9 / D12) */
|
|
211
|
+
export interface WorkspaceListResult {
|
|
212
|
+
workspaces: WorkspaceView[];
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* `workspace.create` 入参(PRD D9 / D10)。
|
|
216
|
+
*
|
|
217
|
+
* `cwd` 可以是未登记的目录 —— 普通对话遇到未登记 cwd 时问一次要不要登记(D10),
|
|
218
|
+
* 用户答「是」就走这个方法;`name` 不传则由目录名起一个可改的名字。
|
|
219
|
+
*/
|
|
220
|
+
export interface WorkspaceCreateParams {
|
|
221
|
+
cwd: string;
|
|
222
|
+
name?: string;
|
|
223
|
+
}
|
|
224
|
+
/** `workspace.create` 出参 */
|
|
225
|
+
export interface WorkspaceCreateResult {
|
|
226
|
+
workspace: WorkspaceView;
|
|
227
|
+
}
|
|
228
|
+
/** `workspace.get` 入参 */
|
|
229
|
+
export interface WorkspaceGetParams {
|
|
230
|
+
workspaceId: string;
|
|
231
|
+
}
|
|
232
|
+
/** `workspace.get` 出参 */
|
|
233
|
+
export interface WorkspaceGetResult {
|
|
234
|
+
workspace: WorkspaceView;
|
|
235
|
+
}
|
|
236
|
+
/** `workspace.rename` 入参(名字可改,id 与 cwd 不变,PRD D9) */
|
|
237
|
+
export interface WorkspaceRenameParams {
|
|
238
|
+
workspaceId: string;
|
|
239
|
+
name: string;
|
|
240
|
+
}
|
|
241
|
+
/** `workspace.rename` 出参 */
|
|
242
|
+
export interface WorkspaceRenameResult {
|
|
243
|
+
workspace: WorkspaceView;
|
|
244
|
+
}
|
|
245
|
+
/**
|
|
246
|
+
* `workspace.remove` 入参(PRD D11 / F-F9)。
|
|
247
|
+
*
|
|
248
|
+
* `dryRun: true` 只算代价不动手,供客户端做二次确认;目录本身宿主不碰(D11)。
|
|
249
|
+
*/
|
|
250
|
+
export interface WorkspaceRemoveParams {
|
|
251
|
+
workspaceId: string;
|
|
252
|
+
dryRun?: boolean;
|
|
253
|
+
}
|
|
254
|
+
/** `workspace.remove` 出参 */
|
|
255
|
+
export interface WorkspaceRemoveResult {
|
|
256
|
+
removed: boolean;
|
|
257
|
+
consequences: RemovalConsequences;
|
|
258
|
+
}
|
|
259
|
+
/**
|
|
260
|
+
* 对话在列表里的样子(PRD F-C5 / D13)。
|
|
261
|
+
*
|
|
262
|
+
* `pinned` 与 `createdAt` 一起决定侧栏顺序:默认创建时间倒序、置顶优先;活动/打开/改名都不改顺序(D13)。
|
|
263
|
+
*/
|
|
264
|
+
export interface ConversationSummary {
|
|
265
|
+
id: string;
|
|
266
|
+
workspaceId: string;
|
|
267
|
+
/** 可改的名字(PRD D1:改名不碰 id,名字是独立字段) */
|
|
268
|
+
name: string;
|
|
269
|
+
/** 名字还是「创建时间」这个原名,即用户没改过(PRD D2) */
|
|
270
|
+
nameIsAuto: boolean;
|
|
271
|
+
pinned: boolean;
|
|
272
|
+
/** 这段对话的助手(创建时定死,PRD L7) */
|
|
273
|
+
agentId: string;
|
|
274
|
+
/** 这段对话现在用的模型(存会话行上,可改,PRD F-B4) */
|
|
275
|
+
modelId: string;
|
|
276
|
+
createdAt: string;
|
|
277
|
+
updatedAt: string;
|
|
278
|
+
messageCount: number;
|
|
279
|
+
lastMessageAt: string | null;
|
|
280
|
+
/** 现在是否在跑一轮(PRD F-I3) */
|
|
281
|
+
running: boolean;
|
|
282
|
+
/** 是否有问题挂着没答(PRD F-I9) */
|
|
283
|
+
hasPendingQuestion: boolean;
|
|
284
|
+
}
|
|
285
|
+
/**
|
|
286
|
+
* 一段对话的当前模型事实(PRD F-B4 / F-B8)。
|
|
287
|
+
*
|
|
288
|
+
* `source` 说这个模型是谁定的:`agent` = 助手定义上那个(这段会话没换过);
|
|
289
|
+
* `conversation` = 这段会话自己定的(创建时点名或 `conversation.setModel` 改过)。
|
|
290
|
+
*/
|
|
291
|
+
export type ConversationModelState = ModelState;
|
|
292
|
+
/** 一段对话的完整样子 */
|
|
293
|
+
export interface ConversationView extends ConversationSummary {
|
|
294
|
+
model: ConversationModelState;
|
|
295
|
+
thinking: ThinkingState;
|
|
296
|
+
/** 对话所属 Workspace 的目录事实(PRD D12) */
|
|
297
|
+
folder: FolderFact;
|
|
298
|
+
}
|
|
299
|
+
/** `conversation.list` 入参(PRD F-C5 / D13:按 Workspace 列表、按置顶筛) */
|
|
300
|
+
export interface ConversationListParams {
|
|
301
|
+
workspaceId?: string;
|
|
302
|
+
/** true 只看置顶,false 只看未置顶,不传全要 */
|
|
303
|
+
pinned?: boolean;
|
|
304
|
+
limit?: number;
|
|
305
|
+
offset?: number;
|
|
306
|
+
}
|
|
307
|
+
/** `conversation.list` 出参:按侧栏顺序排好的结果 + 总数 */
|
|
308
|
+
export interface ConversationListResult {
|
|
309
|
+
conversations: ConversationSummary[];
|
|
310
|
+
total: number;
|
|
311
|
+
}
|
|
312
|
+
/**
|
|
313
|
+
* `conversation.create` 入参(PRD F-A3「开新会话、别续接」/ F-C7 / D9 / D10 / L7)。
|
|
314
|
+
*
|
|
315
|
+
* 项目与助手在创建时定死(PRD L7);模型先取助手定义上那个(也可在这里点名),之后归这段会话
|
|
316
|
+
* —— 换它走 `conversation.setModel`,改「以后的对话」用哪个模型走 `agent.setModel`。
|
|
317
|
+
*
|
|
318
|
+
* 定位项目两条路(D10):`workspaceId` 是「已经登记过的项目」;`cwd` 是从目录出发
|
|
319
|
+
* —— 那个目录还没登记成项目时,宿主不建对话,而是问一次要不要登记(见出参)。
|
|
320
|
+
*/
|
|
321
|
+
export interface ConversationCreateParams {
|
|
322
|
+
/** 已经登记的项目 id */
|
|
323
|
+
workspaceId: string;
|
|
324
|
+
agentId: string;
|
|
325
|
+
/** 缺省用助手绑定的模型(PRD F-B1:模型真相在助手定义上) */
|
|
326
|
+
modelId?: string;
|
|
327
|
+
}
|
|
328
|
+
/**
|
|
329
|
+
* `conversation.create` 出参。
|
|
330
|
+
*
|
|
331
|
+
* 一定建出了草稿(R56:这行还没落库,首次 `send` 才写)。
|
|
332
|
+
*/
|
|
333
|
+
export interface ConversationCreateResult {
|
|
334
|
+
conversation: ConversationView;
|
|
335
|
+
}
|
|
336
|
+
/** `conversation.get` 入参(PRD F-A6:宿主只提供「按 id 打开」) */
|
|
337
|
+
export interface ConversationGetParams {
|
|
338
|
+
conversationId: string;
|
|
339
|
+
}
|
|
340
|
+
/** `conversation.get` 出参 */
|
|
341
|
+
export interface ConversationGetResult {
|
|
342
|
+
conversation: ConversationView;
|
|
343
|
+
}
|
|
344
|
+
/** `conversation.state` 入参(PRD L5:重连先拉状态) */
|
|
345
|
+
export interface ConversationStateParams {
|
|
346
|
+
conversationId: string;
|
|
347
|
+
/**
|
|
348
|
+
* 连消息本体一起回(默认 `false`)。
|
|
349
|
+
*
|
|
350
|
+
* 客户端打开一段对话时本来就要「现场 + 消息」两件事,分两次调会在两份快照之间留一道缝
|
|
351
|
+
* (第二次请求发出前又落了一条消息,现场说的用量就对不上消息);带上这个开关一次拿齐。
|
|
352
|
+
* 只要现场、不要消息的调用方(状态栏轮询)不必为消息付费。
|
|
353
|
+
*/
|
|
354
|
+
includeMessages?: boolean;
|
|
355
|
+
}
|
|
356
|
+
/** `conversation.state` 出参:一段对话的现场(六态、阈值、问题、用量、状态栏块) */
|
|
357
|
+
export interface ConversationStateResult {
|
|
358
|
+
state: ConversationState;
|
|
359
|
+
/**
|
|
360
|
+
* `includeMessages: true` 时的整段消息,与 `message.list` 同一形状、同一顺序(含流式中那条的最新内容)。
|
|
361
|
+
* 没要的时候这个键不出现 —— 不是空数组,空数组的含义是「对话里没有消息」。
|
|
362
|
+
*/
|
|
363
|
+
messages?: AgentNS.Message[];
|
|
364
|
+
}
|
|
365
|
+
/** `conversation.rename` 入参(PRD D1 / F-C3:改名不改身份、不改排序) */
|
|
366
|
+
export interface ConversationRenameParams {
|
|
367
|
+
conversationId: string;
|
|
368
|
+
name: string;
|
|
369
|
+
}
|
|
370
|
+
/** `conversation.rename` 出参 */
|
|
371
|
+
export interface ConversationRenameResult {
|
|
372
|
+
conversation: ConversationView;
|
|
373
|
+
}
|
|
374
|
+
/** `conversation.pin` 入参(PRD F-C5 / D13:手动置顶) */
|
|
375
|
+
export interface ConversationPinParams {
|
|
376
|
+
conversationId: string;
|
|
377
|
+
pinned: boolean;
|
|
378
|
+
}
|
|
379
|
+
/** `conversation.pin` 出参 */
|
|
380
|
+
export interface ConversationPinResult {
|
|
381
|
+
conversation: ConversationView;
|
|
382
|
+
}
|
|
383
|
+
/**
|
|
384
|
+
* `conversation.delete` 入参(PRD F-C10 / D17 / F-F9)。
|
|
385
|
+
*
|
|
386
|
+
* 硬删,图片按引用清理;`dryRun: true` 先算代价,供「删除前警告」使用。
|
|
387
|
+
*/
|
|
388
|
+
export interface ConversationDeleteParams {
|
|
389
|
+
conversationId: string;
|
|
390
|
+
dryRun?: boolean;
|
|
391
|
+
}
|
|
392
|
+
/** `conversation.delete` 出参 */
|
|
393
|
+
export interface ConversationDeleteResult {
|
|
394
|
+
removed: boolean;
|
|
395
|
+
consequences: RemovalConsequences;
|
|
396
|
+
}
|
|
397
|
+
/**
|
|
398
|
+
* `conversation.send` 入参(PRD F-C2 / L6 / D14 / F-H7 / F-D10)。
|
|
399
|
+
*
|
|
400
|
+
* 一轮的开始:宿主先占位(在跑则 `busy`),再分配用户消息与助手消息的 id(L6:助手消息 id
|
|
401
|
+
* 在请求发出之前就有),然后开始流式。用户输入用 core 的内容形状(`MessageInput`),
|
|
402
|
+
* 图片的传输路径由宿主定(F-H7)。
|
|
403
|
+
* 有问题在挡着这段对话时会被拒(`question_pending`,D23 / F-D10)。
|
|
404
|
+
*/
|
|
405
|
+
export interface ConversationSendParams {
|
|
406
|
+
conversationId: string;
|
|
407
|
+
input: MessageInput;
|
|
408
|
+
}
|
|
409
|
+
/**
|
|
410
|
+
* `conversation.send` 出参:受理即返回两个 id(PRD F-I12:受理了就不会静默丢)。
|
|
411
|
+
*
|
|
412
|
+
* `attachments` 说明每个附件最后是怎么走的(文件引用 / 内联 / 退化成文字 / 没发出去),
|
|
413
|
+
* 失败与降级都带原因,拿不到结果时不报成功(F-H7)。
|
|
414
|
+
*/
|
|
415
|
+
export interface ConversationSendResult {
|
|
416
|
+
userMessageId: string;
|
|
417
|
+
assistantMessageId: string;
|
|
418
|
+
attachments: AttachmentOutcome[];
|
|
419
|
+
acceptedAt: string;
|
|
420
|
+
}
|
|
421
|
+
/**
|
|
422
|
+
* `conversation.abort` 入参(PRD D14:中止是用户的显式动作,不排队、不自动打断)。
|
|
423
|
+
*/
|
|
424
|
+
export interface ConversationAbortParams {
|
|
425
|
+
conversationId: string;
|
|
426
|
+
reason?: string;
|
|
427
|
+
}
|
|
428
|
+
/** `conversation.abort` 出参:中止后的运行状态(`aborted: false` 表示本来就没在跑) */
|
|
429
|
+
export interface ConversationAbortResult {
|
|
430
|
+
aborted: boolean;
|
|
431
|
+
run: RunState;
|
|
432
|
+
}
|
|
433
|
+
/**
|
|
434
|
+
* `conversation.revert` 入参(PRD F-C8 / D24)。
|
|
435
|
+
*
|
|
436
|
+
* 撤回到某条用户消息**之前**:其后消息硬删,被撤回的内容回填输入框(回填内容由宿主给事实)。
|
|
437
|
+
*/
|
|
438
|
+
export interface ConversationRevertParams {
|
|
439
|
+
conversationId: string;
|
|
440
|
+
/** 撤回点:这条用户消息及其之后的内容都会被删 */
|
|
441
|
+
beforeMessageId: string;
|
|
442
|
+
}
|
|
443
|
+
/** `conversation.revert` 出参 */
|
|
444
|
+
export interface ConversationRevertResult {
|
|
445
|
+
/** 被删掉的消息 id(按原顺序) */
|
|
446
|
+
removedMessageIds: string[];
|
|
447
|
+
/** 回填到输入框的内容(core 的内容形状 + 素材引用,PRD F-C8) */
|
|
448
|
+
restoredInput: MessageInput;
|
|
449
|
+
}
|
|
450
|
+
/**
|
|
451
|
+
* `conversation.setModel` 入参(PRD F-B4 / F-B8 / D20)。
|
|
452
|
+
*
|
|
453
|
+
* 换的是**这段会话**的模型:写完就落库,重开、重启都还是它;换模型同时把这段会话的
|
|
454
|
+
* 思考档位清成「跟随助手默认」(档位属于模型)。历史里有图而新模型读不了图时拒绝
|
|
455
|
+
* (业务码 `model_unsupported`)。改助手默认模型是另一个动作,见 `agent.setModel`。
|
|
456
|
+
*/
|
|
457
|
+
export interface ConversationSetModelParams {
|
|
458
|
+
conversationId: string;
|
|
459
|
+
/** `null` 表示回到助手定义上那个模型 */
|
|
460
|
+
modelId: string | null;
|
|
461
|
+
}
|
|
462
|
+
/** `conversation.setModel` 出参 */
|
|
463
|
+
export interface ConversationSetModelResult {
|
|
464
|
+
conversation: ConversationView;
|
|
465
|
+
model: ConversationModelState;
|
|
466
|
+
/** 换模型后上下文占用要重算(阈值跟着模型走,PRD D27) */
|
|
467
|
+
context: ContextState;
|
|
468
|
+
}
|
|
469
|
+
/**
|
|
470
|
+
* `conversation.setThinking` 入参(PRD F-B6 / F-B7)。
|
|
471
|
+
*
|
|
472
|
+
* 改的是**这段会话**的思考档位:档位名落库,装配 agent 时按当前模型的思考策略表展开成
|
|
473
|
+
* 参数补丁。与 `agent.setThinking`(改助手的默认)分开。
|
|
474
|
+
*/
|
|
475
|
+
export interface ConversationSetThinkingParams {
|
|
476
|
+
conversationId: string;
|
|
477
|
+
/** 档位名(来自 `ThinkingState.levels`);`null` = 回到跟随助手默认 */
|
|
478
|
+
level: string | null;
|
|
479
|
+
}
|
|
480
|
+
/** `conversation.setThinking` 出参:展开后的参数与来源(PRD F-B7) */
|
|
481
|
+
export interface ConversationSetThinkingResult {
|
|
482
|
+
thinking: ThinkingState;
|
|
483
|
+
}
|
|
484
|
+
/**
|
|
485
|
+
* `conversation.transient` 入参(PRD F-A2 / D3:临时对话)。
|
|
486
|
+
*
|
|
487
|
+
* 一次请求跑一轮、结果返回后内存清空:无 id、不可 attach、不入库、不进列表;只借 Scope,
|
|
488
|
+
* 与 Workspace 无关,所以这里要显式的 `cwd` 而不是 `workspaceId`。
|
|
489
|
+
*/
|
|
490
|
+
export interface ConversationTransientParams {
|
|
491
|
+
/** 这一轮在哪个目录里跑(相对路径的解析基准) */
|
|
492
|
+
cwd: string;
|
|
493
|
+
input: MessageInput;
|
|
494
|
+
agentId?: string;
|
|
495
|
+
modelId?: string;
|
|
496
|
+
}
|
|
497
|
+
/**
|
|
498
|
+
* `conversation.transient` 出参:这一轮产出的那条助手消息(不产生任何可回看的 id)。
|
|
499
|
+
*
|
|
500
|
+
* 内容、思考、工具调用、结束原因、用量都在 core 的 `AgentNS.Message` 上;要「这一轮一共花了
|
|
501
|
+
* 多少」用 core 的 `sumUsage([message])`(它把自身用量与子 Agent 用量一起算)。
|
|
502
|
+
*/
|
|
503
|
+
export interface ConversationTransientResult {
|
|
504
|
+
/** 这一轮产出的助手消息,core 原样 */
|
|
505
|
+
message: AgentNS.Message;
|
|
506
|
+
subagents: SubAgentSnapshot[];
|
|
507
|
+
problem: ProblemFact | null;
|
|
508
|
+
}
|
|
509
|
+
/**
|
|
510
|
+
* `message.list` 入参(architecture A12 / PRD L5 / F-I7 / F-C6)。
|
|
511
|
+
*
|
|
512
|
+
* - 不给 `after`、也不给 `around`:返回这段对话的全部消息;
|
|
513
|
+
* - 给了 `after` 且该 id 存在:**从这条开始**(含它本身,内容是**最新**的)+ 其后全部;
|
|
514
|
+
* - 给了 `after` 但该 id 不存在:返回全部。
|
|
515
|
+
*
|
|
516
|
+
* `around` 是另一条取法(PRD F-C6 的定位):**以某条消息为中心取一窗**,见下。
|
|
517
|
+
*
|
|
518
|
+
* 「从这条开始而不是它的下一条」是故意的:重连的客户端上次拿到的最后一条可能正是流式中那条,
|
|
519
|
+
* 它的内容已经变了;从它自己重新拿,就天然是「最新内容 + 之后的」。
|
|
520
|
+
*
|
|
521
|
+
* `toolCallId` 用来取某个子 Agent 自己的消息(PRD F-I7:子 Agent 的消息可回看)。
|
|
522
|
+
*
|
|
523
|
+
* `hidden` 的消息(会话创建时那条 cwd 消息、交接摘要)默认**不返回**:core 的 `hidden` 就是
|
|
524
|
+
* 「这条不给人看」。要它们就显式要(`includeHidden: true`)。
|
|
525
|
+
*/
|
|
526
|
+
export interface MessageListParams {
|
|
527
|
+
conversationId: string;
|
|
528
|
+
after?: string;
|
|
529
|
+
toolCallId?: string;
|
|
530
|
+
/**
|
|
531
|
+
* 定位取窗(PRD F-C6):以这条消息为中心取一窗,供客户端把搜索命中的那条摆到眼前。
|
|
532
|
+
*
|
|
533
|
+
* **消费者是桌面端的搜索命中跳转(PLAN W4)**:`search.messages` 给了一条命中,桌面端拿着它的
|
|
534
|
+
* `messageId` 调 `message.list({ around })` 就能直接渲染命中那条附近的一段对话。
|
|
535
|
+
*
|
|
536
|
+
* 只在一种情形下有一种解释:
|
|
537
|
+
* - 命中(这条在这段对话里、且在本次可见集里):返回以它为中心的一窗(默认 40 条,
|
|
538
|
+
* 见 `MessageService` 的 `AROUND_WINDOW`;前后尽量均分,命中那条一定在里面),
|
|
539
|
+
* `anchor` 报成它;
|
|
540
|
+
* - 没命中(已撤回 / 换过库 / 是 `hidden` 而这次没要 `includeHidden`):**空页**
|
|
541
|
+
* (`messages: []`、`anchor: null`),**不报错** —— 消息可能刚被撤回,那不是一次失败的请求;
|
|
542
|
+
* - 与 `after` 同时给:**`around` 优先,`after` 被忽略**。两者是两种取法(一个「从这里往下」、
|
|
543
|
+
* 一个「围绕这里」),混在一起没有唯一答案,所以只认 `around`;
|
|
544
|
+
* - 与 `toolCallId` 同时给:`toolCallId` 决定读哪一段消息(子 Agent 自己那一段),`around`
|
|
545
|
+
* 只在这一段里定位 —— 与 `after` 无关。
|
|
546
|
+
*/
|
|
547
|
+
around?: string;
|
|
548
|
+
/** 连 `hidden` 的消息一起返回(默认 false) */
|
|
549
|
+
includeHidden?: boolean;
|
|
550
|
+
}
|
|
551
|
+
/**
|
|
552
|
+
* `message.list` 出参:消息本体就是 core 的 `AgentNS.Message`,这里只包一层定位外壳。
|
|
553
|
+
*
|
|
554
|
+
* 顺序即对话里的先后顺序;「这条是否还在上下文里」看消息自己的 `omit`,「这条是不是不给人看」
|
|
555
|
+
* 看 `hidden`(PRD F-D9),内容与工具调用看 `content` / `tool_calls` / `reasoning_content`。
|
|
556
|
+
*/
|
|
557
|
+
export interface MessageListResult {
|
|
558
|
+
conversationId: string;
|
|
559
|
+
/**
|
|
560
|
+
* 被 `after` / `around` 命中的那条消息 id(没命中或没给则为空)。
|
|
561
|
+
*
|
|
562
|
+
* 客户端据此判断这是全量还是续传、以及这次 `around` 找没找到(`around` 没命中时是空页 + `null`)。
|
|
563
|
+
*/
|
|
564
|
+
anchor: string | null;
|
|
565
|
+
messages: AgentNS.Message[];
|
|
566
|
+
}
|
|
567
|
+
/** `question.list` 入参(PRD D22:多端看到同一个问题) */
|
|
568
|
+
export interface QuestionListParams {
|
|
569
|
+
conversationId?: string;
|
|
570
|
+
/** 只看某个状态;不传则全部 */
|
|
571
|
+
state?: QuestionState;
|
|
572
|
+
}
|
|
573
|
+
/** `question.list` 出参 */
|
|
574
|
+
export interface QuestionListResult {
|
|
575
|
+
questions: QuestionView[];
|
|
576
|
+
}
|
|
577
|
+
/**
|
|
578
|
+
* `question.answer` 出参里的后续动作(PRD D22:答完就接着往下走,客户端不必再发一次请求)。
|
|
579
|
+
*/
|
|
580
|
+
export interface QuestionEffects {
|
|
581
|
+
/** 这道题答完后开始交接(D22:交接在对话停下之后触发) */
|
|
582
|
+
handoffStarted: boolean;
|
|
583
|
+
/** 交接顺带开出来的新对话(PRD D18:同 Workspace、同助手) */
|
|
584
|
+
newConversationId: string | null;
|
|
585
|
+
}
|
|
586
|
+
/** `question.answer` 入参(PRD D22 / F-I9:问题能被回答) */
|
|
587
|
+
export interface QuestionAnswerParams {
|
|
588
|
+
questionId: string;
|
|
589
|
+
/** 候选里的值(`QuestionView.options[].value`) */
|
|
590
|
+
value: string;
|
|
591
|
+
}
|
|
592
|
+
/** `question.answer` 出参 */
|
|
593
|
+
export interface QuestionAnswerResult {
|
|
594
|
+
question: QuestionView;
|
|
595
|
+
effects: QuestionEffects;
|
|
596
|
+
}
|
|
597
|
+
/** `notice.list` 入参(PRD L3 / F-I8:通知是独立通道,持久化、可手动清) */
|
|
598
|
+
export interface NoticeListParams {
|
|
599
|
+
conversationId?: string;
|
|
600
|
+
level?: NoticeLevel;
|
|
601
|
+
}
|
|
602
|
+
/** `notice.list` 出参 */
|
|
603
|
+
export interface NoticeListResult {
|
|
604
|
+
notices: NoticeView[];
|
|
605
|
+
}
|
|
606
|
+
/** `notice.dismiss` 入参:清掉一条 */
|
|
607
|
+
export interface NoticeDismissParams {
|
|
608
|
+
noticeId: string;
|
|
609
|
+
}
|
|
610
|
+
/** `notice.dismiss` 出参 */
|
|
611
|
+
export interface NoticeDismissResult {
|
|
612
|
+
dismissed: boolean;
|
|
613
|
+
}
|
|
614
|
+
/** `notice.clear` 入参:清掉一批(不给 `conversationId` 就清全部) */
|
|
615
|
+
export interface NoticeClearParams {
|
|
616
|
+
conversationId?: string;
|
|
617
|
+
}
|
|
618
|
+
/** `notice.clear` 出参 */
|
|
619
|
+
export interface NoticeClearResult {
|
|
620
|
+
cleared: number;
|
|
621
|
+
}
|
|
622
|
+
/** 端点:密钥掩码显示(PRD F-F2) */
|
|
623
|
+
export interface EndpointView {
|
|
624
|
+
id: string;
|
|
625
|
+
name: string;
|
|
626
|
+
baseUrl: string;
|
|
627
|
+
/** 掩码后的密钥,例如 `sk-…9f3a`;明文不出网 */
|
|
628
|
+
apiKeyMasked: string;
|
|
629
|
+
/** 是否配了密钥(PRD F-A7 的「这个端点配好了没」) */
|
|
630
|
+
apiKeySet: boolean;
|
|
631
|
+
description: string | null;
|
|
632
|
+
capabilities: {
|
|
633
|
+
filesApi: boolean;
|
|
634
|
+
};
|
|
635
|
+
}
|
|
636
|
+
/**
|
|
637
|
+
* 端点写入(PRD F-F2)。
|
|
638
|
+
*
|
|
639
|
+
* `apiKey` 省略表示「保留原密钥」:读出来的密钥是掩码(`sk-…9f3a` 这种值),回写它会把掩码
|
|
640
|
+
* 当成密钥存起来,所以「不改密钥」用省略表达,而不是传空串。
|
|
641
|
+
*/
|
|
642
|
+
export interface EndpointInput {
|
|
643
|
+
id: string;
|
|
644
|
+
name: string;
|
|
645
|
+
baseUrl: string;
|
|
646
|
+
apiKey?: string;
|
|
647
|
+
description?: string;
|
|
648
|
+
capabilities?: {
|
|
649
|
+
filesApi?: boolean;
|
|
650
|
+
};
|
|
651
|
+
}
|
|
652
|
+
/** 模型:编辑即转自定义,恢复出厂是整条替换(PRD F-F3) */
|
|
653
|
+
export interface ModelView {
|
|
654
|
+
id: string;
|
|
655
|
+
name: string;
|
|
656
|
+
endpointId: string;
|
|
657
|
+
/** 发给 API 的模型名(不填则用 id) */
|
|
658
|
+
modelName: string | null;
|
|
659
|
+
/** 两条阈值(PRD F-D1 / D27:交接线与硬线) */
|
|
660
|
+
tokenThresholds: TokenThresholds;
|
|
661
|
+
defaultParams: Record<string, unknown>;
|
|
662
|
+
/** 思考策略名 */
|
|
663
|
+
reasoningPreset: string | null;
|
|
664
|
+
/** 这个策略下可选的档位名(PRD F-B7:能不能调、能调哪几档) */
|
|
665
|
+
thinkingLevels: string[];
|
|
666
|
+
/** 能不能看图(PRD D20 / F-B8) */
|
|
667
|
+
vision: boolean;
|
|
668
|
+
description: string | null;
|
|
669
|
+
/** 是不是用户自定义的(false = 出厂托管,PRD F-F3) */
|
|
670
|
+
custom: boolean;
|
|
671
|
+
/** 现在能不能用;不能用时 `unavailableReason` 说明原因(PRD F-B5) */
|
|
672
|
+
available: boolean;
|
|
673
|
+
unavailableReason: LocalizedText | null;
|
|
674
|
+
}
|
|
675
|
+
/** 模型写入(PRD F-F3) */
|
|
676
|
+
export interface ModelInput {
|
|
677
|
+
id: string;
|
|
678
|
+
name: string;
|
|
679
|
+
endpointId: string;
|
|
680
|
+
modelName?: string;
|
|
681
|
+
/**
|
|
682
|
+
* 两条上下文阈值。**省略 = 用出厂默认**(SDK `DEFAULT_APP_CONFIG` 里那份),不是「不设阈值」:
|
|
683
|
+
* 没有阈值的模型既不会触发交接、也没有硬线保护。
|
|
684
|
+
*
|
|
685
|
+
* `model.create` 省略时套出厂默认;`model.update` 省略时不动(局部更新的既有语义)。
|
|
686
|
+
*/
|
|
687
|
+
tokenThresholds?: TokenThresholds;
|
|
688
|
+
defaultParams?: Record<string, unknown>;
|
|
689
|
+
reasoningPreset?: string;
|
|
690
|
+
vision?: boolean;
|
|
691
|
+
description?: string;
|
|
692
|
+
}
|
|
693
|
+
/** 图片模型(PRD F-F4 / D6) */
|
|
694
|
+
export interface ImageModelView {
|
|
695
|
+
id: string;
|
|
696
|
+
name: string;
|
|
697
|
+
endpointId: string;
|
|
698
|
+
modelName: string;
|
|
699
|
+
description: string | null;
|
|
700
|
+
defaultSize: string | null;
|
|
701
|
+
defaultQuality: string | null;
|
|
702
|
+
custom: boolean;
|
|
703
|
+
}
|
|
704
|
+
/** 图片模型写入(PRD F-F4) */
|
|
705
|
+
export interface ImageModelInput {
|
|
706
|
+
id: string;
|
|
707
|
+
name: string;
|
|
708
|
+
endpointId: string;
|
|
709
|
+
modelName: string;
|
|
710
|
+
description?: string;
|
|
711
|
+
defaultSize?: string;
|
|
712
|
+
defaultQuality?: string;
|
|
713
|
+
}
|
|
714
|
+
/**
|
|
715
|
+
* 默认项(PRD F-F7 / D2 / D6)。
|
|
716
|
+
*
|
|
717
|
+
* 模型只有一个真相源在助手定义上(PRD F-B1),这里的 `defaultModel` 是 SDK 的兜底那一层,
|
|
718
|
+
* 只在助手没绑模型时起作用。`language` 是这一组里唯一的非「选哪个实体」项:它是缺省语言
|
|
719
|
+
* (裁定 R58),与 SDK `AppConfig.language` 同源。
|
|
720
|
+
*/
|
|
721
|
+
export interface DefaultSelection {
|
|
722
|
+
/** 默认助手(PRD F-B3 / F-B5) */
|
|
723
|
+
defaultAgent: string | null;
|
|
724
|
+
/** 兜底模型(助手没绑模型时才用) */
|
|
725
|
+
defaultModel: string | null;
|
|
726
|
+
/** 默认迁移模型(PRD F-F7) */
|
|
727
|
+
defaultMigrationModel: string | null;
|
|
728
|
+
/** 默认图片模型(PRD F-F7 / D6) */
|
|
729
|
+
defaultImageModel: string | null;
|
|
730
|
+
/** 自动命名用的「取名模型」(PRD D2) */
|
|
731
|
+
namingModel: string | null;
|
|
732
|
+
/** 自动命名开关(PRD D2:带独立开关) */
|
|
733
|
+
autoTitle: boolean;
|
|
734
|
+
/**
|
|
735
|
+
* 缺省语言(PRD D8 / 裁定 R58):`hello` 没声明语言时算哪一种。
|
|
736
|
+
*
|
|
737
|
+
* 它不是「这个客户端现在用哪种语言」(那是连接的事,断开即忘),而是「没声明时用哪一种」。
|
|
738
|
+
* 省略 = 这次不改;写 `null` = 清掉这一项(回落英文);`config.get` 读回时没设置就是 `null`。
|
|
739
|
+
*/
|
|
740
|
+
language?: Language | null;
|
|
741
|
+
}
|
|
742
|
+
/** 配置层面的上限(PRD F-F8 / D5) */
|
|
743
|
+
export interface ConfigLimits {
|
|
744
|
+
/** 工具输出上限(字符数,PRD F-F8) */
|
|
745
|
+
maxToolOutput: number;
|
|
746
|
+
maxAssetBytes: number;
|
|
747
|
+
maxAssetsPerMessage: number;
|
|
748
|
+
}
|
|
749
|
+
/** 中断修复与工具刷新的行为开关(SDK 口径,宿主只做透传与生效) */
|
|
750
|
+
export interface ConfigBehavior {
|
|
751
|
+
/** 被中断的助手消息怎么处置(PRD D15 的修复口径) */
|
|
752
|
+
abortedMessageStrategy: AbortedMessageStrategy;
|
|
753
|
+
/** 被中断的工具轮次怎么归一(PRD D15) */
|
|
754
|
+
abortedToolRoundStrategy: AbortedToolRoundStrategy;
|
|
755
|
+
/** 每轮刷新工具的时机(PRD F-E2:改完配置即生效的那条链) */
|
|
756
|
+
autoRefreshTools: "off" | "outer-loop-start" | "inner-loop-start";
|
|
757
|
+
}
|
|
758
|
+
/** 整个配置的只读形状(PRD F-F1:一处管完所有配置;密钥掩码,PRD F-F2) */
|
|
759
|
+
export interface ConfigView {
|
|
760
|
+
endpoints: EndpointView[];
|
|
761
|
+
models: ModelView[];
|
|
762
|
+
imageModels: ImageModelView[];
|
|
763
|
+
defaults: DefaultSelection;
|
|
764
|
+
limits: ConfigLimits;
|
|
765
|
+
behavior: ConfigBehavior;
|
|
766
|
+
/** 配置文件所在目录(数据根),便于用户知道改的是哪一份 */
|
|
767
|
+
configDir: string;
|
|
768
|
+
}
|
|
769
|
+
/**
|
|
770
|
+
* 一条配置问题(PRD F-A8:配错了要能当场修 —— 宿主给结构化原因)。
|
|
771
|
+
*
|
|
772
|
+
* `path` 指到具体字段(如 `models[2].endpointId`),客户端据此把光标放到那一栏。
|
|
773
|
+
*/
|
|
774
|
+
export interface ConfigIssue {
|
|
775
|
+
severity: "error" | "warning";
|
|
776
|
+
/** 稳定码,客户端据此分支 */
|
|
777
|
+
code: string;
|
|
778
|
+
text: LocalizedText;
|
|
779
|
+
/** 出问题的字段路径 */
|
|
780
|
+
path: string | null;
|
|
781
|
+
}
|
|
782
|
+
/** `config.get` 入参 */
|
|
783
|
+
export type ConfigGetParams = NoParams;
|
|
784
|
+
/** `config.get` 出参(PRD F-F1 / D21:配置的读写都走宿主 API) */
|
|
785
|
+
export interface ConfigGetResult {
|
|
786
|
+
config: ConfigView;
|
|
787
|
+
/** 现在读到的这份配置有没有问题(有问题时相关动作会以 `config_invalid` 拒绝) */
|
|
788
|
+
issues: ConfigIssue[];
|
|
789
|
+
}
|
|
790
|
+
/**
|
|
791
|
+
* 配置写入(PRD F-F1 / D21:改完即生效,没有全局「保存」键)。
|
|
792
|
+
*
|
|
793
|
+
* 端点、模型、助手各有自己的写方法(它们要做引用检查与掩码处理);这里管的是
|
|
794
|
+
* 默认项、上限与行为开关这些「散落的小设置」。
|
|
795
|
+
*/
|
|
796
|
+
export interface ConfigPatch {
|
|
797
|
+
defaults?: Partial<DefaultSelection>;
|
|
798
|
+
limits?: Partial<Pick<ConfigLimits, "maxToolOutput">>;
|
|
799
|
+
behavior?: Partial<ConfigBehavior>;
|
|
800
|
+
}
|
|
801
|
+
/**
|
|
802
|
+
* 改完配置后「做了什么」(PRD F-E2:改完不用重启就生效)。
|
|
803
|
+
*
|
|
804
|
+
* 哪些东西被重载、哪些 Scope 被回收重连 MCP,都作为事实回报 —— 界面据此提示「已生效」,
|
|
805
|
+
* 用户不必去猜要不要重启。
|
|
806
|
+
*/
|
|
807
|
+
export interface ConfigApplyReport {
|
|
808
|
+
appliedAt: string;
|
|
809
|
+
reloaded: {
|
|
810
|
+
config: boolean;
|
|
811
|
+
tools: boolean;
|
|
812
|
+
skills: boolean;
|
|
813
|
+
agents: boolean;
|
|
814
|
+
mcp: boolean;
|
|
815
|
+
};
|
|
816
|
+
/** 因为配置变化被回收(随后会重建)的 Workspace Scope */
|
|
817
|
+
recycledWorkspaceIds: string[];
|
|
818
|
+
/** 是否还需要重启才生效(配置变更走重连,PRD F-E2) */
|
|
819
|
+
restartRequired: boolean;
|
|
820
|
+
/** 这次改动合成的一条通知(PRD F-F9:一次改动合成一条通知) */
|
|
821
|
+
noticeId: string | null;
|
|
822
|
+
}
|
|
823
|
+
/** `config.patch` 入参 */
|
|
824
|
+
export interface ConfigPatchParams {
|
|
825
|
+
patch: ConfigPatch;
|
|
826
|
+
}
|
|
827
|
+
/** `config.patch` 出参 */
|
|
828
|
+
export interface ConfigPatchResult {
|
|
829
|
+
config: ConfigView;
|
|
830
|
+
applied: ConfigApplyReport;
|
|
831
|
+
}
|
|
832
|
+
/** `config.setDefaults` 入参(PRD F-F7 / D2 / D6) */
|
|
833
|
+
export interface ConfigSetDefaultsParams {
|
|
834
|
+
defaults: Partial<DefaultSelection>;
|
|
835
|
+
}
|
|
836
|
+
/** `config.setDefaults` 出参 */
|
|
837
|
+
export interface ConfigSetDefaultsResult {
|
|
838
|
+
config: ConfigView;
|
|
839
|
+
applied: ConfigApplyReport;
|
|
840
|
+
}
|
|
841
|
+
/**
|
|
842
|
+
* `config.saveEndpoint` 入参(PRD F-F2)。
|
|
843
|
+
*
|
|
844
|
+
* 同一个方法兼创建与修改:`id` 已存在则改,不存在则建。密钥省略表示保留原值。
|
|
845
|
+
*/
|
|
846
|
+
export interface ConfigSaveEndpointParams {
|
|
847
|
+
endpoint: EndpointInput;
|
|
848
|
+
}
|
|
849
|
+
/** `config.saveEndpoint` 出参 */
|
|
850
|
+
export interface ConfigSaveEndpointResult {
|
|
851
|
+
endpoint: EndpointView;
|
|
852
|
+
applied: ConfigApplyReport;
|
|
853
|
+
}
|
|
854
|
+
/**
|
|
855
|
+
* `config.deleteEndpoint` 入参(PRD F-F2:被引用时禁删并列出引用者)。
|
|
856
|
+
*
|
|
857
|
+
* 被模型引用时以 `config_invalid` 拒绝,`detail.references` 里列出「还有谁指它」+
|
|
858
|
+
* 「我该先做什么」。
|
|
859
|
+
*/
|
|
860
|
+
export interface ConfigDeleteEndpointParams {
|
|
861
|
+
endpointId: string;
|
|
862
|
+
dryRun?: boolean;
|
|
863
|
+
}
|
|
864
|
+
/** `config.deleteEndpoint` 出参 */
|
|
865
|
+
export interface ConfigDeleteEndpointResult {
|
|
866
|
+
removed: boolean;
|
|
867
|
+
references: ReferenceList;
|
|
868
|
+
}
|
|
869
|
+
/** 发现的种类(PRD F-G1 / F-G2:MCP 5 层链、Skill 4 层、工具与子 Agent 各 2 层) */
|
|
870
|
+
export type DiscoveryKind = "mcps" | "skills" | "tools" | "subagents";
|
|
871
|
+
/**
|
|
872
|
+
* MCP 的 oauth 视图:形状就是 SDK 的 `McpServerConfig["oauth"]`,只把密钥那一项换掉。
|
|
873
|
+
*
|
|
874
|
+
* `clientSecret` → `clientSecretMasked` + `clientSecretSet`,与 `EndpointView` 的
|
|
875
|
+
* `apiKeyMasked` / `apiKeySet` 完全同一套口径(F-F2:明文不出网)。掩码由宿主用同一个函数
|
|
876
|
+
* 生成(`services/secretMask.ts` 的 `maskSecret`),客户端只负责显示。
|
|
877
|
+
*/
|
|
878
|
+
export type McpOauthView = Omit<NonNullable<McpServerConfig["oauth"]>, "clientSecret"> & {
|
|
879
|
+
/** 掩码后的密钥,例如 `abc…9f3a`;没配时为 `""` */
|
|
880
|
+
clientSecretMasked: string;
|
|
881
|
+
/** 是否配了密钥(配了才有东西需要保管) */
|
|
882
|
+
clientSecretSet: boolean;
|
|
883
|
+
};
|
|
884
|
+
/**
|
|
885
|
+
* 发现出来的一个条目(PRD F-F6:条目字段齐全)。
|
|
886
|
+
*
|
|
887
|
+
* MCP 条目把「这条服务器是怎么起的」整份摊开:传输方式与它的参数(命令 / 参数 / 环境变量 /
|
|
888
|
+
* 地址 / 请求头),这样客户端不必凭 `id` 重建一条就能改它(F-F6「按 id 增删改」)。
|
|
889
|
+
* 已知字段的形状就是 SDK 的 `McpServerConfig`;`extra` 收留这一版不认识的键,
|
|
890
|
+
* 客户端原样带回(F-F6「未知字段原样保留」)。唯一的例外是 oauth 的 `clientSecret`:
|
|
891
|
+
* 它跟端点密钥一样只给掩码({@link McpOauthView},F-F2)。
|
|
892
|
+
*
|
|
893
|
+
* 只有启用状态留了一个开关:视图给 `enabled`,写入端收 SDK 的 `disabled`,两者互为取反。
|
|
894
|
+
*
|
|
895
|
+
* 非 MCP 的那三类(Skill / 工具 / 子 Agent)没有传输这一层:那几个字段恒为 `null`、`extra` 恒为
|
|
896
|
+
* `Record` 里的空对象。
|
|
897
|
+
*/
|
|
898
|
+
export interface DiscoveryEntryView {
|
|
899
|
+
id: string;
|
|
900
|
+
name: string;
|
|
901
|
+
description: string | null;
|
|
902
|
+
/** 来自哪个文件/目录 */
|
|
903
|
+
source: string;
|
|
904
|
+
/**
|
|
905
|
+
* 是否启用(= SDK `McpServerConfig.disabled` 取反;其它种类目前恒为 true)。
|
|
906
|
+
*
|
|
907
|
+
* CLI 的 MCP 详情屏用它画「启用 / 已禁用」那一行,写入时折回 `disabled`。
|
|
908
|
+
*/
|
|
909
|
+
enabled: boolean;
|
|
910
|
+
/** 条目自身的问题(如 MCP 连不上,PRD F-F6) */
|
|
911
|
+
problem: ProblemFact | null;
|
|
912
|
+
/**
|
|
913
|
+
* 传输方式(`stdio` / `http` / `sse`);文件里没有、也推不出来时为 `null`。
|
|
914
|
+
*
|
|
915
|
+
* CLI 的 MCP 列表与详情屏据此决定显示命令还是地址(`mcp-helpers.ts`),
|
|
916
|
+
* 并把整条错误条目修成能用的那一条。
|
|
917
|
+
*/
|
|
918
|
+
transport: McpServerConfig["transport"] | null;
|
|
919
|
+
/** stdio:起什么程序 */
|
|
920
|
+
command: string | null;
|
|
921
|
+
/** stdio:程序参数 */
|
|
922
|
+
args: string[] | null;
|
|
923
|
+
/** stdio:环境变量 */
|
|
924
|
+
env: Record<string, string> | null;
|
|
925
|
+
/** http / sse:地址 */
|
|
926
|
+
url: string | null;
|
|
927
|
+
/** http / sse:请求头 */
|
|
928
|
+
headers: Record<string, string> | null;
|
|
929
|
+
/**
|
|
930
|
+
* oauth 配置(http):{@link McpOauthView},`clientSecret` 只给掩码。
|
|
931
|
+
*
|
|
932
|
+
* 消费者是 CLI 的 MCP 详情屏(`step-mcp.tsx` 把它渲染成一行「客户端密钥:sk-…9f3a」)。
|
|
933
|
+
* 回写时 `clientSecret` 省略 = 保留磁盘原值(与 `config.saveEndpoint` 的 `apiKey` 同口径)。
|
|
934
|
+
*/
|
|
935
|
+
oauth: McpOauthView | null;
|
|
936
|
+
/**
|
|
937
|
+
* 这一版不认识的键(原样一条不多一条不少)。
|
|
938
|
+
*
|
|
939
|
+
* CLI 的 `mcp-helpers.ts` 把它塞回 `McpServerEntryInput.extra`,写回时逐字带回(F-F6)。
|
|
940
|
+
*/
|
|
941
|
+
extra: Record<string, unknown>;
|
|
942
|
+
}
|
|
943
|
+
/**
|
|
944
|
+
* 一层发现来源(PRD F-G1 / F-G2 / F-F6)。
|
|
945
|
+
*
|
|
946
|
+
* `state` 把「文件不存在」与「文件坏了」分开(PRD F-F6:以前都当空配置,一保存就覆盖);
|
|
947
|
+
* `editable` 说明这一层能不能写 —— MCP 是 5 层链但只有 2 个作用域可编辑(PRD F-G1)。
|
|
948
|
+
*/
|
|
949
|
+
export interface DiscoveryLayerView {
|
|
950
|
+
kind: DiscoveryKind;
|
|
951
|
+
/** 层序:0 最靠近项目,数字越大越远(合并时近的优先) */
|
|
952
|
+
depth: number;
|
|
953
|
+
/** 这一层对应的文件或目录绝对路径 */
|
|
954
|
+
path: string;
|
|
955
|
+
editable: boolean;
|
|
956
|
+
/**
|
|
957
|
+
* 这一层归哪个可编辑作用域;写不了(或不是 MCP)时为 `null`(PRD F-G1 / F-F6)。
|
|
958
|
+
*
|
|
959
|
+
* 客户端拿它直接认「哪一层是 `user`、哪一层是 `workspace`」,不必按 `editable` + `depth`
|
|
960
|
+
* 反推(CLI 的 `/mcp` 入口与 MCP 屏都按它取层)。
|
|
961
|
+
*/
|
|
962
|
+
scope: McpEditableScope | null;
|
|
963
|
+
state: "missing" | "ok" | "broken";
|
|
964
|
+
/** 坏在哪(`state === "broken"` 时给) */
|
|
965
|
+
problem: ProblemFact | null;
|
|
966
|
+
entries: DiscoveryEntryView[];
|
|
967
|
+
}
|
|
968
|
+
/**
|
|
969
|
+
* 一份完整的发现视图(PRD F-G2 / F-F6 / F-G1)。
|
|
970
|
+
*
|
|
971
|
+
* 客户端拿它渲染「MCP 屏 / Skill 屏 / 工具屏 / 子 Agent 屏」,也能看见坏掉的配置文件。
|
|
972
|
+
*/
|
|
973
|
+
export interface DiscoveryView {
|
|
974
|
+
workspaceId: string | null;
|
|
975
|
+
mcps: DiscoveryLayerView[];
|
|
976
|
+
skills: DiscoveryLayerView[];
|
|
977
|
+
tools: DiscoveryLayerView[];
|
|
978
|
+
subagents: DiscoveryLayerView[];
|
|
979
|
+
}
|
|
980
|
+
/** `config.getDiscovery` 入参 */
|
|
981
|
+
export interface ConfigGetDiscoveryParams {
|
|
982
|
+
/** 给了就带上这一层的 Workspace 侧来源 */
|
|
983
|
+
workspaceId?: string;
|
|
984
|
+
}
|
|
985
|
+
/** `config.getDiscovery` 出参 */
|
|
986
|
+
export interface ConfigGetDiscoveryResult {
|
|
987
|
+
discovery: DiscoveryView;
|
|
988
|
+
}
|
|
989
|
+
/** MCP 可编辑的两个作用域(PRD F-G1:只有 2 个) */
|
|
990
|
+
export type McpEditableScope = "user" | "workspace";
|
|
991
|
+
/**
|
|
992
|
+
* MCP 条目写入(PRD F-F6:字段齐全、`oauth` 与未知字段原样保留)。
|
|
993
|
+
*
|
|
994
|
+
* SDK 的 `McpServerConfig` 覆盖已知字段;`extra` 收留这个版本不认识的键,写回时原样带上。
|
|
995
|
+
* 与 {@link DiscoveryEntryView} 是同一份事实的两个方向:视图用 `enabled`,这里用 SDK 的
|
|
996
|
+
* `disabled`;视图里 `null` 的字段在这边省略即可(省略 = 这一项不动)。
|
|
997
|
+
*
|
|
998
|
+
* `oauth.clientSecret` 与 `config.saveEndpoint` 的 `apiKey` 同口径(F-F2):
|
|
999
|
+
* - 省略 → 保留磁盘原值(这是「不改密钥」的唯一写法);
|
|
1000
|
+
* - 传回来的值正好等于当前掩码(`clientSecretMasked`)→ 当作没改,同样保留原值;
|
|
1001
|
+
* - 空串 → 把密钥清掉。
|
|
1002
|
+
* 于是「客户端把掩码当密钥写回去」不会发生。`oauth` 里其余几项给了就覆盖。
|
|
1003
|
+
*/
|
|
1004
|
+
export type McpServerEntryInput = McpServerConfig & {
|
|
1005
|
+
extra?: Record<string, unknown>;
|
|
1006
|
+
};
|
|
1007
|
+
/**
|
|
1008
|
+
* `config.saveMcp` 入参(PRD F-F6:按 id 增删改)。
|
|
1009
|
+
*
|
|
1010
|
+
* 形状与 `config.saveEndpoint` 对齐:`entry.id` 已在这一层里就改那一条,没有就建。
|
|
1011
|
+
* 一次只动一条 —— 客户端因此不必先读整层再拼回去,也不会因为有一条读不全就把别的条目覆盖掉。
|
|
1012
|
+
*/
|
|
1013
|
+
export interface ConfigSaveMcpParams {
|
|
1014
|
+
scope: McpEditableScope;
|
|
1015
|
+
/** `scope === "workspace"` 时必填 */
|
|
1016
|
+
workspaceId?: string;
|
|
1017
|
+
entry: McpServerEntryInput;
|
|
1018
|
+
}
|
|
1019
|
+
/** `config.saveMcp` 出参:写回后的那一层(含坏文件状态是否已修好) */
|
|
1020
|
+
export interface ConfigSaveMcpResult {
|
|
1021
|
+
layer: DiscoveryLayerView;
|
|
1022
|
+
applied: ConfigApplyReport;
|
|
1023
|
+
}
|
|
1024
|
+
/**
|
|
1025
|
+
* `config.deleteMcp` 入参(PRD F-F6:另有一条删除)。
|
|
1026
|
+
*
|
|
1027
|
+
* `id` 本来就不在这一层里时不算失败:`removed: false` 如实回答「本来就没有」,
|
|
1028
|
+
* 与 `config.deleteEndpoint` 的 `removed` 同口径(「本来就没有」不是错误)。
|
|
1029
|
+
*/
|
|
1030
|
+
export interface ConfigDeleteMcpParams {
|
|
1031
|
+
scope: McpEditableScope;
|
|
1032
|
+
/** `scope === "workspace"` 时必填 */
|
|
1033
|
+
workspaceId?: string;
|
|
1034
|
+
id: string;
|
|
1035
|
+
}
|
|
1036
|
+
/** `config.deleteMcp` 出参:删完之后的那一层 + 到底删掉了没有 */
|
|
1037
|
+
export interface ConfigDeleteMcpResult {
|
|
1038
|
+
layer: DiscoveryLayerView;
|
|
1039
|
+
applied: ConfigApplyReport;
|
|
1040
|
+
removed: boolean;
|
|
1041
|
+
}
|
|
1042
|
+
/**
|
|
1043
|
+
* 助手的样子(PRD F-B2 / F-B5 / F-B7 / F-B1)。
|
|
1044
|
+
*
|
|
1045
|
+
* 提示词 + 模型 + 权限四维(tools / skills / mcps / subagents)+ 自定义标记,形状沿用 SDK;
|
|
1046
|
+
* 不可用的助手也列出来并说明原因(F-B5:「藏起来」会让人以为它没了)。
|
|
1047
|
+
*
|
|
1048
|
+
* 提示词(`messages`)与子 Agent 定义(`function`)也在视图里:`agent.update` 收得到它们,
|
|
1049
|
+
* 视图就必须读得回来,否则「能写不能读」等于编辑不了助手定义(F-F5)。
|
|
1050
|
+
*/
|
|
1051
|
+
export interface AgentView {
|
|
1052
|
+
id: string;
|
|
1053
|
+
name: string;
|
|
1054
|
+
description: string | null;
|
|
1055
|
+
/** 这个助手默认用哪个模型(PRD F-B1:模型只有这一个真相源) */
|
|
1056
|
+
modelId: string | null;
|
|
1057
|
+
/** 助手级模型参数覆盖(思考强度写在这里,PRD F-B6) */
|
|
1058
|
+
modelParams: Record<string, unknown>;
|
|
1059
|
+
permissions: AgentDefinition["permissions"] | null;
|
|
1060
|
+
/**
|
|
1061
|
+
* 提示词(预设对话),形状就是 SDK 的 `AgentDefinition["messages"]`(PRD F-B2 / F-F5)。
|
|
1062
|
+
*
|
|
1063
|
+
* 定义是「能写就能读」的:这份原样交给 `agent.update` 的 `messages` 等于没改。
|
|
1064
|
+
* 定义文件读不出来时是 `null` —— 那时没有「它的提示词是什么」这个事实可说。
|
|
1065
|
+
* 文件读得出来但里面没写 `messages` 时也是 `null`:`null` 只表示「没有这份提示词」,
|
|
1066
|
+
* 不区分是文件缺了还是字段缺了(要分清就去看 `agent.get` 报没报问题)。
|
|
1067
|
+
*/
|
|
1068
|
+
messages: AgentDefinition["messages"] | null;
|
|
1069
|
+
/**
|
|
1070
|
+
* 子 Agent 的函数定义,形状沿用 SDK 的 `AgentDefinition["function"]`(PRD F-B2 / F-F5)。
|
|
1071
|
+
*
|
|
1072
|
+
* 非子 Agent 为 `null`;定义文件读不出来时也是 `null`。
|
|
1073
|
+
*/
|
|
1074
|
+
function: AgentDefinition["function"] | null;
|
|
1075
|
+
/** 有 `function` 字段即子 Agent(PRD F-B2) */
|
|
1076
|
+
isSubAgent: boolean;
|
|
1077
|
+
/** 是不是用户自定义的(PRD F-G3:一实体一文件,可进 git、可手改) */
|
|
1078
|
+
custom: boolean;
|
|
1079
|
+
/** 是不是当前的默认助手(PRD F-B3) */
|
|
1080
|
+
isDefault: boolean;
|
|
1081
|
+
available: boolean;
|
|
1082
|
+
/** 不可用的原因(PRD F-B5:要说明原因,不是藏起来) */
|
|
1083
|
+
unavailableReason: LocalizedText | null;
|
|
1084
|
+
/** 思考强度的当前状态与可选档位(PRD F-B7) */
|
|
1085
|
+
thinking: ThinkingState;
|
|
1086
|
+
createdAt: string;
|
|
1087
|
+
updatedAt: string;
|
|
1088
|
+
}
|
|
1089
|
+
/** 助手写入(PRD F-B2 / F-G3) */
|
|
1090
|
+
export interface AgentInput {
|
|
1091
|
+
id: string;
|
|
1092
|
+
name: string;
|
|
1093
|
+
description?: string;
|
|
1094
|
+
/** 预设对话(至少一条 system) */
|
|
1095
|
+
messages: AgentDefinition["messages"];
|
|
1096
|
+
modelId?: string;
|
|
1097
|
+
modelParams?: Record<string, unknown>;
|
|
1098
|
+
permissions?: AgentDefinition["permissions"];
|
|
1099
|
+
/** 有则视为子 Agent */
|
|
1100
|
+
function?: AgentDefinition["function"];
|
|
1101
|
+
}
|
|
1102
|
+
/** `agent.list` 入参 */
|
|
1103
|
+
export interface AgentListParams {
|
|
1104
|
+
/** 给了就把「在这个项目里能不能用」一起算进去 */
|
|
1105
|
+
workspaceId?: string;
|
|
1106
|
+
}
|
|
1107
|
+
/** `agent.list` 出参(PRD F-B2 / F-B3 / F-B5) */
|
|
1108
|
+
export interface AgentListResult {
|
|
1109
|
+
agents: AgentView[];
|
|
1110
|
+
/** 默认助手 id(PRD F-B3:有默认,为空时有回落) */
|
|
1111
|
+
defaultAgentId: string | null;
|
|
1112
|
+
}
|
|
1113
|
+
/** `agent.get` 入参 */
|
|
1114
|
+
export interface AgentGetParams {
|
|
1115
|
+
agentId: string;
|
|
1116
|
+
}
|
|
1117
|
+
/** `agent.get` 出参 */
|
|
1118
|
+
export interface AgentGetResult {
|
|
1119
|
+
agent: AgentView;
|
|
1120
|
+
}
|
|
1121
|
+
/** `agent.create` 入参 */
|
|
1122
|
+
export interface AgentCreateParams {
|
|
1123
|
+
agent: AgentInput;
|
|
1124
|
+
}
|
|
1125
|
+
/** `agent.create` 出参 */
|
|
1126
|
+
export interface AgentCreateResult {
|
|
1127
|
+
agent: AgentView;
|
|
1128
|
+
}
|
|
1129
|
+
/** `agent.update` 入参(局部更新) */
|
|
1130
|
+
export interface AgentUpdateParams {
|
|
1131
|
+
agentId: string;
|
|
1132
|
+
patch: Partial<AgentInput>;
|
|
1133
|
+
}
|
|
1134
|
+
/** `agent.update` 出参 */
|
|
1135
|
+
export interface AgentUpdateResult {
|
|
1136
|
+
agent: AgentView;
|
|
1137
|
+
}
|
|
1138
|
+
/**
|
|
1139
|
+
* `agent.delete` 入参(PRD F-F5:删之前问「还有谁指它」;删默认助手时连带清默认)。
|
|
1140
|
+
*/
|
|
1141
|
+
export interface AgentDeleteParams {
|
|
1142
|
+
agentId: string;
|
|
1143
|
+
dryRun?: boolean;
|
|
1144
|
+
}
|
|
1145
|
+
/** `agent.delete` 出参 */
|
|
1146
|
+
export interface AgentDeleteResult {
|
|
1147
|
+
removed: boolean;
|
|
1148
|
+
references: ReferenceList;
|
|
1149
|
+
/** 默认助手指向是否被清掉(PRD F-F5) */
|
|
1150
|
+
defaultsCleared: boolean;
|
|
1151
|
+
}
|
|
1152
|
+
/**
|
|
1153
|
+
* `agent.setModel` 入参(PRD F-B4 / F-B1:改助手默认模型,影响以后的对话)。
|
|
1154
|
+
*
|
|
1155
|
+
* 与 `conversation.setModel`(改这一段会话的模型、存会话行)是两个动作、两个入口。
|
|
1156
|
+
*/
|
|
1157
|
+
export interface AgentSetModelParams {
|
|
1158
|
+
agentId: string;
|
|
1159
|
+
modelId: string;
|
|
1160
|
+
}
|
|
1161
|
+
/** `agent.setModel` 出参 */
|
|
1162
|
+
export interface AgentSetModelResult {
|
|
1163
|
+
agent: AgentView;
|
|
1164
|
+
}
|
|
1165
|
+
/**
|
|
1166
|
+
* `agent.setThinking` 入参(PRD F-B6:写入的是参数不是档位名)。
|
|
1167
|
+
*
|
|
1168
|
+
* 档位在这里被展开成具体参数写进 `AgentDefinition.modelParams`,之后运行时不再查表。
|
|
1169
|
+
* `level: null` 是撤回设值:把定义里的思考参数删掉,助手的思考回到「参数即真相」的那份来源
|
|
1170
|
+
* (模型的默认参数),`ThinkingState.source` 跟着回落到 `following_default`。
|
|
1171
|
+
*
|
|
1172
|
+
* 与会话那一侧的 `conversation.setThinking(null)` 是两件事:那边改的是会话行上的档位名
|
|
1173
|
+
* (这段对话回到跟随助手定义),这边改的是**助手的定义文件**(以后的对话都跟着变)。
|
|
1174
|
+
*/
|
|
1175
|
+
export interface AgentSetThinkingParams {
|
|
1176
|
+
agentId: string;
|
|
1177
|
+
/** 档位名(来自 `ThinkingState.levels`);`null` = 删掉定义上的思考参数 */
|
|
1178
|
+
level: string | null;
|
|
1179
|
+
}
|
|
1180
|
+
/** `agent.setThinking` 出参 */
|
|
1181
|
+
export interface AgentSetThinkingResult {
|
|
1182
|
+
agent: AgentView;
|
|
1183
|
+
thinking: ThinkingState;
|
|
1184
|
+
}
|
|
1185
|
+
/**
|
|
1186
|
+
* `agent.restoreFactory` 入参(PRD F-F5:与 `model.restoreFactory` 同族,可以先预演不落盘)。
|
|
1187
|
+
*
|
|
1188
|
+
* 只是同族不是同形:模型那边没有 `dryRun`,也没有 `restored`。
|
|
1189
|
+
*
|
|
1190
|
+
* 只有出厂清单里的助手(SDK 的出厂定义)才有「出厂版本」可恢复;恢复是整条替换,
|
|
1191
|
+
* 引用关系不动(这里不删任何东西)。
|
|
1192
|
+
*/
|
|
1193
|
+
export interface AgentRestoreFactoryParams {
|
|
1194
|
+
agentId: string;
|
|
1195
|
+
/** 只算「恢复之后会是什么样」,不落盘 */
|
|
1196
|
+
dryRun?: boolean;
|
|
1197
|
+
}
|
|
1198
|
+
/**
|
|
1199
|
+
* `agent.restoreFactory` 出参。
|
|
1200
|
+
*
|
|
1201
|
+
* `restored: false` 表示它本来就是出厂状态(没有可恢复的改动),不是失败。
|
|
1202
|
+
*/
|
|
1203
|
+
export interface AgentRestoreFactoryResult {
|
|
1204
|
+
agent: AgentView;
|
|
1205
|
+
restored: boolean;
|
|
1206
|
+
}
|
|
1207
|
+
/** `model.list` 入参 */
|
|
1208
|
+
export interface ModelListParams {
|
|
1209
|
+
/** 连不可用的也列(默认列,PRD F-B5 的口径) */
|
|
1210
|
+
includeUnavailable?: boolean;
|
|
1211
|
+
}
|
|
1212
|
+
/** `model.list` 出参(PRD F-F3:出厂托管 vs 自定义、思考策略、两条阈值、视觉、描述) */
|
|
1213
|
+
export interface ModelListResult {
|
|
1214
|
+
models: ModelView[];
|
|
1215
|
+
}
|
|
1216
|
+
/** `model.listImages` 出参(PRD F-F4 / D6:图片模型与默认图片模型) */
|
|
1217
|
+
export interface ModelListImagesResult {
|
|
1218
|
+
imageModels: ImageModelView[];
|
|
1219
|
+
defaultImageModel: string | null;
|
|
1220
|
+
}
|
|
1221
|
+
/** `model.create` 入参(建出来就是自定义,PRD F-F3);`tokenThresholds` 省略时套出厂默认 */
|
|
1222
|
+
export interface ModelCreateParams {
|
|
1223
|
+
model: ModelInput;
|
|
1224
|
+
}
|
|
1225
|
+
/** `model.create` 出参 */
|
|
1226
|
+
export interface ModelCreateResult {
|
|
1227
|
+
model: ModelView;
|
|
1228
|
+
}
|
|
1229
|
+
/** `model.update` 入参(编辑即转自定义,PRD F-F3) */
|
|
1230
|
+
export interface ModelUpdateParams {
|
|
1231
|
+
modelId: string;
|
|
1232
|
+
patch: Partial<Omit<ModelInput, "id">>;
|
|
1233
|
+
}
|
|
1234
|
+
/** `model.update` 出参 */
|
|
1235
|
+
export interface ModelUpdateResult {
|
|
1236
|
+
model: ModelView;
|
|
1237
|
+
}
|
|
1238
|
+
/** `model.delete` 入参(被助手引用时禁删并列出引用者,PRD F-F2 / F-F7) */
|
|
1239
|
+
export interface ModelDeleteParams {
|
|
1240
|
+
modelId: string;
|
|
1241
|
+
dryRun?: boolean;
|
|
1242
|
+
}
|
|
1243
|
+
/** `model.delete` 出参 */
|
|
1244
|
+
export interface ModelDeleteResult {
|
|
1245
|
+
removed: boolean;
|
|
1246
|
+
references: ReferenceList;
|
|
1247
|
+
}
|
|
1248
|
+
/** `model.restoreFactory` 入参(PRD F-F3:恢复出厂是整条替换) */
|
|
1249
|
+
export interface ModelRestoreFactoryParams {
|
|
1250
|
+
modelId: string;
|
|
1251
|
+
}
|
|
1252
|
+
/** `model.restoreFactory` 出参 */
|
|
1253
|
+
export interface ModelRestoreFactoryResult {
|
|
1254
|
+
model: ModelView;
|
|
1255
|
+
}
|
|
1256
|
+
/** `model.saveImage` 入参(PRD F-F4:图片模型的创建与修改) */
|
|
1257
|
+
export interface ModelSaveImageParams {
|
|
1258
|
+
imageModel: ImageModelInput;
|
|
1259
|
+
}
|
|
1260
|
+
/** `model.saveImage` 出参 */
|
|
1261
|
+
export interface ModelSaveImageResult {
|
|
1262
|
+
imageModel: ImageModelView;
|
|
1263
|
+
}
|
|
1264
|
+
/** `model.deleteImage` 入参(被默认项引用时禁删,PRD F-F7 / F-F4) */
|
|
1265
|
+
export interface ModelDeleteImageParams {
|
|
1266
|
+
imageModelId: string;
|
|
1267
|
+
dryRun?: boolean;
|
|
1268
|
+
}
|
|
1269
|
+
/** `model.deleteImage` 出参 */
|
|
1270
|
+
export interface ModelDeleteImageResult {
|
|
1271
|
+
removed: boolean;
|
|
1272
|
+
references: ReferenceList;
|
|
1273
|
+
}
|
|
1274
|
+
/**
|
|
1275
|
+
* 一串凭证(PRD L11:可以有多串、创建时带备注、权限相同、可单独吊销)。
|
|
1276
|
+
*
|
|
1277
|
+
* 库里存的是哈希;`token` 明文只在 `agents-host token create` 的那一次输出里出现。
|
|
1278
|
+
*/
|
|
1279
|
+
export interface CredentialView {
|
|
1280
|
+
id: string;
|
|
1281
|
+
/** 创建时写的备注 */
|
|
1282
|
+
note: string;
|
|
1283
|
+
createdAt: string;
|
|
1284
|
+
revokedAt: string | null;
|
|
1285
|
+
}
|
|
1286
|
+
/** 凭证清单(PRD L11) */
|
|
1287
|
+
export interface CredentialListResult {
|
|
1288
|
+
credentials: CredentialView[];
|
|
1289
|
+
}
|
|
1290
|
+
/** 新建凭证的入参(PRD L11:创作者自己起、自己分发) */
|
|
1291
|
+
export interface CredentialCreateParams {
|
|
1292
|
+
note: string;
|
|
1293
|
+
}
|
|
1294
|
+
/** 新建凭证的出参:明文只此一次 */
|
|
1295
|
+
export interface CredentialCreateResult {
|
|
1296
|
+
credential: CredentialView;
|
|
1297
|
+
/** 明文凭证;宿主此后只存哈希 */
|
|
1298
|
+
token: string;
|
|
1299
|
+
}
|
|
1300
|
+
/** 吊销凭证的入参(PRD L11:可单独吊销) */
|
|
1301
|
+
export interface CredentialRevokeParams {
|
|
1302
|
+
credentialId: string;
|
|
1303
|
+
}
|
|
1304
|
+
/** 吊销凭证的出参 */
|
|
1305
|
+
export interface CredentialRevokeResult {
|
|
1306
|
+
revoked: boolean;
|
|
1307
|
+
}
|
|
1308
|
+
/** 附件的用途(PRD D5:图片走上传入口) */
|
|
1309
|
+
export type AssetPurpose = "message_image";
|
|
1310
|
+
/**
|
|
1311
|
+
* `asset.begin` 入参(architecture A11 三段式的第一段 / PRD F-H8)。
|
|
1312
|
+
*
|
|
1313
|
+
* 声明总长、用途、类型与归属的对话。超限在这里就拒(PRD D5:20MB/张,不接收完再说不行)。
|
|
1314
|
+
*/
|
|
1315
|
+
export interface AssetBeginParams {
|
|
1316
|
+
purpose: AssetPurpose;
|
|
1317
|
+
/** MIME 类型,如 `image/png` */
|
|
1318
|
+
mime: string;
|
|
1319
|
+
/** 总字节数 */
|
|
1320
|
+
bytes: number;
|
|
1321
|
+
/** 原始文件名(可缺) */
|
|
1322
|
+
name?: string;
|
|
1323
|
+
/**
|
|
1324
|
+
* 内容的 sha256(客户端本来就算过一次,传上来即可)。
|
|
1325
|
+
*
|
|
1326
|
+
* 带上它之后,同一段对话里同一张图第二次上传会在 `begin` 就短路(`deduped: true`):
|
|
1327
|
+
* 客户端不必再发二进制帧、也不必调 `asset.end`。不带就按一次全新上传处理。
|
|
1328
|
+
*/
|
|
1329
|
+
sha256?: string;
|
|
1330
|
+
/**
|
|
1331
|
+
* 这段素材归属哪段对话(必填)。
|
|
1332
|
+
*
|
|
1333
|
+
* 素材行在库里按 `conversationId` 挂外键,落定那一刻这段对话必须已经存在;草稿对话
|
|
1334
|
+
* (`conversation.create` 之后还没发过消息,R56)在 `asset.begin` 这一步落库,
|
|
1335
|
+
* 与「第一次 `conversation.send`」同义。
|
|
1336
|
+
*/
|
|
1337
|
+
conversationId: string;
|
|
1338
|
+
}
|
|
1339
|
+
/**
|
|
1340
|
+
* `asset.begin` 出参:上传句柄与这次的上限(或「已经有了,不用传」)。
|
|
1341
|
+
*
|
|
1342
|
+
* 两种形态:
|
|
1343
|
+
* - 新上传:`deduped: false`,`uploadId` 是一个句柄,`asset` 为 `null`;
|
|
1344
|
+
* - 命中「同一段对话里同一个 sha256」:`deduped: true`,`uploadId` 为 `null`,`asset` 是既有
|
|
1345
|
+
* 素材的引用(客户端直接拿它放进消息,既不发二进制帧也不调 `asset.end`)。
|
|
1346
|
+
*/
|
|
1347
|
+
export interface AssetBeginResult {
|
|
1348
|
+
/** 是否命中了对话内的去重(命中时客户端跳过 `chunk` 与 `asset.end`) */
|
|
1349
|
+
deduped: boolean;
|
|
1350
|
+
/** 上传句柄;`deduped: true` 时为 `null` */
|
|
1351
|
+
uploadId: string | null;
|
|
1352
|
+
/** 这个句柄能收多少字节(等于 `maxAssetBytes`,超了会在 `end` 被拒) */
|
|
1353
|
+
maxBytes: number;
|
|
1354
|
+
/** 宿主已收到的字节数(刚开时为 0) */
|
|
1355
|
+
receivedBytes: number;
|
|
1356
|
+
/** `deduped: true` 时是既有素材的引用,否则为 `null` */
|
|
1357
|
+
asset: AssetRef | null;
|
|
1358
|
+
}
|
|
1359
|
+
/**
|
|
1360
|
+
* `asset.end` 入参(三段式的第三段 / PRD F-H8)。
|
|
1361
|
+
*
|
|
1362
|
+
* 中间的字节走同一条 WS 上的二进制帧,不攒进内存(A11)。
|
|
1363
|
+
*/
|
|
1364
|
+
export interface AssetEndParams {
|
|
1365
|
+
uploadId: string;
|
|
1366
|
+
/** 客户端算的摘要;宿主校验长度与摘要后才改名为正式引用 */
|
|
1367
|
+
sha256: string;
|
|
1368
|
+
}
|
|
1369
|
+
/** `asset.end` 出参:可放进消息的引用 */
|
|
1370
|
+
export interface AssetEndResult {
|
|
1371
|
+
asset: AssetRef;
|
|
1372
|
+
}
|
|
1373
|
+
/** `asset.get` 的取哪一档:原图,还是缩略图 */
|
|
1374
|
+
export type AssetVariant = "original" | "thumb";
|
|
1375
|
+
/**
|
|
1376
|
+
* `asset.get` 入参(PRD F-H7 / F-H8):按素材 id 取回内容。
|
|
1377
|
+
*
|
|
1378
|
+
* `assets` 是资源的唯一真相,所以宿主重启、换模型、换设备之后,任何一段历史里的图都能靠
|
|
1379
|
+
* 段上的 `__asset_id`(本地扩展字段)重新取回来。
|
|
1380
|
+
*/
|
|
1381
|
+
export interface AssetGetParams {
|
|
1382
|
+
assetId: string;
|
|
1383
|
+
/**
|
|
1384
|
+
* 取哪一档;缺省 `original`。
|
|
1385
|
+
*
|
|
1386
|
+
* `thumb` 目前**等同原图**:宿主这一波不引入原生图像库,缩略图只是「原图直出 + 宽高」,
|
|
1387
|
+
* 客户端需要小图时自己按 `width` / `height` 缩放(宽高未知时为 `null`)。
|
|
1388
|
+
*/
|
|
1389
|
+
variant?: AssetVariant;
|
|
1390
|
+
}
|
|
1391
|
+
/**
|
|
1392
|
+
* `asset.get` 出参:内容本体 + 它的类型与尺寸。
|
|
1393
|
+
*
|
|
1394
|
+
* 内容走同一条 WS 上的 JSON 响应(base64),而不是另开一条二进制下行帧:
|
|
1395
|
+
* - 上传的二进制帧是「按 `uploadId` 认路的、没有回执的流」,下行复用它得再定一套
|
|
1396
|
+
* 「这条帧对应哪个请求」的关联规则;JSON 响应的 id 天然就是那个关联;
|
|
1397
|
+
* - 请求/响应天然是原子的(不会与别的请求的下行数据交错),客户端也不用维护下行状态机。
|
|
1398
|
+
* 代价是 base64 多出三分之一体积,单张上限仍是 20MB(PRD D5),一次一张。
|
|
1399
|
+
*/
|
|
1400
|
+
export interface AssetGetResult {
|
|
1401
|
+
asset: AssetRef;
|
|
1402
|
+
/** 实际给出的档(`thumb` 目前等同原图) */
|
|
1403
|
+
variant: AssetVariant;
|
|
1404
|
+
/** 内容本体,base64 编码(`mime` 说它是什么) */
|
|
1405
|
+
data: string;
|
|
1406
|
+
}
|
|
1407
|
+
/** 补全用的文件条目(PRD F-H5:`@` 菜单的数据来源) */
|
|
1408
|
+
export interface FileEntryView {
|
|
1409
|
+
/** 相对 Workspace 的路径(`@` 菜单显示与插入都用它) */
|
|
1410
|
+
path: string;
|
|
1411
|
+
name: string;
|
|
1412
|
+
kind: "file" | "directory";
|
|
1413
|
+
}
|
|
1414
|
+
/** 文件清单的三种状态(PRD D7:未就绪要说话) */
|
|
1415
|
+
export type CompletionState = "ready" | "scanning" | "unavailable";
|
|
1416
|
+
/**
|
|
1417
|
+
* `completion.files` 入参(PRD F-H5 / D7)。
|
|
1418
|
+
*
|
|
1419
|
+
* 按需扫描:git `ls-files` 优先,非 git 用 glob 并排除 `node_modules/.git/dist`;
|
|
1420
|
+
* 20000 条上限、5s 超时、15s 缓存 —— 这些是宿主的实现事实,客户端只需要知道「现在能不能用」。
|
|
1421
|
+
*/
|
|
1422
|
+
export interface CompletionFilesParams {
|
|
1423
|
+
workspaceId: string;
|
|
1424
|
+
/** 已输入的前缀(可能是路径形式,如 `src/co`) */
|
|
1425
|
+
prefix: string;
|
|
1426
|
+
limit?: number;
|
|
1427
|
+
}
|
|
1428
|
+
/** `completion.files` 出参:条目 + 现在这个清单处在什么状态 */
|
|
1429
|
+
export interface CompletionFilesResult {
|
|
1430
|
+
state: CompletionState;
|
|
1431
|
+
entries: FileEntryView[];
|
|
1432
|
+
/** 是否被条目上限截断(PRD D7:20000 条) */
|
|
1433
|
+
truncated: boolean;
|
|
1434
|
+
/** 清单建好的时刻;还在扫时为空 */
|
|
1435
|
+
scannedAt: string | null;
|
|
1436
|
+
/** 拿不到清单或清单不完整时的说明(PRD D7:未就绪要说话) */
|
|
1437
|
+
problem: ProblemFact | null;
|
|
1438
|
+
}
|
|
1439
|
+
/** 交接执行者:原 agent 自己写,或独立调用摘要(形状沿用 SDK) */
|
|
1440
|
+
export type HandoffMode = "self" | "summary";
|
|
1441
|
+
/** 交接之后做什么:只产出文档,还是顺带开一段新对话(PRD F-D4 / F-D5 / D18) */
|
|
1442
|
+
export type HandoffThen = "document_only" | "new_conversation";
|
|
1443
|
+
/** 交接文档(PRD F-D6 / D19:写进项目 `<cwd>/.ai-zen/handoffs/`) */
|
|
1444
|
+
export interface HandoffDocument {
|
|
1445
|
+
/** 绝对路径 */
|
|
1446
|
+
path: string;
|
|
1447
|
+
bytes: number;
|
|
1448
|
+
writtenAt: string;
|
|
1449
|
+
/** 实际用的执行者 */
|
|
1450
|
+
mode: HandoffMode;
|
|
1451
|
+
}
|
|
1452
|
+
/** 一份交接文档的元信息(用于列表回看) */
|
|
1453
|
+
export interface HandoffDocumentInfo {
|
|
1454
|
+
path: string;
|
|
1455
|
+
name: string;
|
|
1456
|
+
bytes: number;
|
|
1457
|
+
modifiedAt: string;
|
|
1458
|
+
}
|
|
1459
|
+
/**
|
|
1460
|
+
* `handoff.start` 入参(PRD F-D3 / F-D4 / F-D5 / F-D7 / D22)。
|
|
1461
|
+
*
|
|
1462
|
+
* `questionId` 用于「用户刚回答了交接问题」这条路径:带上它,答案与这次交接就对得上。
|
|
1463
|
+
*/
|
|
1464
|
+
export interface HandoffStartParams {
|
|
1465
|
+
conversationId: string;
|
|
1466
|
+
/** 执行者(PRD F-D2 的「自交接」= self,「独立摘要」= summary) */
|
|
1467
|
+
mode: HandoffMode;
|
|
1468
|
+
/** 后面接什么(PRD F-D4:只产文档;F-D5:一步完成交接 + 开新会话) */
|
|
1469
|
+
then: HandoffThen;
|
|
1470
|
+
questionId?: string;
|
|
1471
|
+
}
|
|
1472
|
+
/**
|
|
1473
|
+
* `handoff.start` 出参(PRD F-D7:降级要说明,取消不等于失败)。
|
|
1474
|
+
*
|
|
1475
|
+
* `degraded` 说明这次实际退到了哪个执行者、为什么;`newConversationId` 是 `then ===
|
|
1476
|
+
* "new_conversation"` 时开出来的新对话(PRD D18:同 Workspace、同助手;旧对话完整保留)。
|
|
1477
|
+
*/
|
|
1478
|
+
export interface HandoffStartResult {
|
|
1479
|
+
document: HandoffDocument;
|
|
1480
|
+
/** 用户选的那一档 */
|
|
1481
|
+
requestedMode: HandoffMode;
|
|
1482
|
+
/** 实际用的那一档 */
|
|
1483
|
+
usedMode: HandoffMode;
|
|
1484
|
+
degraded: boolean;
|
|
1485
|
+
/** 降级/取消的原因(成功且未降级时为空) */
|
|
1486
|
+
problem: ProblemFact | null;
|
|
1487
|
+
/** 交接完的旧对话(完整保留,PRD D18) */
|
|
1488
|
+
conversation: ConversationView;
|
|
1489
|
+
newConversationId: string | null;
|
|
1490
|
+
}
|
|
1491
|
+
/** `handoff.listDocuments` 入参(PRD F-D6:文档写进项目,可反复打磨同一份) */
|
|
1492
|
+
export interface HandoffListDocumentsParams {
|
|
1493
|
+
workspaceId: string;
|
|
1494
|
+
}
|
|
1495
|
+
/** `handoff.listDocuments` 出参 */
|
|
1496
|
+
export interface HandoffListDocumentsResult {
|
|
1497
|
+
documents: HandoffDocumentInfo[];
|
|
1498
|
+
}
|
|
1499
|
+
/** `search.conversations` 入参(PRD F-C6 / D16:按名称搜 + Workspace 过滤) */
|
|
1500
|
+
export interface SearchConversationsParams {
|
|
1501
|
+
query: string;
|
|
1502
|
+
workspaceId?: string;
|
|
1503
|
+
limit?: number;
|
|
1504
|
+
}
|
|
1505
|
+
/** 按名搜到的一段对话 */
|
|
1506
|
+
export interface ConversationHit {
|
|
1507
|
+
conversation: ConversationSummary;
|
|
1508
|
+
/** 名字里命中的那一段(供高亮) */
|
|
1509
|
+
matchedName: string;
|
|
1510
|
+
}
|
|
1511
|
+
/** `search.conversations` 出参 */
|
|
1512
|
+
export interface SearchConversationsResult {
|
|
1513
|
+
hits: ConversationHit[];
|
|
1514
|
+
}
|
|
1515
|
+
/**
|
|
1516
|
+
* `search.messages` 入参(PRD F-C6 / D16:按聊天内容全文搜,中文分词成本接受)。
|
|
1517
|
+
*
|
|
1518
|
+
* 少于 3 字符的短查询会退化到 `LIKE`(FTS5 trigram 的下限),这个取舍由宿主承担。
|
|
1519
|
+
*/
|
|
1520
|
+
export interface SearchMessagesParams {
|
|
1521
|
+
query: string;
|
|
1522
|
+
workspaceId?: string;
|
|
1523
|
+
conversationId?: string;
|
|
1524
|
+
limit?: number;
|
|
1525
|
+
offset?: number;
|
|
1526
|
+
}
|
|
1527
|
+
/** 一条消息命中 */
|
|
1528
|
+
export interface MessageHit {
|
|
1529
|
+
conversationId: string;
|
|
1530
|
+
conversationName: string;
|
|
1531
|
+
messageId: string;
|
|
1532
|
+
/** 命中消息的角色,core 原样 */
|
|
1533
|
+
role: AgentNS.Role;
|
|
1534
|
+
/** 命中处前后的一小段原文(供高亮) */
|
|
1535
|
+
snippet: string;
|
|
1536
|
+
createdAt: string;
|
|
1537
|
+
}
|
|
1538
|
+
/** `search.messages` 出参 */
|
|
1539
|
+
export interface SearchMessagesResult {
|
|
1540
|
+
hits: MessageHit[];
|
|
1541
|
+
total: number;
|
|
1542
|
+
}
|
|
1543
|
+
/**
|
|
1544
|
+
* 方法名 → `{ params, result }`。
|
|
1545
|
+
*
|
|
1546
|
+
* 这是宿主与客户端之间唯一的方法清单:接线层按它分发(architecture §6),
|
|
1547
|
+
* 客户端按它接线,帮助与指令菜单按能力清单渲染(PRD F-E5)。
|
|
1548
|
+
*/
|
|
1549
|
+
export interface MethodMap {
|
|
1550
|
+
/**
|
|
1551
|
+
* F-A1:人用与脚本用两条路要分开。宿主判定「这次调用算不算一段对话」,
|
|
1552
|
+
* 握手这一帧是这条连接的起点(凭证 + 语言 + 客户端身份)。
|
|
1553
|
+
*/
|
|
1554
|
+
"host.hello": {
|
|
1555
|
+
params: HostHelloParams;
|
|
1556
|
+
result: HostHelloResult;
|
|
1557
|
+
};
|
|
1558
|
+
/** F-E3 / D4:升级要能确认「磁盘上的版本已更新」,所以先得能报版本。 */
|
|
1559
|
+
"host.version": {
|
|
1560
|
+
params: NoParams;
|
|
1561
|
+
result: HostVersionResult;
|
|
1562
|
+
};
|
|
1563
|
+
/** F-E3 / D4:检测版本号 → 确认升级完成 → 立即重启,不等在跑的轮次。 */
|
|
1564
|
+
"host.upgrade": {
|
|
1565
|
+
params: HostUpgradeParams;
|
|
1566
|
+
result: HostUpgradeResult;
|
|
1567
|
+
};
|
|
1568
|
+
/** F-E1:命令清单里的「退出」在宿主这一侧的动作。 */
|
|
1569
|
+
"host.shutdown": {
|
|
1570
|
+
params: HostShutdownParams;
|
|
1571
|
+
result: HostShutdownResult;
|
|
1572
|
+
};
|
|
1573
|
+
/** F-E5 / F-E6 / F-F9:帮助由能力清单渲染;阻塞与不可撤销是能力属性。 */
|
|
1574
|
+
"host.capabilities": {
|
|
1575
|
+
params: NoParams;
|
|
1576
|
+
result: HostCapabilitiesResult;
|
|
1577
|
+
};
|
|
1578
|
+
/**
|
|
1579
|
+
* F-E1:命令清单里的「重载」在宿主这一侧的动作。
|
|
1580
|
+
*
|
|
1581
|
+
* 改完配置本来就会自动生效(F-E2);这一条是给人一个「我现在就说一遍」的入口 ——
|
|
1582
|
+
* 手改了磁盘上的助手定义 / 技能目录 / MCP 文件之后不必重启。
|
|
1583
|
+
*/
|
|
1584
|
+
"host.reload": {
|
|
1585
|
+
params: HostReloadParams;
|
|
1586
|
+
result: HostReloadResult;
|
|
1587
|
+
};
|
|
1588
|
+
/** D8 / F-E4:`/lang` 是连接级动作,语言挂在连接上、断开即忘。 */
|
|
1589
|
+
"host.setLanguage": {
|
|
1590
|
+
params: HostSetLanguageParams;
|
|
1591
|
+
result: HostSetLanguageResult;
|
|
1592
|
+
};
|
|
1593
|
+
/** D9 / D12 / D13(PRD §4 未给 Workspace 单列能力编号):项目列表,含「目录已不存在」这个事实。 */
|
|
1594
|
+
"workspace.list": {
|
|
1595
|
+
params: WorkspaceListParams;
|
|
1596
|
+
result: WorkspaceListResult;
|
|
1597
|
+
};
|
|
1598
|
+
/** D9 / D10(§4 未单列):显式添加项目;未登记 cwd 被用户确认登记后也走这里。 */
|
|
1599
|
+
"workspace.create": {
|
|
1600
|
+
params: WorkspaceCreateParams;
|
|
1601
|
+
result: WorkspaceCreateResult;
|
|
1602
|
+
};
|
|
1603
|
+
/** D9(§4 未单列):按 id 取一个项目。 */
|
|
1604
|
+
"workspace.get": {
|
|
1605
|
+
params: WorkspaceGetParams;
|
|
1606
|
+
result: WorkspaceGetResult;
|
|
1607
|
+
};
|
|
1608
|
+
/** D9(§4 未单列):id 与 cwd 不可变,名字可改。 */
|
|
1609
|
+
"workspace.rename": {
|
|
1610
|
+
params: WorkspaceRenameParams;
|
|
1611
|
+
result: WorkspaceRenameResult;
|
|
1612
|
+
};
|
|
1613
|
+
/** D11 / F-F9:连带删名下对话,删前给出代价;目录本身宿主不碰。 */
|
|
1614
|
+
"workspace.remove": {
|
|
1615
|
+
params: WorkspaceRemoveParams;
|
|
1616
|
+
result: WorkspaceRemoveResult;
|
|
1617
|
+
};
|
|
1618
|
+
/** F-C5 / D13:默认创建时间倒序 + 手动置顶。 */
|
|
1619
|
+
"conversation.list": {
|
|
1620
|
+
params: ConversationListParams;
|
|
1621
|
+
result: ConversationListResult;
|
|
1622
|
+
};
|
|
1623
|
+
/** F-A3 / F-C7 / L7:开新会话;项目与助手在创建时定死(模型与档位归会话)。 */
|
|
1624
|
+
"conversation.create": {
|
|
1625
|
+
params: ConversationCreateParams;
|
|
1626
|
+
result: ConversationCreateResult;
|
|
1627
|
+
};
|
|
1628
|
+
/** F-A6:按 id 打开(「接着上次聊」的记住工作归客户端)。 */
|
|
1629
|
+
"conversation.get": {
|
|
1630
|
+
params: ConversationGetParams;
|
|
1631
|
+
result: ConversationGetResult;
|
|
1632
|
+
};
|
|
1633
|
+
/** L5 / F-I3 / F-I5 / F-I6 / F-D1:重连拉状态(六态、阈值、问题、用量、状态栏块)。 */
|
|
1634
|
+
"conversation.state": {
|
|
1635
|
+
params: ConversationStateParams;
|
|
1636
|
+
result: ConversationStateResult;
|
|
1637
|
+
};
|
|
1638
|
+
/** D1 / F-C3:改名不改身份、不改排序。 */
|
|
1639
|
+
"conversation.rename": {
|
|
1640
|
+
params: ConversationRenameParams;
|
|
1641
|
+
result: ConversationRenameResult;
|
|
1642
|
+
};
|
|
1643
|
+
/** F-C5 / D13:手动置顶。 */
|
|
1644
|
+
"conversation.pin": {
|
|
1645
|
+
params: ConversationPinParams;
|
|
1646
|
+
result: ConversationPinResult;
|
|
1647
|
+
};
|
|
1648
|
+
/** F-C10 / D17:硬删,图片按引用清理;删除前给出代价。 */
|
|
1649
|
+
"conversation.delete": {
|
|
1650
|
+
params: ConversationDeleteParams;
|
|
1651
|
+
result: ConversationDeleteResult;
|
|
1652
|
+
};
|
|
1653
|
+
/** F-C2 / L6 / D14 / F-H7 / F-D10:一轮的起点(忙则拒、id 先分配、问题挡着则拒)。 */
|
|
1654
|
+
"conversation.send": {
|
|
1655
|
+
params: ConversationSendParams;
|
|
1656
|
+
result: ConversationSendResult;
|
|
1657
|
+
};
|
|
1658
|
+
/** D14(§4 未单列,能力落在「一段对话同时只跑一轮」上):中止是用户的显式动作。 */
|
|
1659
|
+
"conversation.abort": {
|
|
1660
|
+
params: ConversationAbortParams;
|
|
1661
|
+
result: ConversationAbortResult;
|
|
1662
|
+
};
|
|
1663
|
+
/** F-C8 / D24:撤回到某条用户消息之前,其后硬删,内容回填输入框。 */
|
|
1664
|
+
"conversation.revert": {
|
|
1665
|
+
params: ConversationRevertParams;
|
|
1666
|
+
result: ConversationRevertResult;
|
|
1667
|
+
};
|
|
1668
|
+
/** F-B4 / F-B8 / D20:换这段会话的模型(存会话行)+ 拒绝降级。 */
|
|
1669
|
+
"conversation.setModel": {
|
|
1670
|
+
params: ConversationSetModelParams;
|
|
1671
|
+
result: ConversationSetModelResult;
|
|
1672
|
+
};
|
|
1673
|
+
/** F-B6 / F-B7:调这段会话的思考档位(存档位名);展开成参数在装配 agent 那一刻。 */
|
|
1674
|
+
"conversation.setThinking": {
|
|
1675
|
+
params: ConversationSetThinkingParams;
|
|
1676
|
+
result: ConversationSetThinkingResult;
|
|
1677
|
+
};
|
|
1678
|
+
/** F-A2 / D3:临时对话,一次请求跑一轮、零痕迹。 */
|
|
1679
|
+
"conversation.transient": {
|
|
1680
|
+
params: ConversationTransientParams;
|
|
1681
|
+
result: ConversationTransientResult;
|
|
1682
|
+
};
|
|
1683
|
+
/**
|
|
1684
|
+
* A12 / L5 / F-I7:按 id 取(含自身最新内容),可指定某个子 Agent 的消息。
|
|
1685
|
+
*
|
|
1686
|
+
* F-C6 的定位(`around`)在这里:消费者是桌面端的搜索命中跳转(PLAN W4)—— 由
|
|
1687
|
+
* `search.messages` 拿到命中后,用它把命中那条摆到眼前。CLI 不消费 `around`。
|
|
1688
|
+
*/
|
|
1689
|
+
"message.list": {
|
|
1690
|
+
params: MessageListParams;
|
|
1691
|
+
result: MessageListResult;
|
|
1692
|
+
};
|
|
1693
|
+
/** D22 / F-I9:多端看到同一批问题。 */
|
|
1694
|
+
"question.list": {
|
|
1695
|
+
params: QuestionListParams;
|
|
1696
|
+
result: QuestionListResult;
|
|
1697
|
+
};
|
|
1698
|
+
/** F-I9 / D22 / D23:回答问题;答完的后续动作(交接、开新会话)一并回。 */
|
|
1699
|
+
"question.answer": {
|
|
1700
|
+
params: QuestionAnswerParams;
|
|
1701
|
+
result: QuestionAnswerResult;
|
|
1702
|
+
};
|
|
1703
|
+
/** L3 / F-I8:通知持久化,可随时列出。 */
|
|
1704
|
+
"notice.list": {
|
|
1705
|
+
params: NoticeListParams;
|
|
1706
|
+
result: NoticeListResult;
|
|
1707
|
+
};
|
|
1708
|
+
/** F-I8 / L3:不带时长的通知靠手动清除。 */
|
|
1709
|
+
"notice.dismiss": {
|
|
1710
|
+
params: NoticeDismissParams;
|
|
1711
|
+
result: NoticeDismissResult;
|
|
1712
|
+
};
|
|
1713
|
+
/** F-I8 / L3:一次清掉一批通知。 */
|
|
1714
|
+
"notice.clear": {
|
|
1715
|
+
params: NoticeClearParams;
|
|
1716
|
+
result: NoticeClearResult;
|
|
1717
|
+
};
|
|
1718
|
+
/** F-F1 / D21:配置的读写都走宿主 API;密钥掩码,同时报出配置问题。 */
|
|
1719
|
+
"config.get": {
|
|
1720
|
+
params: ConfigGetParams;
|
|
1721
|
+
result: ConfigGetResult;
|
|
1722
|
+
};
|
|
1723
|
+
/** F-F1 / F-E2 / F-F9:改完即生效,回报重载了哪些东西。 */
|
|
1724
|
+
"config.patch": {
|
|
1725
|
+
params: ConfigPatchParams;
|
|
1726
|
+
result: ConfigPatchResult;
|
|
1727
|
+
};
|
|
1728
|
+
/** F-F7 / D2 / D6:默认项(助手、迁移模型、图片模型、取名模型、自动命名开关)。 */
|
|
1729
|
+
"config.setDefaults": {
|
|
1730
|
+
params: ConfigSetDefaultsParams;
|
|
1731
|
+
result: ConfigSetDefaultsResult;
|
|
1732
|
+
};
|
|
1733
|
+
/** F-G1 / F-G2 / F-F6:5 层 MCP 链、Skill / 工具 / 子 Agent 的分层与坏文件状态。 */
|
|
1734
|
+
"config.getDiscovery": {
|
|
1735
|
+
params: ConfigGetDiscoveryParams;
|
|
1736
|
+
result: ConfigGetDiscoveryResult;
|
|
1737
|
+
};
|
|
1738
|
+
/** F-G1 / F-F6:两个可编辑作用域的 MCP 条目写入(有 id 则改、无则建;未知字段与 `oauth` 原样保留)。 */
|
|
1739
|
+
"config.saveMcp": {
|
|
1740
|
+
params: ConfigSaveMcpParams;
|
|
1741
|
+
result: ConfigSaveMcpResult;
|
|
1742
|
+
};
|
|
1743
|
+
/** F-F6:删掉那一层里的一条(本来就没有时 `removed: false`)。 */
|
|
1744
|
+
"config.deleteMcp": {
|
|
1745
|
+
params: ConfigDeleteMcpParams;
|
|
1746
|
+
result: ConfigDeleteMcpResult;
|
|
1747
|
+
};
|
|
1748
|
+
/** F-F2:端点写入(密钥可省略表示保留)。 */
|
|
1749
|
+
"config.saveEndpoint": {
|
|
1750
|
+
params: ConfigSaveEndpointParams;
|
|
1751
|
+
result: ConfigSaveEndpointResult;
|
|
1752
|
+
};
|
|
1753
|
+
/** F-F2:被引用时禁删并列出引用者。 */
|
|
1754
|
+
"config.deleteEndpoint": {
|
|
1755
|
+
params: ConfigDeleteEndpointParams;
|
|
1756
|
+
result: ConfigDeleteEndpointResult;
|
|
1757
|
+
};
|
|
1758
|
+
/** F-B2 / F-B3 / F-B5:助手清单,不可用的也列出并说明原因。 */
|
|
1759
|
+
"agent.list": {
|
|
1760
|
+
params: AgentListParams;
|
|
1761
|
+
result: AgentListResult;
|
|
1762
|
+
};
|
|
1763
|
+
/** F-B2:按 id 取一个助手。 */
|
|
1764
|
+
"agent.get": {
|
|
1765
|
+
params: AgentGetParams;
|
|
1766
|
+
result: AgentGetResult;
|
|
1767
|
+
};
|
|
1768
|
+
/** F-B2 / F-G3:新建助手定义(一实体一文件)。 */
|
|
1769
|
+
"agent.create": {
|
|
1770
|
+
params: AgentCreateParams;
|
|
1771
|
+
result: AgentCreateResult;
|
|
1772
|
+
};
|
|
1773
|
+
/** F-B2 / F-G3:编辑助手定义。 */
|
|
1774
|
+
"agent.update": {
|
|
1775
|
+
params: AgentUpdateParams;
|
|
1776
|
+
result: AgentUpdateResult;
|
|
1777
|
+
};
|
|
1778
|
+
/** F-F5:删除(含子 Agent),删前问「还有谁指它」;删默认助手时连带清默认。 */
|
|
1779
|
+
"agent.delete": {
|
|
1780
|
+
params: AgentDeleteParams;
|
|
1781
|
+
result: AgentDeleteResult;
|
|
1782
|
+
};
|
|
1783
|
+
/** F-B4 / F-B1:改助手默认模型(另一个动作:与改这段会话的模型分开),并清掉旧模型的档位参数。 */
|
|
1784
|
+
"agent.setModel": {
|
|
1785
|
+
params: AgentSetModelParams;
|
|
1786
|
+
result: AgentSetModelResult;
|
|
1787
|
+
};
|
|
1788
|
+
/** F-B6:把思考档位展开成参数写进助手定义(`null` = 把那份参数删掉)。 */
|
|
1789
|
+
"agent.setThinking": {
|
|
1790
|
+
params: AgentSetThinkingParams;
|
|
1791
|
+
result: AgentSetThinkingResult;
|
|
1792
|
+
};
|
|
1793
|
+
/** F-F5:恢复出厂(整条替换;可以先预演不落盘)。 */
|
|
1794
|
+
"agent.restoreFactory": {
|
|
1795
|
+
params: AgentRestoreFactoryParams;
|
|
1796
|
+
result: AgentRestoreFactoryResult;
|
|
1797
|
+
};
|
|
1798
|
+
/** F-F3 / F-B7:模型清单(出厂托管 vs 自定义、两条阈值、思考档位、可用性)。 */
|
|
1799
|
+
"model.list": {
|
|
1800
|
+
params: ModelListParams;
|
|
1801
|
+
result: ModelListResult;
|
|
1802
|
+
};
|
|
1803
|
+
/** F-F4 / D6:图片模型与默认图片模型。 */
|
|
1804
|
+
"model.listImages": {
|
|
1805
|
+
params: NoParams;
|
|
1806
|
+
result: ModelListImagesResult;
|
|
1807
|
+
};
|
|
1808
|
+
/** F-F3:新建模型(建出来即自定义;不传阈值就用出厂默认那一档)。 */
|
|
1809
|
+
"model.create": {
|
|
1810
|
+
params: ModelCreateParams;
|
|
1811
|
+
result: ModelCreateResult;
|
|
1812
|
+
};
|
|
1813
|
+
/** F-F3:编辑模型(编辑即转自定义;没给的字段不动,阈值省略也不清空)。 */
|
|
1814
|
+
"model.update": {
|
|
1815
|
+
params: ModelUpdateParams;
|
|
1816
|
+
result: ModelUpdateResult;
|
|
1817
|
+
};
|
|
1818
|
+
/** F-F2 / F-F7:删除模型;被引用时禁删并列出引用者。 */
|
|
1819
|
+
"model.delete": {
|
|
1820
|
+
params: ModelDeleteParams;
|
|
1821
|
+
result: ModelDeleteResult;
|
|
1822
|
+
};
|
|
1823
|
+
/** F-F3:恢复出厂(整条替换)。 */
|
|
1824
|
+
"model.restoreFactory": {
|
|
1825
|
+
params: ModelRestoreFactoryParams;
|
|
1826
|
+
result: ModelRestoreFactoryResult;
|
|
1827
|
+
};
|
|
1828
|
+
/** F-F4:图片模型的创建与修改。 */
|
|
1829
|
+
"model.saveImage": {
|
|
1830
|
+
params: ModelSaveImageParams;
|
|
1831
|
+
result: ModelSaveImageResult;
|
|
1832
|
+
};
|
|
1833
|
+
/** F-F4 / F-F7:删除图片模型;被默认项引用时禁删。 */
|
|
1834
|
+
"model.deleteImage": {
|
|
1835
|
+
params: ModelDeleteImageParams;
|
|
1836
|
+
result: ModelDeleteImageResult;
|
|
1837
|
+
};
|
|
1838
|
+
/** D5 / F-H8 / A11:上传第一段,声明总长与类型,超限当场拒;带 sha256 时可命中去重。 */
|
|
1839
|
+
"asset.begin": {
|
|
1840
|
+
params: AssetBeginParams;
|
|
1841
|
+
result: AssetBeginResult;
|
|
1842
|
+
};
|
|
1843
|
+
/** F-H8 / A11:上传第三段,校验长度与摘要后变成可引用的素材。 */
|
|
1844
|
+
"asset.end": {
|
|
1845
|
+
params: AssetEndParams;
|
|
1846
|
+
result: AssetEndResult;
|
|
1847
|
+
};
|
|
1848
|
+
/** F-H7 / F-H8:按素材 id 取回内容(原图 / 缩略图两档),历史里的图因此能被重放。 */
|
|
1849
|
+
"asset.get": {
|
|
1850
|
+
params: AssetGetParams;
|
|
1851
|
+
result: AssetGetResult;
|
|
1852
|
+
};
|
|
1853
|
+
/** F-H5 / D7:按需扫描的文件清单;未就绪要说话。 */
|
|
1854
|
+
"completion.files": {
|
|
1855
|
+
params: CompletionFilesParams;
|
|
1856
|
+
result: CompletionFilesResult;
|
|
1857
|
+
};
|
|
1858
|
+
/** F-D4 / F-D5 / F-D3:写交接文档;可选顺带开新对话,旧对话完整保留。 */
|
|
1859
|
+
"handoff.start": {
|
|
1860
|
+
params: HandoffStartParams;
|
|
1861
|
+
result: HandoffStartResult;
|
|
1862
|
+
};
|
|
1863
|
+
/** F-D6 / D19:项目里的交接文档清单(可反复打磨同一份)。 */
|
|
1864
|
+
"handoff.listDocuments": {
|
|
1865
|
+
params: HandoffListDocumentsParams;
|
|
1866
|
+
result: HandoffListDocumentsResult;
|
|
1867
|
+
};
|
|
1868
|
+
/** F-C6 / D16:按名称搜对话,可按项目过滤。 */
|
|
1869
|
+
"search.conversations": {
|
|
1870
|
+
params: SearchConversationsParams;
|
|
1871
|
+
result: SearchConversationsResult;
|
|
1872
|
+
};
|
|
1873
|
+
/** F-C6 / D16:按聊天内容全文搜。 */
|
|
1874
|
+
"search.messages": {
|
|
1875
|
+
params: SearchMessagesParams;
|
|
1876
|
+
result: SearchMessagesResult;
|
|
1877
|
+
};
|
|
1878
|
+
}
|
|
1879
|
+
/** 方法名 */
|
|
1880
|
+
export type MethodName = keyof MethodMap;
|
|
1881
|
+
/** 取某个方法的入参类型 */
|
|
1882
|
+
export type MethodParams<M extends MethodName> = MethodMap[M]["params"];
|
|
1883
|
+
/** 取某个方法的出参类型 */
|
|
1884
|
+
export type MethodResult<M extends MethodName> = MethodMap[M]["result"];
|
|
1885
|
+
/**
|
|
1886
|
+
* 全部方法名(分发注册、帮助渲染、测试遍历用)。
|
|
1887
|
+
*
|
|
1888
|
+
* 用 `as const satisfies` 是为了让「表里漏了一个方法」在编译期就能被抓到:
|
|
1889
|
+
* 测试里做 `Exclude<MethodName, (typeof METHOD_NAMES)[number]>` 时,漏掉的名字会留在
|
|
1890
|
+
* 那个差集里而不是被抹成 `never`。
|
|
1891
|
+
*/
|
|
1892
|
+
export declare const METHOD_NAMES: readonly ["host.hello", "host.version", "host.upgrade", "host.shutdown", "host.capabilities", "host.reload", "host.setLanguage", "workspace.list", "workspace.create", "workspace.get", "workspace.rename", "workspace.remove", "conversation.list", "conversation.create", "conversation.get", "conversation.state", "conversation.rename", "conversation.pin", "conversation.delete", "conversation.send", "conversation.abort", "conversation.revert", "conversation.setModel", "conversation.setThinking", "conversation.transient", "message.list", "question.list", "question.answer", "notice.list", "notice.dismiss", "notice.clear", "config.get", "config.patch", "config.setDefaults", "config.getDiscovery", "config.saveMcp", "config.deleteMcp", "config.saveEndpoint", "config.deleteEndpoint", "agent.list", "agent.get", "agent.create", "agent.update", "agent.delete", "agent.setModel", "agent.setThinking", "agent.restoreFactory", "model.list", "model.listImages", "model.create", "model.update", "model.delete", "model.restoreFactory", "model.saveImage", "model.deleteImage", "asset.begin", "asset.end", "asset.get", "completion.files", "handoff.start", "handoff.listDocuments", "search.conversations", "search.messages"];
|
|
1893
|
+
/** 运行时判断一个字符串是不是已知方法名 */
|
|
1894
|
+
export declare function isMethodName(value: unknown): value is MethodName;
|
|
1895
|
+
/** 方法名属于哪个域(`conversation.send` → `conversation`) */
|
|
1896
|
+
export declare function methodDomain(method: MethodName): MethodDomain;
|