@sema-agent/client-core 0.110.0 → 0.112.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.
Files changed (243) hide show
  1. package/CHANGELOG.md +244 -0
  2. package/README.md +59 -18
  3. package/dist/abortableSleep.d.ts +7 -0
  4. package/dist/abortableSleep.js +37 -0
  5. package/dist/adapt/arms.js +25 -4
  6. package/dist/adapt/toolCards.d.ts +3 -1
  7. package/dist/adapt/toolCards.js +4 -2
  8. package/dist/adapter/activeRunSelfHeal.d.ts +39 -0
  9. package/dist/adapter/activeRunSelfHeal.js +171 -3
  10. package/dist/adapter/downstream/eventToSdkMessage.js +10 -10
  11. package/dist/adapter/downstream/terminalToSdkResult.d.ts +2 -0
  12. package/dist/adapter/downstream/terminalToSdkResult.js +11 -0
  13. package/dist/adapter/runStream.d.ts +5 -0
  14. package/dist/adapter/runStream.js +15 -3
  15. package/dist/agentSession/engineSessionBackgroundStop.js +2 -2
  16. package/dist/attachmentRoute.d.ts +20 -0
  17. package/dist/attachmentRoute.js +39 -0
  18. package/dist/attachmentsWireCaps.js +1 -1
  19. package/dist/builtinOutputStyles.d.ts +12 -0
  20. package/dist/builtinOutputStyles.js +147 -0
  21. package/dist/checkpointRowVerdict.d.ts +3 -0
  22. package/dist/checkpointRowVerdict.js +14 -1
  23. package/dist/compactionStatus.d.ts +9 -0
  24. package/dist/compactionStatus.js +29 -5
  25. package/dist/consoleCaPin.d.ts +136 -0
  26. package/dist/consoleCaPin.js +827 -0
  27. package/dist/controlRouter.js +2 -1
  28. package/dist/coreValuePorts.d.ts +39 -1
  29. package/dist/coreValuePorts.js +10 -0
  30. package/dist/decideReceipt.d.ts +2 -1
  31. package/dist/deviceRebind.js +3 -3
  32. package/dist/displayUntrusted.d.ts +1 -0
  33. package/dist/displayUntrusted.js +6 -0
  34. package/dist/effectiveFacts.d.ts +9 -0
  35. package/dist/effectiveFacts.js +33 -0
  36. package/dist/engineAddress.d.ts +1 -0
  37. package/dist/engineAddress.js +4 -1
  38. package/dist/engineCredentialRelease.d.ts +54 -0
  39. package/dist/engineCredentialRelease.js +146 -0
  40. package/dist/engineErrorCodes.d.ts +1 -0
  41. package/dist/engineErrorCodes.js +1 -0
  42. package/dist/engineHealthProbeVerdict.d.ts +24 -0
  43. package/dist/engineHealthProbeVerdict.js +123 -0
  44. package/dist/engineNoticeCodes.js +5 -7
  45. package/dist/engineRepoint.d.ts +12 -5
  46. package/dist/engineRepoint.js +44 -19
  47. package/dist/engineRowRef.d.ts +3 -0
  48. package/dist/engineRowRef.js +11 -1
  49. package/dist/engineSwapCrossing.d.ts +57 -0
  50. package/dist/engineSwapCrossing.js +297 -0
  51. package/dist/engineUnavailable.d.ts +45 -0
  52. package/dist/engineUnavailable.js +496 -0
  53. package/dist/engineUrl.js +4 -2
  54. package/dist/eventLeg.js +3 -3
  55. package/dist/gateFailureCodes.js +2 -2
  56. package/dist/generated/sdkFactTables.d.ts +2 -1
  57. package/dist/generated/sdkFactTables.js +14 -0
  58. package/dist/generated/settingsSchemaFns.d.ts +1 -0
  59. package/dist/generated/settingsSchemaFns.js +3 -0
  60. package/dist/generated/settingsSchemaHooksClassifier.js +38 -9
  61. package/dist/generated/settingsSchemaTables.d.ts +56 -0
  62. package/dist/generated/settingsSchemaTables.js +19 -0
  63. package/dist/generated/settingsSchemaTypes.d.ts +23 -13
  64. package/dist/generated/settingsSchemaUrlShape.d.ts +1 -0
  65. package/dist/generated/settingsSchemaUrlShape.js +17 -0
  66. package/dist/hitl/approvalDelivery.d.ts +1 -0
  67. package/dist/hitl/approvalDelivery.js +1 -1
  68. package/dist/hitl/approvalResolution.d.ts +1 -1
  69. package/dist/hitl/approvalResolution.js +2 -1
  70. package/dist/hitl/askGateWire.js +5 -6
  71. package/dist/hitl/decisionRefusal.d.ts +6 -0
  72. package/dist/hitl/decisionRefusal.js +19 -10
  73. package/dist/hitl/decisionRefusalCarrier.d.ts +3 -0
  74. package/dist/hitl/decisionRefusalCarrier.js +348 -0
  75. package/dist/hitl/decisionSend.d.ts +7 -0
  76. package/dist/hitl/decisionSend.js +34 -12
  77. package/dist/hitl/editedApprovalAcceptance.js +1 -1
  78. package/dist/hitl/elicitationRefusal.d.ts +4 -0
  79. package/dist/hitl/elicitationRefusal.js +23 -0
  80. package/dist/hitl/frameRouter.d.ts +2 -2
  81. package/dist/hitl/frameRouter.js +8 -15
  82. package/dist/hitl/gateIdentity.d.ts +5 -0
  83. package/dist/hitl/gateIdentity.js +23 -0
  84. package/dist/hitl/hitlBridge.d.ts +6 -0
  85. package/dist/hitl/hitlBridge.js +10 -4
  86. package/dist/hitl/hitlHostSurface.d.ts +2 -1
  87. package/dist/hitl/hitlHostSurface.js +7 -2
  88. package/dist/hitl/localAllowRedemption.d.ts +70 -0
  89. package/dist/hitl/localAllowRedemption.js +276 -0
  90. package/dist/hitl/parkOwnership.js +2 -1
  91. package/dist/hitl/parkResolver.js +14 -4
  92. package/dist/hitl/persistedRulesWire.d.ts +16 -0
  93. package/dist/hitl/persistedRulesWire.js +70 -0
  94. package/dist/hitl/planReviewWire.d.ts +3 -0
  95. package/dist/hitl/planReviewWire.js +23 -6
  96. package/dist/hitl/policyDenyCause.d.ts +1 -1
  97. package/dist/hitl/policyDenyCause.js +1 -1
  98. package/dist/hitl/resumeRunningCard.d.ts +1 -0
  99. package/dist/hitl/resumeRunningCard.js +1 -0
  100. package/dist/hitl/screenCardCarriers.d.ts +15 -0
  101. package/dist/hitl/screenCardCarriers.js +41 -0
  102. package/dist/hitl/screenDecisionCards.d.ts +98 -0
  103. package/dist/hitl/screenDecisionCards.js +363 -0
  104. package/dist/hitl/sessionPolicyWire.js +2 -2
  105. package/dist/hitl/standingRows.d.ts +6 -2
  106. package/dist/hitl/standingRows.js +27 -2
  107. package/dist/hitl/toolApprovalWire.d.ts +30 -8
  108. package/dist/hitl/toolApprovalWire.js +264 -121
  109. package/dist/hooksReaderGenerations.js +1 -1
  110. package/dist/hooksWireCaps.js +3 -3
  111. package/dist/hostSettingNoticeArm.d.ts +3 -0
  112. package/dist/hostSettingNoticeArm.js +12 -0
  113. package/dist/hostTurnSettings.d.ts +3 -0
  114. package/dist/hostTurnSettings.js +38 -5
  115. package/dist/humanTurnRead.js +11 -1
  116. package/dist/i18n/messages.en.d.ts +292 -0
  117. package/dist/i18n/messages.en.js +298 -7
  118. package/dist/i18n/messages.zh.js +316 -6
  119. package/dist/i18n/translate.d.ts +3 -0
  120. package/dist/i18n/translate.js +78 -10
  121. package/dist/i18n/zh.d.ts +1 -0
  122. package/dist/i18n/zh.js +1 -0
  123. package/dist/index.d.ts +71 -20
  124. package/dist/index.js +44 -13
  125. package/dist/interactiveHalt.js +2 -1
  126. package/dist/interactiveInterrupt.js +20 -2
  127. package/dist/liveModelCatalog.d.ts +4 -0
  128. package/dist/liveModelCatalog.js +12 -3
  129. package/dist/localConfig/documents.d.ts +61 -0
  130. package/dist/localConfig/documents.js +51 -0
  131. package/dist/localConfig/kernel.d.ts +149 -0
  132. package/dist/localConfig/kernel.js +597 -0
  133. package/dist/localConfig/mcp/edit.d.ts +161 -0
  134. package/dist/localConfig/mcp/edit.js +846 -0
  135. package/dist/localConfig/mcp/servers.d.ts +165 -0
  136. package/dist/localConfig/mcp/servers.js +776 -0
  137. package/dist/localConfig/mcp/views.d.ts +170 -0
  138. package/dist/localConfig/mcp/views.js +429 -0
  139. package/dist/localConfig/modelPool.d.ts +262 -0
  140. package/dist/localConfig/modelPool.js +1489 -0
  141. package/dist/localConfig/modelPoolWords.d.ts +13 -0
  142. package/dist/localConfig/modelPoolWords.js +20 -0
  143. package/dist/localConfig/receiptShape.d.ts +7 -0
  144. package/dist/localConfig/receiptShape.js +135 -0
  145. package/dist/localConfig/settingsWrite.d.ts +127 -0
  146. package/dist/localConfig/settingsWrite.js +237 -0
  147. package/dist/localConfig/skills.d.ts +124 -0
  148. package/dist/localConfig/skills.js +397 -0
  149. package/dist/localConfig/skillsWords.d.ts +10 -0
  150. package/dist/localConfig/skillsWords.js +5 -0
  151. package/dist/localEngineSeatReading.d.ts +2 -2
  152. package/dist/localEngineSeatReading.js +5 -3
  153. package/dist/localEngineSpawn.d.ts +0 -7
  154. package/dist/localEngineSpawn.js +0 -92
  155. package/dist/localEngineStep.d.ts +2 -2
  156. package/dist/localEngineStep.js +2 -0
  157. package/dist/mcpProbeWire.js +2 -1
  158. package/dist/mcpReconnect.js +3 -3
  159. package/dist/mcpWireCaps.js +1 -1
  160. package/dist/memoryVerbsWire.js +3 -2
  161. package/dist/model/engineModelWords.d.ts +3 -0
  162. package/dist/model/engineModelWords.js +13 -0
  163. package/dist/model/onboardJudgement.d.ts +14 -4
  164. package/dist/model/onboardJudgement.js +91 -139
  165. package/dist/model/subagentModelWord.d.ts +21 -2
  166. package/dist/model/subagentModelWord.js +100 -29
  167. package/dist/modelCapabilityProbe.js +3 -40
  168. package/dist/modelConfigGapNotice.d.ts +20 -0
  169. package/dist/modelConfigGapNotice.js +102 -0
  170. package/dist/modsKernelIdentity.js +2 -47
  171. package/dist/notifications.d.ts +19 -0
  172. package/dist/notifications.js +114 -12
  173. package/dist/ownKey.d.ts +7 -0
  174. package/dist/ownKey.js +71 -8
  175. package/dist/pendingUserRow.d.ts +4 -0
  176. package/dist/pendingUserRow.js +16 -0
  177. package/dist/permissionsDeclaration.d.ts +3 -1
  178. package/dist/permissionsDeclaration.js +33 -9
  179. package/dist/planReviewCardFacts.d.ts +3 -0
  180. package/dist/planReviewCardFacts.js +52 -2
  181. package/dist/pluginHooksWire.d.ts +9 -1
  182. package/dist/pluginHooksWire.js +40 -6
  183. package/dist/printToolResultFrame.js +4 -2
  184. package/dist/promptBlockedCopy.js +12 -7
  185. package/dist/promptSuggestionBatch.d.ts +7 -0
  186. package/dist/promptSuggestionBatch.js +9 -0
  187. package/dist/promptSuggestionsTail.d.ts +39 -0
  188. package/dist/promptSuggestionsTail.js +116 -0
  189. package/dist/request/taskRequest.js +10 -6
  190. package/dist/requestCoordinate.d.ts +1 -0
  191. package/dist/requestCoordinate.js +13 -0
  192. package/dist/resumeRefusalCopy.d.ts +3 -1
  193. package/dist/resumeRefusalCopy.js +12 -4
  194. package/dist/rewindArchiveReading.js +4 -4
  195. package/dist/runCancelContext.d.ts +2 -1
  196. package/dist/runCancelContext.js +1 -0
  197. package/dist/runLedgerSnapshot.js +3 -3
  198. package/dist/runPermissionModeSwitch.js +3 -4
  199. package/dist/scenarioRefusal.js +11 -13
  200. package/dist/scenarioSkills.js +11 -6
  201. package/dist/seam.d.ts +16 -2
  202. package/dist/seam.js +10 -0
  203. package/dist/seatContract.d.ts +259 -9
  204. package/dist/seatContract.js +444 -15
  205. package/dist/sessionCostReading.d.ts +70 -0
  206. package/dist/sessionCostReading.js +150 -0
  207. package/dist/sessionHooksRoster.d.ts +4 -0
  208. package/dist/sessionHooksRoster.js +158 -0
  209. package/dist/sessionIdSegment.d.ts +1 -0
  210. package/dist/sessionIdSegment.js +4 -1
  211. package/dist/sessionMemoryErase.js +2 -1
  212. package/dist/sessionMemoryStatus.js +2 -2
  213. package/dist/sessionReadRedaction.d.ts +7 -0
  214. package/dist/sessionReadRedaction.js +26 -0
  215. package/dist/sessionSyncFileHistory.js +8 -9
  216. package/dist/settingsHooksSalvage.js +2 -1
  217. package/dist/sha256Bytes.d.ts +1 -0
  218. package/dist/sha256Bytes.js +46 -0
  219. package/dist/skillOverrideChain.d.ts +83 -0
  220. package/dist/skillOverrideChain.js +378 -0
  221. package/dist/skillsWireCaps.d.ts +3 -0
  222. package/dist/skillsWireCaps.js +16 -1
  223. package/dist/sseIdleTriage.js +2 -1
  224. package/dist/storeDurabilityWord.d.ts +15 -0
  225. package/dist/storeDurabilityWord.js +18 -0
  226. package/dist/storePostureCapability.d.ts +7 -3
  227. package/dist/storePostureCapability.js +69 -39
  228. package/dist/subagent/engineSubagentResume.js +2 -2
  229. package/dist/subagent/engineSubagentTail.js +2 -1
  230. package/dist/subagentContentStore.d.ts +11 -0
  231. package/dist/subagentContentStore.js +28 -2
  232. package/dist/toolResult.d.ts +1 -0
  233. package/dist/toolResult.js +2 -0
  234. package/dist/turnFailurePresentation.js +4 -10
  235. package/dist/userAttachmentEnvelope.d.ts +2 -1
  236. package/dist/userAttachmentEnvelope.js +10 -0
  237. package/dist/wireErrorTriage.js +2 -1
  238. package/dist/wireFailureShape.d.ts +4 -0
  239. package/dist/wireFailureShape.js +141 -19
  240. package/dist/wireRefusalCopy.d.ts +6 -5
  241. package/dist/wireRefusalCopy.js +49 -92
  242. package/docs/INTEGRATION-CLIENTS.md +2718 -17
  243. package/package.json +7 -3
@@ -115,6 +115,13 @@ const ZH = {
115
115
  'model.subagent.chainUnbound': '子代理模型 {word} 在这台引擎上没有绑定(它和比它低的档位都没绑模型)—— 子代理将沿用父代理的模型。',
116
116
  'model.subagent.bindingNotInCatalog': '子代理模型 {word} 绑定的模型不在这台引擎的模型目录里 —— 子代理将沿用父代理的模型。',
117
117
  'model.subagent.ambiguous': '子代理模型 {word} 同时对上了几个只差大小写的模型名 —— 请照原样拼写;子代理将沿用父代理的模型。',
118
+ 'model.subagent.call.ambiguous': '这次调用用不了子代理模型 {word}:它同时对上了几个只差大小写的模型名 —— 请照原样拼写。',
119
+ 'model.subagent.call.tiersInert': '这次调用用不了子代理模型 {word}:它是档位词,但这台引擎没有配置模型档位。',
120
+ 'model.subagent.call.chainUnbound': '这次调用用不了子代理模型 {word}:它对应档位 {tier},这台引擎上这一档没有绑定模型(比它低的档位也都没有)。',
121
+ 'model.subagent.call.bindingNotInCatalog': '这次调用用不了子代理模型 {word}:它的档位 {tier} 绑定的模型不在这台引擎的模型目录里。',
122
+ 'model.subagent.refused.notListed': '子代理模型 {word} 在这台引擎上既不是模型名,也不是档位词或模型 id —— 这个代理不随请求发出(带着它的请求引擎一律拒收);请改这个代理的模型,或设成 `inherit`。',
123
+ 'model.subagent.refused.notServed': '子代理模型 {word} 在这台引擎上背后没有模型 —— 这个代理不随请求发出(带着它的请求引擎一律拒收);请改这个代理的模型,或设成 `inherit`。',
124
+ 'model.subagent.refused.disabled': '子代理模型 {word} 在这台引擎上已停用 —— 这个代理不随请求发出(带着它的请求引擎一律拒收);请改这个代理的模型,或设成 `inherit`。',
118
125
  'model.catalogDefault.refused.named': '不点名模型的任务会被拒:引擎从它的模型配置里解析不出缺省模型(设置里的缺省是 {name}) · 设一个引擎跑得了的缺省模型,或添加 / 修好一个',
119
126
  'model.catalogDefault.refused.select': '不点名模型的任务会被拒:引擎从它的模型配置里解析不出缺省模型(设置里的缺省是挑选条件) · 改挑选条件,或添加 / 修好一个引擎跑得了的模型',
120
127
  'session.sync.pushRowBitsWriterSide': '会话已推送 · 它在目的端是只读镜像,标题与置顶由写入它的那一端持有,这一次没有在目的端更改',
@@ -147,8 +154,11 @@ const ZH = {
147
154
  'session.mcpReconnect.undeclared': '这次运行没有声明任何 MCP 服务器,所以没有可重连的对象({server} 不属于这次运行){why}。',
148
155
  'session.mcpReconnect.unsettled': 'MCP 重连在本次请求愿意等待的时间内没有落定,所以还没有结果:重连没有被取消,可能仍在进行。再次重连这台服务器前,请先确认它的状态——拨号落定之后再发一次请求,会先关闭连接、再重新拨号。',
149
156
  'session.mcpReconnect.reasonTail': ' —— {reason}',
157
+ 'session.mcpReconnect.transaction': '重连会先关闭当前连接,再重新拨号。在运行正常的服务器上,这是一次整体操作,不是刷新:重拨失败会让服务器保持断开,并把它的工具从模型那里撤走,直到之后某次重拨成功。',
150
158
  'session.mcpFailure.reauthorizeSuffix': '(需要重新授权)',
151
159
  'session.mcpFailure.serverDownSuffix': '(服务器不可用)',
160
+ 'mcp.elicitation.refused.named': 'MCP 服务器 {server} 请求通过表单填写信息,此处无法呈现表单,已拒绝该请求。',
161
+ 'mcp.elicitation.refused.unnamed': '有 MCP 服务器请求通过表单填写信息,此处无法呈现表单,已拒绝该请求。',
152
162
  'config.cloudLogin.accessDenied': '登录被拒绝了。',
153
163
  'config.cloudLogin.expiredToken': '登录码在批准之前过期了 —— 请重新开始。',
154
164
  'config.cloudLogin.invalidGrant': 'Cloud 登录已无法续期 —— 请重新登录。',
@@ -201,6 +211,20 @@ const ZH = {
201
211
  'onboard.plan.envNotObject': '设置文件里的 "env" 不是对象 —— 不改写它。',
202
212
  'onboard.plan.envCatalogPresent': '引擎正按环境变量供模型 "{model}",目录里没有启用的模型;写下第一条目录模型会替换掉环境里的那几只。请先把它们放进目录。',
203
213
  'onboard.input.keyInFields': '模型 ID / 根地址里含着 API 钥匙 —— 请检查这几栏。',
214
+ 'model.pool.add.duplicate': '「{model}」在这一批里以同一个地址出现了两次 —— 只加一次。',
215
+ 'model.pool.add.probeFailed': '供应商拒绝了「{model}」(钥匙、模型名或应答格式不对)—— 改好后再核对一次。',
216
+ 'model.pool.add.probeUnverified': '「{model}」还没跟供应商核对过(或核对没做完)—— 请再核对一次,或按「未验证」保存。',
217
+ 'model.pool.add.pinMoved': '保存「{name}」时模型列表被改了(它的名字或存的钥匙变了)—— 什么都没加。请再试一次。',
218
+ 'model.pool.notFound': '模型列表里没有叫「{name}」的模型。',
219
+ 'model.pool.importEnv.notYet': '引擎正在用环境设置里的「{model}」。本应用暂时还不能把环境模型复制进模型列表 —— 请先手动把它们加进来(地址和钥匙),再加别的。',
220
+ 'model.pool.tier.badGroup': '档位组名要以字母或数字开头,只能用字母、数字、「.」「_」「-」。',
221
+ 'model.pool.tier.noGroup': '没有叫「{group}」的档位组。',
222
+ 'model.pool.tier.groupExists': '已经有叫「{group}」的档位组了。',
223
+ 'model.pool.channel.badPick': '在本应用从那个来源读到的内容里找不到选中的档案或模型。',
224
+ 'model.pool.discover.status': '拉模型列表的请求答了 HTTP {status}。',
225
+ 'model.pool.discover.notList': '端点没有答一份模型列表。',
226
+ 'model.pool.discover.timeout': '拉模型列表的请求超时了。',
227
+ 'model.pool.discover.unreachable': '连不上端点:{cause}',
204
228
  'onboard.refusal.input': '模型接入信息不全或形状不对 —— 什么都没保存。',
205
229
  'onboard.refusal.probeFailed': '供应商没有接受这套配置 —— 什么都没保存。',
206
230
  'onboard.refusal.probeUnverified': '查不了供应商,所以什么都没保存 —— 请重试,或按「未验证」保存。',
@@ -221,9 +245,9 @@ const ZH = {
221
245
  'config.mcp.transportsNone': '无',
222
246
  'config.mcp.transportInvalid': 'MCP 服务器 {name}{where} 没有启动:它的传输设置不可用 —— {path} {problem}。请修正这台服务器的这项设置(或删掉这台服务器);其他 MCP 服务器不受影响。',
223
247
  'config.mcp.transportDegraded': 'MCP 服务器 {name}{where} 已启动,但它的部分传输设置不能照原样使用、被略去了:{lost}。其余设置照常生效;请修正上面点名的设置,让它们也生效。',
224
- 'config.mcp.toolAxesInvalid': 'MCP 服务器 {name}{where} 没有启动:它的 toolAxes 设置不合法 —— {problem}。请修正这台服务器的 toolAxes(或删掉它);其他 MCP 服务器不受影响。',
248
+ 'config.mcp.toolAxesInvalid': 'MCP 服务器 {name}{where} 曾被启动去读取它的工具列表,随后被丢弃:它的 toolAxes 设置不合法 —— {problem}。请修正这台服务器的 toolAxes(或删掉它);其他 MCP 服务器不受影响。',
225
249
  'config.mcp.toolAxesFallbackProblem': '这份声明不是一组合法的按工具安全设置',
226
- 'config.mcp.toolFacesInvalid': 'MCP 服务器 {name}{where} 没有启动:它的 toolFaces 设置不合法 —— {problem}。请修正这台服务器的 toolFaces(或删掉它);其他 MCP 服务器不受影响。',
250
+ 'config.mcp.toolFacesInvalid': 'MCP 服务器 {name}{where} 曾被启动去读取它的工具列表,随后被丢弃:它的 toolFaces 设置不合法 —— {problem}。请修正这台服务器的 toolFaces(或删掉它);其他 MCP 服务器不受影响。',
227
251
  'config.mcp.toolFacesFallbackProblem': '这份声明不是一组合法的按工具展示与审批设置',
228
252
  'config.mcp.toolFacesUnreadable': '这项设置读不出来(它上面的取值器或代理陷阱抛了错)',
229
253
  'config.mcp.elicitationInvalid': 'MCP 服务器 {name}{where} 没有启动:它的 elicitation 设置必须是 true 或 false。请修正这台服务器的 elicitation(或删掉它);其他 MCP 服务器不受影响。',
@@ -233,7 +257,7 @@ const ZH = {
233
257
  'config.mcp.transportTypeUnsupported': '这种传输类别请求面承载不了(只支持 stdio 与 http)',
234
258
  'config.mcp.transportIdentityBothSetProblem': '同时设置了 principalHeader 与 assertionHeader,而这两项指的是同一个身份头 —— 只保留其中一项',
235
259
  'config.mcp.cloudElicitationInvalid': '云配置:这些 MCP 服务器条目被略过,因为它们的 elicitation 设置不是 true 或 false —— 请修正或删掉 elicitation 条目:{who}',
236
- 'config.mcp.allowToolsInvalid': 'MCP 服务器 {name}{where} 没有启动:它的 allowTools 设置不能使用 —— {problem}。请修正这台服务器的 allowTools 条目(工具名字符串的列表);其他 MCP 服务器不受影响。',
260
+ 'config.mcp.allowToolsInvalid': 'MCP 服务器 {name}{where} 曾被启动去读取它的工具列表,随后被丢弃:它的 allowTools 设置不能使用 —— {problem}。请修正这台服务器的 allowTools 条目(工具名字符串的列表);其他 MCP 服务器不受影响。',
237
261
  'config.mcp.allowToolsNotArray': '{path} 必须是字符串数组(实际是 {got})',
238
262
  'config.mcp.allowToolsElementNotString': '{path} 必须是字符串(实际是 {got})',
239
263
  'config.mcp.allowToolsHole': '{path} 缺失:列表中不允许有空缺,每个位置都必须是字符串',
@@ -281,6 +305,7 @@ const ZH = {
281
305
  'approval.rowUnresumable.askNotSurfaced': '这条待决行(任务 {taskId})这台引擎续不了,所以没有呈成可作答的卡:{sentence}',
282
306
  'approval.park.stillParked': '{gate} 这道门没能作答:{reason} —— 这一跑仍停在这条审批上。',
283
307
  'approval.park.refusedNotResumable': '{gate} 这道门没能作答:{reason} —— 这台引擎目前续不了这条审批;若这一跑仍停着,请取消它。',
308
+ 'approval.park.newerWorker': '{gate} 这道门没能作答:{reason} —— 这一跑仍停在这条审批上,但{wayOut}。',
284
309
  'approval.park.resume.card': '{gate} 这道门没能作答:{reason} —— 这一跑仍停在这条审批上:卡再次出现时在卡上决,或取消这一跑。',
285
310
  'approval.park.resume.speak': '{gate} 这道门没能作答:{reason} —— 这一跑仍停在这条审批上:发一句话把这张卡重新打开,再在卡上决,或取消这一跑。',
286
311
  'approval.park.argsFromModelCall': '这条待决审批的记录里没有将执行的工具入参,下面显示的是对话里模型的原始调用 —— 若它在那之后被改写过(例如被钩子),实际执行的会与所见不同。这张卡不接受编辑后批准:所见入参不是将执行的那一份',
@@ -288,13 +313,17 @@ const ZH = {
288
313
  'approval.policyDeny.denyRule': '这次工具调用被权限设置里的拒绝规则拒绝了。{tail}',
289
314
  'approval.policyDeny.dontAsk': '这次工具调用被拒绝了:本会话不再询问审批,凡需要审批的调用一律拒绝。{tail}',
290
315
  'approval.policyDeny.engineFloor': '这次工具调用被引擎侧的保护规则拒绝了,权限设置无法覆盖。{tail}',
316
+ 'approval.policyDeny.hook': '这次工具调用被一只 PermissionRequest 钩子拒绝了。该操作没有执行。不要声称它已成功,也不要原样重试 —— 请向用户说明被拦下的是什么,或建议别的做法。',
291
317
  'approval.policyDeny.tail': '该操作没有执行。不要声称它已成功,也不要在本会话里重试 —— 请向用户说明这一限制,或建议别的做法。',
292
318
  'approval.decision.grantChanged': '引擎拒收了这次批准:它绑定的技能授予在卡呈出之后已经变了 · 什么都没有决定,这一请求仍在等待,但再批一次会以同样的理由被拒 · 请拒绝这一请求,让模型重新激活那个技能',
293
319
  'approval.decision.answerInvalid': '引擎拒收了这次回答本身:它与所问的问题对不上 · 什么都没有决定,这一问仍在等待 · 请改正回答后重新发送',
294
- 'approval.editRefusal.line': '这次批准没有发出:这条请求在此处看不到工具入参,所以收不了改写后的批准。原卡照旧在等你决断——请按原样批准或拒绝。',
320
+ 'approval.editRefusal.stem': '这条请求在此处看不到工具入参,所以收不了改写后的批准',
321
+ 'approval.editRefusal.line': '这次批准没有发出:{stem}。原卡照旧在等你决断——请按原样批准或拒绝。',
322
+ 'approval.editRefusal.parkReason': '这张卡回了一个改写后的批准,但{stem}——什么都没有发出(待决记录里的入参缺失,或因为太大在那里只留下了一个标明大小的占位);请按原样批准或拒绝',
295
323
  'approval.decision.settledElsewhereContrary.deniedFirst': '这一请求已在别处被答复为拒绝,你的批准没有生效。',
296
324
  'approval.decision.settledElsewhereContrary.approvedFirst': '这一请求已在别处被答复为批准,你的拒绝没有生效。',
297
325
  'approval.decision.unconfirmedAfterRetry': '不知道你的答复有没有生效:之前那一发没有得到确认,重发时这一请求已不在等待 · 动手之前先看任务当前的状态',
326
+ 'approval.decideAck.unconfirmed': '不知道你的答复有没有生效 · 再答之前先看这一请求的当前状态',
298
327
  'notice.decide.rowUnrevivable': '引擎已经无法恢复这张审批卡,批准和拒绝都不会生效 · 这张卡只能在服务端清理 —— 请等待清理完成,或联系运维这台引擎的人',
299
328
  'approval.askPark.autoReopenBlocked.policyInteractive': '引擎的准入策略拒绝续跑这一停驻步骤(run {run}),所以 sema 不会自己把它的卡放回屏幕。请换成这台部署允许的权限模式,或联系部署的运维方,然后发一条消息把卡带回来。',
300
329
  'approval.askPark.autoReopenBlocked.policyPrint': '引擎的准入策略拒绝续跑这一停驻步骤(run {run}),所以 sema 不会自己把它的卡放回屏幕。请换成这台部署允许的权限模式,或联系部署的运维方,然后发一条消息把卡带回来;或者停掉这条 run({cancel})。',
@@ -419,6 +448,9 @@ const ZH = {
419
448
  'resume.refusal.park.printHolds': '{head}{configMayReturn}parked 的那条 run 仍占着这个会话({code}):请取消它({cancel}),再把这项工作作为新任务重新提交。{blocked}',
420
449
  'resume.refusal.park.interactiveEnded': '{head}引擎已结束那条 parked 的 run,所以这段对话空出来了:请把这项工作作为新消息重新发一次。',
421
450
  'resume.refusal.park.interactiveBusy': '{head}{configMayReturn}parked 的那条 run 会一直占着这段对话,直到它被取消。',
451
+ 'resume.refusal.park.whyNewerEngine': '它是由比这一版更新的引擎版本 parked 的',
452
+ 'resume.refusal.park.interactiveNewerWorker': '{head}{configMayReturn}parked 的那条 run 仍占着这段对话,但{wayOut}。',
453
+ 'resume.refusal.park.printNewerWorker': '{head}{configMayReturn}parked 的那条 run 仍占着这个会话({code}),但{wayOut}({cancel})。{blocked}',
422
454
  'resume.refusal.park.blockedPrint': 'sema 不会自己把 run {run} 的卡放回屏幕:这一版引擎拒绝续跑它。请取消这条 run({cancel}),再把这项工作作为新任务重新提交。',
423
455
  'resume.refusal.park.blockedInteractive': 'sema 不会自己把 run {run} 的卡放回屏幕:这一版引擎拒绝续跑它。要空出这段对话,请发一条消息 —— sema 随后会提出取消那条 run(若卡反而回来了,先作答),之后你就可以把这项工作作为新消息重新发一次。',
424
456
  'session.selfHeal.wayOut.interactive': '运行 /clear,在全新会话里继续工作',
@@ -460,6 +492,9 @@ const ZH = {
460
492
  'session.selfHeal.injected.notDelivered': '{lead}没有送达:这个会话还被较早的一轮回复占着{id},而且没有可以回答来放行的打开的卡{noView}。sema 没有重试,所以模型没有看到它。',
461
493
  'session.selfHeal.injected.redundant': '{lead}没有转交:它说的那一轮回复{id}在那次决定之后已经自己接着往下走了,它没有什么可补充的。',
462
494
  'session.selfHeal.injected.deferred': '{lead}正在等待:这个会话正被较早的一轮回复{id}占着,sema 保留了这条消息,等那一轮回复结束或暂停后再作为一条新消息发送。',
495
+ 'session.selfHeal.injected.resendWithheldLeftConfirmed': '{lead}没有送达:较早的那一轮回复{id}已经放开了这条消息要发往的那个对话,但 sema 还没来得及发送,屏幕就切到了另一个对话;sema 不会把它发进另一个对话 —— 模型没有看到它。',
496
+ 'session.selfHeal.injected.resendWithheldUnconfirmed': '{lead}没有送达:sema 无法确认屏幕上仍是这条消息要发往的那个对话,所以没有发送 —— 模型没有看到它。',
497
+ 'session.selfHeal.injected.resendWithheldLeftInferred': '{lead}没有送达:较早的那一轮回复{id}在这条消息要发往的那个对话里现在报告为已结束,但 sema 还没来得及发送,屏幕就切到了另一个对话;sema 不会把它发进另一个对话 —— 模型没有看到它。',
463
498
  'session.selfHeal.decisionInFlight': '上一个 turn 处于 parked 状态,{parkedOn},而你对那张卡的回答还在送往引擎的路上,所以 sema 没有再次显示那张卡 —— 再回答一次会发出第二个决断。它没有取消这次 run。你的消息没有发出;请稍等片刻,等引擎应用了那个决断之后再发一次。',
464
499
  'session.selfHeal.parkedOn.ask': '在等你的决断(run {taskId})',
465
500
  'session.selfHeal.parkedOn.plan': '停在一次计划审阅上(run {taskId})',
@@ -499,6 +534,17 @@ const ZH = {
499
534
  'session.selfHeal.row.attach': '{disclosure}你的消息没有发出;等那次 run 结束后,请再发一次。',
500
535
  'session.selfHeal.row.cancelled.confirmed': '你选择了取消 run {taskId}。引擎确认它不再占着这个会话,所以 sema 现在就发送你的消息。',
501
536
  'session.selfHeal.row.cancelled.reported': '你选择了取消 run {taskId}。引擎现在报告那次 run 已结束,所以 sema 现在就发送你的消息;如果那次 run 还没完全放开这个会话,你可能得再发一次。',
537
+ 'session.selfHeal.row.resendWithheldLeft.confirmed': '你的消息没有发出去:run {taskId} 已经不再占着你输入这条消息的那个对话,但 sema 还没来得及重发,屏幕就切到了另一个对话;sema 不会把消息发进另一个对话。如果还需要,请切回那个对话再发一次。',
538
+ 'session.selfHeal.row.resendWithheldLeft.reported': '你的消息没有发出去:引擎现在报告 run {taskId} 在你输入这条消息的那个对话里已结束,但 sema 还没来得及重发,屏幕就切到了另一个对话;sema 不会把消息发进另一个对话。如果还需要,请切回那个对话再发一次(如果那次 run 还没完全放开那个对话,你可能得再发一次)。',
539
+ 'session.selfHeal.row.resendWithheldUnconfirmed': '你的消息没有发出去:sema 无法确认屏幕上仍是你输入这条消息的那个对话,所以没有重发 —— 把消息发进别的对话比不发更糟。如果这仍是那个对话,请再发一次。',
540
+ 'session.selfHeal.stopLeft.untouched': 'sema 没有动 run {taskId}:sema 检查那次 run 时屏幕切到了另一个对话,而 sema 不会替一个已经不在屏幕上的对话结束 run。那次 run 可能仍占着它所属的那个对话 —— 请切回那个对话,然后{endRun}。',
541
+ 'session.selfHeal.stopLeft.waiting.certain': 'run {taskId} 正在它所属的那个对话里等你做决定,而 sema 不会结束一个在等你回答的 run。屏幕此后已切到另一个对话 —— 请切回那个对话去回答。',
542
+ 'session.selfHeal.stopLeft.waiting.uncertain': 'run {taskId} 可能正在它所属的那个对话里等你做决定 —— sema 无法确认它没有在等 —— 所以 sema 没有动它。屏幕此后已切到另一个对话 —— 请切回那个对话去回答;如果那里没有在等的决定,{endRun}。',
543
+ 'session.selfHeal.stopLeft.ended.confirmed': 'run {taskId} 已结束 —— 引擎确认它不再占着它所属的那个对话。屏幕此后已切到另一个对话 —— 请切回那个对话再发一次你的消息。',
544
+ 'session.selfHeal.stopLeft.ended.reported': 'run {taskId} 已结束 —— 引擎报告它已完成。屏幕此后已切到另一个对话 —— 请切回那个对话再发一次你的消息。',
545
+ 'session.selfHeal.stopLeft.nothingToEnd': 'run {taskId} 早已结束,没有可结束的东西。屏幕此后已切到另一个对话 —— 请切回那个对话再发一次你的消息。',
546
+ 'session.selfHeal.stopLeft.refused': 'sema 没能结束 run {taskId}:引擎拒绝了({detail}),所以什么都没有结束。屏幕此后已切到另一个对话 —— 请切回那次 run 所属的对话再试一次:{endRun}。',
547
+ 'session.selfHeal.stopLeft.notConfirmed': 'sema 无法确认 run {taskId} 已经放开它所属的那个对话,而屏幕此后已切到另一个对话。请切回那个对话去确认;要结束它,{endRun}。',
502
548
  'session.selfHeal.row.cancelTimeout.aborted': 'sema 请引擎取消 run {taskId},而你在它还在确认的时候中断了(已过 {waited})。取消是异步的,所以那次 run 可能仍在收尾,仍占着这个会话。你的消息没有发出;请稍等片刻再发一次,或者{wayOut}。',
503
549
  'session.selfHeal.row.cancelTimeout.unread': 'sema 请引擎取消 run {taskId},但在 {waited} 内读不回那次 run 的状态,所以确认不了会话是否已被释放。你的消息没有发出;请稍等片刻再发一次(如果那次 run 真的没了,它就会直接运行),或者{wayOut}。',
504
550
  'session.selfHeal.row.cancelTimeout.held': 'sema 请引擎取消 run {taskId},但 {waited} 之后那次 run 仍占着这个会话 —— 取消是异步的,它可能仍在收尾。你的消息没有发出;请稍等片刻再发一次,或者{wayOut}。',
@@ -659,6 +705,21 @@ const ZH = {
659
705
  'session.hostSettings.styleSafeMode': '安全模式已开启,设置里的输出风格不套用。',
660
706
  'session.hostSettings.styleOversize': '你的输出风格这一次请求没有套用:加上内置的产品背景说明后超过了 {limit} 个字符的上限。请缩短风格正文后再用。',
661
707
  'session.hostSettings.styleUnreadable': '输出风格的正文读不成文本,这一次请求不套用它。',
708
+ 'session.hostSettings.allowKept.managed.inProgress.one': '这一次运行有 {held} 条 permissions.allow 规则没有发给引擎,原因是你账号的托管策略还没有收到(sema 会继续拉取;收到后 allow 规则就会生效)。请等它收到后再运行一次(deny 与 ask 规则,以及用 --allowedTools 给的规则,仍然照常发出)。',
709
+ 'session.hostSettings.allowKept.managed.inProgress.other': '这一次运行有 {held} 条 permissions.allow 规则没有发给引擎,原因是你账号的托管策略还没有收到(sema 会继续拉取;收到后 allow 规则就会生效)。请等它收到后再运行一次(deny 与 ask 规则,以及用 --allowedTools 给的规则,仍然照常发出)。',
710
+ 'session.hostSettings.allowKept.managed.failed.one': '这一次运行有 {held} 条 permissions.allow 规则没有发给引擎,原因是你账号的托管策略还没有收到(这一次运行不会再拉取;下一次运行会重试)。请再运行一次以重新拉取(deny 与 ask 规则,以及用 --allowedTools 给的规则,仍然照常发出)。',
711
+ 'session.hostSettings.allowKept.managed.failed.other': '这一次运行有 {held} 条 permissions.allow 规则没有发给引擎,原因是你账号的托管策略还没有收到(这一次运行不会再拉取;下一次运行会重试)。请再运行一次以重新拉取(deny 与 ask 规则,以及用 --allowedTools 给的规则,仍然照常发出)。',
712
+ 'session.hostSettings.allowKept.managed.unknown.one': '这一次运行有 {held} 条 permissions.allow 规则没有发给引擎,原因是你账号的托管策略还没有收到。请等它收到后再运行一次(deny 与 ask 规则,以及用 --allowedTools 给的规则,仍然照常发出)。',
713
+ 'session.hostSettings.allowKept.managed.unknown.other': '这一次运行有 {held} 条 permissions.allow 规则没有发给引擎,原因是你账号的托管策略还没有收到。请等它收到后再运行一次(deny 与 ask 规则,以及用 --allowedTools 给的规则,仍然照常发出)。',
714
+ 'session.hostSettings.allowKept.generic.one': '这一次运行有 {held} 条 permissions.allow 规则没有发给引擎,原因是{why};设置文件里的 allow 规则只有在设置读取没有任何问题时才会发出。请先修好报告的设置,再运行一次(这次读取里的 deny 与 ask 规则,以及用 --allowedTools 给的规则,仍然照常发出)。',
715
+ 'session.hostSettings.allowKept.generic.other': '这一次运行有 {held} 条 permissions.allow 规则没有发给引擎,原因是{why};设置文件里的 allow 规则只有在设置读取没有任何问题时才会发出。请先修好报告的设置,再运行一次(这次读取里的 deny 与 ask 规则,以及用 --allowedTools 给的规则,仍然照常发出)。',
716
+ 'session.hostSettings.allowKept.why.problems': '设置读取报告了问题',
717
+ 'session.hostSettings.allowKept.why.problemsWhere': '设置读取报告了问题({where})',
718
+ 'session.hostSettings.allowKept.why.counted.one': '设置读取报告了 {count} 个问题',
719
+ 'session.hostSettings.allowKept.why.counted.other': '设置读取报告了 {count} 个问题',
720
+ 'session.hostSettings.allowKept.why.countedWhere.one': '设置读取报告了 {count} 个问题({where})',
721
+ 'session.hostSettings.allowKept.why.countedWhere.other': '设置读取报告了 {count} 个问题({where})',
722
+ 'session.hostSettings.allowKept.why.unreadable': '没法检查这一次设置读取是否健康',
662
723
  'model.identity.lane.processEnv': '本客户端启动时的环境',
663
724
  'model.identity.lane.settingsEnv': '本客户端的设置文件',
664
725
  'model.identity.lane.modelCatalogFile': '本地模型目录文件',
@@ -670,6 +731,24 @@ const ZH = {
670
731
  'model.identity.catalogAdoption.refused': '{lane}里列了模型,但据报引擎会把这份目录按现状整个拒掉,所以其中任何一个都当不了缺省模型',
671
732
  'model.identity.catalogAdoption.notResolvable': '本机引擎没有配置可用来启动的模型名 —— {clause},而且引擎没有模型名就不会启动',
672
733
  'model.identity.catalogAdoption.notResolvableWithPartial': '本机引擎没有配置可用来启动的模型名 —— {clause};另外{partial},而且引擎没有模型名就不会启动',
734
+ 'model.configGap.head.model': '还没有配置模型',
735
+ 'model.configGap.head.gatewayUrl': '没有配置模型网关地址',
736
+ 'model.configGap.head.apiKey': '没有配置 API 钥匙',
737
+ 'model.configGap.head.anthropicKey': '没有配置 Anthropic 钥匙(ANTHROPIC_API_KEY 或 ANTHROPIC_AUTH_TOKEN)',
738
+ 'model.configGap.head.incomplete': '模型配置不完整',
739
+ 'model.configGap.item.model': '模型名(MODEL_ID)',
740
+ 'model.configGap.item.gatewayUrl': '网关地址(MODEL_GATEWAY_BASEURL)',
741
+ 'model.configGap.item.apiKey': '钥匙(MODEL_API_KEY)',
742
+ 'model.configGap.item.anthropicKey': '用于 Anthropic 的钥匙(ANTHROPIC_API_KEY 或 ANTHROPIC_AUTH_TOKEN)',
743
+ 'model.configGap.lead.one': '{a}还没有配置',
744
+ 'model.configGap.lead.two': '{a}和{b}都还没有配置',
745
+ 'model.configGap.lead.three': '{a}、{b}和{c}都还没有配置',
746
+ 'model.configGap.reason.noModel': '没有模型名,引擎就不会启动',
747
+ 'model.configGap.reason.anthropicCatalog.one': '模型目录里唯一启用的条目走 anthropic 通道,所以引擎无法使用它',
748
+ 'model.configGap.reason.anthropicCatalog.other': '模型目录里启用的 {count} 个条目都走 anthropic 通道,所以引擎一个也用不了',
749
+ 'model.configGap.reason.gatewayCatalog.one': '模型目录里唯一启用的条目没有自己的根地址,所以引擎无法使用它',
750
+ 'model.configGap.reason.gatewayCatalog.other': '模型目录里启用的 {count} 个条目都没有自己的根地址,所以引擎一个也用不了',
751
+ 'model.configGap.detail.withReason': '{missing} —— {reason}',
673
752
  'notice.injectionLane.sentence': '在这台引擎的 {lane} 车道上,工具跑在与引擎不同的机器上,所以随任务发送的{items}也在那里运行、而不是在本机 —— 依赖本机程序或凭据的会在那里失败',
674
753
  'notice.injectionLane.item.stdioMcp': '本机 stdio MCP 服务器',
675
754
  'notice.injectionLane.item.credentialedMcp': '使用本机凭据的 MCP 服务器',
@@ -700,7 +779,7 @@ const ZH = {
700
779
  'notice.durableGate.exit.other': '要使用持久审批,需要有可用的检查点存储。',
701
780
  'notice.durableGate.exitAlt.forceDurableGate': '或者请运维这套部署的人撤掉对这个账号的此项要求。',
702
781
  'notice.durableGate.exitAlt.durableApproval': '或者让这个任务在有实时审批人的地方运行。',
703
- 'notice.memory.sessionPolluted': '本会话的记忆已标记为暴露于外部({reason})。从现在起,它写入的记忆可能被扣下候审,而不是存入长期记忆库;每一批实际扣下了什么,会另行通知。',
782
+ 'notice.memory.sessionPolluted': '本会话里有工具能够到外部内容({reason})。从现在起,它写入的记忆可能被扣下候审,而不是存入长期记忆库;每一批实际扣下了什么,会另行通知。',
704
783
  'notice.memory.harvestQuarantined.counts': '记忆收集把本会话写入或修改的条目文件扣下了,没有加入长期记忆库 —— 扣下 {count} 个,移到一旁候审 {moved} 个,需要跟进 {escalated} 个;后两个数字可能有重叠。',
705
784
  'notice.memory.harvestQuarantined.indexOnly': '记忆收集把本会话对记忆索引的改动回滚到了原样;没有条目文件被扣下。',
706
785
  'notice.memory.harvestQuarantined.indexAlso': '记忆索引也已回滚。',
@@ -754,6 +833,8 @@ const ZH = {
754
833
  'notice.sessionBox.idle.unavailable': '{peer} 不可用。',
755
834
  'notice.sessionBox.idle.expired': '{peer} 在等待结束前没有应答。',
756
835
  'notice.sessionBox.idle.other': '{peer} 有新的状态通知。',
836
+ 'notice.resupply.truncated.one': '这条通知已精简:完整记录有 {bytes} 字节,超过通知大小上限,省略了 1 个字段。完整内容仍可在运行记录里查看。',
837
+ 'notice.resupply.truncated.other': '这条通知已精简:完整记录有 {bytes} 字节,超过通知大小上限,省略了 {count} 个字段。完整内容仍可在运行记录里查看。',
757
838
  'notice.peer.held.deliveredApproved': '{subject} 已获批准并送达。',
758
839
  'notice.peer.held.deliveredRejudged': '{subject} 经重新判断后送达,因为策略现在接受它。',
759
840
  'notice.peer.held.droppedRejudged': '{subject} 曾获批准,但策略现在拒绝它,所以被丢弃了。',
@@ -911,6 +992,20 @@ const ZH = {
911
992
  'notice.capability.mcpProbe.notReported': '这台引擎没有报告逐服务器 MCP 状态面 —— 这说不清这个面在不在,所以这条路在这里可能并不存在(直接问它,可能得到机读的「路由不存在」答复,但超时或不带码的网关答复两头都说明不了什么);有会话面板的末腿名册时优先用它,否则就把这个原因摆出来,而不是摆一个答不了的入口',
912
993
  'notice.capability.mcpProbe.absent': '逐服务器 MCP 状态面在这个部署上报告为关 —— 这台引擎在那里不回答任何读数;本端不猜原因,而调用方自带的声明会不会被认,是另一位独立的问题、有它自己的答案',
913
994
  'notice.capability.mcpProbe.present': '逐服务器 MCP 状态面已开启 —— 这台引擎按请求去连它自己声明的 MCP 服务器,不需要 run,而对调用方自带声明的探测会答回同一种体形',
995
+ 'notice.capability.subject.storePosture': '存储姿态',
996
+ 'notice.capability.storePosture.unobserved': '存储姿态没有观测到 —— 引擎在 /v1/capabilities 上报它;本进程没有缓存可用的能力读数,所以这个部署持不持久化状态是未知的',
997
+ 'notice.capability.storePosture.notReported': '这台引擎没有报告存储姿态;这说明不了这个部署持不持久化状态',
998
+ 'notice.capability.storePosture.assembled': '存储 {backend}',
999
+ 'notice.capability.storePosture.assembledDeclared': '存储声明为 {declared},实际运行在 {backend} 上',
1000
+ 'notice.capability.storePosture.durable': '{assembled} —— 持久:这台副本会持久化它的状态,重启之后仍在',
1001
+ 'notice.capability.storePosture.notDurableHead': '不持久',
1002
+ 'notice.capability.storePosture.memory': '{assembled} —— {head}:这台副本把状态放在内存里,重启就会丢',
1003
+ 'notice.capability.storePosture.ephemeral': '{assembled} —— {head}:引擎报告这台副本有状态放在重启后留不下来的存储上',
1004
+ 'notice.capability.storePosture.unknown': '{assembled} —— 持久性未知:引擎报告它判断不了这台副本的状态重启之后还在不在',
1005
+ 'notice.capability.storePosture.unrecognized': '{assembled} —— 持久性未知:引擎报了一个本端还不认识的持久性词:"{word}"',
1006
+ 'notice.capability.storePosture.degraded.dbUnreachable': '{line}(降级:声明的数据库在启动时打不开,所以引擎退回了,而不是拒绝启动)',
1007
+ 'notice.capability.storePosture.degraded.localUnwritable': '{line}(降级:默认的本地文件存储建不起来 —— 数据目录只读或写满是一种可能的原因,本端分不出是哪一种)',
1008
+ 'notice.capability.storePosture.degraded.other': '{line}(降级,原因本端还不认识:"{reason}")',
914
1009
  'notice.capability.hands.noneStem': '这条 run 腿装配时没有任何内置的文件与 shell 工具',
915
1010
  'notice.capability.hands.noneTail': '所以在这条腿上,模型没有引擎自己的、用来改文件或跑命令的工具(由别的条件挂载的工具,例如外部服务器,以及委派给别的腿的子 run,不在这一读数的范围内)',
916
1011
  'notice.capability.hands.noneLine': '{stem} —— {why},{tail}',
@@ -1246,6 +1341,7 @@ const ZH = {
1246
1341
  'config.hooks.plan.reason.closedUntrusted': '这个工作区未受信任,所以其中不运行任何 hook',
1247
1342
  'config.hooks.plan.reason.closedGovernanceUnreadable': '托管策略读不出来,所以这一回合不运行任何 hook',
1248
1343
  'config.hooks.plan.reason.closedDisableAll': '托管设置关闭了全部 hooks(disableAllHooks)',
1344
+ 'config.hooks.plan.reason.noExecutor': '引擎和本客户端都不运行这个事件',
1249
1345
  'config.hooks.plan.keyNotRead.oneKey': '{layer}:{hooks} 不会运行 —— 所连服务端不读键 {coordinates}。删掉该键,或改用会读它的服务端。',
1250
1346
  'config.hooks.plan.keyNotRead.manyKeys': '{layer}:{hooks} 不会运行 —— 所连服务端不读这些键:{coordinates}。删掉这些键,或改用会读它们的服务端。',
1251
1347
  'config.hooks.plan.keyNotRead.more': '{shown} 等另 {rest} 处',
@@ -1297,6 +1393,79 @@ const ZH = {
1297
1393
  'config.mods.rewrite.inputBy': '参数在放行前被 {by} 改过',
1298
1394
  'config.mods.session.unreadable': '读不出这个对话最近一次运行用了哪些 mod',
1299
1395
  'config.mods.session.unarmed': '这个对话在当前引擎上运行过之后,这里会显示 mod',
1396
+ 'config.hooks.roster.unreadable': '读不出这个对话的 hooks 计划',
1397
+ 'config.hooks.roster.unarmed': '这个应用打开这个对话之后,这里会显示 hooks',
1398
+ 'config.localConfig.refused.invalidRequest': '这次改动读不成有效的请求 —— 什么都没保存。',
1399
+ 'config.localConfig.refused.scopeUnreadable': '配置文件读不出,所以没有覆盖它 —— 什么都没保存。',
1400
+ 'config.localConfig.refused.scopeUnwritable': '这项设置不能存进那个文件 —— 存进去也不会生效。什么都没保存。',
1401
+ 'config.localConfig.refused.untrustedFolder': '这个文件夹未被信任,它的设置文件带不了这项设置 —— 什么都没保存。',
1402
+ 'config.localConfig.refused.policyDenied': '组织的托管设置不允许这次改动 —— 什么都没保存。',
1403
+ 'config.localConfig.refused.notFound': '要改的那一项不存在 —— 什么都没保存。',
1404
+ 'config.localConfig.refused.alreadyExists': '那一项已经存在 —— 什么都没保存。',
1405
+ 'config.localConfig.refused.lockBusy': '另一个程序正在改这份配置 —— 什么都没保存。请稍后再试。',
1406
+ 'config.localConfig.refused.lockFailed': '拿不到这份配置文件的写锁(权限或目录问题)—— 文件没有改动。',
1407
+ 'config.localConfig.refused.changedDuringWrite': '保存时这份配置被别的程序改了 —— 什么都没保存。请再试一次。',
1408
+ 'config.localConfig.refused.writeFailed': '配置文件写不进去 —— 文件没有改动。',
1409
+ 'config.localConfig.refused.notWritten': '这次改动没有保存。',
1410
+ 'config.localConfig.refused.skillLockedByHigherLayer': '更高优先级的配置定了这个技能的状态;这里改不了。',
1411
+ 'config.localConfig.refused.skillManagedByPlugin': '插件技能随插件管理,不在这里改。',
1412
+ 'config.localConfig.refused.skillLockedByAuthor': '这个技能自己的文件关掉了模型调用;它的状态在这里改不了。',
1413
+ 'config.localConfig.refused.skillNameUnstorable': '设置里存不下这个技能的名字;给它的文件夹或文件改个名再来配置。',
1414
+ 'config.localConfig.refused.entryInUse': '这个模型还在被使用(作缺省模型、被某个角色指着,或在旧档位设置里)—— 先把它们改指别的模型。什么都没保存。',
1415
+ 'config.localConfig.refused.credentialUnpaired': '这个模型用它现有的钥匙或地址连不上 —— 什么都没保存。',
1416
+ 'config.localConfig.refused.envCatalogPresent': '引擎正在用环境里设的模型;在这里加一条会让那几只退出使用。请先导入环境模型 —— 什么都没保存。',
1417
+ 'config.localConfig.refused.probeFailed': '供应商表明这次改动里有模型配错了(钥匙、模型名或应答格式)—— 什么都没保存。',
1418
+ 'config.localConfig.refused.probeUnverified': '这次改动里有模型还没跟供应商核对过(或核对没做完)—— 什么都没保存。请再核对一次,或按「未验证」保存。',
1419
+ 'config.localConfig.unavailable.engineIsRemote': '正在用 Cloud 引擎 —— 本机配置对它不起作用。请先切回本机引擎。',
1420
+ 'config.localConfig.unavailable.notSingleUser': '无法确认这台引擎只为你一个人服务,所以不对它使用本机配置。',
1421
+ 'config.localConfig.unavailable.configHomeUnpinned': '应用还没有确定用哪个配置目录,所以本机配置既不显示也不修改。',
1422
+ 'config.localConfig.unavailable.domainNotHosted': '这台设备上的应用暂时还不提供这类配置修改。',
1423
+ 'config.localConfig.unknown.commitUnconfirmed': '不确定这次改动有没有保存 —— 请刷新核对。',
1424
+ 'config.localConfig.unknown.reportUnreadable': '保存后应用的回答读不懂,不确定这次改动有没有保存 —— 请刷新核对。',
1425
+ 'config.localConfig.applied.nextTurn': '已保存。从下一轮起生效。',
1426
+ 'config.localConfig.applied.engineReload': '已保存。引擎下次重读配置时生效,通常在一分钟内。',
1427
+ 'config.localConfig.applied.nextEngineStart': '已保存。本机引擎下次启动时生效。',
1428
+ 'config.localConfig.applied.unchanged': '本来就是这样 —— 不需要改动。',
1429
+ 'config.localConfig.preview.nextTurn': '还没保存。保存后从下一轮起生效。',
1430
+ 'config.localConfig.preview.engineReload': '还没保存。保存后,引擎下次重读配置时生效。',
1431
+ 'config.localConfig.preview.nextEngineStart': '还没保存。保存后,本机引擎下次启动时生效。',
1432
+ 'config.localConfig.preview.unchanged': '本来就是这样 —— 保存也不会改动什么。',
1433
+ 'config.localConfig.residue.orphanKeySlot': '留下了一个没有模型使用的钥匙槽;它不起作用。',
1434
+ 'config.localConfig.residue.legacyTierGroupsLeft': '旧的档位设置还留在设置文件里;它们已不再被使用。',
1435
+ 'config.localConfig.disclosure.decidedBy': '生效的设置来自{layer}。',
1436
+ 'config.localConfig.disclosure.shadowed': '这项设置被{layer}盖住了,所以暂时不生效。',
1437
+ 'config.localConfig.disclosure.tierGroupOverridden': '旧设置里有几个档位组与{layer}里已有的组重名;已保留{layer}里的,旧的没有拷过去。',
1438
+ 'config.localConfig.disclosure.tierGroupOverriddenNamed': '旧设置里这几个档位组与{layer}里已有的组重名;已保留{layer}里的,旧的没有拷过去:{names}。',
1439
+ 'config.localConfig.layer.userSettings': '你的用户设置',
1440
+ 'config.localConfig.layer.projectSettings': '这个项目的共享设置',
1441
+ 'config.localConfig.layer.localSettings': '这个项目的本地设置',
1442
+ 'config.localConfig.layer.globalConfig': '应用的状态文件',
1443
+ 'config.localConfig.layer.projectMcp': '这个项目的 MCP 服务器文件',
1444
+ 'config.localConfig.layer.models': '模型目录',
1445
+ 'config.localConfig.layer.deploymentMcp': '引擎的 MCP 服务器声明',
1446
+ 'config.localConfig.layer.policySettings': '组织的托管设置',
1447
+ 'config.localConfig.layer.other': '另一个设置文件',
1448
+ 'config.localConfig.refused.nameUnusable': '这个服务器名不能用——没有保存。',
1449
+ 'config.localConfig.refused.nameReserved': '这个服务器名被本应用自带的内置服务器占用——没有保存。',
1450
+ 'config.localConfig.refused.mcpEntryInvalid': '这条服务器配置有会让它挂不上的问题——没有保存。',
1451
+ 'config.localConfig.refused.ambiguousScope': '同名服务器配置在不止一处;请选定要改哪一处——没有保存。',
1452
+ 'config.localConfig.refused.credentialsNeedReentry': '服务器的地址或命令改了,为它存的密钥要重新填写或删除——没有保存。',
1453
+ 'config.localConfig.refused.baseConflict': '这台服务器的配置在显示之后被改过——没有保存。请刷新后再试。',
1454
+ 'config.mcpServers.notice.shadowed': '{scope} 配置里的同名服务器优先于这一台。',
1455
+ 'config.mcpServers.notice.endpointDiffers': '{scope} 配置里的同名服务器指向别处。',
1456
+ 'config.mcpServers.notice.deploymentWins': '引擎所在部署自己声明了同名服务器;实际用的是部署那一台。',
1457
+ 'config.mcpServers.notice.envMissing': '这些变量没有设置,原样保留:{names}。',
1458
+ 'config.mcpServers.notice.narrowingWouldConflict': '其它位置({scopes})为这个名字声明了不同的工具清单;各处一致之前这台服务器不会挂载。',
1459
+ 'config.mcpServers.withheld.narrowingConflict': '未挂载:配置这台服务器的几处对工具清单的声明不一致。',
1460
+ 'config.mcpServers.withheld.narrowingInvalid': '未挂载:配置这台服务器的某一处把工具清单写坏了。',
1461
+ 'config.mcpServers.withheld.layerUnreadable': '未挂载:一份能添加或限制 MCP 服务器的配置文件读不出,修好之前不挂载任何 MCP 服务器。',
1462
+ 'config.mcpServers.withheld.policyLocked': '未挂载:组织的托管设置只允许它提供的 MCP 服务器。',
1463
+ 'config.mcpServers.problem.nameReserved': '这个名字属于本应用自带的内置服务器。',
1464
+ 'config.mcpServers.approvalsWithheld': '{layer} 里写的 MCP 批准不生效,因为这个文件夹未被信任。',
1465
+ 'config.mcpServers.probe.removed': '无需测试:这次改动会删除这台服务器。',
1466
+ 'config.mcpServers.probe.notActive': '无需测试:改动之后这台服务器不会处于启用状态。',
1467
+ 'config.mcpServers.probe.envMissing': '未测试:这台服务器用到的部分变量没有设置。',
1468
+ 'config.mcpServers.probe.editRefusal': '未测试:这次改动本身没有被接受。',
1300
1469
  'follow.notFollowed.headRun': '这块屏已不再跟着 run {taskId}{reason}{ending}{exit}',
1301
1470
  'follow.notFollowed.headTurn': '这块屏已不再跟着这一轮的 run{reason}{ending}{exit}',
1302
1471
  'follow.notFollowed.reason.exhaustedDraining': ':服务它的那台引擎实例在它最后一条事件流关闭时正在下线,而这个客户端的重新附着次数已经用完。',
@@ -1382,6 +1551,7 @@ const ZH = {
1382
1551
  'localEngine.down.spawnRefused': '本机引擎没有启动:启动前的准备没有通过。',
1383
1552
  'localEngine.down.stopFailed': '旧的本机引擎没有按时停下,所以没有更换。',
1384
1553
  'localEngine.down.crashLoop': '本机引擎反复意外停止,自动重启已暂停。',
1554
+ 'localEngine.down.exitedOnce': '本机引擎启动后已退出,Sema 不会自动重新启动它。',
1385
1555
  'localEngine.down.highWaterUnreadable': '读不出这台机器上用过的最新引擎版本记录,本机引擎不启动;请检查引擎数据目录。',
1386
1556
  'localEngine.crashLoop.retry': '本机引擎反复意外停止;约 {seconds} 秒后再试一次。',
1387
1557
  'localEngine.crashLoop.stopped': '本机引擎反复意外停止;Sema 已不再自动重试,请手动重启。',
@@ -1408,11 +1578,80 @@ const ZH = {
1408
1578
  'localEngine.restartOutcome.pendingBusy': '有别的会话在用本机引擎;没人用时就重启。',
1409
1579
  'localEngine.restartOutcome.failedPrepare': '本机引擎没有重启;当前引擎照常运行。',
1410
1580
  'localEngine.restartOutcome.failedDown': '本机引擎没能重启:{detail}',
1581
+ 'localEngine.swapGuard.newer': '本机引擎(版本 {running})是比这个 Sema({own})更新的 Sema 启动的,Sema 让它继续运行,不用更旧的引擎替换它。',
1582
+ 'localEngine.swapGuard.newer.highWater': '这台机器的本机引擎数据上次由更新的 Sema(引擎版本 {running})用过,比这个 Sema({own})新,Sema 不会在上面启动更旧的引擎。',
1583
+ 'localEngine.swapGuard.newer.cliUpdate': '要让改动生效,请运行 `sema update`。',
1584
+ 'localEngine.swapGuard.newer.appUpdate': '要让改动生效,请更新本应用。',
1585
+ 'localEngine.swapGuard.hold': '本机引擎暂不替换:仍在等待的工作换引擎后可能无法继续。',
1586
+ 'localEngine.swapGuard.unknown': 'Sema 无法判断在跑的本机引擎是否比这个 Sema 新,未经你确认不会替换它。',
1587
+ 'localEngine.swapGuard.parked.one': '有一张审批卡仍在等待回答。',
1588
+ 'localEngine.swapGuard.parked.oneSession': '有 {count} 张审批卡仍在同一个会话里等待回答。',
1589
+ 'localEngine.swapGuard.parked.manySessions': '有 {count} 张审批卡仍在 {sessions} 个会话里等待回答。',
1590
+ 'localEngine.swapGuard.parked.failed': '读不出是否还有审批卡在等待回答。',
1591
+ 'localEngine.swapGuard.parked.unsupported': '这台引擎读不到是否还有审批卡在等待回答。',
1592
+ 'localEngine.swapGuard.wayOut.interactive': '请先回答等待中的卡,或确认后立即替换引擎。',
1593
+ 'localEngine.swapGuard.wayOut.print': '本次命令继续使用当前引擎;请以交互方式打开 Sema 回答等待中的卡或替换引擎。',
1594
+ 'localEngine.swapGuard.told.one': '本机引擎已替换;之前仍在等待的那张审批卡可能无法再回答。如果它提示无法继续,请重新发送那一轮。',
1595
+ 'localEngine.swapGuard.told.other': '本机引擎已替换;之前仍在等待的 {count} 张审批卡可能无法再回答。如果某张提示无法继续,请重新发送那一轮。',
1596
+ 'localEngine.swapGuard.told.unknown': '本机引擎已替换;之前若有仍在等待的审批卡,可能无法再回答。如果某张提示无法继续,请重新发送那一轮。',
1597
+ 'engine.unavailable.line': '[sema] engine-fatal · {tag} — {head},本会话的任何内容都到不了模型:{detail}。{fix}',
1598
+ 'engine.unavailable.lineNoDetail': '[sema] engine-fatal · {tag} — {head},本会话的任何内容都到不了模型。{fix}',
1599
+ 'engine.unavailable.lineNoFix': '[sema] engine-fatal · {tag} — {head},本会话的任何内容都到不了模型:{detail}',
1600
+ 'engine.unavailable.lineBare': '[sema] engine-fatal · {tag} — {head},本会话的任何内容都到不了模型。',
1601
+ 'engine.unavailable.lineRefusedUse': '[sema] engine-fatal · {tag} — {head},本会话没有向模型发出任何内容:{detail}',
1602
+ 'engine.unavailable.lineRefusedUseNoDetail': '[sema] engine-fatal · {tag} — {head},本会话没有向模型发出任何内容。',
1603
+ 'engine.unavailable.head.notRunning': 'sema 引擎没有在运行',
1604
+ 'engine.unavailable.head.refused': 'sema 引擎拒绝启动',
1605
+ 'engine.unavailable.head.notAnswering': 'sema 引擎没有应答',
1606
+ 'engine.unavailable.head.noHealthyAnswer': 'sema 引擎一直没有给出健康应答',
1607
+ 'engine.unavailable.head.drainStuck': '上一台 sema 引擎还没停完',
1608
+ 'engine.unavailable.head.addressRefused': 'sema 没有连接 SEMA_ENGINE_URL 指定的引擎',
1609
+ 'engine.unavailable.head.versionRefused': '有一台引擎在运行,但这个 sema 拒绝使用它',
1610
+ 'engine.unavailable.head.unknown': 'sema 引擎不可用',
1611
+ 'engine.unavailable.again.session': '重新启动 sema',
1612
+ 'engine.unavailable.again.command': '重新运行这条命令',
1613
+ 'engine.unavailable.again.app': '重新打开本应用',
1614
+ 'engine.unavailable.retry.session': '重启 sema 再试',
1615
+ 'engine.unavailable.retry.command': '重新运行这条命令再试',
1616
+ 'engine.unavailable.fix.diagnose': '出路:运行 `sema doctor` 诊断,或{retry}。',
1617
+ 'engine.unavailable.fix.modelSetup': '出路:运行 `sema onboard` 把模型配置补完,然后{again}。',
1618
+ 'engine.unavailable.fix.credentialConflict': '出路:两把凭据去掉一把,留下你的端点要的那一把,然后{again}。',
1619
+ 'engine.unavailable.fix.credentialMalformed': '出路:运行 `sema cloud login` 重新登录(它会重写 sema 管理的那只文件),或运行 `sema cloud logout` 不再使用它;如果 {tokenFile} 是你自己设的,修好那只文件。然后{again}。',
1620
+ 'engine.unavailable.fix.credentialMultiTenant': '出路:把工作节点拉取令牌交给引擎({token},或在 {tokenFile} 指向的文件里写一行令牌),或去掉 REQUIRE_PRINCIPAL 改成单用户引擎,然后{again}。',
1621
+ 'engine.unavailable.fix.credential': '出路:改正引擎点名的那份登录凭据,然后{again}。',
1622
+ 'engine.unavailable.wait.respond': '等它应答',
1623
+ 'engine.unavailable.wait.healthy': '等它给出健康应答',
1624
+ 'engine.unavailable.wait.exit': '等它退出',
1625
+ 'engine.unavailable.fix.waitPid': '出路:{wait}后{again},或自己停掉它(kill {pid})后{again}。',
1626
+ 'engine.unavailable.fix.wait': '出路:{wait}后{again},或自己停掉那台引擎进程后{again}。',
1627
+ 'engine.bootRefusal.withWaysOut': '本机引擎拒绝启动:{reason} {waysOut}',
1628
+ 'engine.bootRefusal.withFix': '本机引擎拒绝启动:{reason} {fix}',
1629
+ 'engine.bootRefusal.waysOut': '出路:(1){newer} —— {separate};(2){restore};(3){repair}。',
1630
+ 'engine.bootRefusal.who.sema': '更新的 sema',
1631
+ 'engine.bootRefusal.who.semaAtLeast': '更新的 sema(它的引擎是 {version} 或更新的版本)',
1632
+ 'engine.bootRefusal.who.app': '本应用更新的版本',
1633
+ 'engine.bootRefusal.who.appAtLeast': '本应用更新的版本(它的引擎是 {version} 或更新的版本)',
1634
+ 'engine.bootRefusal.who.build': '更新的构建',
1635
+ 'engine.bootRefusal.who.buildAtLeast': '更新的构建(引擎 {version} 或更新)',
1636
+ 'engine.bootRefusal.newer.update': '{who}用过这个数据文件夹:用 `sema update` 更新这个 sema 后{again},或重新启动那个更新的 sema',
1637
+ 'engine.bootRefusal.newer.projectLocal': '{who}用过这个数据文件夹:在装它的那个项目里更新这份 sema,然后{again};或重新启动那个更新的 sema',
1638
+ 'engine.bootRefusal.newer.devTree': '{who}用过这个数据文件夹:把这份源码检出切到更新的构建,然后{again};或重新启动那个更新的 sema',
1639
+ 'engine.bootRefusal.newer.app': '{who}用过这个数据文件夹:更新本应用,或重新启动那个更新的版本',
1640
+ 'engine.bootRefusal.newer.unknown': '{who}用过这个数据文件夹:重新启动那个更新的 sema',
1641
+ 'engine.bootRefusal.newer.deployment': '{who}写过这个数据根:部署那份构建',
1642
+ 'engine.bootRefusal.separate.embedded': '要在这台电脑上继续用这个 sema,就给它单独的配置文件夹启动:`{key}=<another-folder> sema`(启动后没有你的设置和会话)',
1643
+ 'engine.bootRefusal.separate.app': '要继续用这个版本,就给它单独的配置文件夹启动(`{key}=<another-folder>`);启动后没有你的设置和会话',
1644
+ 'engine.bootRefusal.separate.deployment': '要在这台机器上运行这份较旧的构建,给它单独的数据根(LOCAL_DATA_ROOT)',
1645
+ 'engine.bootRefusal.restore': '放回 {folder} 在更新的引擎第一次打开它之前的副本,然后{again}(上面点名的文件损坏时也走这条;副本之后的改动会丢)',
1646
+ 'engine.bootRefusal.restoreDeployment': '恢复升级前做的数据根备份,然后启动这份构建(上面点名的文件损坏时也走这条)',
1647
+ 'engine.bootRefusal.folder.default': '你的 sema 配置文件夹里的 engine-data 文件夹',
1648
+ 'engine.bootRefusal.repair': '如果上面点名的文件根本读不了(EACCES 一类的 I/O 错误),修好它的访问(权限、磁盘)后{again}',
1649
+ 'engine.bootRefusal.repairDeployment': '如果上面点名的文件根本读不了(EACCES 一类的 I/O 错误),修好它的访问(权限、挂载、磁盘)后重启',
1411
1650
  'session.devices.repoint.done': '已改指:这台机器的设备档和会话现在跟着新的引擎地址走。设备身份没变 —— 没有重新注册。',
1412
1651
  'session.devices.repoint.unverified': '什么都没改:确认不了新地址上有这台设备。如果它就是同一台引擎,请确认你是用这台设备所属账号登录的,然后再试一次;否则请到引擎自己的地址重新注册这台机器,再到引擎的设备列表里移除旧设备。',
1413
1652
  'session.devices.repoint.undetermined': '什么都没改:对新地址的一项核对没读到结果,所以不知道这台设备是否登记在那边。请再试一次;或者到引擎自己的地址重新注册这台机器,再到引擎的设备列表里移除旧设备。',
1414
1653
  'session.devices.repoint.partial': '设备档已跟着新地址走,但不是每只会话都改成了。再运行一次同样的命令即可补完 —— 已改好的会话不会再动。',
1415
- 'session.devices.repoint.storeFailed': '设备档没能迁过去,所以什么都没改。请再运行一次命令;一直失败的话,到引擎自己的地址重新注册这台机器。',
1654
+ 'session.devices.repoint.storeFailed': '设备档没能确认迁过去,会话都没有动。请再运行一次同样的命令;一直失败的话,到引擎自己的地址重新注册这台机器。',
1416
1655
  'session.devices.repoint.refused.addressInvalid': '什么都没改:有一个地址用不了。请给引擎完整的 https:// 地址(明文 http:// 只收本机地址)。',
1417
1656
  'session.devices.repoint.refused.sameAddress': '什么都没改:新地址和旧地址是同一个引擎地址。',
1418
1657
  'session.devices.repoint.refused.recordAbsent': '什么都没改:这台机器上没有旧地址对应的设备档。',
@@ -1420,10 +1659,64 @@ const ZH = {
1420
1659
  'session.devices.repoint.refused.recordUnreadable': '什么都没改:有一份设备档读不了,所以原样没动。',
1421
1660
  'session.devices.repoint.refused.targetOccupied': '什么都没改:这台机器在新地址上已经有一份不同设备的设备档。',
1422
1661
  'session.devices.repoint.refused.unarmed': '什么都没改:这个应用没有接好迁移设备档和会话的能力。',
1662
+ 'session.devices.repoint.refused.rosterUnbound': '什么都没改:这个应用没有接好新地址上的设备列表,所以无法核对这次迁移。这是应用自己的接线问题,再试一次也不会好。',
1663
+ 'attachments.withheld.toolsElsewhere.row': '这个会话的工具不读写这台机器上的文件',
1664
+ 'attachments.withheld.toolsLocationUnconfirmed.row': '无法确认这个会话的工具读写的是这台机器上的文件',
1665
+ 'attachments.withheld.toolsElsewhere.model': '这个会话的工具不读写客户端所在机器上的文件,所以客户端没有附上那台机器上的副本;它可能与工具读写的文件不同,文件也可能只存在于工具运行的地方',
1666
+ 'attachments.withheld.toolsLocationUnconfirmed.model': '客户端无法确认这个会话的工具读写的是它所在机器上的文件,所以没有附上那台机器上的副本;它可能与工具读写的文件不同,文件也可能只存在于工具运行的地方',
1667
+ 'attachments.localCopy.model': '这是用户从客户端所在机器上交来的内容:它是那台机器上的副本,随附的路径也是那台机器上的路径。这个会话的工具未必读写那台机器上的文件,所以工具读写的文件可能不同,也可能不存在。',
1668
+ 'session.compaction.canceled': '压缩已取消。',
1669
+ 'localEngine.health.answer.unansweredTimeout': '没有在时限内应答',
1670
+ 'localEngine.health.answer.unansweredNetwork': '连不上',
1671
+ 'localEngine.health.answer.ok': '应答了,状态为 "ok"',
1672
+ 'localEngine.health.answer.notOkHttp': '应答了 HTTP {http}',
1673
+ 'localEngine.health.answer.notOkStatus': '应答了 HTTP {http},但状态不是 "ok"',
1674
+ 'centerTrust.refusal.badInput': '这道检查收到了读不出的入参;这是客户端的缺陷,不是你输入的问题。',
1675
+ 'centerTrust.refusal.empty': '没有给出地址。',
1676
+ 'centerTrust.refusal.tooLong': '地址太长(至多 {addressMax} 个字符,主机部分至多 {authorityMax} 个)。',
1677
+ 'centerTrust.refusal.unsafeCharacter': '地址里有空白、控制字符或反斜杠。',
1678
+ 'centerTrust.refusal.scheme': '地址必须写全:邀请链接以 `https://` 起头,中心地址以 `http://` 或 `https://` 起头。',
1679
+ 'centerTrust.refusal.userinfo': '地址的主机前不许带用户名或密码。',
1680
+ 'centerTrust.refusal.percentInHost': '地址的主机部分不许含百分号编码。',
1681
+ 'centerTrust.refusal.unparseable': '地址不是能解析的 http(s) URL。',
1682
+ 'centerTrust.refusal.query': '地址不许带查询串(`?`)。',
1683
+ 'centerTrust.refusal.fragment': '地址不许带片段(`#`);只有邀请链接可以以 `#ca=` 指纹列表结尾。',
1684
+ 'centerTrust.refusal.trailingDot': '主机名不许以点结尾。',
1685
+ 'centerTrust.refusal.ipNotCanonical': 'IP 地址必须用标准写法(例如 `127.0.0.1`,不用缩写或十六进制写法)。',
1686
+ 'centerTrust.refusal.plaintextRemote': '明文 `http://` 只许用于本机;远端中心必须用 `https://`。',
1687
+ 'centerTrust.refusal.path': '地址路径不合规:邀请链接不带路径,中心地址的路径不许以 `//` 起头,也不许含 `.` 或 `..` 段。',
1688
+ 'centerTrust.refusal.fingerprint': '指纹必须是 `sha256:` 后接 64 位十六进制数字(邀请链接里只收小写)。',
1689
+ 'centerTrust.refusal.tooManyFingerprints': '至多给 {fingerprintsMax} 个指纹。',
1690
+ 'centerTrust.refusal.prefix': '指纹必须以 `sha256:` 起头。',
1691
+ 'centerTrust.refusal.parserUnavailable': '这个客户端在当前平台上读不了证书,所以钉不住中心的证书。',
1692
+ 'centerTrust.refusal.bodyTooLarge': '中心的证书应答超过 {bodyMax} 字节。',
1693
+ 'centerTrust.refusal.bodyNotJson': '中心的证书应答不是有效的 UTF-8 JSON。',
1694
+ 'centerTrust.refusal.bodyShape': '中心的证书应答形状不对。',
1695
+ 'centerTrust.refusal.servedCount': '中心必须给出 1 至 {servedMax} 张证书。',
1696
+ 'centerTrust.refusal.certificateTooLarge': '中心给出的一张证书超过 {pemMax} 个字符。',
1697
+ 'centerTrust.refusal.certificateNotCanonical': '中心给出的一张证书不是恰一张、标准 PEM 形(每行 64 字符、LF 换行)且 DER 长度规范的证书。',
1698
+ 'centerTrust.refusal.certificateUnparseable': '中心给出的一张证书在本平台上读不出。',
1699
+ 'centerTrust.refusal.servedDuplicate': '中心把同一张证书给了不止一次。',
1700
+ 'centerTrust.refusal.namedNotServed': '你给的一个指纹与中心给出的证书都对不上。',
1701
+ 'centerTrust.refusal.anchorNotSelfSigned': '你点名的一张证书不是自签的,不能作信任锚钉住。',
1702
+ 'centerTrust.refusal.unconfiguredWithFingerprints': '你给了指纹,但中心说它没有配置证书颁发机构。',
1703
+ 'centerTrust.refusal.cancelled': '取中心证书已取消。',
1704
+ 'centerTrust.refusal.timedOut': '取中心证书超时(每次尝试至多等 {roundSec} 秒)。',
1705
+ 'centerTrust.refusal.transportFailed': '连不上中心,取不到它的证书。',
1706
+ 'centerTrust.refusal.contentType': '中心的证书应答不是 JSON(内容类型不对)。',
1707
+ 'centerTrust.refusal.caUnavailable': '中心报告它的证书颁发机构暂时不可用。',
1708
+ 'centerTrust.refusal.endpointMissing': '中心没有提供可钉的证书(可能是较旧的版本)。',
1709
+ 'centerTrust.refusal.unexpectedStatus': '中心对证书请求给了意料之外的状态。',
1710
+ 'centerTrust.refusal.retryAfterUnusable': '中心要求稍后再试但没给可用的等待时长,客户端已停止。',
1711
+ 'centerTrust.refusal.retryAfterTooLong': '中心要求等待超过 {waitCapSec} 秒再试,客户端已停止;请稍后再试。',
1712
+ 'centerTrust.refusal.retriesExhausted': '中心一直要求重试;客户端在 {attemptsMax} 次尝试后停止。',
1713
+ 'centerTrust.refusal.budgetExhausted': '取中心证书用完了 {budgetSec} 秒的时间预算。',
1714
+ 'centerTrust.refusal.unknown': '中心的证书核验没有通过。',
1423
1715
  };
1424
1716
  export const ZH_MESSAGES = Object.freeze(ZH);
1425
1717
  export const TERM_SLOTS = Object.freeze({
1426
1718
  'session.background.refusal.envOff': ['SEMA_HEADLESS_DETACH'],
1719
+ 'approval.policyDeny.hook': ['PermissionRequest'],
1427
1720
  'session.mcpReconnect.unsupported': ['MCP'],
1428
1721
  'session.mcpReconnect.accepted.one': ['MCP'],
1429
1722
  'session.mcpReconnect.accepted.other': ['MCP'],
@@ -1489,6 +1782,9 @@ export const TERM_SLOTS = Object.freeze({
1489
1782
  'resume.refusal.park.printHolds': ['parked', 'run'],
1490
1783
  'resume.refusal.park.interactiveEnded': ['parked', 'run'],
1491
1784
  'resume.refusal.park.interactiveBusy': ['parked', 'run'],
1785
+ 'resume.refusal.park.whyNewerEngine': ['parked'],
1786
+ 'resume.refusal.park.interactiveNewerWorker': ['parked', 'run'],
1787
+ 'resume.refusal.park.printNewerWorker': ['parked', 'run'],
1492
1788
  'resume.refusal.park.blockedPrint': ['run'],
1493
1789
  'resume.refusal.park.blockedInteractive': ['run'],
1494
1790
  'approval.askPark.autoReopenBlocked.policyInteractive': ['run'],
@@ -1531,6 +1827,12 @@ export const TERM_SLOTS = Object.freeze({
1531
1827
  'session.selfHeal.row.attach': ['run'],
1532
1828
  'session.selfHeal.row.cancelled.confirmed': ['run'],
1533
1829
  'session.selfHeal.row.cancelled.reported': ['run'],
1830
+ 'session.selfHeal.row.resendWithheldLeft.confirmed': ['run'],
1831
+ 'session.selfHeal.row.resendWithheldLeft.reported': ['run'],
1832
+ 'session.selfHeal.stopLeft.untouched': ['run'],
1833
+ 'session.selfHeal.stopLeft.waiting.certain': ['run'],
1834
+ 'session.selfHeal.stopLeft.refused': ['run'],
1835
+ 'session.selfHeal.stopLeft.notConfirmed': ['run'],
1534
1836
  'session.selfHeal.row.cancelTimeout.aborted': ['run'],
1535
1837
  'session.selfHeal.row.cancelTimeout.unread': ['run'],
1536
1838
  'session.selfHeal.row.cancelTimeout.held': ['run'],
@@ -1594,4 +1896,12 @@ export const TERM_SLOTS = Object.freeze({
1594
1896
  'notice.failure.settings.safety': ['turn'],
1595
1897
  'notice.wireRefusal.hostPosture.writeFace': ['bypassPermissions'],
1596
1898
  'notice.wireRefusal.hostPosture.both': ['bypassPermissions'],
1899
+ 'session.hostSettings.allowKept.managed.inProgress.one': ['permissions.allow', '--allowedTools'],
1900
+ 'session.hostSettings.allowKept.managed.inProgress.other': ['permissions.allow', '--allowedTools'],
1901
+ 'session.hostSettings.allowKept.managed.failed.one': ['permissions.allow', '--allowedTools'],
1902
+ 'session.hostSettings.allowKept.managed.failed.other': ['permissions.allow', '--allowedTools'],
1903
+ 'session.hostSettings.allowKept.managed.unknown.one': ['permissions.allow', '--allowedTools'],
1904
+ 'session.hostSettings.allowKept.managed.unknown.other': ['permissions.allow', '--allowedTools'],
1905
+ 'session.hostSettings.allowKept.generic.one': ['permissions.allow', '--allowedTools'],
1906
+ 'session.hostSettings.allowKept.generic.other': ['permissions.allow', '--allowedTools'],
1597
1907
  });
@@ -18,6 +18,9 @@ export type MissLedger = {
18
18
  };
19
19
  export declare function createMissLedger(): MissLedger;
20
20
  export declare const uiMissLedger: MissLedger;
21
+ export type MessageCatalogInstallOutcome = 'installed' | 'built_in' | 'unknown_language' | 'not_a_catalog' | 'conflict';
22
+ export declare function renderLanguageOf(lang: string | undefined): UiLanguage;
23
+ export declare function installMessageCatalog(lang: Exclude<UiLanguage, 'en'>, catalog: Readonly<Record<MessageKey, string>>): MessageCatalogInstallOutcome;
21
24
  export declare function translate(lang: UiLanguage, key: string, params?: MessageParams, ledger?: MissLedger): string;
22
25
  export declare function createTranslator(lang: UiLanguage, ledger?: MissLedger): Translator;
23
26
  export declare function msg(key: MessageKey, params?: MessageParams): MessageRef;