@chainingintention/pi-web-cn 1.202610.4 → 2.202610.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 (299) hide show
  1. package/README.md +2 -2
  2. package/dist/cli.js +31 -7
  3. package/dist/cli.js.map +1 -1
  4. package/dist/client/assets/PiWebApp-BXSziMEg.js +4921 -0
  5. package/dist/client/assets/classic-CyM97Akm.css +54 -0
  6. package/dist/client/assets/external-B9K8duyP.js +2 -0
  7. package/dist/client/assets/graphite-DquaqFXU.css +54 -0
  8. package/dist/client/assets/index-cdtUOfOW.js +2 -0
  9. package/dist/client/assets/paper-CB1oLuRr.css +54 -0
  10. package/dist/client/assets/pi-web-dark-D_KtbM95.css +54 -0
  11. package/dist/client/assets/pi-web-light-DSNLMIBI.css +54 -0
  12. package/dist/client/assets/vendor-editor-core-BfnHL1Dg.js +10 -0
  13. package/dist/client/assets/{vendor-editor-languages-DOCw3vc9.js → vendor-editor-languages-bNquDJP0.js} +1 -1
  14. package/dist/client/index.html +3 -47
  15. package/dist/config.js +11 -2
  16. package/dist/config.js.map +1 -1
  17. package/dist/nativeServices/installedServiceDefinitions.js +10 -7
  18. package/dist/nativeServices/installedServiceDefinitions.js.map +1 -1
  19. package/dist/pi-packages/captains-log/dist/browser/index.js +43 -47
  20. package/dist/pi-packages/captains-log/dist/browser/panel.js +6 -10
  21. package/dist/pi-packages/captains-log/dist/companion.js +1 -1
  22. package/dist/pi-packages/captains-log/package.json +4 -4
  23. package/dist/pi-packages/relays/extensions/index.js +61 -0
  24. package/dist/pi-packages/relays/package.json +10 -1
  25. package/dist/pi-packages/relays/pi-web-plugin.js +52 -2
  26. package/dist/pi-packages/relays/prompts/relay-worktree.md +6 -16
  27. package/dist/pi-packages/relays/prompts/relay.md +6 -33
  28. package/dist/pi-packages/relays/relayDispatch.js +67 -0
  29. package/dist/pi-packages/relays/relayIdentity.js +37 -0
  30. package/dist/pi-packages/relays/relaysPanelElement.js +75 -37
  31. package/dist/pi-packages/relays/skills/relay/SKILL.md +24 -68
  32. package/dist/pi-packages/relays/skills/relay-runner/SKILL.md +40 -219
  33. package/dist/pi-packages/workflows/browser/pi-web-plugin.js +42 -0
  34. package/dist/pi-packages/workflows/browser/worktreeDialog.js +170 -0
  35. package/dist/pi-packages/workflows/package.json +23 -0
  36. package/dist/pi-packages/workflows/prompts/worktree.md +21 -0
  37. package/dist/pi-packages/workflows/server-plugin.js +586 -0
  38. package/dist/pi-packages/workflows/vite.config.mjs +17 -0
  39. package/dist/pi-web-plugins/code-highlight/browser/pi-web-plugin.js +22 -0
  40. package/dist/pi-web-plugins/code-highlight/package.json +13 -0
  41. package/dist/pi-web-plugins/files/browser/pi-web-plugin.js +115 -105
  42. package/dist/pi-web-plugins/git/browser/git-panel.js +60 -46
  43. package/dist/pi-web-plugins/git/browser/pi-web-plugin.js +23 -3
  44. package/dist/pi-web-plugins/git/git-backend.js +20 -1
  45. package/dist/pi-web-plugins/git/server-plugin.js +20 -3
  46. package/dist/pi-web-plugins/git/workspace-discovery-notify.cjs +14 -0
  47. package/dist/pi-web-plugins/git/workspaceDiscoveryHooks.js +186 -0
  48. package/dist/pi-web-plugins/info/infoInternals.js +3 -3
  49. package/dist/pi-web-plugins/info/pi-web-plugin.js +1 -1
  50. package/dist/pi-web-plugins/mermaid/browser/mermaid-engine.js +1087 -422
  51. package/dist/pi-web-plugins/mermaid/browser/pi-web-plugin.js +8 -3
  52. package/dist/pi-web-plugins/terminal/browser/pi-web-plugin.js +39 -33
  53. package/dist/pi-web-plugins/updates/pi-web-plugin.js +13 -13
  54. package/dist/pi-web-plugins/updates/updatesLogic.js +4 -5
  55. package/dist/pi-web-plugins/workspace-tasks/pi-web-plugin.js +21 -1
  56. package/dist/pi-web-plugins/workspace-tasks/tasksPanelElement.js +39 -22
  57. package/dist/pi-web-plugins/zh-cn/bundled.json +44 -1
  58. package/dist/pi-web-plugins/zh-cn/cli.json +60 -1
  59. package/dist/pi-web-plugins/zh-cn/client.json +7 -1
  60. package/dist/pi-web-plugins/zh-cn/components.json +252 -2
  61. package/dist/pi-web-plugins/zh-cn/config-errors.json +17 -1
  62. package/dist/pi-web-plugins/zh-cn/files.json +10 -1
  63. package/dist/pi-web-plugins/zh-cn/main.json +1 -1
  64. package/dist/pi-web-plugins/zh-cn/provider-auth.json +2 -1
  65. package/dist/pi-web-plugins/zh-cn/server.json +83 -1
  66. package/dist/piAi.js +4 -0
  67. package/dist/piAi.js.map +1 -0
  68. package/dist/piRuntime.js +150 -0
  69. package/dist/piRuntime.js.map +1 -0
  70. package/dist/piSdk.js +5 -0
  71. package/dist/piSdk.js.map +1 -0
  72. package/dist/piWebUpdate.js +508 -0
  73. package/dist/piWebUpdate.js.map +1 -0
  74. package/dist/piWebVersionReport.js +43 -1
  75. package/dist/piWebVersionReport.js.map +1 -1
  76. package/dist/plugin-api.d.ts +393 -51
  77. package/dist/server/activity/workspaceActivityService.js +8 -1
  78. package/dist/server/activity/workspaceActivityService.js.map +1 -1
  79. package/dist/server/app.js +19 -4
  80. package/dist/server/app.js.map +1 -1
  81. package/dist/server/browserMessageProjection.js +39 -20
  82. package/dist/server/browserMessageProjection.js.map +1 -1
  83. package/dist/server/configRoutes.js +8 -0
  84. package/dist/server/configRoutes.js.map +1 -1
  85. package/dist/server/index.js +10 -1
  86. package/dist/server/index.js.map +1 -1
  87. package/dist/server/knownAutoInstallPiPackages.js +6 -0
  88. package/dist/server/knownAutoInstallPiPackages.js.map +1 -1
  89. package/dist/server/machines/machineProxyRoutes.js +37 -2
  90. package/dist/server/machines/machineProxyRoutes.js.map +1 -1
  91. package/dist/server/navigationPreferenceRoutes.js +59 -0
  92. package/dist/server/navigationPreferenceRoutes.js.map +1 -0
  93. package/dist/server/piPackageService.js +1 -1
  94. package/dist/server/piPackageService.js.map +1 -1
  95. package/dist/server/piWebPluginCatalog.js +1 -1
  96. package/dist/server/piWebPluginCatalog.js.map +1 -1
  97. package/dist/server/piWebPluginService.js +7 -1
  98. package/dist/server/piWebPluginService.js.map +1 -1
  99. package/dist/server/piWebStatus.js +17 -56
  100. package/dist/server/piWebStatus.js.map +1 -1
  101. package/dist/server/plugins/pluginBackendChannelProxyAdmission.js +1 -1
  102. package/dist/server/plugins/pluginBackendChannelProxyAdmission.js.map +1 -1
  103. package/dist/server/plugins/pluginBackendChannelProxyRoutes.js +40 -42
  104. package/dist/server/plugins/pluginBackendChannelProxyRoutes.js.map +1 -1
  105. package/dist/server/plugins/pluginBackendProxyRoutes.js +40 -44
  106. package/dist/server/plugins/pluginBackendProxyRoutes.js.map +1 -1
  107. package/dist/server/plugins/pluginBackendRegistry.js +66 -35
  108. package/dist/server/plugins/pluginBackendRegistry.js.map +1 -1
  109. package/dist/server/plugins/projectPluginSettings.js +95 -0
  110. package/dist/server/plugins/projectPluginSettings.js.map +1 -0
  111. package/dist/server/plugins/serverPluginCatalogCapability.js +106 -0
  112. package/dist/server/plugins/serverPluginCatalogCapability.js.map +1 -0
  113. package/dist/server/plugins/serverPluginRuntime.js +47 -11
  114. package/dist/server/plugins/serverPluginRuntime.js.map +1 -1
  115. package/dist/server/projectTrustRoutes.js +1 -1
  116. package/dist/server/projectTrustRoutes.js.map +1 -1
  117. package/dist/server/projects/projectLifecycleService.js +17 -7
  118. package/dist/server/projects/projectLifecycleService.js.map +1 -1
  119. package/dist/server/realtime/sessionEventHub.js +22 -9
  120. package/dist/server/realtime/sessionEventHub.js.map +1 -1
  121. package/dist/server/sessiond/agentHttpDispatcher.js +1 -1
  122. package/dist/server/sessiond/agentHttpDispatcher.js.map +1 -1
  123. package/dist/server/sessiond/autoInstallPiPackages.js +3 -3
  124. package/dist/server/sessiond/pluginBackendChannelRoutes.js +27 -14
  125. package/dist/server/sessiond/pluginBackendChannelRoutes.js.map +1 -1
  126. package/dist/server/sessiond/pluginBackendRoutes.js +56 -49
  127. package/dist/server/sessiond/pluginBackendRoutes.js.map +1 -1
  128. package/dist/server/sessiond/pluginCatalogRoutes.js +41 -0
  129. package/dist/server/sessiond/pluginCatalogRoutes.js.map +1 -0
  130. package/dist/server/sessiond/sessionProxyRoutes.js +46 -1
  131. package/dist/server/sessiond/sessionProxyRoutes.js.map +1 -1
  132. package/dist/server/sessiond/sessionServiceDependencies.js +1 -0
  133. package/dist/server/sessiond/sessionServiceDependencies.js.map +1 -1
  134. package/dist/server/sessiond/workspaceCatalogRoutes.js +6 -2
  135. package/dist/server/sessiond/workspaceCatalogRoutes.js.map +1 -1
  136. package/dist/server/sessiond/workspaceNotificationRoutes.js +55 -0
  137. package/dist/server/sessiond/workspaceNotificationRoutes.js.map +1 -0
  138. package/dist/server/sessiond.js +58 -8
  139. package/dist/server/sessiond.js.map +1 -1
  140. package/dist/server/sessions/askUserDomain.js +232 -0
  141. package/dist/server/sessions/askUserDomain.js.map +1 -0
  142. package/dist/server/sessions/askUserTool.js +18 -18
  143. package/dist/server/sessions/askUserTool.js.map +1 -1
  144. package/dist/server/sessions/attachmentService.js +1 -1
  145. package/dist/server/sessions/attachmentService.js.map +1 -1
  146. package/dist/server/sessions/authRoutes.js +12 -0
  147. package/dist/server/sessions/authRoutes.js.map +1 -1
  148. package/dist/server/sessions/authService.js +11 -1
  149. package/dist/server/sessions/authService.js.map +1 -1
  150. package/dist/server/sessions/builtinExtensionFactories.js +36 -0
  151. package/dist/server/sessions/builtinExtensionFactories.js.map +1 -0
  152. package/dist/server/sessions/companionBackend.js +286 -0
  153. package/dist/server/sessions/companionBackend.js.map +1 -0
  154. package/dist/server/sessions/dockerEnvironmentFacts.js +16 -1
  155. package/dist/server/sessions/dockerEnvironmentFacts.js.map +1 -1
  156. package/dist/server/sessions/extensionSessionDispatch.js +76 -0
  157. package/dist/server/sessions/extensionSessionDispatch.js.map +1 -0
  158. package/dist/server/sessions/globalProviderPolicy.js +88 -19
  159. package/dist/server/sessions/globalProviderPolicy.js.map +1 -1
  160. package/dist/server/sessions/managementAgentTools.js +2 -2
  161. package/dist/server/sessions/managementAgentTools.js.map +1 -1
  162. package/dist/server/sessions/mcpAuthFlowService.js +289 -0
  163. package/dist/server/sessions/mcpAuthFlowService.js.map +1 -0
  164. package/dist/server/sessions/mcpAuthRoutes.js +104 -0
  165. package/dist/server/sessions/mcpAuthRoutes.js.map +1 -0
  166. package/dist/server/sessions/mcpOAuthCredentialAdapter.js +92 -0
  167. package/dist/server/sessions/mcpOAuthCredentialAdapter.js.map +1 -0
  168. package/dist/server/sessions/messageHistoryTarget.js +79 -0
  169. package/dist/server/sessions/messageHistoryTarget.js.map +1 -0
  170. package/dist/server/sessions/piSessionEventConnections.js +5 -2
  171. package/dist/server/sessions/piSessionEventConnections.js.map +1 -1
  172. package/dist/server/sessions/piSessionManagerGateway.js +32 -27
  173. package/dist/server/sessions/piSessionManagerGateway.js.map +1 -1
  174. package/dist/server/sessions/piSessionService.js +1296 -341
  175. package/dist/server/sessions/piSessionService.js.map +1 -1
  176. package/dist/server/sessions/plainTextTheme.js +1 -1
  177. package/dist/server/sessions/plainTextTheme.js.map +1 -1
  178. package/dist/server/sessions/projectAuthService.js +1 -1
  179. package/dist/server/sessions/projectAuthService.js.map +1 -1
  180. package/dist/server/sessions/projectSettingsScope.js +1 -1
  181. package/dist/server/sessions/projectSettingsScope.js.map +1 -1
  182. package/dist/server/sessions/projectTrust.js +1 -1
  183. package/dist/server/sessions/projectTrust.js.map +1 -1
  184. package/dist/server/sessions/queuedMessageMutation.js +170 -0
  185. package/dist/server/sessions/queuedMessageMutation.js.map +1 -0
  186. package/dist/server/sessions/relaySkill.js +57 -7
  187. package/dist/server/sessions/relaySkill.js.map +1 -1
  188. package/dist/server/sessions/sessionArchiveMapping.js +6 -0
  189. package/dist/server/sessions/sessionArchiveMapping.js.map +1 -1
  190. package/dist/server/sessions/sessionArchiveStore.js +5 -1
  191. package/dist/server/sessions/sessionArchiveStore.js.map +1 -1
  192. package/dist/server/sessions/sessionArchiveTree.js +2 -2
  193. package/dist/server/sessions/sessionArchiveTree.js.map +1 -1
  194. package/dist/server/sessions/sessionCommandService.js +11 -24
  195. package/dist/server/sessions/sessionCommandService.js.map +1 -1
  196. package/dist/server/sessions/sessionImageDimensions.js +31 -0
  197. package/dist/server/sessions/sessionImageDimensions.js.map +1 -0
  198. package/dist/server/sessions/sessionMediaIndex.js +191 -0
  199. package/dist/server/sessions/sessionMediaIndex.js.map +1 -0
  200. package/dist/server/sessions/sessionMetadata.js +51 -0
  201. package/dist/server/sessions/sessionMetadata.js.map +1 -0
  202. package/dist/server/sessions/sessionModelScope.js +2 -2
  203. package/dist/server/sessions/sessionModelScope.js.map +1 -1
  204. package/dist/server/sessions/sessionNameGenerator.js +13 -33
  205. package/dist/server/sessions/sessionNameGenerator.js.map +1 -1
  206. package/dist/server/sessions/sessionReadAccess.js +41 -0
  207. package/dist/server/sessions/sessionReadAccess.js.map +1 -0
  208. package/dist/server/sessions/sessionRoutes.js +61 -6
  209. package/dist/server/sessions/sessionRoutes.js.map +1 -1
  210. package/dist/server/sessions/sessionSummaryScanner.js +62 -5
  211. package/dist/server/sessions/sessionSummaryScanner.js.map +1 -1
  212. package/dist/server/sessions/sessionUiEvents.js +17 -4
  213. package/dist/server/sessions/sessionUiEvents.js.map +1 -1
  214. package/dist/server/sessions/spawnSessionTool.js +11 -3
  215. package/dist/server/sessions/spawnSessionTool.js.map +1 -1
  216. package/dist/server/sessions/spawnSubsessionTool.js +35 -19
  217. package/dist/server/sessions/spawnSubsessionTool.js.map +1 -1
  218. package/dist/server/sessions/subsessionCompletionDelivery.js +15 -0
  219. package/dist/server/sessions/subsessionCompletionDelivery.js.map +1 -0
  220. package/dist/server/sessions/subsessionCompletionInbox.js +134 -0
  221. package/dist/server/sessions/subsessionCompletionInbox.js.map +1 -0
  222. package/dist/server/sessions/subsessionProvenance.js +27 -0
  223. package/dist/server/sessions/subsessionProvenance.js.map +1 -0
  224. package/dist/server/sessions/transcriptMarkdown.js +48 -0
  225. package/dist/server/sessions/transcriptMarkdown.js.map +1 -0
  226. package/dist/server/sessions/transcriptMessages.js +3 -0
  227. package/dist/server/sessions/transcriptMessages.js.map +1 -1
  228. package/dist/server/startupLogger.js +13 -0
  229. package/dist/server/startupLogger.js.map +1 -0
  230. package/dist/server/startupUrls.js +27 -0
  231. package/dist/server/startupUrls.js.map +1 -0
  232. package/dist/server/status/machineStatusService.js +15 -9
  233. package/dist/server/status/machineStatusService.js.map +1 -1
  234. package/dist/server/storage/navigationPreferenceStore.js +138 -0
  235. package/dist/server/storage/navigationPreferenceStore.js.map +1 -0
  236. package/dist/server/webSocketBridge.js +9 -0
  237. package/dist/server/webSocketBridge.js.map +1 -1
  238. package/dist/server/workbench/skillSync.js +1 -1
  239. package/dist/server/workbench/skillSync.js.map +1 -1
  240. package/dist/server/workbench/workbenchTools.js +2 -2
  241. package/dist/server/workbench/workbenchTools.js.map +1 -1
  242. package/dist/server/workspaces/filePreviewService.js +5 -2
  243. package/dist/server/workspaces/filePreviewService.js.map +1 -1
  244. package/dist/server/workspaces/projectPiWebConfig.js +87 -6
  245. package/dist/server/workspaces/projectPiWebConfig.js.map +1 -1
  246. package/dist/server/workspaces/workspaceChangeNotifier.js +12 -0
  247. package/dist/server/workspaces/workspaceChangeNotifier.js.map +1 -0
  248. package/dist/server/workspaces/workspaceNotificationCommand.js +64 -0
  249. package/dist/server/workspaces/workspaceNotificationCommand.js.map +1 -0
  250. package/dist/server/workspaces/workspaceProviderRegistry.js +53 -0
  251. package/dist/server/workspaces/workspaceProviderRegistry.js.map +1 -1
  252. package/dist/server-plugin-api.d.ts +83 -15
  253. package/dist/server-plugin-api.js +25 -0
  254. package/dist/server-plugin-api.js.map +1 -1
  255. package/dist/sessiond/sessionDaemonClient.js +27 -3
  256. package/dist/sessiond/sessionDaemonClient.js.map +1 -1
  257. package/dist/shared/apiTypes.js +3 -2
  258. package/dist/shared/apiTypes.js.map +1 -1
  259. package/dist/shared/capabilities.js +3 -0
  260. package/dist/shared/capabilities.js.map +1 -1
  261. package/dist/shared/federatedRoutes.js +25 -5
  262. package/dist/shared/federatedRoutes.js.map +1 -1
  263. package/dist/shared/machineStatus.js +11 -2
  264. package/dist/shared/machineStatus.js.map +1 -1
  265. package/dist/shared/navigationPreferences.js +6 -0
  266. package/dist/shared/navigationPreferences.js.map +1 -0
  267. package/dist/shared/piWebConfigParsing.js +54 -0
  268. package/dist/shared/piWebConfigParsing.js.map +1 -1
  269. package/dist/shared/pluginApiTypes.d.ts +55 -0
  270. package/dist/shared/pluginBackendProtocol.js +56 -1
  271. package/dist/shared/pluginBackendProtocol.js.map +1 -1
  272. package/dist/shared/pluginCatalogTypes.d.ts +49 -0
  273. package/dist/shared/pluginCatalogTypes.js +156 -0
  274. package/dist/shared/pluginCatalogTypes.js.map +1 -0
  275. package/dist/shared/sessionMedia.js +12 -0
  276. package/dist/shared/sessionMedia.js.map +1 -0
  277. package/dist/shared/streamingBehavior.js +8 -0
  278. package/dist/shared/streamingBehavior.js.map +1 -0
  279. package/dist/shared/themePreference.js +24 -0
  280. package/dist/shared/themePreference.js.map +1 -0
  281. package/dist/workspaceNotificationCli.js +95 -0
  282. package/dist/workspaceNotificationCli.js.map +1 -0
  283. package/docs/README.md +31 -0
  284. package/docs/config.md +77 -4
  285. package/docs/plugins.md +60 -11
  286. package/examples/session-bridge-plugin/package.json +2 -2
  287. package/examples/session-bridge-plugin/src/browser/index.ts +1 -1
  288. package/examples/session-bridge-plugin/src/companion.ts +1 -1
  289. package/extensions/pi-web.ts +3 -1
  290. package/package.json +46 -34
  291. package/skills/README.md +10 -9
  292. package/skills/relay/SKILL.md +24 -68
  293. package/skills/relay-runner/SKILL.md +40 -219
  294. package/dist/client/assets/PiWebApp-CN3g7SqA.js +0 -4362
  295. package/dist/client/assets/external-DUGCSDhZ.js +0 -2
  296. package/dist/client/assets/index-JduZlbIF.js +0 -2
  297. package/dist/client/assets/vendor-editor-core-YWog6mAR.js +0 -10
  298. package/dist/server/sessions/pendingAskStore.js +0 -275
  299. package/dist/server/sessions/pendingAskStore.js.map +0 -1
@@ -1,4 +1,126 @@
1
1
  {
2
+ "ui.settingsDialog.machineConnected": "已连接",
3
+ "ui.settingsDialog.machineUnchecked": "尚未检查连接",
4
+ "ui.settingsDialog.machineUnavailable": "不可用",
5
+ "ui.settingsDialog.configureMachine": "配置机器",
6
+ "ui.settingsDialog.thisGateway": "(当前网关)",
7
+ "ui.settingsDialog.machineScopeTitle": "哪些设置会改变?",
8
+ "ui.settingsDialog.machineScope": "代理权限、包、插件、文件访问和上传设置作用于此机器。网关设置、默认主题和键盘快捷键仍保存在当前服务器。浏览器主题、工作区和会话保持不变。",
9
+ "ui.settingsDialog.machineUnavailableMessage": "此机器不可用。",
10
+ "ui.settingsDialog.checkMachineConnection": "请检查机器连接,然后刷新设置。",
11
+ "ui.settingsDialog.unsavedMachineSettings": "机器设置尚未保存",
12
+ "ui.settingsDialog.confirmMachineSwitch": "{current} 的文件访问或上传设置尚未保存。是否放弃修改并配置 {next}?",
13
+ "ui.settingsDialog.discardAndSwitch": "放弃修改并切换",
14
+ "ui.settingsDialog.keepEditing": "继续编辑",
15
+ "ui.settingsDialog.pluginSettingsSaved": "已保存 {machine} 的插件设置。",
16
+ "ui.settingsDialog.keyboardSaved": "键盘设置已保存。",
17
+ "ui.settingsDialog.gatewaySaved": "网关设置已保存。地址变更需重启 Web 服务后生效。",
18
+ "ui.settingsDialog.fileSettingsSaved": "已保存 {machine} 的文件访问和上传设置。",
19
+ "ui.settingsGeneralPanel.gatewayUnavailable": "网关配置不可用,请重新加载设置后重试。",
20
+ "ui.settingsGeneralPanel.hostList": "主机列表",
21
+ "ui.settingsGeneralPanel.unsavedChanges": "有未保存的修改",
22
+ "ui.settingsPluginsPanel.requiredLabel": "{id} 为必需插件",
23
+ "ui.settingsPluginsPanel.enableLabel": "启用 {id}",
24
+ "ui.settingsPluginsPanel.checkSafeMode": "检查安全启动模式",
25
+ "ui.settingsPluginsPanel.bundledOnly": "仅加载内置服务端插件启动",
26
+ "ui.settingsPluginsPanel.noServerPlugins": "不加载服务端插件启动(包括终端)",
27
+ "ui.settingsPluginsPanel.clearSafeMode": "清除安全启动模式并正常启动",
28
+ "ui.settingsShortcutsPanel.unavailable": "快捷键设置不可用,请重新加载设置后重试。",
29
+ "ui.settingsShortcutsPanel.shortcutFor": "{title} 的快捷键",
30
+ "ui.settingsShortcutsPanel.saveFor": "保存 {title} 的快捷键",
31
+ "ui.settingsShortcutsPanel.cancelRecordingFor": "取消录制 {title} 的快捷键",
32
+ "ui.settingsShortcutsPanel.recordFor": "录制 {title} 的快捷键",
33
+ "ui.settingsShortcutsPanel.disableFor": "禁用 {title} 的快捷键",
34
+ "ui.settingsShortcutsPanel.restoreFor": "恢复 {title} 的默认快捷键",
35
+ "ui.settingsShortcutsPanel.saveFailed": "无法保存快捷键。{error}",
36
+ "ui.errorBanner.retry": "重试",
37
+ "bundled.updates.updatePiWeb": "更新 PI WEB",
38
+ "bundled.updates.confirmationAndSafeExecution": "运行推荐命令。更新需要在终端确认,可能中断活动会话;若此终端无法安全执行更新,CLI 会给出后续指引。",
39
+ "ui.settingsPackagesPanel.findCommunityPlugins": "查找社区插件",
40
+ "ui.promptEditor.attachmentSource": "附件来源",
41
+ "ui.promptEditor.chooseFromPhotoLibrary": "从照片图库选择",
42
+ "ui.promptEditor.photos": "照片",
43
+ "ui.promptEditor.takePhoto": "拍摄新照片",
44
+ "ui.promptEditor.camera": "相机",
45
+ "ui.promptEditor.browseFiles": "浏览文档及其他文件",
46
+ "ui.promptEditor.files": "文件",
47
+ "ui.promptEditor.sendMessage": "发送消息",
48
+ "ui.promptEditor.attachmentDelivery": "附件投递方式",
49
+ "ui.queuedMessages.unavailable": "当前运行时无法操作单条排队消息。",
50
+ "ui.queuedMessages.clearQueue": "清空队列",
51
+ "ui.queuedMessages.clearTitle": "清除排队消息,不停止当前工作",
52
+ "ui.queuedMessages.steer": "引导",
53
+ "ui.queuedMessages.queue": "后续",
54
+ "ui.queuedMessages.attachmentsTitle": "这条排队消息包含的附件",
55
+ "ui.queuedMessages.copy": "复制排队消息",
56
+ "ui.queuedMessages.copyTitle": "复制消息",
57
+ "ui.queuedMessages.switchToQueueTitle": "移到后续队列末尾",
58
+ "ui.queuedMessages.switchToSteerTitle": "移到引导队列末尾",
59
+ "ui.queuedMessages.switchToQueue": "改为后续",
60
+ "ui.queuedMessages.switchToSteer": "改为引导",
61
+ "ui.queuedMessages.recall": "撤回排队消息",
62
+ "ui.queuedMessages.recallTitle": "撤回这条消息的文本并清除后续排队消息",
63
+ "ui.queuedMessages.remove": "移除排队消息",
64
+ "ui.queuedMessages.removeTitle": "仅移除这条消息",
65
+ "ui.queuedMessages.copyFailed": "无法复制消息",
66
+ "ui.chatView.activityDetail": "{label}:{detail}",
67
+ "client.sessionController.queueContextChanged": "结果返回前会话上下文已改变,已保留当前草稿。",
68
+ "client.sessionController.queueResponseMismatch": "队列响应不属于原会话。",
69
+ "client.sessionController.queueActionsUnavailable": "排队消息操作已不可用。",
70
+ "client.queuedMessageActions.attachment": "1 个附件",
71
+ "client.queuedMessageActions.attachments": "{count} 个附件",
72
+ "client.queuedMessageActions.attachmentsUnknown": "附件",
73
+ "client.queuedMessageActions.recallAttachments": "撤回这条消息?仅文本会回到输入框,附件将丢失。",
74
+ "client.queuedMessageActions.recall": "撤回这条消息?",
75
+ "client.queuedMessageActions.laterSteer": "1 条后续引导消息",
76
+ "client.queuedMessageActions.laterSteers": "{count} 条后续引导消息",
77
+ "client.queuedMessageActions.queuedFollowUp": "1 条排队的后续消息",
78
+ "client.queuedMessageActions.queuedFollowUps": "{count} 条排队的后续消息",
79
+ "client.queuedMessageActions.removesLater": "同时会移除{messages}。",
80
+ "client.queuedMessageActions.and": "和",
81
+ "ui.settingsShortcutsPanel.sendBehavior": "发送行为",
82
+ "ui.settingsShortcutsPanel.sendWhileRunning": "代理运行时发送",
83
+ "ui.settingsShortcutsPanel.steerDefault": "引导(默认)",
84
+ "ui.settingsShortcutsPanel.followUp": "后续",
85
+ "ui.piWebApp.confirmRecallDraft": "撤回消息将替换尚未发送的草稿,是否继续?",
86
+ "ui.piWebApp.confirmGoBackDraft": "回到此处将替换尚未发送的草稿,是否继续?",
87
+ "ui.piWebApp.draftActionInProgress": "另一项替换草稿的操作正在进行。",
88
+ "ui.formattedText.codeBlockControls": "代码块操作",
89
+ "ui.formattedText.rawSource": "原始源码",
90
+ "ui.codeHighlight.highlighted": "语法高亮",
91
+ "ui.mermaid.diagram": "图表",
92
+ "images.attached": "附件图片",
93
+ "images.loadingDisabled": "图片加载已禁用",
94
+ "images.unavailable": "图片不可用",
95
+ "images.show": "显示图片",
96
+ "images.enlarge": "放大{description}",
97
+ "images.image": "图片",
98
+ "images.enlargeHint": "点击放大",
99
+ "images.preview": "图片预览",
100
+ "images.position": "第{index}张,共{total}张",
101
+ "images.close": "关闭图片",
102
+ "images.previousLabel": "上一张图片",
103
+ "images.nextLabel": "下一张图片",
104
+ "images.previous": "上一张",
105
+ "images.next": "下一张",
106
+ "images.code.copy": "复制代码块",
107
+ "images.code.controls": "代码块操作",
108
+ "ui.chatView.chatNavigation": "聊天导航",
109
+ "ui.chatView.jumpToTop": "跳到开头",
110
+ "ui.chatView.jumpToEnd": "跳到末尾",
111
+ "ui.chatView.followingLiveJumpToEnd": "正在跟随实时输出,跳到末尾",
112
+ "ui.chatView.jumpToEndAndFollowLive": "跳到末尾并跟随实时输出",
113
+ "ui.chatView.followingDisabled": "自动跟随已禁用",
114
+ "ui.chatView.followingLive": "正在跟随实时输出",
115
+ "ui.chatView.followingPaused": "实时跟随已暂停",
116
+ "ui.chatView.toolImageDescription": "{tool}图片,第{index}张,共{count}张",
117
+ "ui.chatView.imageSources": "来源({count})",
118
+ "ui.chatView.imageOutput": "输出{index}",
119
+ "ui.chatView.messageInformation": "消息信息",
120
+ "ui.chatView.loadedSkill": "已加载{name}",
121
+ "ui.chatView.readSkillPath": "读取{path}",
122
+ "ui.chatView.toolResult": "{toolName}结果",
123
+ "ui.chatView.toolResultFailed": " · 失败",
2
124
  "ui.settingsGeneralPanel.settingsScope": "网关服务器字段用于编辑当前本地网关;文件访问和上传默认值用于编辑 {machine}。",
3
125
  "ui.settingsGeneralPanel.allowedHostsHint": "每行输入一个主机名,或选择“允许所有主机名”写入 true。",
4
126
  "ui.settingsGeneralPanel.fileSettingsScope": "外部文件系统根目录和上传默认值会保存到 {machine}。",
@@ -13,6 +135,11 @@
13
135
  "ui.settingsPackagesPanel.noPackages": "{machine} 的 Pi 设置中尚未配置 Pi 包。",
14
136
  "ui.piPackageSettings.targetSuffix": "({name})",
15
137
  "ui.askUserCard.answeredCount": "已回答 {count}/{total}",
138
+ "ui.askUserCard.skipQuestions": "跳过问题",
139
+ "ui.askUserCard.closedQuestions": "已关闭 · {count} 个问题",
140
+ "ui.askUserCard.multipleChoicesAllowed": "可选择多项",
141
+ "ui.askUserCard.questionsSkipped": "已跳过问题",
142
+ "ui.askUserCard.answers": "回答",
16
143
  "ui.authDialog.credentialDestination": "将 API key 存入{scope}的 auth.json",
17
144
  "ui.authDialog.apiKeyInstructions": "输入 {provider} 的 API key。它会保存到{scope}的凭据文件。",
18
145
  "ui.chatView.queuedDialogCount": "另有 {count} 个扩展对话框正在排队",
@@ -458,6 +585,7 @@
458
585
  "ui.chatView.copied": "已复制",
459
586
  "ui.chatView.copyMessage": "复制消息",
460
587
  "ui.chatView.messageActions": "消息操作",
588
+ "ui.messageActions.clipboardFailed": "无法复制消息到剪贴板。",
461
589
  "ui.chatView.startOfSession": "会话开始",
462
590
  "ui.chatView.scrollUpToLoadEarlierMessages": "向上滚动以加载较早消息",
463
591
  "ui.chatView.loadEarlierMessages": "加载较早消息",
@@ -548,6 +676,7 @@
548
676
  "ui.sessionList.visible": "· 可见",
549
677
  "ui.sessionList.selected": "已选",
550
678
  "ui.sessionList.clearSelection": "清除所选",
679
+ "ui.sessionList.clearSelectedCount": "清除所选({count})",
551
680
  "ui.sessionList.selectVisible": "选择可见",
552
681
  "ui.sessionList.permanentlyDeleteSelectedArchivedSessions": "永久删除所选已归档会话",
553
682
  "ui.sessionList.markRead": "标记已读",
@@ -614,6 +743,9 @@
614
743
  "ui.promptEditor.regularFilesAreSavedToTheWorkspaceAnd": "普通文件会保存到工作区并通过引用提及",
615
744
  "ui.promptEditor.howAttachmentsAreSentToTheAgent": "附件发送给代理的方式",
616
745
  "ui.promptEditor.remove": "移除 {name}",
746
+ "ui.promptEditor.pendingPluginContext": "待发送的插件上下文",
747
+ "ui.promptEditor.contextKeptForRetry": "消息未提交,上下文已保留,可重试。",
748
+ "ui.promptEditor.messageNotSubmitted": "消息未提交:{error}",
617
749
  "ui.promptEditor.removeAttachment": "移除附件",
618
750
  "ui.promptEditor.pendingAttachments": "待发送附件",
619
751
  "ui.promptEditor.thinkingLevel": "思考级别:{thinkingLevel}",
@@ -787,7 +919,7 @@
787
919
  "ui.settingsShortcutsPanel.enterInsertsNewline": "Enter 插入新行",
788
920
  "ui.settingsShortcutsPanel.enterSendsChatMessagesShiftEnterInsertsA": "Enter 发送聊天消息;支持时 Shift+Enter 插入新行。",
789
921
  "ui.settingsShortcutsPanel.enterSendsMessages": "Enter 发送消息",
790
- "ui.settingsShortcutsPanel.enterSendsOnDesktopEnterInsertsANewline": "桌面环境按 Enter 发送;移动设备、粗略指针或窄屏环境按 Enter 换行。",
922
+ "ui.settingsShortcutsPanel.enterSendsOnDesktopEnterInsertsANewline": "宽屏环境按 Enter 发送;视口宽度不超过 760px 时按 Enter 换行。",
791
923
  "ui.settingsShortcutsPanel.autoDefault": "自动/默认",
792
924
  "ui.settingsSessiondPanel.piWebCannotCompareTheDesiredProfileWith": "PI WEB 无法比较期望配置档案与正在运行的会话守护进程配置档案。请在守护进程可用后重新加载。",
793
925
  "ui.settingsSessiondPanel.unableToGetTheActivePiCompatibleAgent": "无法获取 {targetLabel} 上当前生效的 Pi 兼容代理配置档案",
@@ -998,5 +1130,123 @@
998
1130
  "ui.appContextBar.machines": "机器",
999
1131
  "ui.appContextBar.machineOpenMachineSelection": "机器:{machineLabel}。打开机器选择。",
1000
1132
  "ui.appContextBar.location": "位置",
1001
- "ui.appContextBar.currentLocation": "当前位置"
1133
+ "ui.appContextBar.currentLocation": "当前位置",
1134
+ "ui.settingsThemePanel.title": "主题",
1135
+ "ui.settingsThemePanel.scope": "选择此浏览器使用的主题,或保存网关默认主题。",
1136
+ "ui.settingsThemePanel.local": "正在使用此浏览器保存的主题",
1137
+ "ui.settingsThemePanel.default": "正在使用默认主题",
1138
+ "ui.settingsThemePanel.systemSuffix": " · 跟随系统外观",
1139
+ "ui.settingsThemePanel.unavailableHelp": "此主题不可用。请选择可用主题,或启用提供该主题的插件。",
1140
+ "ui.settingsThemePanel.auto": "跟随系统外观",
1141
+ "ui.settingsThemePanel.autoHelp": "主题支持时,在浅色和深色版本之间切换。",
1142
+ "ui.settingsThemePanel.useLocal": "在此浏览器使用",
1143
+ "ui.settingsThemePanel.setDefault": "设为网关默认主题",
1144
+ "ui.settingsThemePanel.useDefault": "使用默认主题",
1145
+ "ui.settingsThemePanel.scopeHelp": "设置默认主题不会改变已保存的浏览器选择。使用默认主题将移除此浏览器的覆盖。",
1146
+ "ui.settingsThemePanel.current": "当前:{theme}",
1147
+ "ui.settingsThemePanel.defaultName": "默认:{theme}",
1148
+ "ui.settingsThemePanel.unavailable": "{theme}(不可用)",
1149
+ "ui.settingsThemePanel.saveFailed": "无法保存默认主题:{message}",
1150
+ "ui.sessionActivity.title": "最近在另一个实例中活动",
1151
+ "ui.sessionActivity.message": "此会话最近在另一个 PI WEB 实例中活动。请避免在两个实例中同时操作此会话。",
1152
+ "ui.sessionActivity.dismiss": "关闭提示并继续",
1153
+ "ui.chatView.suggestedInput": "建议输入",
1154
+ "ui.chatView.emptyInput": "空输入",
1155
+ "ui.chatView.suggestedInputHint": "替换当前草稿,不会发送。",
1156
+ "ui.chatView.useSuggestedInput": "使用建议输入",
1157
+ "ui.mcp.selectSession": "请选择一个会话以认证 MCP 服务器。",
1158
+ "ui.mcp.signInTitle": "登录 MCP 服务器",
1159
+ "ui.mcp.signOutTitle": "退出 MCP 服务器登录",
1160
+ "ui.mcp.authentication": "MCP 认证",
1161
+ "ui.mcp.authenticationTitle": "MCP {mode}{server}",
1162
+ "ui.mcp.login": "登录",
1163
+ "ui.mcp.logout": "退出登录",
1164
+ "ui.mcp.starting": "正在启动 MCP 认证…",
1165
+ "ui.mcp.approveBrowser": "请在浏览器中批准访问,然后返回此处。",
1166
+ "ui.mcp.openAuthorizationPage": "打开授权页面",
1167
+ "ui.mcp.cancellationWaiting": "已请求取消,正在等待 Pi 结束…",
1168
+ "ui.mcp.operationFinished": "操作已结束",
1169
+ "ui.mcp.waitingForPi": "正在等待 Pi…",
1170
+ "ui.mcp.logoutWarning": "退出登录会移除 Pi 保存的凭据,但不会禁用服务器或撤销提供方的授权。使用这些凭据的其他会话也会受到影响。",
1171
+ "ui.mcp.reusedCredentials": "未请求浏览器授权。Pi 可能复用了已有凭据,请查看下方结果。",
1172
+ "ui.mcp.cancellationWarning": "Pi 可能已经在完成认证。如果先批准授权、后请求取消,凭据可能已保存。",
1173
+ "ui.mcp.redirectFallback": "如果批准后无法加载重定向页面,请复制浏览器地址栏中的完整 URL 并粘贴到下方。",
1174
+ "ui.mcp.authenticationMessages": "认证消息",
1175
+ "ui.mcp.loadServersError": "无法加载 MCP 服务器:{error}",
1176
+ "ui.mcp.openAuthenticationError": "无法打开 MCP 认证:{error}",
1177
+ "ui.mcp.settingsDescription": "管理所选会话中已启用且支持 OAuth 的 MCP 服务器认证。",
1178
+ "ui.mcp.refreshServers": "刷新服务器",
1179
+ "ui.mcp.selectNonarchivedSession": "请选择 {machine} 上未归档的会话以管理 MCP 认证。",
1180
+ "ui.mcp.sessionContext": "会话上下文",
1181
+ "ui.mcp.sessionContextLabel": "MCP 会话上下文",
1182
+ "ui.mcp.machineLabel": "机器:",
1183
+ "ui.mcp.sessionLabel": "会话:",
1184
+ "ui.mcp.workspaceLabel": "工作区:",
1185
+ "ui.mcp.loadingServers": "正在加载 MCP 服务器…",
1186
+ "ui.mcp.noServers": "此会话中没有已启用且支持 OAuth 的 MCP 服务器。",
1187
+ "ui.mcp.serversLabel": "MCP 服务器",
1188
+ "ui.mcp.loginTo": "登录 {server}",
1189
+ "ui.mcp.logoutFrom": "退出 {server} 登录",
1190
+ "ui.mcp.selectedSession": "所选会话",
1191
+ "ui.mcp.loginAction": "MCP 登录",
1192
+ "ui.mcp.loginDescription": "选择所选会话的 MCP 服务器并登录",
1193
+ "ui.mcp.logoutAction": "MCP 退出登录",
1194
+ "ui.mcp.logoutDescription": "移除本地 MCP 凭据,不禁用服务器,也不撤销提供方的授权",
1195
+ "ui.sessionNaming.heading": "会话命名",
1196
+ "ui.sessionNaming.model": "命名模型",
1197
+ "ui.sessionNaming.useSessionModel": "使用会话模型",
1198
+ "ui.sessionNaming.modelHelp": "搜索当前认证上下文中可用的模型,或使用会话模型。",
1199
+ "ui.sessionNaming.modelsLoading": "正在加载命名模型…",
1200
+ "ui.sessionNaming.modelsRetry": "刷新设置后重试,已保存的模型不变。",
1201
+ "ui.sessionNaming.noModels": "没有可用的命名模型。请配置提供商认证后刷新设置。",
1202
+ "ui.sessionNaming.unavailableModel": "已保存的命名模型不可用,请选择其他模型或使用会话模型。",
1203
+ "ui.sessionNaming.maxTokens": "命名 token 预算",
1204
+ "ui.sessionNaming.maxTokensHelp": "请填写正整数,留空使用 24 tokens,不随模型变化。",
1205
+ "ui.sessionNaming.timeout": "命名超时(秒)",
1206
+ "ui.sessionNaming.timeoutHelp": "总超时包含模型加载时间。冷启动的本地引擎可适当延长,留空使用 10 秒。",
1207
+ "ui.sessionNaming.thinkingLevel": "命名思考等级",
1208
+ "ui.sessionNaming.defaultThinking": "默认(minimal)",
1209
+ "ui.sessionNaming.thinkingHelp": "仅影响命名推理。off 会在支持时关闭可选思考,具体取决于模型能力。",
1210
+ "ui.sessionNaming.nextRequestHeading": "下次命名请求",
1211
+ "ui.sessionNaming.nextRequestHelp": "命名设置保存后无需重启,已有名称和正在进行的命名请求不变。",
1212
+ "ui.sessionNaming.timeoutSummary": "命名超时",
1213
+ "ui.sessionNaming.seconds": "{seconds} 秒",
1214
+ "ui.sessionNaming.selectModel": "选择命名模型",
1215
+ "ui.sessionNaming.sessionModelHelp": "使用当前对话的模型生成名称。",
1216
+ "ui.sessionNaming.description": "配置 {targetLabel} 上的代理权限和会话命名。命名变更无需重启,下次命名请求即生效。代理权限变更需重启该机器的会话守护进程,重启会中断活动会话和正在运行的任务。",
1217
+ "ui.sessionNaming.selectProject": "请选择此机器上的项目以加载命名模型。",
1218
+ "ui.sessionNaming.loadModelsError": "无法加载 {machine} 的命名模型:{error}",
1219
+ "ui.sessionNaming.saved": "已保存 {machine} 的会话命名设置。无需重启,下次命名请求即生效;已有名称和正在进行的请求不变。",
1220
+ "ui.sessionNaming.daemonSaved": "已保存 {machine} 的会话守护进程设置。代理权限变更需重启守护进程,重启会中断活动会话。{naming}",
1221
+ "ui.sessionNaming.nextRequest": "命名变更无需重启,下次命名请求即生效。",
1222
+ "ui.navigationOrder.failure": "无法读取或保存导航顺序:{error}",
1223
+ "ui.piWebApp.loadingConversation": "正在加载对话...",
1224
+ "ui.navigation.moveUp": "上移",
1225
+ "ui.navigation.moveDown": "下移",
1226
+ "ui.navigation.recent": "最近会话",
1227
+ "ui.navigation.agentSubsessions": "代理子会话({count})",
1228
+ "ui.navigation.sendingSubsessionMessage": "正在发送子会话消息",
1229
+ "ui.navigation.agentSubsessionsActive": "代理子会话正在运行",
1230
+ "ui.navigation.unreadSubsessionActivity": "子会话有未读活动",
1231
+ "ui.navigation.collapsePanel": "折叠导航面板",
1232
+ "ui.navigation.resizeSection": "调整{section}高度",
1233
+ "ui.navigation.resizeSectionReset": "调整{section}高度。双击或轻点两次以重置。",
1234
+ "ui.navigation.otherMachinesTerminalActive": "其他机器上的终端正在运行",
1235
+ "ui.navigation.otherMachinesActive": "其他机器正在运行",
1236
+ "ui.navigation.otherMachinesUnread": "其他机器上有未读会话",
1237
+ "ui.navigation.machineSwitchStatus": "机器:{name}。{status}。切换机器。",
1238
+ "ui.projectList.projects": "项目",
1239
+ "ui.workspaceList.workspaces": "工作区",
1240
+ "ui.machineDialog.closeAddMachine": "关闭添加机器窗口",
1241
+ "ui.machineDialog.enterMachineName": "请输入机器名称。",
1242
+ "ui.machineDialog.tokenWithoutPrefix": "如果远端机器需要令牌,请粘贴令牌值,不要包含 Bearer 前缀。",
1243
+ "ui.projectDialog.trustCodeWarning": "扩展和包可以在此机器上执行代码。请只信任你了解且可信的项目。",
1244
+ "ui.projectDialog.trustCheckFailed": "无法检查项目信任状态:{error}。请重试以读取现有的信任决定。",
1245
+ "ui.projectDialog.retryTrustCheck": "重试信任检查",
1246
+ "ui.projectDialog.closeAddProject": "关闭添加项目窗口",
1247
+ "ui.projectDialog.localFolders": "本地机器(PI WEB 运行所在机器)上的文件夹。",
1248
+ "ui.projectDialog.remoteFolders": "远端机器 {machineId} 上的文件夹。",
1249
+ "ui.projectDialog.machinePaths": "路径属于此机器,而非浏览器所在设备。",
1250
+ "ui.projectDialog.folderLookupFailed": "无法读取此机器上的文件夹。请检查连接后重试,或直接输入文件夹路径。",
1251
+ "ui.projectDialog.retryFolderLookup": "重新查找文件夹"
1002
1252
  }
@@ -1,4 +1,5 @@
1
1
  {
2
+ "configError.defaultTheme.invalid": "PI WEB 配置 defaultTheme 必须包含限定的 themeId 和布尔值 auto:{source}",
2
3
  "configError.pi.web.config.update.must.include.a.config.object.ec8277": "PI WEB 配置 更新必须包含 config 对象",
3
4
  "configError.pi.web.config.update.must.include.a.config.object.ec8277.selectedMachine": "PI WEB 所选机器配置 更新必须包含 config 对象",
4
5
  "configError.pi.web.config.field.must.be.an.integer.from.1.to.65535.field.2efa42": "PI WEB 配置 {value1} 必须是 1 到 65535 的整数: {value2}",
@@ -168,5 +169,20 @@
168
169
  "configError.field.field.must.be.a.boolean.field.be00df": "{value1} 字段 必须是布尔值: {value2}",
169
170
  "configError.field.field.must.be.a.boolean.field.be00df.selectedMachine": "{value1} 字段 必须是布尔值: {value2}",
170
171
  "configError.field.field.must.be.a.valid.agent.directory.source.agentdirsource.934d85": "{value1} 字段 agentDirSource 必须是有效的代理目录来源",
171
- "configError.field.field.must.be.a.valid.agent.directory.source.agentdirsource.934d85.selectedMachine": "{value1} 字段 agentDirSource 必须是有效的代理目录来源"
172
+ "configError.field.field.must.be.a.valid.agent.directory.source.agentdirsource.934d85.selectedMachine": "{value1} 字段 agentDirSource 必须是有效的代理目录来源",
173
+ "configError.sessionNaming.object": "PI WEB 配置 sessionNaming 必须为对象:{source}",
174
+ "configError.sessionNaming.unknownKey": "PI WEB 配置 sessionNaming 包含未知字段 {key}:{source}",
175
+ "configError.sessionNaming.model": "PI WEB 配置 sessionNaming.model 必须为 provider/model-id,且两部分均非空:{source}",
176
+ "configError.sessionNaming.maxTokens": "PI WEB 配置 sessionNaming.maxTokens 必须为正安全整数:{source}",
177
+ "configError.sessionNaming.thinkingLevel": "PI WEB 配置 sessionNaming.thinkingLevel 必须为有效的思考等级:{source}",
178
+ "configError.sessionNaming.timeoutMs": "PI WEB 配置 sessionNaming.timeoutMs 必须为 1 到 2147483647 之间的整数:{source}",
179
+ "configError.sessionNaming.object.selectedMachine": "所选机器的 sessionNaming 配置必须为对象:{source}",
180
+ "configError.sessionNaming.unknownKey.selectedMachine": "所选机器的 sessionNaming 配置包含未知字段 {key}:{source}",
181
+ "configError.sessionNaming.model.selectedMachine": "所选机器的 sessionNaming.model 配置必须为 provider/model-id,且两部分均非空:{source}",
182
+ "configError.sessionNaming.maxTokens.selectedMachine": "所选机器的 sessionNaming.maxTokens 配置必须为正安全整数:{source}",
183
+ "configError.sessionNaming.thinkingLevel.selectedMachine": "所选机器的 sessionNaming.thinkingLevel 配置必须为有效的思考等级:{source}",
184
+ "configError.sessionNaming.timeoutMs.selectedMachine": "所选机器的 sessionNaming.timeoutMs 配置必须为 1 到 2147483647 之间的整数:{source}",
185
+ "configError.sessionArchive.object": "PI WEB 配置 sessionArchive 必须为对象:{source}",
186
+ "configError.sessionArchive.unknownKey": "PI WEB 配置 sessionArchive 包含未知字段 {key}:{source}",
187
+ "configError.sessionArchive.directory": "PI WEB 配置 sessionArchive.directory 必须为非空路径:{source}"
172
188
  }
@@ -37,5 +37,14 @@
37
37
  "server.files.mainWorkspaceMissing": "找不到项目主工作区",
38
38
  "server.files.invalidCommandResponse": "终端命令运行响应无效",
39
39
  "server.files.inlinePreviewUnsupported": "此文件类型不支持内联预览",
40
- "server.files.previewTooLarge": "文件过大,无法预览(上限 {limit})"
40
+ "server.files.previewTooLarge": "文件过大,无法预览(上限 {limit})",
41
+ "server.files.projectConfigRegular": "PI WEB 项目配置必须是普通文件:{path}",
42
+ "server.files.projectPluginsObject": "PI WEB 项目配置的 plugins 必须是对象:{path}",
43
+ "server.files.projectPluginId": "PI WEB 项目配置的插件 ID 必须符合 {pattern}:{path}",
44
+ "server.files.projectPluginObject": "PI WEB 项目配置的插件条目必须是对象:{path}",
45
+ "server.files.projectPluginEnabled": "PI WEB 项目配置不支持 plugins.{pluginId}.enabled;插件启用状态由全局配置管理:{path}",
46
+ "server.files.pluginSettingsObject": "{label} 必须是 JSON 对象",
47
+ "server.files.pluginSettingsCycle": "{label} 不能包含循环引用",
48
+ "server.files.pluginSettingsSparse": "{label} 不能包含稀疏数组",
49
+ "server.files.pluginSettingsJson": "{label} 只能包含 JSON 值"
41
50
  }
@@ -129,7 +129,7 @@
129
129
  "ui.main.ce9fd54c50a3": "正在处理…",
130
130
  "ui.main.28dc9ba9fe2f": "已信任",
131
131
  "ui.main.272d152c38f6": "选择工作区来使用其工具。",
132
- "ui.main.1ad9b8f6af70": "发送消息 — 触屏或窄屏",
132
+ "ui.main.1ad9b8f6af70": "发送消息 — 窄屏",
133
133
  "ui.main.a6a82014e150": "发送消息 — 桌面",
134
134
  "ui.main.9fffd0fc011d": "仅在消息编辑器内生效的单个组合键。编辑器内优先于全局快捷键。",
135
135
  "ui.main.8bcdd03f7054": "会话历史不可用",
@@ -13,5 +13,6 @@
13
13
  "providerAuth.valueRequired": "必须填写一个值",
14
14
  "providerAuth.invalidSelection": "无效的登录选项",
15
15
  "providerAuth.promptCancelled": "输入请求已取消",
16
- "providerAuth.flowExpired": "登录流程已过期"
16
+ "providerAuth.flowExpired": "登录流程已过期",
17
+ "providerAuth.invalidManagementContext": "管理上下文无效"
17
18
  }
@@ -1,5 +1,23 @@
1
1
  {
2
+ "status.updateReviewCommand": "PI WEB {latestVersion} 已可用{installed}。运行更新命令可查看适用于当前安装的计划并确认。更新可能中断活动会话;若此终端无法安全执行,CLI 会给出后续指引。",
3
+ "startup.ready": "PI WEB 已就绪",
4
+ "startup.local": "本机",
5
+ "startup.open": "访问地址",
6
+ "queueControls.incompatible": "当前 Pi SDK 的队列接口不兼容,无法操作单条排队消息。",
7
+ "queueControls.mutationRequired": "缺少队列操作请求",
8
+ "queueControls.invalidAction": "无效的队列操作",
9
+ "queueControls.invalidIndex": "无效的队列索引",
10
+ "queueControls.invalidExpected": "无效的预期队列",
11
+ "queueControls.changed": "排队消息已改变,请刷新队列后重试",
12
+ "queueControls.mutateAction": "修改排队消息",
13
+ "configError.defaultStreamingBehavior.invalid": "PI WEB 配置 defaultStreamingBehavior 必须为 steer 或 followUp:{source}",
2
14
  "session.authRemoved": "{provider}/{model} 的认证已移除。请使用 /model 选择其他模型。",
15
+ "session.metadataUnsupported": "会话管理器不支持初始化界面元数据",
16
+ "session.initialNameUnsupported": "会话管理器不支持设置初始名称",
17
+ "session.parentReceiptUnavailable": "父会话 {parentSessionId} 暂不可接收子会话结果",
18
+ "session.subsessionCompletionPersistFailed": "无法记录子会话 {sessionId} 的完成结果;该结果仍为未读。修复会话存储后请重试。",
19
+ "session.action.receiveSubsessions": "接收子会话结果",
20
+ "session.action.deliverSubsessions": "投递子会话结果",
3
21
  "workbench.skillDisabled": "该Skill已被管理员停用,请刷新工作台授权后重试。",
4
22
  "workbench.searchLabel": "检索授权能力",
5
23
  "workbench.callLabel": "调用授权能力",
@@ -170,5 +188,69 @@
170
188
  "session.action.changeThinking": "更改思考级别",
171
189
  "session.action.prompt": "发送提示",
172
190
  "session.action.shell": "运行 Shell 命令",
173
- "session.action.notify": "发送子会话通知"
191
+ "session.action.notify": "发送子会话通知",
192
+ "session.compaction.autoCancelled": "自动压缩已取消。",
193
+ "session.compaction.cancelled": "压缩已取消。",
194
+ "session.compaction.failed": "无法压缩历史,请重试。",
195
+ "activity.compactionCancelled": "压缩已取消",
196
+ "session.extensionUnavailable": "此扩展命令所属的会话运行时已不可用",
197
+ "session.extensionNewUnsupported": "PI WEB 不支持 ctx.newSession(),请从网页界面新建会话。",
198
+ "session.extensionSwitchUnsupported": "PI WEB 不支持 ctx.switchSession(),请从网页界面选择会话。",
199
+ "session.checkpointSummary": "保留自定义消息检查点时,不能同时生成分支摘要",
200
+ "session.media.invalidId": "媒体 ID 无效",
201
+ "session.checkpointParent": "此检查点没有有效的历史父节点",
202
+ "session.forkRuntimeChanged": "分叉前会话运行时发生了变化,请从当前会话重试。",
203
+ "session.checkpointUnavailable": "此消息已不在当前会话分支中。",
204
+ "mcpAuth.disposed": "MCP 认证服务已关闭",
205
+ "mcpAuth.sessionAlreadyRunning": "此会话已有 MCP 认证操作正在运行",
206
+ "mcpAuth.machineBusy": "此机器已有 MCP 认证操作正在运行,请等待其结束后重试。",
207
+ "mcpAuth.machineBusyShort": "此机器已有 MCP 认证操作正在运行",
208
+ "mcpAuth.tooManyFlows": "MCP 认证流程过多",
209
+ "mcpAuth.ownerChanged": "MCP 认证的所属会话已失效",
210
+ "mcpAuth.discoveryFailed": "MCP 服务器发现失败",
211
+ "mcpAuth.sessionBusy": "此会话正在运行 MCP 认证操作",
212
+ "mcpAuth.flowNotFound": "找不到 MCP 认证流程",
213
+ "mcpAuth.requestNotPending": "此 MCP 认证请求已不再等待回答",
214
+ "mcpAuth.invalidResponse": "MCP 认证回答无效",
215
+ "mcpAuth.promptPending": "已有 MCP 认证请求正在等待回答",
216
+ "mcpAuth.promptTooLarge": "MCP 认证提示过长",
217
+ "mcpAuth.authUrlTooLarge": "MCP 授权 URL 过长",
218
+ "mcpAuth.authUrlProtocol": "不支持的 MCP 授权 URL 协议",
219
+ "mcpAuth.invalidAuthUrl": "MCP 授权 URL 无效",
220
+ "mcpAuth.discoveryInput": "发现 MCP 服务器时不能请求输入",
221
+ "mcpAuth.server": "MCP 服务器",
222
+ "mcpAuth.chooseServer": "选择 MCP 服务器",
223
+ "mcpAuth.yes": "是",
224
+ "mcpAuth.no": "否",
225
+ "mcpAuth.cwdEmpty": "工作目录不能为空",
226
+ "mcpAuth.invalidMode": "模式必须为 login 或 logout",
227
+ "mcpAuth.requestObject": "请求必须为对象",
228
+ "mcpAuth.unexpectedField": "MCP 认证请求包含未知字段",
229
+ "mcpAuth.invalidIdentifier": "MCP 认证标识无效",
230
+ "mcpAuth.invalidManagementContext": "管理上下文无效",
231
+ "mcpAuth.invalidString": "{field} 必须为不超过 32768 个字符的字符串",
232
+ "mcpAuth.sdkUnsupported": "MCP 专用认证需要 Pi 1.3.0",
233
+ "mcpAuth.restrictedManagement": "受限管理模式不支持 MCP 认证",
234
+ "mcpAuth.builtinUnavailable": "此会话无法使用 Pi 内置的 MCP 命令",
235
+ "mcpAuth.waitForIdle": "请等待当前会话活动结束后再认证 MCP",
236
+ "mcpAuth.workspaceChanged": "MCP 认证会话的工作区已变化",
237
+ "mcpAuth.trustRequired": "MCP 认证需要可信工作区",
238
+ "mcpAuth.tooManyServers": "MCP 认证服务器过多",
239
+ "mcpAuth.descriptionTooLarge": "MCP 服务器描述过长",
240
+ "mcpAuth.waitForIdleListing": "请等待当前会话活动结束后再列出 MCP 服务器",
241
+ "mcpAuth.ineligibleServer": "MCP 认证服务器未知或不符合条件",
242
+ "mcpAuth.sessionNotCurrent": "MCP 认证会话已失效",
243
+ "mcpAuth.noEligibleServers": "此操作没有可用的 MCP 服务器。",
244
+ "mcpAuth.serverNoLongerEligible": "此 MCP 服务器已不再符合认证条件",
245
+ "navigationPreference.managementUnavailable": "管理模式不支持普通导航排序",
246
+ "workspaceNotification.managementDenied": "工作区通知仅适用于普通注册项目",
247
+ "workspaceNotification.invalidInput": "工作区通知必须提供已注册项目 ID 和 pluginId",
248
+ "workspaceNotification.busy": "正在处理的工作区通知过多",
249
+ "workspaceNotification.projectUnavailable": "无法解析工作区通知所属项目",
250
+ "workspaceNotification.evaluationFailed": "无法处理工作区通知",
251
+ "navigationPreference.idsRequired": "导航偏好必须包含 ids 数组",
252
+ "navigationPreference.idsNonEmpty": "导航 ID 必须是非空字符串",
253
+ "navigationPreference.idsUnique": "导航 ID 不得重复",
254
+ "navigationPreference.revisionInvalid": "导航版本号必须是非负安全整数",
255
+ "navigationPreference.conflict": "导航偏好版本冲突"
174
256
  }
package/dist/piAi.js ADDED
@@ -0,0 +1,4 @@
1
+ import { loadPiAi } from "./piRuntime.js";
2
+ const ai = await loadPiAi();
3
+ export const { createAssistantMessageEventStream, getCurrentTools, InMemoryCredentialStore, normalizeContext, modelsAreEqual } = ai;
4
+ //# sourceMappingURL=piAi.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"piAi.js","sourceRoot":"","sources":["../src/piAi.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE1C,MAAM,EAAE,GAAG,MAAM,QAAQ,EAAE,CAAC;AAE5B,MAAM,CAAC,MAAM,EAAE,iCAAiC,EAAE,eAAe,EAAE,uBAAuB,EAAE,gBAAgB,EAAE,cAAc,EAAE,GAAG,EAAE,CAAC"}
@@ -0,0 +1,150 @@
1
+ import { constants } from "node:fs";
2
+ import { access, readFile, realpath } from "node:fs/promises";
3
+ import { createRequire } from "node:module";
4
+ import { delimiter, dirname, join, resolve } from "node:path";
5
+ import { fileURLToPath, pathToFileURL } from "node:url";
6
+ import { resolve as resolveImport } from "import-meta-resolve";
7
+ export const PI_WEB_PI_PACKAGE_DIR_ENV = "PI_WEB_PI_PACKAGE_DIR";
8
+ const SDK_PACKAGE = "@earendil-works/pi-coding-agent";
9
+ async function isSdkPackage(directory) {
10
+ try {
11
+ const manifest = JSON.parse(await readFile(join(directory, "package.json"), "utf8"));
12
+ return typeof manifest === "object" && manifest !== null
13
+ && "name" in manifest && manifest.name === SDK_PACKAGE;
14
+ }
15
+ catch (error) {
16
+ if (error instanceof SyntaxError || (error instanceof Error && "code" in error
17
+ && (error.code === "ENOENT" || error.code === "ENOTDIR")))
18
+ return false;
19
+ throw error;
20
+ }
21
+ }
22
+ async function findSdkAncestor(file) {
23
+ let directory = dirname(file);
24
+ for (;;) {
25
+ if (await isSdkPackage(directory))
26
+ return directory;
27
+ const parent = dirname(directory);
28
+ if (parent === directory)
29
+ return undefined;
30
+ directory = parent;
31
+ }
32
+ }
33
+ /** Prefer an explicit Pi host, then ordinary npm resolution, then the Pi command. */
34
+ export async function selectPiRuntimePackageDir(options = {}) {
35
+ const env = options.env ?? process.env;
36
+ const platform = options.platform ?? process.platform;
37
+ const explicit = env[PI_WEB_PI_PACKAGE_DIR_ENV];
38
+ if (explicit !== undefined) {
39
+ try {
40
+ if (explicit.trim() === "")
41
+ throw new Error("The package directory is empty.");
42
+ // Preserve a supplied symlink: a package manager may retarget it on upgrade.
43
+ const directory = resolve(explicit);
44
+ if (!await isSdkPackage(directory))
45
+ throw new Error(`Expected a package.json named ${SDK_PACKAGE}.`);
46
+ return directory;
47
+ }
48
+ catch (cause) {
49
+ throw new Error(`Invalid ${PI_WEB_PI_PACKAGE_DIR_ENV}=${JSON.stringify(explicit)}. Point it to the hosting Pi npm SDK package root, not a standalone binary.`, { cause });
50
+ }
51
+ }
52
+ let localEntry;
53
+ try {
54
+ localEntry = (options.resolveLocalSdk ?? (() => import.meta.resolve(SDK_PACKAGE)))();
55
+ }
56
+ catch (error) {
57
+ if (!(error instanceof Error && "code" in error && error.code === "ERR_MODULE_NOT_FOUND"))
58
+ throw error;
59
+ }
60
+ if (localEntry !== undefined) {
61
+ const sdk = await findSdkAncestor(fileURLToPath(localEntry));
62
+ if (sdk !== undefined)
63
+ return sdk;
64
+ throw new Error(`The resolved Pi SDK at ${localEntry} has no ${SDK_PACKAGE} package root.`);
65
+ }
66
+ for (const directory of (env["PATH"] ?? "").split(delimiter)) {
67
+ const executable = join(directory, platform === "win32" ? "pi.cmd" : "pi");
68
+ try {
69
+ await access(executable, constants.X_OK);
70
+ }
71
+ catch (error) {
72
+ if (error instanceof Error && "code" in error
73
+ && (error.code === "ENOENT" || error.code === "ENOTDIR" || error.code === "EACCES"))
74
+ continue;
75
+ throw error;
76
+ }
77
+ const sdk = await findSdkAncestor(await realpath(executable));
78
+ if (sdk !== undefined)
79
+ return sdk;
80
+ if (platform === "win32") {
81
+ // npm's Windows command shim is a regular file beside node_modules, not
82
+ // a symlink into the SDK. Use the shim's ordinary Node search paths.
83
+ const requireFromShim = createRequire(await realpath(executable));
84
+ for (const moduleDirectory of requireFromShim.resolve.paths(SDK_PACKAGE) ?? []) {
85
+ const candidate = join(moduleDirectory, SDK_PACKAGE);
86
+ if (await isSdkPackage(candidate))
87
+ return candidate;
88
+ }
89
+ }
90
+ throw new Error(`The pi command at ${JSON.stringify(executable)} does not expose a Pi npm SDK package. Run /pi-web from Pi or set ${PI_WEB_PI_PACKAGE_DIR_ENV} to that installation's SDK package root. PI WEB will not select a different Pi from later on PATH.`);
91
+ }
92
+ throw new Error(`Cannot locate the Pi npm SDK. Run PI WEB from the hosting Pi installation or set ${PI_WEB_PI_PACKAGE_DIR_ENV} to its ${SDK_PACKAGE} package root. Standalone Pi binaries without an SDK package are not supported.`);
93
+ }
94
+ let packageDirPromise;
95
+ let sdkPromise;
96
+ let aiPromise;
97
+ let runtimeDirectoryPromise;
98
+ function selectedPackageDir() {
99
+ // One identity per process. Children and installed services inherit the choice.
100
+ return packageDirPromise ??= selectPiRuntimePackageDir().then((directory) => {
101
+ process.env[PI_WEB_PI_PACKAGE_DIR_ENV] = directory;
102
+ return directory;
103
+ });
104
+ }
105
+ export async function resolvePiRuntimeImport(specifier) {
106
+ const directory = await runtimePackageDir();
107
+ return resolveImport(specifier, pathToFileURL(join(directory, "package.json")).href);
108
+ }
109
+ function runtimePackageDir() {
110
+ // Pin the loaded installation, not a package-manager symlink that can move.
111
+ return runtimeDirectoryPromise ??= selectedPackageDir().then((directory) => realpath(directory));
112
+ }
113
+ /** Identity of the already selected host, including narrowly versioned SDK adapters. */
114
+ export async function piRuntimePackageInfo() {
115
+ const directory = await runtimePackageDir();
116
+ const manifest = JSON.parse(await readFile(join(directory, "package.json"), "utf8"));
117
+ if (typeof manifest !== "object" || manifest === null || !("name" in manifest) || manifest.name !== SDK_PACKAGE
118
+ || !("version" in manifest) || typeof manifest.version !== "string") {
119
+ throw new Error("The selected Pi SDK has an invalid package identity");
120
+ }
121
+ return { directory, version: manifest.version };
122
+ }
123
+ export function loadPiSdk() {
124
+ return sdkPromise ??= resolvePiRuntimeImport(SDK_PACKAGE).then(async (entry) => {
125
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment -- The selected package supplies the public SDK interface used for development types.
126
+ const sdk = await import(entry);
127
+ return sdk;
128
+ });
129
+ }
130
+ export function loadPiAi() {
131
+ return aiPromise ??= resolvePiRuntimeImport("@earendil-works/pi-ai").then(async (entry) => {
132
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment -- Resolve the AI package from the selected SDK, keeping its runtime identity.
133
+ const ai = await import(entry);
134
+ return ai;
135
+ });
136
+ }
137
+ /** The package's declared executable, not a private SDK file layout. */
138
+ export async function piRuntimeCliPath() {
139
+ const directory = await selectedPackageDir();
140
+ const manifest = JSON.parse(await readFile(join(directory, "package.json"), "utf8"));
141
+ if (typeof manifest === "object" && manifest !== null && "bin" in manifest) {
142
+ const bin = manifest.bin;
143
+ const entry = typeof bin === "string" ? bin
144
+ : typeof bin === "object" && bin !== null && "pi" in bin ? bin.pi : undefined;
145
+ if (typeof entry === "string")
146
+ return resolve(directory, entry);
147
+ }
148
+ throw new Error(`The selected Pi package at ${directory} does not declare a pi executable.`);
149
+ }
150
+ //# sourceMappingURL=piRuntime.js.map