@ai-zen/agents-host 0.1.0-alpha.2 → 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.
Files changed (42) hide show
  1. package/CHANGELOG.md +39 -0
  2. package/dist/app.d.ts +0 -5
  3. package/dist/app.js +3 -9
  4. package/dist/config.d.ts +3 -2
  5. package/dist/config.js +30 -4
  6. package/dist/handlers/configHandlers.d.ts +1 -3
  7. package/dist/handlers/conversationHandlers.d.ts +0 -2
  8. package/dist/handlers/conversationHandlers.js +2 -16
  9. package/dist/handlers/hostHandlers.d.ts +4 -5
  10. package/dist/handlers/hostHandlers.js +3 -21
  11. package/dist/handlers/index.d.ts +2 -4
  12. package/dist/handlers/index.js +0 -1
  13. package/dist/handlers/noticeHandlers.d.ts +0 -8
  14. package/dist/handlers/noticeHandlers.js +0 -10
  15. package/dist/i18n/en.d.ts +0 -168
  16. package/dist/i18n/en.js +0 -171
  17. package/dist/i18n/zh.d.ts +0 -168
  18. package/dist/i18n/zh.js +0 -169
  19. package/dist/index.d.ts +1 -0
  20. package/dist/net/WsHub.d.ts +1 -2
  21. package/dist/net/WsHub.js +0 -2
  22. package/dist/services/AutoNaming.d.ts +0 -5
  23. package/dist/services/AutoNaming.js +0 -18
  24. package/dist/services/ConfigService.d.ts +2 -2
  25. package/dist/services/ConfigService.js +11 -20
  26. package/dist/services/DiscoveryService.d.ts +10 -2
  27. package/dist/services/DiscoveryService.js +10 -2
  28. package/dist/services/ModelService.d.ts +1 -3
  29. package/dist/services/ModelService.js +0 -4
  30. package/dist/services/QuestionService.d.ts +0 -7
  31. package/dist/services/QuestionService.js +0 -15
  32. package/dist/storage/ConversationRepository.d.ts +0 -3
  33. package/dist/storage/ConversationRepository.js +0 -12
  34. package/dist/storage/QuestionRepository.d.ts +0 -1
  35. package/dist/storage/QuestionRepository.js +0 -4
  36. package/dist/storage/types.d.ts +0 -2
  37. package/dist/wire/methods.d.ts +4 -52
  38. package/dist/wire/methods.js +0 -5
  39. package/dist/wire/states.d.ts +5 -12
  40. package/package.json +4 -3
  41. package/dist/handlers/capabilities.d.ts +0 -26
  42. package/dist/handlers/capabilities.js +0 -138
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
  };
package/dist/i18n/en.js CHANGED
@@ -30,11 +30,7 @@ export const en = {
30
30
  "error.questionPending": "There's an unanswered question ({question}). Answer it before sending something new.",
31
31
  "error.contextGuard": "This conversation reached its {limit}-token limit at {used} tokens, so the request was stopped before it could fail.",
32
32
  // ---- 通知:三档语气,`duration` 决定是否到点消失(PRD L3 / F-I8)----
33
- "notice.settingsSaved": "Settings saved.",
34
33
  "notice.settingsApplied": "Settings applied — no restart needed.",
35
- "notice.conversationDeleted": "Conversation deleted.",
36
- "notice.workspaceDeleted": "Project removed, along with its {count} conversation(s). The folder itself was left alone.",
37
- "notice.assetsUploaded": "{count} image(s) uploaded.",
38
34
  "notice.attachmentDropped": "{name} couldn't be sent and was left out of the message.",
39
35
  "notice.upgradeRestarting": "Updated to {version}. Restarting now.",
40
36
  "notice.logWarning": "Host warning: {summary}",
@@ -42,19 +38,7 @@ export const en = {
42
38
  "notice.configRecovered": "Config file {path} was broken; factory settings restored.",
43
39
  "notice.handoffWritten": "Handoff document written to {path}.",
44
40
  "notice.autoNamed": "Named this conversation \"{name}\".",
45
- "notice.languageChanged": "This connection now speaks {language}.",
46
- "notice.hardLimitHit": "This turn stopped at the {limit}-token limit. Nothing was lost — the conversation is waiting for you.",
47
41
  // ---- 生成六态(PRD L8 / F-I3):每一态一句人话,事实在 run.state 字段里 ----
48
- "status.connected": "Connected",
49
- "status.awaitingFirstToken": "Connected — waiting for the first word",
50
- "status.thinking": "Thinking…",
51
- "status.generating": "Writing…",
52
- "status.assemblingToolCalls": "Putting together {count} tool call(s)…",
53
- "status.awaitingTools": "Waiting on {tools}",
54
- "status.idle": "Ready",
55
- "status.done": "Finished",
56
- "status.aborted": "Stopped",
57
- "status.error": "Stopped by an error",
58
42
  // ---- 问题对象(PRD D22 / F-I9)----
59
43
  "question.handoff.prompt": "This conversation is at {percent}% of the context budget set for it. How should we continue?",
60
44
  "question.handoff.self": "Let the assistant write the handoff itself",
@@ -62,34 +46,15 @@ export const en = {
62
46
  "question.handoff.summary": "Summarise the history instead",
63
47
  "question.handoff.summaryDetail": "Cheaper and predictable, but the document is less faithful.",
64
48
  "question.handoff.decline": "Keep going in this conversation",
65
- "question.confirm.prompt": "{action} can't be undone. Go ahead?",
66
- "question.confirm.accept": "Yes, do it",
67
- "question.confirm.decline": "Cancel",
68
49
  "question.blocking": "This question is holding the conversation. Answer it to continue.",
69
50
  // ---- 消息与状态的事实叙述(配结构化字段一起给出)----
70
- "message.reverted": "Removed {count} message(s). The text is back in your input.",
71
- "message.cwdMissing": "This project's folder no longer exists ({cwd}). The conversation and its history are still here.",
72
51
  "message.injectedContext": "Sent by the host, not typed by you: {summary}",
73
52
  // 会话创建时那条 hidden 消息里的那句事实(PRD F-D9:cwd 来自对话所属项目,不是宿主进程的目录)
74
53
  "message.injectedContext.cwd": "the current folder is {cwd}",
75
54
  "message.subagentFailed": "The helper agent {name} failed: {reason}",
76
- "message.subagentFinished": "The helper agent {name} finished.",
77
55
  "message.imageAsText": "{model} can't look at images, so {name} was described in text instead.",
78
- "message.attachmentTooMany": "A message carries at most {limit} images. {name} was left out.",
79
56
  // ---- 用量(PRD F-I5):三个数字分开给,句子只是给人看的拼装 ----
80
- "usage.turn": "{value} tokens this turn",
81
- "usage.total": "{value} tokens in total",
82
- "usage.rate": "{value} tokens/s",
83
- "usage.withSubAgents": "the total includes {value} from helper agents",
84
57
  // ---- 状态栏各块的标签(PRD F-I6:宿主给块名,客户端排版)----
85
- "label.agent": "Assistant",
86
- "label.model": "Model",
87
- "label.thinking": "Thinking",
88
- "label.context": "Context",
89
- "label.usage": "Usage",
90
- "label.cwd": "Folder",
91
- "label.tools": "Tools running",
92
- "label.subagents": "Helper agents",
93
58
  // ---- `@` 补全(PRD F-H5 / D7)----
94
59
  "completion.scanning": "Still reading the project's file list — a few more characters and it will fill in.",
95
60
  "completion.timedOut": "The file list took longer than {seconds}s to build, so it may be incomplete.",
@@ -100,7 +65,6 @@ export const en = {
100
65
  "config.referenced": "Still used by {count} item(s), so it can't be removed: {names}",
101
66
  "config.fileBroken": "{path} can't be read as settings: {reason}",
102
67
  // ---- 端点、模型、助手的可用性(PRD F-B5:用不了也要列出来并说明原因)----
103
- "endpoint.missing": "{id} isn't in the endpoint list anymore, so this can't be reached.",
104
68
  "endpoint.noKey": "{endpoint} has no access key yet, so its models can't answer.",
105
69
  "model.endpointMissing": "{model} points to an endpoint ({id}) that isn't in the endpoint list anymore.",
106
70
  "agent.modelMissing": "This assistant is bound to a model ({id}) that isn't in the model list anymore.",
@@ -118,13 +82,7 @@ export const en = {
118
82
  "discovery.skillBroken": "{name} has a SKILL.md that can't be used as a skill: {reason}",
119
83
  "discovery.toolUnloadable": "{name} couldn't be loaded as a tool: {reason}",
120
84
  "discovery.subAgentBroken": "{name} isn't a usable sub-agent definition: {reason}",
121
- "model.unavailable": "{name} is listed but can't be used right now: {reason}",
122
- "model.visionRequired": "{model} can't read images, and this conversation has some.",
123
85
  "handoff.degraded": "The handoff fell back to {mode}: {reason}",
124
- "handoff.declined": "No handoff this time.",
125
- "handoff.noDocuments": "No handoff documents in this project yet.",
126
- "workspace.removalCost": "This removes {conversations} conversation(s) and their {messages} message(s). The folder on disk stays.",
127
- "attachment.tooLarge": "Each image can be at most {limit}; {name} is {size}.",
128
86
  "attachment.tooMany": "A message carries at most {limit} images.",
129
87
  // ---- 通知 / 问题 / 交接 / 自动命名 / 临时对话(W4-H)----
130
88
  // 库里那条通知的码认不出来(配置被手改坏、旧版本写进去的码)时的兜底句
@@ -139,133 +97,4 @@ export const en = {
139
97
  "handoff.degradeReason.fallback": "the assistant couldn't write the document itself this time",
140
98
  // 自动命名(D2):起不出名就保持原名,这句只在内部结果与日志里出现
141
99
  "autoName.failed": "No name came out of it, so the original one stays: {reason}",
142
- // ---- 能力清单:帮助页与指令菜单按它渲染(F-E5 / F-E6 / F-F9,裁定 R6)----
143
- // 每个方法一条标题(`capability.<方法名>`)加一句说明(`.detail`);
144
- // 编号与阻塞 / 不可撤销属性见 `handlers/capabilities.ts`
145
- "capability.host.hello": "Connect to the host",
146
- "capability.host.hello.detail": "Opens a connection with an access key and fixes the language this connection speaks.",
147
- "capability.host.version": "Show the host version",
148
- "capability.host.version.detail": "The running version and the protocol version, so an upgrade can be checked.",
149
- "capability.host.upgrade": "Restart into a newer version",
150
- "capability.host.upgrade.detail": "Compares the version on disk with the running one and restarts when the update has really landed.",
151
- "capability.host.shutdown": "Shut the host down",
152
- "capability.host.shutdown.detail": "Stops serving once nothing is left running — open connections are closed.",
153
- "capability.host.capabilities": "List what the host can do",
154
- "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.",
155
- "capability.host.reload": "Reload from disk",
156
- "capability.host.reload.detail": "Re-read configuration, assistants, tools, skills or MCP entries: affected projects rebuild their capabilities, nothing restarts.",
157
- "capability.host.setLanguage": "Switch language for this connection",
158
- "capability.host.setLanguage.detail": "Every message on this connection is rendered in the chosen language; a reconnect forgets it.",
159
- "capability.workspace.list": "List projects",
160
- "capability.workspace.list.detail": "Every project on this machine, including the ones whose folder is gone.",
161
- "capability.workspace.create": "Add a project",
162
- "capability.workspace.create.detail": "Registers a folder as a project; the same folder can only be added once.",
163
- "capability.workspace.get": "Show a project",
164
- "capability.workspace.get.detail": "One project by id, with whether its folder still exists.",
165
- "capability.workspace.rename": "Rename a project",
166
- "capability.workspace.rename.detail": "Changes the display name only; the folder path never changes.",
167
- "capability.workspace.remove": "Remove a project",
168
- "capability.workspace.remove.detail": "Deletes the project and every conversation in it; the folder on disk is left alone.",
169
- "capability.conversation.list": "List conversations",
170
- "capability.conversation.list.detail": "Newest first, pinned ones on top; can be narrowed to one project.",
171
- "capability.conversation.create": "Start a conversation",
172
- "capability.conversation.create.detail": "Fixes the project, the assistant and the model for this conversation up front.",
173
- "capability.conversation.get": "Open a conversation",
174
- "capability.conversation.get.detail": "One conversation by id — how you pick up where you left off.",
175
- "capability.conversation.state": "Show what is happening right now",
176
- "capability.conversation.state.detail": "The six-state run, context thresholds, pending questions and usage in one snapshot.",
177
- "capability.conversation.rename": "Rename a conversation",
178
- "capability.conversation.rename.detail": "Changes the name only; identity and order stay as they were.",
179
- "capability.conversation.pin": "Pin a conversation",
180
- "capability.conversation.pin.detail": "Keeps it at the top of the sidebar without changing anything else.",
181
- "capability.conversation.delete": "Delete a conversation",
182
- "capability.conversation.delete.detail": "Removes the conversation and its messages for good, and cleans up its images.",
183
- "capability.conversation.send": "Send a message",
184
- "capability.conversation.send.detail": "Starts one turn: you get the message ids back at once, the answer streams in after.",
185
- "capability.conversation.abort": "Stop the current turn",
186
- "capability.conversation.abort.detail": "Stops the answer that is being written; what was written so far stays.",
187
- "capability.conversation.revert": "Take back messages",
188
- "capability.conversation.revert.detail": "Deletes everything after a chosen message and puts that text back in your input.",
189
- "capability.conversation.setModel": "Switch model for this conversation",
190
- "capability.conversation.setModel.detail": "Without touching the assistant's default and without restarting the conversation.",
191
- "capability.conversation.setThinking": "Set how hard the model thinks",
192
- "capability.conversation.setThinking.detail": "Turns a thinking level into request parameters for this conversation only.",
193
- "capability.conversation.transient": "Ask once without a conversation",
194
- "capability.conversation.transient.detail": "One request, one answer, nothing saved and no conversation created.",
195
- "capability.message.list": "Show messages",
196
- "capability.message.list.detail": "The whole history of a conversation, or everything from a given message on, helper agents included.",
197
- "capability.question.list": "Show open questions",
198
- "capability.question.list.detail": "Questions waiting for an answer; every window sees the same ones.",
199
- "capability.question.answer": "Answer a question",
200
- "capability.question.answer.detail": "Records the answer and carries on: a handoff question starts the handoff by itself.",
201
- "capability.notice.list": "Show notices",
202
- "capability.notice.list.detail": "The notices still on screen — separate from the message stream.",
203
- "capability.notice.dismiss": "Dismiss a notice",
204
- "capability.notice.dismiss.detail": "Clears one notice; timed notices go away on their own.",
205
- "capability.notice.clear": "Clear all notices",
206
- "capability.notice.clear.detail": "Clears a batch at once, either the whole list or one conversation's.",
207
- "capability.config.get": "Show settings",
208
- "capability.config.get.detail": "Endpoints (keys masked), models, defaults and what is misconfigured, in one read.",
209
- "capability.config.patch": "Change settings",
210
- "capability.config.patch.detail": "Writes the change and applies it right away — no restart, no save button.",
211
- "capability.config.setDefaults": "Set the defaults",
212
- "capability.config.setDefaults.detail": "Default assistant, fallback model, migration model, image model and naming model.",
213
- "capability.config.getDiscovery": "Show where abilities come from",
214
- "capability.config.getDiscovery.detail": "The MCP layers, Skills, tools and helpers that are actually found, plus the files that can't be read.",
215
- "capability.config.saveMcp": "Save an MCP server",
216
- "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.",
217
- "capability.config.deleteMcp": "Delete an MCP server",
218
- "capability.config.deleteMcp.detail": "Removes one entry from one of the two editable scopes; says so plainly when it wasn't there.",
219
- "capability.config.saveEndpoint": "Save an endpoint",
220
- "capability.config.saveEndpoint.detail": "Creates or edits an endpoint; leave the key out to keep the current one.",
221
- "capability.config.deleteEndpoint": "Delete an endpoint",
222
- "capability.config.deleteEndpoint.detail": "Refuses while models still point at it and lists who does.",
223
- "capability.agent.list": "List assistants",
224
- "capability.agent.list.detail": "Every assistant, including the ones that can't be used right now and why.",
225
- "capability.agent.get": "Show an assistant",
226
- "capability.agent.get.detail": "One assistant definition by id, straight from its file.",
227
- "capability.agent.create": "Create an assistant",
228
- "capability.agent.create.detail": "Writes a new definition file — one file per assistant, editable by hand.",
229
- "capability.agent.update": "Edit an assistant",
230
- "capability.agent.update.detail": "Changes the definition file; from then on it counts as your own, not the factory one.",
231
- "capability.agent.delete": "Delete an assistant",
232
- "capability.agent.delete.detail": "Removes the definition and says who else points at it first.",
233
- "capability.agent.setModel": "Set an assistant's model",
234
- "capability.agent.setModel.detail": "Changes the assistant's default model, which affects conversations started later.",
235
- "capability.agent.setThinking": "Set an assistant's thinking level",
236
- "capability.agent.setThinking.detail": "Writes the expanded request parameters into the assistant definition.",
237
- "capability.agent.restoreFactory": "Restore an assistant to factory settings",
238
- "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.",
239
- "capability.model.list": "List models",
240
- "capability.model.list.detail": "Factory-managed and custom models with thresholds, thinking presets and availability.",
241
- "capability.model.listImages": "List image models",
242
- "capability.model.listImages.detail": "The models used for image generation, plus which one is the default.",
243
- "capability.model.create": "Create a model",
244
- "capability.model.create.detail": "Adds a model bound to an endpoint; a new one counts as custom right away.",
245
- "capability.model.update": "Edit a model",
246
- "capability.model.update.detail": "Editing a factory model turns it into a custom one so later updates leave it alone.",
247
- "capability.model.delete": "Delete a model",
248
- "capability.model.delete.detail": "Refuses while an assistant still points at it, and fixes the defaults when it goes.",
249
- "capability.model.restoreFactory": "Restore a model to factory settings",
250
- "capability.model.restoreFactory.detail": "Replaces the whole model definition with the factory one in a single step.",
251
- "capability.model.saveImage": "Create or edit an image model",
252
- "capability.model.saveImage.detail": "Binds an image model to an endpoint with its default size and quality.",
253
- "capability.model.deleteImage": "Delete an image model",
254
- "capability.model.deleteImage.detail": "Refuses while it is the default image model.",
255
- "capability.asset.begin": "Start an upload",
256
- "capability.asset.begin.detail": "Declares the size and type of a file; anything over the limit is refused right here.",
257
- "capability.asset.end": "Finish an upload",
258
- "capability.asset.end.detail": "Checks length and digest, then turns the file into something a message can reference.",
259
- "capability.asset.get": "Fetch an asset",
260
- "capability.asset.get.detail": "Returns the stored bytes so any model can replay an image from history; the thumbnail variant currently equals the original.",
261
- "capability.completion.files": "Complete file paths",
262
- "capability.completion.files.detail": "The project's file list behind the `@` menu; says so when it is still reading.",
263
- "capability.handoff.start": "Write a handoff document",
264
- "capability.handoff.start.detail": "Writes the document and, if asked, opens the next conversation; the old one stays complete.",
265
- "capability.handoff.listDocuments": "List handoff documents",
266
- "capability.handoff.listDocuments.detail": "The documents already written in this project, ready to be refined again.",
267
- "capability.search.conversations": "Search conversations by name",
268
- "capability.search.conversations.detail": "Finds old conversations by what they are called, optionally within one project.",
269
- "capability.search.messages": "Search inside conversations",
270
- "capability.search.messages.detail": "Full-text search over what was said, with a snippet of each hit.",
271
100
  };