@ai-zen/agents-host 0.1.0-alpha.3 → 0.1.0-alpha.4
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/dist/app.d.ts +0 -5
- package/dist/app.js +3 -9
- package/dist/handlers/configHandlers.d.ts +1 -3
- package/dist/handlers/conversationHandlers.d.ts +0 -2
- package/dist/handlers/conversationHandlers.js +2 -16
- package/dist/handlers/hostHandlers.d.ts +4 -5
- package/dist/handlers/hostHandlers.js +3 -21
- package/dist/handlers/index.d.ts +2 -4
- package/dist/handlers/index.js +0 -1
- package/dist/handlers/noticeHandlers.d.ts +0 -8
- package/dist/handlers/noticeHandlers.js +0 -10
- package/dist/i18n/en.d.ts +0 -168
- package/dist/i18n/en.js +0 -171
- package/dist/i18n/zh.d.ts +0 -168
- package/dist/i18n/zh.js +0 -169
- package/dist/index.d.ts +1 -0
- package/dist/net/WsHub.d.ts +1 -2
- package/dist/net/WsHub.js +0 -2
- package/dist/services/AutoNaming.d.ts +0 -5
- package/dist/services/AutoNaming.js +0 -18
- package/dist/services/ConfigService.d.ts +2 -2
- package/dist/services/ConfigService.js +11 -20
- package/dist/services/ModelService.d.ts +1 -3
- package/dist/services/ModelService.js +0 -4
- package/dist/services/QuestionService.d.ts +0 -7
- package/dist/services/QuestionService.js +0 -15
- package/dist/storage/ConversationRepository.d.ts +0 -3
- package/dist/storage/ConversationRepository.js +0 -12
- package/dist/storage/QuestionRepository.d.ts +0 -1
- package/dist/storage/QuestionRepository.js +0 -4
- package/dist/storage/types.d.ts +0 -2
- package/dist/wire/methods.d.ts +4 -52
- package/dist/wire/methods.js +0 -5
- package/dist/wire/states.d.ts +5 -12
- package/package.json +3 -2
- package/dist/handlers/capabilities.d.ts +0 -26
- package/dist/handlers/capabilities.js +0 -138
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,45 @@
|
|
|
3
3
|
All notable changes to `@ai-zen/agents-host` are documented here.
|
|
4
4
|
Format follows [Keep a Changelog](https://keepachangelog.com/); versions use SemVer.
|
|
5
5
|
|
|
6
|
+
## [0.1.0-alpha.4] - 2026-11-14
|
|
7
|
+
|
|
8
|
+
> The capability list is gone. `host.capabilities` existed to tell clients "what this build can
|
|
9
|
+
> do", but the only client that ever read it was the TUI's `/help` — and `/help` already had a
|
|
10
|
+
> local command table. A list that duplicates a list is a list that drifts: the host called it
|
|
11
|
+
> "项目", the CLI called it "工作区". So the method, its 252 copy entries and the `CapabilityView`
|
|
12
|
+
> shape are removed — **63 → 62 methods** — and the CLI's `/help` now costs zero round trips.
|
|
13
|
+
>
|
|
14
|
+
> Ships on `@ai-zen/agents-core@4.6.0-alpha.0` + `@ai-zen/agents-sdk@1.2.0-alpha.2` (both
|
|
15
|
+
> unchanged since the previous alpha, so this release is host-only).
|
|
16
|
+
|
|
17
|
+
### ⚠️ Breaking
|
|
18
|
+
|
|
19
|
+
- **`host.capabilities` removed** (63 → 62 methods), together with `hello.capabilities`,
|
|
20
|
+
`CapabilityView` / `HostCapabilitiesResult` / `MethodDomain`, the `handlers/capabilities.ts`
|
|
21
|
+
wiring and 252 `capability.*` strings. Nothing depended on it: the CLI's `/help` is local
|
|
22
|
+
now, the Desktop never called it.
|
|
23
|
+
- **`host.reload` no longer takes `scope`** — the host is the only one who knows what is
|
|
24
|
+
reloadable, so it decides; `reloadedOf()` is unconditionally `true`.
|
|
25
|
+
- **`StatusBlock.label` removed** — block names are client concepts ("sidebar" is not a host
|
|
26
|
+
word). The CLI carries its own eight `status.block.*` strings.
|
|
27
|
+
|
|
28
|
+
### 🧹 Changed
|
|
29
|
+
|
|
30
|
+
- **i18n now has a consumer rule**: the 33 entries no production code ever emitted are deleted,
|
|
31
|
+
and a guard test fails the suite if any entry has no reader. PLAN.md §7.5 keeps the 19 cases
|
|
32
|
+
where the host *should* say something and currently says nothing — those are gaps, not strings.
|
|
33
|
+
- 4 exports with zero references removed, along with the long-dead `localizeCapabilities`.
|
|
34
|
+
- The two real-process cases moved to `test:e2e` (out of the default suite's 759); test fixtures
|
|
35
|
+
went "one file, one database" with one `db.tx()` table wipe.
|
|
36
|
+
|
|
37
|
+
## [0.1.0-alpha.1 … 0.1.0-alpha.3] - 2026-11-14
|
|
38
|
+
|
|
39
|
+
- **`agents-host` bin got its shebang** (alpha.1) — without it `npm i -g` installed a file the
|
|
40
|
+
shell refuses to execute.
|
|
41
|
+
- **A configuration file that does not parse is reset to factory values** and written back, the
|
|
42
|
+
broken one kept as `<name>.broken`, plus one warning notice naming the file (D32;
|
|
43
|
+
alpha.2 / alpha.3). No fallback layers, no throwing upwards.
|
|
44
|
+
|
|
6
45
|
## [0.1.0] - 2026-11-09
|
|
7
46
|
|
|
8
47
|
First extraction step. The package exists so that CLI and Desktop stop maintaining two
|
package/dist/app.d.ts
CHANGED
|
@@ -39,7 +39,6 @@ import { ModelService } from "./services/ModelService.js";
|
|
|
39
39
|
import { NoticeService } from "./services/NoticeService.js";
|
|
40
40
|
import { QuestionService } from "./services/QuestionService.js";
|
|
41
41
|
import { AssetRepository, ConversationRepository, CredentialRepository, Database, MessageRepository, NoticeRepository, QuestionRepository, WorkspaceRepository } from "./storage/index.js";
|
|
42
|
-
import type { CapabilityView } from "./wire/index.js";
|
|
43
42
|
/**
|
|
44
43
|
* 起一个低频定时器,返回取消函数。
|
|
45
44
|
*
|
|
@@ -97,8 +96,6 @@ export interface HostAppOptions {
|
|
|
97
96
|
clock?: Clock;
|
|
98
97
|
/** 真退出时做什么;缺省 `process.exit(0)` */
|
|
99
98
|
exit?: ExitHook;
|
|
100
|
-
/** 能力清单(PRD F-E5);缺省用 `handlers/capabilities.ts` 里那份与契约同步的清单 */
|
|
101
|
-
capabilities?: (language: Language) => CapabilityView[];
|
|
102
99
|
/** 连接未声明语言时的缺省语言(PRD D8);不给时用配置里的 `language`,再缺省英文 */
|
|
103
100
|
defaultLanguage?: Language;
|
|
104
101
|
/** 日志口(连接事件与内部错误);缺省写到 `<dataRoot>/logs/host.log` 并按大小轮转 */
|
|
@@ -168,8 +165,6 @@ export declare class HostApp {
|
|
|
168
165
|
readonly handlers: HandlerTable;
|
|
169
166
|
/** 宿主版本(`hello` 与 `host.version` 报的那一个) */
|
|
170
167
|
readonly version: string;
|
|
171
|
-
/** 能力清单(PRD F-E5:帮助页与指令菜单按它渲染;按给定语言出句子) */
|
|
172
|
-
readonly capabilities: (language: Language) => CapabilityView[];
|
|
173
168
|
/** 进程启动时刻(ISO 8601) */
|
|
174
169
|
readonly startedAt: string;
|
|
175
170
|
/** 是不是本地实例(PRD A6:决定监听范围与要不要发本地凭证交付文件) */
|
package/dist/app.js
CHANGED
|
@@ -21,7 +21,7 @@ import { mkdir } from "node:fs/promises";
|
|
|
21
21
|
import { join } from "node:path";
|
|
22
22
|
import { AgentRepository, ConfigManager } from "@ai-zen/agents-sdk";
|
|
23
23
|
import { readHostSettings, resolveListenTarget, resolvePaths } from "./config.js";
|
|
24
|
-
import {
|
|
24
|
+
import { createHandlers } from "./handlers/index.js";
|
|
25
25
|
import { DEFAULT_LANGUAGE, normalizeLanguage } from "./i18n/index.js";
|
|
26
26
|
import { clearHostFile, createLocalCredential, createTokenVerifier, readHostFile, UploadReceiver, writeHostFile, WsHub, } from "./net/index.js";
|
|
27
27
|
import { ChatRunner, createSdkAgentFactory, createWorkspaceScopeFactory, RunRegistry, ScopeRegistry, systemClock, } from "./runtime/index.js";
|
|
@@ -162,8 +162,6 @@ export class HostApp {
|
|
|
162
162
|
handlers;
|
|
163
163
|
/** 宿主版本(`hello` 与 `host.version` 报的那一个) */
|
|
164
164
|
version;
|
|
165
|
-
/** 能力清单(PRD F-E5:帮助页与指令菜单按它渲染;按给定语言出句子) */
|
|
166
|
-
capabilities;
|
|
167
165
|
/** 进程启动时刻(ISO 8601) */
|
|
168
166
|
startedAt;
|
|
169
167
|
/** 是不是本地实例(PRD A6:决定监听范围与要不要发本地凭证交付文件) */
|
|
@@ -427,7 +425,6 @@ export class HostApp {
|
|
|
427
425
|
// ---- 9. 接线:方法表 + 一条 WebSocket ----
|
|
428
426
|
this.handlers = createHandlers(this.handlerDeps());
|
|
429
427
|
const target = this.resolveTarget();
|
|
430
|
-
this.capabilities = options.capabilities ?? ((language) => createCapabilities(language));
|
|
431
428
|
this.hub = new WsHub({
|
|
432
429
|
host: target.host,
|
|
433
430
|
port: target.port,
|
|
@@ -436,8 +433,6 @@ export class HostApp {
|
|
|
436
433
|
uploads: this.uploads,
|
|
437
434
|
hostVersion: this.version,
|
|
438
435
|
startedAt: this.startedAt,
|
|
439
|
-
// 握手只用它的 id(R57);`host.capabilities` 按连接语言重渲染(R58)
|
|
440
|
-
capabilities: (language) => this.capabilities(language),
|
|
441
436
|
// 连接没带语言时用配置里的缺省语言(再缺省英文,D8 / R58);配置可变,所以每一跳现读
|
|
442
437
|
defaultLanguage: options.defaultLanguage ?? (() => this.configuredLanguage()),
|
|
443
438
|
// 通知与问题里的句子按收件人那条连接的语言重新渲染一次(D8)
|
|
@@ -767,7 +762,6 @@ export class HostApp {
|
|
|
767
762
|
return {
|
|
768
763
|
version: this.version,
|
|
769
764
|
startedAt: this.startedAt,
|
|
770
|
-
capabilities: () => this.capabilities(DEFAULT_LANGUAGE),
|
|
771
765
|
workspaces: this.workspaceService,
|
|
772
766
|
conversations: this.conversationService,
|
|
773
767
|
messages: this.messageService,
|
|
@@ -810,8 +804,8 @@ export class HostApp {
|
|
|
810
804
|
upgrade: (params) => this.upgradeHost(params),
|
|
811
805
|
// 从磁盘重载(F-E1 / R63):走配置服务那条「生效」路(回收 Scope + 合成一条通知);
|
|
812
806
|
// 思考策略表是启动时的快照,重载时一并重读(否则改完档位表要等 setThinking 才生效)
|
|
813
|
-
reload: async (
|
|
814
|
-
const report = await this.configService.reload(
|
|
807
|
+
reload: async () => {
|
|
808
|
+
const report = await this.configService.reload();
|
|
815
809
|
this.presets = await this.configManager.readReasoningPresets();
|
|
816
810
|
return report;
|
|
817
811
|
},
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
* 业务判断都在 `services/ConfigService.ts`;这里没有一条分支是在决定「该怎么算」。
|
|
8
8
|
*/
|
|
9
9
|
import { type Language } from "../i18n/index.js";
|
|
10
|
-
import type { HandlerTable
|
|
10
|
+
import type { HandlerTable } from "../net/WsHub.js";
|
|
11
11
|
import type { ConfigService } from "../services/ConfigService.js";
|
|
12
12
|
/** 本文件负责的方法名(其余域各有各的文件) */
|
|
13
13
|
export type ConfigHandlerName = "config.get" | "config.patch" | "config.setDefaults" | "config.getDiscovery" | "config.saveMcp" | "config.deleteMcp" | "config.saveEndpoint" | "config.deleteEndpoint";
|
|
@@ -27,5 +27,3 @@ export interface ConfigHandlerDeps {
|
|
|
27
27
|
export declare function localizeLocalizedTexts<T>(value: T, language: Language): T;
|
|
28
28
|
/** 造出 `config.*` 的 handler 表 */
|
|
29
29
|
export declare function createConfigHandlers(deps: ConfigHandlerDeps): ConfigHandlers;
|
|
30
|
-
/** 单个方法也导出,便于用例直接调(不必造整张表) */
|
|
31
|
-
export type ConfigMethodHandler<M extends ConfigHandlerName> = MethodHandler<M>;
|
|
@@ -15,7 +15,6 @@
|
|
|
15
15
|
* - `conversation.transient` 走不落库的那条执行路径(R1 / R49)。
|
|
16
16
|
*/
|
|
17
17
|
import { addUsage, sumUsage, ZERO_USAGE } from "@ai-zen/agents-core";
|
|
18
|
-
import { render } from "../i18n/index.js";
|
|
19
18
|
import { STATUS_BLOCK_IDS } from "../wire/index.js";
|
|
20
19
|
import { localizeOutcome } from "./assetHandlers.js";
|
|
21
20
|
/**
|
|
@@ -162,7 +161,7 @@ async function conversationStateOf(deps, conversationId, language) {
|
|
|
162
161
|
thinking: conversation.thinking,
|
|
163
162
|
usage,
|
|
164
163
|
questions: deps.questionsFor ? await deps.questionsFor(conversationId) : [],
|
|
165
|
-
statusBlocks: statusBlocksOf({ conversation, agent, run, context, usage
|
|
164
|
+
statusBlocks: statusBlocksOf({ conversation, agent, run, context, usage }),
|
|
166
165
|
updatedAt: now,
|
|
167
166
|
},
|
|
168
167
|
// 这份消息就是上面算用量与上下文用的那一次读取,不是又读一遍
|
|
@@ -185,11 +184,6 @@ async function agentFactOf(deps, agentId) {
|
|
|
185
184
|
return { name: null, available: null };
|
|
186
185
|
return { name: described.name, available: described.available };
|
|
187
186
|
}
|
|
188
|
-
/** 块的标签(`label.agent` / `label.model` …,PRD F-I6:宿主给块名,客户端排版) */
|
|
189
|
-
function blockLabel(id, language) {
|
|
190
|
-
const messageKey = `label.${id}`;
|
|
191
|
-
return { code: messageKey, messageKey, params: {}, message: render(language, messageKey) };
|
|
192
|
-
}
|
|
193
187
|
/**
|
|
194
188
|
* 按 `STATUS_BLOCK_IDS` 的顺序拼装状态栏的块(PRD F-I6 / 裁定 R65)。
|
|
195
189
|
*
|
|
@@ -202,48 +196,40 @@ function blockLabel(id, language) {
|
|
|
202
196
|
* (`input.agent`):本函数保持同步纯函数,不在这里做 IO。
|
|
203
197
|
*/
|
|
204
198
|
export function statusBlocksOf(input) {
|
|
205
|
-
const { conversation, agent, run, context, usage
|
|
199
|
+
const { conversation, agent, run, context, usage } = input;
|
|
206
200
|
const generation = run.generation;
|
|
207
201
|
const runningTools = generation?.phase === "awaiting_tools" ? generation.runningTools : [];
|
|
208
202
|
const blocks = {
|
|
209
203
|
agent: {
|
|
210
204
|
id: "agent",
|
|
211
|
-
label: blockLabel("agent", language),
|
|
212
205
|
facts: { agentId: conversation.agentId, name: agent.name, available: agent.available },
|
|
213
206
|
},
|
|
214
207
|
model: {
|
|
215
208
|
id: "model",
|
|
216
|
-
label: blockLabel("model", language),
|
|
217
209
|
facts: conversation.model,
|
|
218
210
|
},
|
|
219
211
|
thinking: {
|
|
220
212
|
id: "thinking",
|
|
221
|
-
label: blockLabel("thinking", language),
|
|
222
213
|
facts: conversation.thinking,
|
|
223
214
|
},
|
|
224
215
|
context: {
|
|
225
216
|
id: "context",
|
|
226
|
-
label: blockLabel("context", language),
|
|
227
217
|
facts: context,
|
|
228
218
|
},
|
|
229
219
|
usage: {
|
|
230
220
|
id: "usage",
|
|
231
|
-
label: blockLabel("usage", language),
|
|
232
221
|
facts: usage,
|
|
233
222
|
},
|
|
234
223
|
cwd: {
|
|
235
224
|
id: "cwd",
|
|
236
|
-
label: blockLabel("cwd", language),
|
|
237
225
|
facts: conversation.folder,
|
|
238
226
|
},
|
|
239
227
|
tools: {
|
|
240
228
|
id: "tools",
|
|
241
|
-
label: blockLabel("tools", language),
|
|
242
229
|
facts: { running: runningTools },
|
|
243
230
|
},
|
|
244
231
|
subagents: {
|
|
245
232
|
id: "subagents",
|
|
246
|
-
label: blockLabel("subagents", language),
|
|
247
233
|
facts: { items: run.subagents },
|
|
248
234
|
},
|
|
249
235
|
};
|
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
* `host.*`:进程事实(PRD F-E5 / D4 / L4)。
|
|
3
3
|
*
|
|
4
4
|
* 三件事在这里:
|
|
5
|
-
* - `version` / `capabilities
|
|
6
|
-
*
|
|
5
|
+
* - `version` / `capabilities`:报事实(能力清单只在配置层维护一份,这里不编造;
|
|
6
|
+
* 清单里没有文案 —— 一份能力怎么跟用户说,归客户端);
|
|
7
7
|
* - `upgrade`:比磁盘上的版本与正在跑的版本,确认新版本真的落盘了才安排重启(D4 / F-E3);
|
|
8
8
|
* - `shutdown`:受理一次收尾请求。真正退不退由单根的退出判据决定(PRD L4 / 裁定 R53)。
|
|
9
9
|
*
|
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
* 没有任何客户端消费,已从契约面删除。
|
|
19
19
|
*/
|
|
20
20
|
import type { HandlerTable } from "../net/index.js";
|
|
21
|
-
import type {
|
|
21
|
+
import type { HostReloadResult, HostUpgradeParams, HostUpgradeResult } from "../wire/index.js";
|
|
22
22
|
/** `host.*` 的实现要的持有者 */
|
|
23
23
|
export interface HostHandlerDeps {
|
|
24
24
|
/** 宿主版本(`hello` 报的那一个) */
|
|
@@ -26,11 +26,10 @@ export interface HostHandlerDeps {
|
|
|
26
26
|
/** 进程启动时刻(ISO 8601) */
|
|
27
27
|
startedAt: string;
|
|
28
28
|
/** 能力清单(PRD F-E5);内容归配置层,本轮由单根注入 */
|
|
29
|
-
capabilities: () => CapabilityView[];
|
|
30
29
|
/** 请求收尾(`host.shutdown`):单根排程,先让回包写出去 */
|
|
31
30
|
requestStop: (reason?: string) => void;
|
|
32
31
|
/** 从磁盘重载(`host.reload`):配置服务那边跑「生效」那条路(回收 Scope + 合成通知) */
|
|
33
|
-
reload: (
|
|
32
|
+
reload: () => Promise<HostReloadResult>;
|
|
34
33
|
/** 升级判定与重启排程(磁盘版本归单根去读,这里只把结论转给客户端) */
|
|
35
34
|
upgrade: HostUpgradeHandler;
|
|
36
35
|
}
|
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
* `host.*`:进程事实(PRD F-E5 / D4 / L4)。
|
|
3
3
|
*
|
|
4
4
|
* 三件事在这里:
|
|
5
|
-
* - `version` / `capabilities
|
|
6
|
-
*
|
|
5
|
+
* - `version` / `capabilities`:报事实(能力清单只在配置层维护一份,这里不编造;
|
|
6
|
+
* 清单里没有文案 —— 一份能力怎么跟用户说,归客户端);
|
|
7
7
|
* - `upgrade`:比磁盘上的版本与正在跑的版本,确认新版本真的落盘了才安排重启(D4 / F-E3);
|
|
8
8
|
* - `shutdown`:受理一次收尾请求。真正退不退由单根的退出判据决定(PRD L4 / 裁定 R53)。
|
|
9
9
|
*
|
|
@@ -17,7 +17,6 @@
|
|
|
17
17
|
* `conversation.state` 的 `usage`(`UsageSnapshot`)给,`host.usage` 的「按项目 / 整机」聚合
|
|
18
18
|
* 没有任何客户端消费,已从契约面删除。
|
|
19
19
|
*/
|
|
20
|
-
import { relocalizeText } from "../services/NoticeService.js";
|
|
21
20
|
import { PROTOCOL_VERSION } from "../wire/index.js";
|
|
22
21
|
export function createHostHandlers(deps) {
|
|
23
22
|
return {
|
|
@@ -27,10 +26,6 @@ export function createHostHandlers(deps) {
|
|
|
27
26
|
startedAt: deps.startedAt,
|
|
28
27
|
pid: process.pid,
|
|
29
28
|
}),
|
|
30
|
-
"host.capabilities": (context) => ({
|
|
31
|
-
// 清单按这条连接的语言出句子(裁定 R58):id / 顺序与语言无关(R57)
|
|
32
|
-
capabilities: localizeCapabilities(deps.capabilities(), context.connection.language),
|
|
33
|
-
}),
|
|
34
29
|
"host.shutdown": (context) => {
|
|
35
30
|
deps.requestStop(context.params.reason);
|
|
36
31
|
return { accepted: true };
|
|
@@ -38,19 +33,6 @@ export function createHostHandlers(deps) {
|
|
|
38
33
|
// 升级即重启(D4 / F-E3):结论由单根给,它知道磁盘上的版本与重启排程
|
|
39
34
|
"host.upgrade": async (context) => await deps.upgrade(context.params),
|
|
40
35
|
// 重载不重启(F-E1 / F-E2 / R63):与改配置走同一条生效路径,回同一份报告
|
|
41
|
-
"host.reload": async (
|
|
36
|
+
"host.reload": async () => await deps.reload(),
|
|
42
37
|
};
|
|
43
38
|
}
|
|
44
|
-
/**
|
|
45
|
-
* 能力清单按这条连接的语言重渲染(裁定 R58)。
|
|
46
|
-
*
|
|
47
|
-
* 清单本身由配置层按缺省语言产出(每项的标题与说明都带着 `messageKey` + `params`),这里只把
|
|
48
|
-
* 句子换成收件人的语言 —— 与通知、问题出网前那一跳同一个口径(D8:存码不存句子)。
|
|
49
|
-
*/
|
|
50
|
-
function localizeCapabilities(capabilities, language) {
|
|
51
|
-
return capabilities.map((capability) => ({
|
|
52
|
-
...capability,
|
|
53
|
-
title: relocalizeText(capability.title, language),
|
|
54
|
-
description: relocalizeText(capability.description, language),
|
|
55
|
-
}));
|
|
56
|
-
}
|
package/dist/handlers/index.d.ts
CHANGED
|
@@ -34,7 +34,7 @@ import type { NoticeService } from "../services/NoticeService.js";
|
|
|
34
34
|
import type { QuestionService } from "../services/QuestionService.js";
|
|
35
35
|
import type { SearchService } from "../services/SearchService.js";
|
|
36
36
|
import type { WorkspaceService } from "../services/WorkspaceService.js";
|
|
37
|
-
import type {
|
|
37
|
+
import type { MethodName, QuestionView, HostReloadResult } from "../wire/index.js";
|
|
38
38
|
import type { EventMap, EventName } from "../wire/events.js";
|
|
39
39
|
export type { AgentHandlerDeps } from "./agentHandlers.js";
|
|
40
40
|
export type { AssetHandlerDeps } from "./assetHandlers.js";
|
|
@@ -49,7 +49,6 @@ export type { QuestionHandlerDeps } from "./questionHandlers.js";
|
|
|
49
49
|
export type { SearchHandlerDeps } from "./searchHandlers.js";
|
|
50
50
|
export type { HostHandlerDeps } from "./hostHandlers.js";
|
|
51
51
|
export type { WorkspaceHandlerDeps } from "./workspaceHandlers.js";
|
|
52
|
-
export { createCapabilities } from "./capabilities.js";
|
|
53
52
|
/**
|
|
54
53
|
* 由接线层代管、因此不在 handler 表里的方法名。
|
|
55
54
|
*
|
|
@@ -70,7 +69,6 @@ export interface HandlerDeps {
|
|
|
70
69
|
/** 进程启动时刻(ISO 8601) */
|
|
71
70
|
startedAt: string;
|
|
72
71
|
/** 能力清单(PRD F-E5) */
|
|
73
|
-
capabilities: () => CapabilityView[];
|
|
74
72
|
workspaces: WorkspaceService;
|
|
75
73
|
conversations: ConversationService;
|
|
76
74
|
messages: MessageService;
|
|
@@ -117,7 +115,7 @@ export interface HandlerDeps {
|
|
|
117
115
|
targetVersion: string | null;
|
|
118
116
|
}>;
|
|
119
117
|
/** 从磁盘重载(`host.reload`:与改配置同一条生效路径) */
|
|
120
|
-
reload: (
|
|
118
|
+
reload: () => Promise<HostReloadResult>;
|
|
121
119
|
}
|
|
122
120
|
/**
|
|
123
121
|
* 造出整张 handler 表。
|
package/dist/handlers/index.js
CHANGED
|
@@ -30,7 +30,6 @@ import { createQuestionHandlers } from "./questionHandlers.js";
|
|
|
30
30
|
import { createSearchHandlers } from "./searchHandlers.js";
|
|
31
31
|
import { createHostHandlers } from "./hostHandlers.js";
|
|
32
32
|
import { createWorkspaceHandlers } from "./workspaceHandlers.js";
|
|
33
|
-
export { createCapabilities } from "./capabilities.js";
|
|
34
33
|
/**
|
|
35
34
|
* 由接线层代管、因此不在 handler 表里的方法名。
|
|
36
35
|
*
|
|
@@ -6,7 +6,6 @@
|
|
|
6
6
|
* 一层只解释一次,多一层翻译就多一处会漂的地方。
|
|
7
7
|
*/
|
|
8
8
|
import type { HandlerTable } from "../net/WsHub.js";
|
|
9
|
-
import type { EventLocalizer } from "../services/NoticeService.js";
|
|
10
9
|
import type { NoticeService } from "../services/NoticeService.js";
|
|
11
10
|
export interface NoticeHandlerDeps {
|
|
12
11
|
/** 只要本域用到的那三个方法(结构上 `NoticeService` 满足,用例可以给替身) */
|
|
@@ -15,10 +14,3 @@ export interface NoticeHandlerDeps {
|
|
|
15
14
|
/** 本域注册的方法 */
|
|
16
15
|
export type NoticeHandlers = Pick<HandlerTable, "notice.list" | "notice.dismiss" | "notice.clear">;
|
|
17
16
|
export declare function createNoticeHandlers(deps: NoticeHandlerDeps): NoticeHandlers;
|
|
18
|
-
/**
|
|
19
|
-
* 事件出网前的按连接本地化(`WsHub` 的 `localizeEvent` 注入点)。
|
|
20
|
-
*
|
|
21
|
-
* 通知与问题的统一入口在这里:两类事件都带 `LocalizedText`,语言是连接的事,
|
|
22
|
-
* 所以「产生时按缺省语言渲染、出网时换成这条连接的语言」这一步落在接线层。
|
|
23
|
-
*/
|
|
24
|
-
export declare function createNoticeEventLocalizer(): EventLocalizer;
|
|
@@ -5,7 +5,6 @@
|
|
|
5
5
|
* 以及把服务层的返回值原样交回。业务事实全在 `NoticeService` 里,这里不做判断 ——
|
|
6
6
|
* 一层只解释一次,多一层翻译就多一处会漂的地方。
|
|
7
7
|
*/
|
|
8
|
-
import { createEventLocalizer } from "../services/NoticeService.js";
|
|
9
8
|
export function createNoticeHandlers(deps) {
|
|
10
9
|
return {
|
|
11
10
|
"notice.list": async (context) => await deps.notices.list(context.params, context.connection.language),
|
|
@@ -13,12 +12,3 @@ export function createNoticeHandlers(deps) {
|
|
|
13
12
|
"notice.clear": async (context) => await deps.notices.clear(context.params),
|
|
14
13
|
};
|
|
15
14
|
}
|
|
16
|
-
/**
|
|
17
|
-
* 事件出网前的按连接本地化(`WsHub` 的 `localizeEvent` 注入点)。
|
|
18
|
-
*
|
|
19
|
-
* 通知与问题的统一入口在这里:两类事件都带 `LocalizedText`,语言是连接的事,
|
|
20
|
-
* 所以「产生时按缺省语言渲染、出网时换成这条连接的语言」这一步落在接线层。
|
|
21
|
-
*/
|
|
22
|
-
export function createNoticeEventLocalizer() {
|
|
23
|
-
return createEventLocalizer();
|
|
24
|
-
}
|
package/dist/i18n/en.d.ts
CHANGED
|
@@ -25,11 +25,7 @@ export declare const en: {
|
|
|
25
25
|
readonly "error.handoffDeclined": "Handoff was declined, so this conversation carries on as it is.";
|
|
26
26
|
readonly "error.questionPending": "There's an unanswered question ({question}). Answer it before sending something new.";
|
|
27
27
|
readonly "error.contextGuard": "This conversation reached its {limit}-token limit at {used} tokens, so the request was stopped before it could fail.";
|
|
28
|
-
readonly "notice.settingsSaved": "Settings saved.";
|
|
29
28
|
readonly "notice.settingsApplied": "Settings applied — no restart needed.";
|
|
30
|
-
readonly "notice.conversationDeleted": "Conversation deleted.";
|
|
31
|
-
readonly "notice.workspaceDeleted": "Project removed, along with its {count} conversation(s). The folder itself was left alone.";
|
|
32
|
-
readonly "notice.assetsUploaded": "{count} image(s) uploaded.";
|
|
33
29
|
readonly "notice.attachmentDropped": "{name} couldn't be sent and was left out of the message.";
|
|
34
30
|
readonly "notice.upgradeRestarting": "Updated to {version}. Restarting now.";
|
|
35
31
|
readonly "notice.logWarning": "Host warning: {summary}";
|
|
@@ -37,48 +33,17 @@ export declare const en: {
|
|
|
37
33
|
readonly "notice.configRecovered": "Config file {path} was broken; factory settings restored.";
|
|
38
34
|
readonly "notice.handoffWritten": "Handoff document written to {path}.";
|
|
39
35
|
readonly "notice.autoNamed": "Named this conversation \"{name}\".";
|
|
40
|
-
readonly "notice.languageChanged": "This connection now speaks {language}.";
|
|
41
|
-
readonly "notice.hardLimitHit": "This turn stopped at the {limit}-token limit. Nothing was lost — the conversation is waiting for you.";
|
|
42
|
-
readonly "status.connected": "Connected";
|
|
43
|
-
readonly "status.awaitingFirstToken": "Connected — waiting for the first word";
|
|
44
|
-
readonly "status.thinking": "Thinking…";
|
|
45
|
-
readonly "status.generating": "Writing…";
|
|
46
|
-
readonly "status.assemblingToolCalls": "Putting together {count} tool call(s)…";
|
|
47
|
-
readonly "status.awaitingTools": "Waiting on {tools}";
|
|
48
|
-
readonly "status.idle": "Ready";
|
|
49
|
-
readonly "status.done": "Finished";
|
|
50
|
-
readonly "status.aborted": "Stopped";
|
|
51
|
-
readonly "status.error": "Stopped by an error";
|
|
52
36
|
readonly "question.handoff.prompt": "This conversation is at {percent}% of the context budget set for it. How should we continue?";
|
|
53
37
|
readonly "question.handoff.self": "Let the assistant write the handoff itself";
|
|
54
38
|
readonly "question.handoff.selfDetail": "Uses the full conversation and its tools — the best result, at the price of one more full input.";
|
|
55
39
|
readonly "question.handoff.summary": "Summarise the history instead";
|
|
56
40
|
readonly "question.handoff.summaryDetail": "Cheaper and predictable, but the document is less faithful.";
|
|
57
41
|
readonly "question.handoff.decline": "Keep going in this conversation";
|
|
58
|
-
readonly "question.confirm.prompt": "{action} can't be undone. Go ahead?";
|
|
59
|
-
readonly "question.confirm.accept": "Yes, do it";
|
|
60
|
-
readonly "question.confirm.decline": "Cancel";
|
|
61
42
|
readonly "question.blocking": "This question is holding the conversation. Answer it to continue.";
|
|
62
|
-
readonly "message.reverted": "Removed {count} message(s). The text is back in your input.";
|
|
63
|
-
readonly "message.cwdMissing": "This project's folder no longer exists ({cwd}). The conversation and its history are still here.";
|
|
64
43
|
readonly "message.injectedContext": "Sent by the host, not typed by you: {summary}";
|
|
65
44
|
readonly "message.injectedContext.cwd": "the current folder is {cwd}";
|
|
66
45
|
readonly "message.subagentFailed": "The helper agent {name} failed: {reason}";
|
|
67
|
-
readonly "message.subagentFinished": "The helper agent {name} finished.";
|
|
68
46
|
readonly "message.imageAsText": "{model} can't look at images, so {name} was described in text instead.";
|
|
69
|
-
readonly "message.attachmentTooMany": "A message carries at most {limit} images. {name} was left out.";
|
|
70
|
-
readonly "usage.turn": "{value} tokens this turn";
|
|
71
|
-
readonly "usage.total": "{value} tokens in total";
|
|
72
|
-
readonly "usage.rate": "{value} tokens/s";
|
|
73
|
-
readonly "usage.withSubAgents": "the total includes {value} from helper agents";
|
|
74
|
-
readonly "label.agent": "Assistant";
|
|
75
|
-
readonly "label.model": "Model";
|
|
76
|
-
readonly "label.thinking": "Thinking";
|
|
77
|
-
readonly "label.context": "Context";
|
|
78
|
-
readonly "label.usage": "Usage";
|
|
79
|
-
readonly "label.cwd": "Folder";
|
|
80
|
-
readonly "label.tools": "Tools running";
|
|
81
|
-
readonly "label.subagents": "Helper agents";
|
|
82
47
|
readonly "completion.scanning": "Still reading the project's file list — a few more characters and it will fill in.";
|
|
83
48
|
readonly "completion.timedOut": "The file list took longer than {seconds}s to build, so it may be incomplete.";
|
|
84
49
|
readonly "completion.unavailable": "The file list isn't available here: {reason}";
|
|
@@ -86,7 +51,6 @@ export declare const en: {
|
|
|
86
51
|
readonly "completion.truncated": "Only the first {limit} files are listed; narrow what you type to see the rest.";
|
|
87
52
|
readonly "config.referenced": "Still used by {count} item(s), so it can't be removed: {names}";
|
|
88
53
|
readonly "config.fileBroken": "{path} can't be read as settings: {reason}";
|
|
89
|
-
readonly "endpoint.missing": "{id} isn't in the endpoint list anymore, so this can't be reached.";
|
|
90
54
|
readonly "endpoint.noKey": "{endpoint} has no access key yet, so its models can't answer.";
|
|
91
55
|
readonly "model.endpointMissing": "{model} points to an endpoint ({id}) that isn't in the endpoint list anymore.";
|
|
92
56
|
readonly "agent.modelMissing": "This assistant is bound to a model ({id}) that isn't in the model list anymore.";
|
|
@@ -101,13 +65,7 @@ export declare const en: {
|
|
|
101
65
|
readonly "discovery.skillBroken": "{name} has a SKILL.md that can't be used as a skill: {reason}";
|
|
102
66
|
readonly "discovery.toolUnloadable": "{name} couldn't be loaded as a tool: {reason}";
|
|
103
67
|
readonly "discovery.subAgentBroken": "{name} isn't a usable sub-agent definition: {reason}";
|
|
104
|
-
readonly "model.unavailable": "{name} is listed but can't be used right now: {reason}";
|
|
105
|
-
readonly "model.visionRequired": "{model} can't read images, and this conversation has some.";
|
|
106
68
|
readonly "handoff.degraded": "The handoff fell back to {mode}: {reason}";
|
|
107
|
-
readonly "handoff.declined": "No handoff this time.";
|
|
108
|
-
readonly "handoff.noDocuments": "No handoff documents in this project yet.";
|
|
109
|
-
readonly "workspace.removalCost": "This removes {conversations} conversation(s) and their {messages} message(s). The folder on disk stays.";
|
|
110
|
-
readonly "attachment.tooLarge": "Each image can be at most {limit}; {name} is {size}.";
|
|
111
69
|
readonly "attachment.tooMany": "A message carries at most {limit} images.";
|
|
112
70
|
readonly "notice.unknown": "A notice from the host ({code}).";
|
|
113
71
|
readonly "error.handoffFailed": "The handoff didn't go through: {reason}";
|
|
@@ -115,130 +73,4 @@ export declare const en: {
|
|
|
115
73
|
readonly "handoff.newConversationSummary": "This conversation continues an earlier one. The handoff document is at {path} — read it first, then carry on with the task.\n\nSummary of the handoff:\n{summary}";
|
|
116
74
|
readonly "handoff.degradeReason.fallback": "the assistant couldn't write the document itself this time";
|
|
117
75
|
readonly "autoName.failed": "No name came out of it, so the original one stays: {reason}";
|
|
118
|
-
readonly "capability.host.hello": "Connect to the host";
|
|
119
|
-
readonly "capability.host.hello.detail": "Opens a connection with an access key and fixes the language this connection speaks.";
|
|
120
|
-
readonly "capability.host.version": "Show the host version";
|
|
121
|
-
readonly "capability.host.version.detail": "The running version and the protocol version, so an upgrade can be checked.";
|
|
122
|
-
readonly "capability.host.upgrade": "Restart into a newer version";
|
|
123
|
-
readonly "capability.host.upgrade.detail": "Compares the version on disk with the running one and restarts when the update has really landed.";
|
|
124
|
-
readonly "capability.host.shutdown": "Shut the host down";
|
|
125
|
-
readonly "capability.host.shutdown.detail": "Stops serving once nothing is left running — open connections are closed.";
|
|
126
|
-
readonly "capability.host.capabilities": "List what the host can do";
|
|
127
|
-
readonly "capability.host.capabilities.detail": "The list this help page is drawn from: what each ability does and whether it blocks or can't be undone.";
|
|
128
|
-
readonly "capability.host.reload": "Reload from disk";
|
|
129
|
-
readonly "capability.host.reload.detail": "Re-read configuration, assistants, tools, skills or MCP entries: affected projects rebuild their capabilities, nothing restarts.";
|
|
130
|
-
readonly "capability.host.setLanguage": "Switch language for this connection";
|
|
131
|
-
readonly "capability.host.setLanguage.detail": "Every message on this connection is rendered in the chosen language; a reconnect forgets it.";
|
|
132
|
-
readonly "capability.workspace.list": "List projects";
|
|
133
|
-
readonly "capability.workspace.list.detail": "Every project on this machine, including the ones whose folder is gone.";
|
|
134
|
-
readonly "capability.workspace.create": "Add a project";
|
|
135
|
-
readonly "capability.workspace.create.detail": "Registers a folder as a project; the same folder can only be added once.";
|
|
136
|
-
readonly "capability.workspace.get": "Show a project";
|
|
137
|
-
readonly "capability.workspace.get.detail": "One project by id, with whether its folder still exists.";
|
|
138
|
-
readonly "capability.workspace.rename": "Rename a project";
|
|
139
|
-
readonly "capability.workspace.rename.detail": "Changes the display name only; the folder path never changes.";
|
|
140
|
-
readonly "capability.workspace.remove": "Remove a project";
|
|
141
|
-
readonly "capability.workspace.remove.detail": "Deletes the project and every conversation in it; the folder on disk is left alone.";
|
|
142
|
-
readonly "capability.conversation.list": "List conversations";
|
|
143
|
-
readonly "capability.conversation.list.detail": "Newest first, pinned ones on top; can be narrowed to one project.";
|
|
144
|
-
readonly "capability.conversation.create": "Start a conversation";
|
|
145
|
-
readonly "capability.conversation.create.detail": "Fixes the project, the assistant and the model for this conversation up front.";
|
|
146
|
-
readonly "capability.conversation.get": "Open a conversation";
|
|
147
|
-
readonly "capability.conversation.get.detail": "One conversation by id — how you pick up where you left off.";
|
|
148
|
-
readonly "capability.conversation.state": "Show what is happening right now";
|
|
149
|
-
readonly "capability.conversation.state.detail": "The six-state run, context thresholds, pending questions and usage in one snapshot.";
|
|
150
|
-
readonly "capability.conversation.rename": "Rename a conversation";
|
|
151
|
-
readonly "capability.conversation.rename.detail": "Changes the name only; identity and order stay as they were.";
|
|
152
|
-
readonly "capability.conversation.pin": "Pin a conversation";
|
|
153
|
-
readonly "capability.conversation.pin.detail": "Keeps it at the top of the sidebar without changing anything else.";
|
|
154
|
-
readonly "capability.conversation.delete": "Delete a conversation";
|
|
155
|
-
readonly "capability.conversation.delete.detail": "Removes the conversation and its messages for good, and cleans up its images.";
|
|
156
|
-
readonly "capability.conversation.send": "Send a message";
|
|
157
|
-
readonly "capability.conversation.send.detail": "Starts one turn: you get the message ids back at once, the answer streams in after.";
|
|
158
|
-
readonly "capability.conversation.abort": "Stop the current turn";
|
|
159
|
-
readonly "capability.conversation.abort.detail": "Stops the answer that is being written; what was written so far stays.";
|
|
160
|
-
readonly "capability.conversation.revert": "Take back messages";
|
|
161
|
-
readonly "capability.conversation.revert.detail": "Deletes everything after a chosen message and puts that text back in your input.";
|
|
162
|
-
readonly "capability.conversation.setModel": "Switch model for this conversation";
|
|
163
|
-
readonly "capability.conversation.setModel.detail": "Without touching the assistant's default and without restarting the conversation.";
|
|
164
|
-
readonly "capability.conversation.setThinking": "Set how hard the model thinks";
|
|
165
|
-
readonly "capability.conversation.setThinking.detail": "Turns a thinking level into request parameters for this conversation only.";
|
|
166
|
-
readonly "capability.conversation.transient": "Ask once without a conversation";
|
|
167
|
-
readonly "capability.conversation.transient.detail": "One request, one answer, nothing saved and no conversation created.";
|
|
168
|
-
readonly "capability.message.list": "Show messages";
|
|
169
|
-
readonly "capability.message.list.detail": "The whole history of a conversation, or everything from a given message on, helper agents included.";
|
|
170
|
-
readonly "capability.question.list": "Show open questions";
|
|
171
|
-
readonly "capability.question.list.detail": "Questions waiting for an answer; every window sees the same ones.";
|
|
172
|
-
readonly "capability.question.answer": "Answer a question";
|
|
173
|
-
readonly "capability.question.answer.detail": "Records the answer and carries on: a handoff question starts the handoff by itself.";
|
|
174
|
-
readonly "capability.notice.list": "Show notices";
|
|
175
|
-
readonly "capability.notice.list.detail": "The notices still on screen — separate from the message stream.";
|
|
176
|
-
readonly "capability.notice.dismiss": "Dismiss a notice";
|
|
177
|
-
readonly "capability.notice.dismiss.detail": "Clears one notice; timed notices go away on their own.";
|
|
178
|
-
readonly "capability.notice.clear": "Clear all notices";
|
|
179
|
-
readonly "capability.notice.clear.detail": "Clears a batch at once, either the whole list or one conversation's.";
|
|
180
|
-
readonly "capability.config.get": "Show settings";
|
|
181
|
-
readonly "capability.config.get.detail": "Endpoints (keys masked), models, defaults and what is misconfigured, in one read.";
|
|
182
|
-
readonly "capability.config.patch": "Change settings";
|
|
183
|
-
readonly "capability.config.patch.detail": "Writes the change and applies it right away — no restart, no save button.";
|
|
184
|
-
readonly "capability.config.setDefaults": "Set the defaults";
|
|
185
|
-
readonly "capability.config.setDefaults.detail": "Default assistant, fallback model, migration model, image model and naming model.";
|
|
186
|
-
readonly "capability.config.getDiscovery": "Show where abilities come from";
|
|
187
|
-
readonly "capability.config.getDiscovery.detail": "The MCP layers, Skills, tools and helpers that are actually found, plus the files that can't be read.";
|
|
188
|
-
readonly "capability.config.saveMcp": "Save an MCP server";
|
|
189
|
-
readonly "capability.config.saveMcp.detail": "Creates it if the id is new, edits it otherwise — one entry at a time, with its transport and that transport's parameters; fields this version doesn't know are kept as they are.";
|
|
190
|
-
readonly "capability.config.deleteMcp": "Delete an MCP server";
|
|
191
|
-
readonly "capability.config.deleteMcp.detail": "Removes one entry from one of the two editable scopes; says so plainly when it wasn't there.";
|
|
192
|
-
readonly "capability.config.saveEndpoint": "Save an endpoint";
|
|
193
|
-
readonly "capability.config.saveEndpoint.detail": "Creates or edits an endpoint; leave the key out to keep the current one.";
|
|
194
|
-
readonly "capability.config.deleteEndpoint": "Delete an endpoint";
|
|
195
|
-
readonly "capability.config.deleteEndpoint.detail": "Refuses while models still point at it and lists who does.";
|
|
196
|
-
readonly "capability.agent.list": "List assistants";
|
|
197
|
-
readonly "capability.agent.list.detail": "Every assistant, including the ones that can't be used right now and why.";
|
|
198
|
-
readonly "capability.agent.get": "Show an assistant";
|
|
199
|
-
readonly "capability.agent.get.detail": "One assistant definition by id, straight from its file.";
|
|
200
|
-
readonly "capability.agent.create": "Create an assistant";
|
|
201
|
-
readonly "capability.agent.create.detail": "Writes a new definition file — one file per assistant, editable by hand.";
|
|
202
|
-
readonly "capability.agent.update": "Edit an assistant";
|
|
203
|
-
readonly "capability.agent.update.detail": "Changes the definition file; from then on it counts as your own, not the factory one.";
|
|
204
|
-
readonly "capability.agent.delete": "Delete an assistant";
|
|
205
|
-
readonly "capability.agent.delete.detail": "Removes the definition and says who else points at it first.";
|
|
206
|
-
readonly "capability.agent.setModel": "Set an assistant's model";
|
|
207
|
-
readonly "capability.agent.setModel.detail": "Changes the assistant's default model, which affects conversations started later.";
|
|
208
|
-
readonly "capability.agent.setThinking": "Set an assistant's thinking level";
|
|
209
|
-
readonly "capability.agent.setThinking.detail": "Writes the expanded request parameters into the assistant definition.";
|
|
210
|
-
readonly "capability.agent.restoreFactory": "Restore an assistant to factory settings";
|
|
211
|
-
readonly "capability.agent.restoreFactory.detail": "Puts the whole assistant definition — prompt, model, permissions and thinking settings — back to the one that shipped with the host. You can look at the result before it's written.";
|
|
212
|
-
readonly "capability.model.list": "List models";
|
|
213
|
-
readonly "capability.model.list.detail": "Factory-managed and custom models with thresholds, thinking presets and availability.";
|
|
214
|
-
readonly "capability.model.listImages": "List image models";
|
|
215
|
-
readonly "capability.model.listImages.detail": "The models used for image generation, plus which one is the default.";
|
|
216
|
-
readonly "capability.model.create": "Create a model";
|
|
217
|
-
readonly "capability.model.create.detail": "Adds a model bound to an endpoint; a new one counts as custom right away.";
|
|
218
|
-
readonly "capability.model.update": "Edit a model";
|
|
219
|
-
readonly "capability.model.update.detail": "Editing a factory model turns it into a custom one so later updates leave it alone.";
|
|
220
|
-
readonly "capability.model.delete": "Delete a model";
|
|
221
|
-
readonly "capability.model.delete.detail": "Refuses while an assistant still points at it, and fixes the defaults when it goes.";
|
|
222
|
-
readonly "capability.model.restoreFactory": "Restore a model to factory settings";
|
|
223
|
-
readonly "capability.model.restoreFactory.detail": "Replaces the whole model definition with the factory one in a single step.";
|
|
224
|
-
readonly "capability.model.saveImage": "Create or edit an image model";
|
|
225
|
-
readonly "capability.model.saveImage.detail": "Binds an image model to an endpoint with its default size and quality.";
|
|
226
|
-
readonly "capability.model.deleteImage": "Delete an image model";
|
|
227
|
-
readonly "capability.model.deleteImage.detail": "Refuses while it is the default image model.";
|
|
228
|
-
readonly "capability.asset.begin": "Start an upload";
|
|
229
|
-
readonly "capability.asset.begin.detail": "Declares the size and type of a file; anything over the limit is refused right here.";
|
|
230
|
-
readonly "capability.asset.end": "Finish an upload";
|
|
231
|
-
readonly "capability.asset.end.detail": "Checks length and digest, then turns the file into something a message can reference.";
|
|
232
|
-
readonly "capability.asset.get": "Fetch an asset";
|
|
233
|
-
readonly "capability.asset.get.detail": "Returns the stored bytes so any model can replay an image from history; the thumbnail variant currently equals the original.";
|
|
234
|
-
readonly "capability.completion.files": "Complete file paths";
|
|
235
|
-
readonly "capability.completion.files.detail": "The project's file list behind the `@` menu; says so when it is still reading.";
|
|
236
|
-
readonly "capability.handoff.start": "Write a handoff document";
|
|
237
|
-
readonly "capability.handoff.start.detail": "Writes the document and, if asked, opens the next conversation; the old one stays complete.";
|
|
238
|
-
readonly "capability.handoff.listDocuments": "List handoff documents";
|
|
239
|
-
readonly "capability.handoff.listDocuments.detail": "The documents already written in this project, ready to be refined again.";
|
|
240
|
-
readonly "capability.search.conversations": "Search conversations by name";
|
|
241
|
-
readonly "capability.search.conversations.detail": "Finds old conversations by what they are called, optionally within one project.";
|
|
242
|
-
readonly "capability.search.messages": "Search inside conversations";
|
|
243
|
-
readonly "capability.search.messages.detail": "Full-text search over what was said, with a snippet of each hit.";
|
|
244
76
|
};
|