@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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pluginCatalogTypes.js","sourceRoot":"","sources":["../../src/shared/pluginCatalogTypes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /** Only a complete, positive pixel pair can establish image geometry. */
2
+ export function validImageDimensions(width, height) {
3
+ return typeof width === "number" && Number.isSafeInteger(width) && width > 0
4
+ && typeof height === "number" && Number.isSafeInteger(height) && height > 0
5
+ ? { width, height } : undefined;
6
+ }
7
+ /** Explicit opt-in keeps older browser clients and remote machines compatible. */
8
+ export const SESSION_MEDIA_MODE = "reference";
9
+ export function isSessionMediaId(value) {
10
+ return typeof value === "string" && /^[0-9a-f]{64}$/u.test(value);
11
+ }
12
+ //# sourceMappingURL=sessionMedia.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sessionMedia.js","sourceRoot":"","sources":["../../src/shared/sessionMedia.ts"],"names":[],"mappings":"AAgBA,yEAAyE;AACzE,MAAM,UAAU,oBAAoB,CAAC,KAAc,EAAE,MAAe;IAClE,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC;WACvE,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC;QAC3E,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;AACpC,CAAC;AAED,kFAAkF;AAClF,MAAM,CAAC,MAAM,kBAAkB,GAAG,WAAW,CAAC;AAE9C,MAAM,UAAU,gBAAgB,CAAC,KAAc;IAC7C,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACpE,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { UserFacingError } from "./i18n.js";
2
+ export function requireDefaultStreamingBehavior(value, source) {
3
+ if (value !== "steer" && value !== "followUp") {
4
+ throw new UserFacingError("configError.defaultStreamingBehavior.invalid", "PI WEB config defaultStreamingBehavior must be steer or followUp: {source}", { source });
5
+ }
6
+ return value;
7
+ }
8
+ //# sourceMappingURL=streamingBehavior.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"streamingBehavior.js","sourceRoot":"","sources":["../../src/shared/streamingBehavior.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAE5C,MAAM,UAAU,+BAA+B,CAAC,KAAc,EAAE,MAAc;IAC5E,IAAI,KAAK,KAAK,OAAO,IAAI,KAAK,KAAK,UAAU,EAAE,CAAC;QAC9C,MAAM,IAAI,eAAe,CAAC,8CAA8C,EAAE,4EAA4E,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;IACtK,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,24 @@
1
+ import { UserFacingError } from "./i18n.js";
2
+ const qualifiedThemeIdPattern = /^[a-z][a-z0-9.-]*:[a-z][a-z0-9.-]*$/u;
3
+ /** Parse data only: theme availability is resolved after browser plugins load. */
4
+ export function parseThemePreference(value) {
5
+ if (!isRecord(value))
6
+ return undefined;
7
+ const record = value;
8
+ const themeId = record["themeId"];
9
+ const auto = record["auto"];
10
+ if (typeof themeId !== "string" || !qualifiedThemeIdPattern.test(themeId) || typeof auto !== "boolean")
11
+ return undefined;
12
+ return { themeId, auto };
13
+ }
14
+ function isRecord(value) {
15
+ return typeof value === "object" && value !== null && !Array.isArray(value);
16
+ }
17
+ export function requireDefaultThemePreference(value, source) {
18
+ const preference = parseThemePreference(value);
19
+ if (preference === undefined) {
20
+ throw new UserFacingError("configError.defaultTheme.invalid", "PI WEB config defaultTheme must contain a qualified themeId and a boolean auto: {source}", { source });
21
+ }
22
+ return preference;
23
+ }
24
+ //# sourceMappingURL=themePreference.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"themePreference.js","sourceRoot":"","sources":["../../src/shared/themePreference.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAE5C,MAAM,uBAAuB,GAAG,sCAAsC,CAAC;AAEvE,kFAAkF;AAClF,MAAM,UAAU,oBAAoB,CAAC,KAAc;IACjD,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IACvC,MAAM,MAAM,GAAG,KAAK,CAAC;IACrB,MAAM,OAAO,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC;IAClC,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;IAC5B,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,OAAO,IAAI,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IACzH,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AAC3B,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC;AAED,MAAM,UAAU,6BAA6B,CAAC,KAAc,EAAE,MAAc;IAC1E,MAAM,UAAU,GAAG,oBAAoB,CAAC,KAAK,CAAC,CAAC;IAC/C,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;QAC7B,MAAM,IAAI,eAAe,CAAC,kCAAkC,EAAE,0FAA0F,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;IACxK,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC"}
@@ -0,0 +1,95 @@
1
+ import { resolve } from "node:path";
2
+ import { fileURLToPath } from "node:url";
3
+ import { isPiWebPluginId } from "./shared/pluginIds.js";
4
+ import { SessionDaemonClient } from "./sessiond/sessionDaemonClient.js";
5
+ const usage = "Usage: pi-web workspaces notify --project <projectId> --plugin <pluginId>";
6
+ const idMaxLength = 512;
7
+ /** These identifiers are opaque; preserve the original value rather than trimming it. */
8
+ export function requireWorkspaceNotificationProjectId(value) {
9
+ if (typeof value !== "string" || value.trim() === "" || value.length > idMaxLength) {
10
+ throw new Error("Workspace notification project id must be non-empty and at most 512 characters");
11
+ }
12
+ return value;
13
+ }
14
+ export function requireWorkspaceNotificationPluginId(value) {
15
+ if (typeof value !== "string" || value.length > idMaxLength || !isPiWebPluginId(value)) {
16
+ throw new Error("Workspace notification plugin id must match a PI WEB plugin id and be at most 512 characters");
17
+ }
18
+ return value;
19
+ }
20
+ /** Failures propagate to the CLI's nonzero exit boundary; integrations own best-effort policy. */
21
+ export async function runWorkspaceNotificationCli(args, dependencies = {}) {
22
+ const target = parseCommand(args);
23
+ if (target === undefined) {
24
+ (dependencies.writeLine ?? console.log)(usage);
25
+ return;
26
+ }
27
+ const client = dependencies.client ?? dependencies.createClient?.(target.daemonOptions) ?? new SessionDaemonClient(target.daemonOptions);
28
+ const response = await client.request("POST", `/workspace-notifications/projects/${encodeURIComponent(target.projectId)}`, { pluginId: target.pluginId }, { signal: AbortSignal.timeout(2_000) });
29
+ if (response.statusCode < 200 || response.statusCode >= 300) {
30
+ const detail = response.body.trim().slice(0, 1024);
31
+ throw new Error(`Workspace notification failed (HTTP ${String(response.statusCode)})${detail === "" ? "" : `: ${detail}`}`);
32
+ }
33
+ }
34
+ function parseCommand(args) {
35
+ if (args.length === 0
36
+ || (args.length === 1 && (args[0] === "help" || isHelp(args[0])))
37
+ || (args.length === 2 && args[0] === "notify" && isHelp(args[1]))) {
38
+ return undefined;
39
+ }
40
+ if (args[0] !== "notify")
41
+ throw new Error(usage);
42
+ const values = new Map();
43
+ for (let index = 1; index < args.length; index += 1) {
44
+ const arg = args[index];
45
+ if (arg === undefined)
46
+ continue;
47
+ const equals = arg.indexOf("=");
48
+ const option = equals === -1 ? arg : arg.slice(0, equals);
49
+ if (option !== "--project" && option !== "--plugin" && option !== "--daemon-url" && option !== "--daemon-socket") {
50
+ throw new Error(`Unknown workspaces notify option: ${arg}`);
51
+ }
52
+ if (values.has(option))
53
+ throw new Error(`Duplicate workspaces notify option: ${option}`);
54
+ const value = equals === -1 ? args[index + 1] : arg.slice(equals + 1);
55
+ if (value === undefined || value === "" || (equals === -1 && value.startsWith("-"))) {
56
+ throw new Error(`${option} requires a value`);
57
+ }
58
+ values.set(option, value);
59
+ if (equals === -1)
60
+ index += 1;
61
+ }
62
+ if (!values.has("--project") || !values.has("--plugin"))
63
+ throw new Error(usage);
64
+ if (values.has("--daemon-url") && values.has("--daemon-socket")) {
65
+ throw new Error("Specify only one of --daemon-url and --daemon-socket");
66
+ }
67
+ const daemonOptions = {};
68
+ const url = values.get("--daemon-url");
69
+ if (url !== undefined) {
70
+ const parsed = new URL(url);
71
+ if (parsed.protocol !== "http:" && parsed.protocol !== "https:")
72
+ throw new Error("--daemon-url requires an HTTP(S) URL");
73
+ daemonOptions.baseUrl = parsed.href;
74
+ }
75
+ const socket = values.get("--daemon-socket");
76
+ if (socket !== undefined)
77
+ daemonOptions.socketPath = socket;
78
+ return {
79
+ projectId: requireWorkspaceNotificationProjectId(values.get("--project")),
80
+ pluginId: requireWorkspaceNotificationPluginId(values.get("--plugin")),
81
+ daemonOptions,
82
+ };
83
+ }
84
+ function isHelp(value) {
85
+ return value === "--help" || value === "-h";
86
+ }
87
+ // Hook invocations use this lightweight entry instead of loading the service
88
+ // installation CLI. Both entrypoints share the same bounded request runner.
89
+ if (process.argv[1] !== undefined && resolve(process.argv[1]) === fileURLToPath(import.meta.url)) {
90
+ runWorkspaceNotificationCli(process.argv.slice(2)).catch((error) => {
91
+ console.error(error instanceof Error ? error.message : String(error));
92
+ process.exitCode = 1;
93
+ });
94
+ }
95
+ //# sourceMappingURL=workspaceNotificationCli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspaceNotificationCli.js","sourceRoot":"","sources":["../src/workspaceNotificationCli.ts"],"names":[],"mappings":"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"}
package/docs/README.md ADDED
@@ -0,0 +1,31 @@
1
+ # 文档导航
2
+
3
+ 本导航的相对链接供仓库检出阅读;npm 包不包含模块架构页,请阅读[仓库主分支文档导航](https://github.com/nayuto-wakusei/pi-web-ChineseTranslation/blob/main/docs/README.md),随包权威参考为 [config.md](config.md) 和 [plugins.md](plugins.md)。
4
+
5
+ 这里是 PI WEB 中文分支的文档入口。系统按 `Machine -> Project -> Workspace -> Session` 组织资源,由浏览器、Web/API 网关与会话守护进程协作;各篇说明对应模块的架构、边界与公开契约。
6
+
7
+ ## 按目的阅读
8
+
9
+ | 目的 | 入口 |
10
+ | --- | --- |
11
+ | 了解产品、安装和使用 | [网站首页](index.html)、[安装](install.html)、[常见问题](faq.html)、[社区插件](community-plugins.html) |
12
+ | 开始维护代码 | [维护约定](maintenance.md)、[维护者上手](getting-started.md) |
13
+ | 理解整体结构与状态归属 | [架构](development/architecture.md) |
14
+ | 查找共享控件和插件样式入口 | [共享 UI 导航](ui-primitives.md)、[插件样式契约](plugins.md#styles-highlighting-and-display) |
15
+ | 查找模块职责与边界 | [项目与工作区](modules/projects-workspaces.md)、[会话](modules/sessions.md)、[认证与模型](modules/auth-models.md)、[文件与终端](modules/files-terminals.md) |
16
+ | 理解跨机器、插件与配置边界 | [机器/API](modules/machines-api.md)、[插件](modules/plugins.md)、[配置维护](modules/configuration.md) |
17
+ | 管理集成与运行维护 | [管理与审计](admin/management-audit.md)、[运维](admin/operations.md) |
18
+ | 查公开使用契约 | [配置参考](config.md)、[插件指南](plugins.md)、[机器联邦](machines.html)、[远端使用](remote-first.html) |
19
+ | 选择验证与交付检查 | [改动联动](development/change-guide.md)、[开发检查](development-checks.md) |
20
+
21
+ ## 目录职责
22
+
23
+ | 位置 | 内容与边界 |
24
+ | --- | --- |
25
+ | `docs/` | 用户指南、配置与插件参考、网站页面、社区插件 npm 发现目录及维护入口。成对的 Markdown/HTML 页面保持契约一致。 |
26
+ | [`development/`](development/) | 全局架构、状态所有权和跨模块改动约束。 |
27
+ | [`modules/`](modules/) | 各领域的职责、协作关系、不变量及少量源码导航。 |
28
+ | [`admin/`](admin/) | 管理权限、审计边界、部署和服务生命周期。 |
29
+ | [`assets/`](assets/) | 网站引用的静态资源,不承载架构或配置权威说明。 |
30
+ | [`superpowers/specs/`](superpowers/specs/) | 历史设计材料,仅供追溯,不代表当前架构。 |
31
+ | [`superpowers/plans/`](superpowers/plans/) | 历史实施计划,不作为当前使用与维护契约。 |
package/docs/config.md CHANGED
@@ -13,6 +13,13 @@
13
13
 
14
14
  Pi 包由目标机器的 `pi install`、`pi remove`、`pi update` 或 **设置 → Pi 包** 管理;PI WEB 的 `plugins` 只控制已发现的纯浏览器、纯服务端与双入口插件的期望状态,不安装、移除或更新包。
15
15
 
16
+ <a id="settings-target-and-drafts"></a>
17
+ ### 设置目标与草稿
18
+
19
+ 普通模式的设置对话框独立持有“配置机器”选择,只改变机器级设置的目标,不切换正在使用的项目、工作区或会话。网关配置、默认主题和快捷键仍属网关,浏览器主题覆盖仍属设备。存在未保存的文件访问或上传草稿时,切换设置机器前需确认放弃或继续编辑;管理模式不开放这套普通跨机器选择器。
20
+
21
+ 通用设置分别持有网关与目标机器草稿:配置刷新只更新未编辑字段,不用其他机器的值重设当前草稿;保存返回的配置确认已提交值后,才结清对应提交,保存期间的新编辑仍保留。快捷键按操作行确认保存值,只清该行已提交且未再改动的草稿;回调结束本身不是保存确认,也不清其他行草稿。
22
+
16
23
  <a id="chinese-language-plugin"></a>
17
24
  ### 中文语言插件
18
25
 
@@ -47,6 +54,42 @@ Pi 包由目标机器的 `pi install`、`pi remove`、`pi update` 或 **设置
47
54
 
48
55
  默认值无需重启,适用于新会话。项目 Pi 设置、显式启动选择及每模型思考设置仍有既定优先级。默认模型必须启用,否则选择首个启用模型。恢复会话保留原模型与思考等级。其他共享 agent 设置(包、扩展、代理等)继续读真实 agent 目录的 `settings.json`。
49
56
 
57
+ <a id="default-theme-and-streaming"></a>
58
+ ## 应用主题与发送默认值
59
+
60
+ `defaultTheme` 是网关配置,形如 `{ "themeId": "plugin-id:theme-id", "auto": true }`:`themeId` 必须为限定贡献 ID,`auto` 必须为布尔值。`auto: true` 在该主题有明暗配对时跟随系统明暗,否则使用所选主题。浏览器设备已保存的主题覆盖优先;主题暂不可用时使用回退,不删除原选择。主题属于整个应用,不保存到当前远端机器;保存/刷新配置后生效,无需重启 daemon。
61
+
62
+ 在 **设置 → 通用 → 主题** 中,“在此设备使用”保存浏览器覆盖,“设为默认”保存网关默认且不覆盖已有设备选择,“使用默认值”清除此浏览器覆盖。Auto 只在主题有明暗配对时跟随设备。
63
+
64
+ 网关 `defaultStreamingBehavior` 为 `"steer"`(默认)或 `"followUp"`,决定流式工作期间编辑器的默认发送方式,不改变已在 daemon 中排队的消息。浏览器分区尺寸、编辑器偏好与普通导航顺序不是新的项目配置文件;导航顺序是按机器管理的托管状态,管理模式不共用普通存储。
65
+
66
+ <a id="session-naming-and-archives"></a>
67
+ ## 会话命名与归档
68
+
69
+ 机器配置 `sessionNaming` 仅接受以下可选字段,不提供项目覆盖。设置保存后用于后续命名请求,无需重启;每次请求固定自己的有效设置,不覆盖用户已命名会话,也不切换聊天模型。
70
+
71
+ | 设置 | 作用范围 | 默认值 | 改变什么 | 生效 / 重启 |
72
+ | --- | --- | --- | --- | --- |
73
+ | `sessionNaming.model` | 机器 | 当前会话模型 | 命名模型,精确 `provider/model-id`;使用原会话普通项目或管理 registry | 后续命名请求;无需重启 |
74
+ | `sessionNaming.maxTokens` | 机器 | `24` | 命名输出 token 上限,正安全整数 | 后续命名请求;无需重启 |
75
+ | `sessionNaming.thinkingLevel` | 机器 | `minimal` | 命名思考等级,须为已知等级;`off` 不发送 reasoning 参数 | 后续命名请求;无需重启 |
76
+ | `sessionNaming.timeoutMs` | 机器 | `10000` | 命名总耗时上限,整数 `1..2147483647` 毫秒 | 后续命名请求;无需重启 |
77
+
78
+ 模型不可用、超时或命名失败时使用首条消息的回退名称;标题语言跟随用户请求。命名设置不把项目凭据切换为全局凭据。
79
+
80
+ <a id="session-archive-directory"></a>
81
+
82
+ `sessionArchive.directory` 选择新归档内容目的地,非空环境变量 `PI_WEB_SESSION_ARCHIVE_DIR` 优先;默认 `$PI_WEB_DATA_DIR/archived-sessions`。配置路径或环境路径相对进程 cwd 解析为绝对路径,daemon 启动后固定,修改需重启 daemon。归档索引仍是 `$PI_WEB_DATA_DIR/archived-sessions.json`,已有记录继续指向原归档文件,不自动迁移。备份时覆盖索引、旧目录与新目的地,不只复制默认目录。
83
+
84
+ <a id="mcp-settings-and-authentication"></a>
85
+ ## MCP 设置与认证
86
+
87
+ **设置 → MCP** 管理所选机器当前非归档会话中已启用、支持 OAuth 的 MCP 服务器认证;先选择可写、空闲且可信的会话。服务器配置由 Pi 的全局/项目设置和信任规则决定,这里不新增 `pi-web` MCP 服务器配置键,也不替代管理模式的 Workbench 受控 MCP 集成。
88
+
89
+ 也可从操作面板选择 MCP 登录/注销,再选择服务器;设置页直接针对所选服务器。两者使用同一独立认证流程,不切到聊天;禁用、header 认证或 stdio 服务器不列为 OAuth 候选,同机器同时只能进行一项 MCP 认证操作。
90
+
91
+ 专用认证仅支持所选 **Pi 1.3.0** 同一 SDK 的内部凭据适配,未知版本不保证兼容。普通项目与管理使用独立私有 MCP 凭据,不回退共享 agent 的 MCP OAuth 存储;完整特权仍是管理身份,受限管理不提供该流程。认证固定原机器、会话、cwd、项目和 scope,切换选择不会转移流程。注销删除对应保存凭据,影响使用该凭据的其他会话,但不禁用服务器或撤销提供方授权。详见[认证与模型](https://github.com/nayuto-wakusei/pi-web-ChineseTranslation/blob/main/docs/modules/auth-models.md#mcp-认证)。
92
+
50
93
  <a id="reverse-proxy-deployment-paths"></a>
51
94
  ## 反向代理部署前缀
52
95
 
@@ -82,6 +125,9 @@ PI WEB 不需要专门的 URL 前缀配置。同一发布产物可用于 `/`、`
82
125
  "uploads": { "defaultFolder": ".pi-web/uploads" },
83
126
  "attachments": { "defaultFolder": ".pi-web/attachments" },
84
127
  "maxUploadBytes": 67108864,
128
+ "sessionArchive": {
129
+ "directory": "/srv/pi-web/archives"
130
+ },
85
131
  "spawnSessions": true,
86
132
  "subsessions": true,
87
133
  "askUser": true,
@@ -108,6 +154,20 @@ PI WEB 不需要专门的 URL 前缀配置。同一发布产物可用于 `/`、`
108
154
 
109
155
  路径根必须是宿主绝对路径或 `~` 前缀,不支持相对根。项目上传/附件目录通过工作区有效配置返回,联邦访问使用目标项目的值;不依赖旧远端可选字段回退。插件可拥有独立文件,如 `.pi-web/tasks.json`。
110
156
 
157
+ <a id="project-plugin-settings"></a>
158
+ ### 项目插件设置
159
+
160
+ 支持项目设置的服务端插件可读取注册项目根目录的 `.pi-web/config.json` 中 `plugins.<id>.settings`,不是各 worktree 独立配置。项目顶层设置键覆盖机器值,嵌套对象整体替换而非深合并;`enabled` 仍只属于机器配置,项目声明会被拒绝。修改服务端插件的全局或项目设置后,手动重启目标 daemon。
161
+
162
+ <a id="git-worktree-discovery-hooks"></a>
163
+ ### Git 工作树发现通知
164
+
165
+ Git 插件的 `plugins.git.settings.workspaceDiscoveryHooks` 为布尔值,默认 `true`,项目值覆盖机器值。支持命名 hooks 的 Git(2.54+)可安装自身命名通知,保留已有 hooks 且不修改 `core.hooksPath`;不支持时仍可按需刷新列表。通知仅提示宿主重新查询当前提供器,不直接注册工作区。修改后重启 daemon,浏览器刷新不能更新 hook 状态。
166
+
167
+ <a id="git-instance-namespace"></a>
168
+
169
+ 多实例可用 daemon 环境变量 `PI_WEB_INSTANCE_NAMESPACE` 区分通知身份:1–32 个字母、数字、下划线或连字符,首字符为字母或数字;生产默认留空,开发实例使用 `dev`。名称应保持稳定;退役旧名称时先在旧名称下禁用发现 hooks 并重启完成清理,再切换名称。不自动接管或迁移其他实例/旧名称的 hook。
170
+
111
171
  <a id="worktree-pre-remove-hook"></a>
112
172
  ## 工作区删除前钩子
113
173
 
@@ -162,8 +222,15 @@ worktree_path="$1"
162
222
  | 扩展对话框超时 | `extensionDialogsTimeoutMs` | — | daemon | 重启 daemon |
163
223
  | 环境事实 | `environmentFacts` | `PI_WEB_ENVIRONMENT_FACTS` | daemon | 重启 daemon |
164
224
  | 插件期望状态 | `plugins.<id>.enabled/settings` | — | 机器 | 浏览器刷新;服务端重启后刷新 |
225
+ | 项目插件设置 | `plugins.<id>.settings` | — | 机器 + 项目 | 支持的服务端插件顶层覆盖;重启 daemon |
226
+ | Git 发现通知 | `plugins.git.settings.workspaceDiscoveryHooks` | — | 机器 + 项目 | 默认 `true`;重启 daemon |
227
+ | Git 通知 namespace | — | `PI_WEB_INSTANCE_NAMESPACE` | daemon | 默认空;开发为 `dev`;重启 daemon |
165
228
  | 插件恢复 | `serverPlugins.safeStart` | — | 机器离线恢复 | 下次 daemon 启动前应用 |
166
229
  | 快捷键 | `shortcuts.<actionId>` | — | 网关 | 保存/刷新配置 |
230
+ | 默认主题 | `defaultTheme.themeId/auto` | — | 网关 | 浏览器覆盖优先;保存/刷新配置 |
231
+ | 流式发送默认方式 | `defaultStreamingBehavior` | — | 网关 | `steer` 或 `followUp`;默认 `steer` |
232
+ | 会话命名 | `sessionNaming.model/maxTokens/thinkingLevel/timeoutMs` | — | 机器 | 后续命名请求生效;无项目覆盖 |
233
+ | 归档目的地 | `sessionArchive.directory` | `PI_WEB_SESSION_ARCHIVE_DIR` | daemon | 重启;不迁移既有归档或索引 |
167
234
  | 项目版本 | `version` | — | 项目 | 存在时必须为 `1` |
168
235
  | 配置文件 | — | `PI_WEB_CONFIG`、`XDG_CONFIG_HOME` | 进程 | 改环境后重启;不是项目配置 |
169
236
  | 托管数据 | — | `PI_WEB_DATA_DIR` | Web/API + daemon | 两进程对齐重启;不自动迁移数据 |
@@ -230,6 +297,8 @@ Python 与受限 bash 默认无网络,只绑定管理工作区及必要的只
230
297
 
231
298
  Skill bundle 只从 MCP origin 下载,校验授权固定版本与 manifest,写入管理项目 `.pi/skills/`;token/票据不离开服务端。受限管理会话只加载所属项目允许范围内的 Skills;SDK 按名称去重时,被全局同名技能遮蔽的授权项目副本仍会恢复加载。启动及 `/reload` 时同步所属工作区的 `relay`、`relay-runner`,使用当前安装包随 SDK 适配的模板。项目 `.pi/skills/relay/` 与 `.pi/skills/relay-runner/` 是平台保留目录,其中旧模板会更新;其他自定义 Skill 不覆盖。普通模式及完整特权管理模式保留普通 SDK 资源加载行为,不执行这项模板同步。
232
299
 
300
+ 完整特权管理会话在启动和 `/reload` 时仅清理确认是平台原样下发的项目 Relay 副本,改由已启用的内置 Relay 包提供技能。清理只匹配当前模板或已知历史模板,且目录中必须仅有普通文件 `SKILL.md`;用户改过的内容、额外文件、符号链接及其他自定义 Skill 均保留,真实同名冲突仍会提示。取消特权后,下次创建或重载受限管理会话会按上述受限模式规则重新下发当前模板;旧特权会话不会运行中自动降权,应停止使用并通过新的授权入口进入。普通模式不执行此清理。升级此行为需重启 `pi-web-sessiond.service`,不改变现有特权授权与沙箱规则。
301
+
233
302
  `workbench_search_knowledge` 检索授权元数据,可用 provider=ragflow/bookstack;RAGFlow 内容用 retrieve_knowledge,BookStack 用 retrieve_bookstack,参数 resource_name、简洁 question、可选 resource_version=live、top_k 默认 8/最大 20。通过后端 `POST /api/knowledge-access/bookstack/retrieval` 读取独立授权的已发布书籍当前非草稿页,不编辑、不提供语义检索。返回纯文本、修订、更新时间、源 URL 与 knowledge:// 引用;truncated 表示搜索/文本限制,不保证包含所有匹配。上限五批各 100 候选、每页 8000 字符、总 40000。源链接仍需要读者自身浏览器权限,工具不授予 BookStack 登录。
234
303
 
235
304
  先部署支持资源快照、knowledge token 和检索 endpoint 的 Workbench 后端,再更新 PI WEB;BookStack 凭据只在后端,不新增 PI WEB BookStack 配置。工具更新重启 daemon;共享 endpoint/limit 改变重启两进程。签名 `projects[].agentsInstructions` 仅在项目 AGENTS.md 不存在时独占创建,已有内容不覆盖,无此字段仍兼容,普通项目不受影响。
@@ -237,7 +306,7 @@ Skill bundle 只从 MCP origin 下载,校验授权固定版本与 manifest,
237
306
  <a id="managed-data-directory"></a>
238
307
  ### 托管数据目录
239
308
 
240
- 默认 `~/.pi-web` 保存项目/机器注册表、本地插件、默认 daemon socket、归档及项目认证/偏好。新目录是独立实例,没有原注册表和归档,不自动迁移。需要迁移时先停服务,复制 `archived-sessions.json` 和 `archived-sessions/` 后再启动。
309
+ 默认 `~/.pi-web` 保存项目/机器注册表、本地插件、默认 daemon socket、归档索引及项目认证/偏好。新目录是独立实例,没有原注册表和归档,不自动迁移。需要迁移时先停服务,复制 `archived-sessions.json` 和每条记录指向的归档内容,包括自定义目的地;仅复制默认 `archived-sessions/` 不保证完整。
241
310
 
242
311
  一个目录只能有一个活跃 daemon。第二实例需要独立数据目录、daemon endpoint 和 Web 端口。过期所有权通常自动恢复;启动仍拒绝时,必须先确认所报进程已退出,再按错误提示处理 `sessiond-owner.json`。不要删除活跃所有权文件。
243
312
 
@@ -281,14 +350,16 @@ Skill bundle 只从 MCP origin 下载,校验授权固定版本与 manifest,
281
350
  <a id="pi-compatible-agent-profile-and-companion-cli"></a>
282
351
  ### Pi 状态目录与本地兼容输入
283
352
 
284
- 会话使用内置 Pi SDK,doctor、状态和更新流程检查机器 PATH 上的 Pi companion CLI。标准 `PI_CODING_AGENT_DIR`(默认 `~/.pi/agent`)选择共享 agent 设置、包与默认会话路径;`PI_CODING_AGENT_SESSION_DIR` 可独立指定会话路径,标准契约仅环境变量,没有新配置文件键。
353
+ 会话复用已安装的 Pi npm SDK。`PI_WEB_PI_PACKAGE_DIR` 显式选择 SDK 包根目录,优先于普通 npm 解析与 PATH 中第一个 `pi`;无 SDK 包的独立二进制不受支持。显式路径无效时直接失败,不回退另一份 Pi。`/pi-web` 将宿主安装传给 CLI,新安装的原生服务保留这个选择;更改后须重装服务定义并重启 Web 与 daemon。doctor 和状态仍分别核对有效安装与 companion CLI,不能把 PATH 上可执行命令当作 SDK 已对齐的证据。
354
+
355
+ 标准 `PI_CODING_AGENT_DIR`(默认 `~/.pi/agent`)选择共享 agent 设置、包与默认会话路径;`PI_CODING_AGENT_SESSION_DIR` 可独立指定会话路径。这些变量与 SDK 安装目录不同,不新增配置文件键。
285
356
 
286
357
  ```sh
287
358
  PI_CODING_AGENT_DIR=/opt/pi-profiles/lab
288
359
  PI_CODING_AGENT_SESSION_DIR=/opt/pi-profiles/lab-sessions
289
360
  ```
290
361
 
291
- 目录必须符合内置 SDK 数据布局;不转换不兼容格式,不迁移 profile,也不移动 PI WEB 归档。
362
+ 目录必须符合所选 SDK 数据布局;不转换不兼容格式,不迁移 profile,也不移动 PI WEB 归档。
292
363
 
293
364
  daemon 启动时解析并固定目录,终端、bash、子会话使用相同值。运行期间改变环境不生效;包管理、插件发现、状态/安装识别和更新计划仍使用 daemon 的有效目录。Web 重启恢复同一有效目录,不独立解析新值。daemon 无法报告有效目录时,相关操作不可用,不自行回退。仅有效目录和可执行 companion CLI 都具备时提供包管理更新命令,并固定目录。
294
365
 
@@ -301,6 +372,8 @@ daemon 启动时解析并固定目录,终端、bash、子会话使用相同值
301
372
 
302
373
  连接设置在对应运行时基线建立后固定。项目扩展和 `/reload` 不能新增、替换或删除提供器;扩展其他功能正常加载与刷新。全局提供器定义、凭据/连接配置或实现变化需要手动重启 daemon,Web 重启和 `/reload` 不重建基线。
303
374
 
375
+ 虚拟模型的 router 捕获会话上下文,不能存入同项目工作区共享的 registry。PI WEB 在全局扩展 bootstrap 前即拒绝 `registerVirtualModel`/`unregisterVirtualModel`,后续会话中也不能重新注册;使用物理模型。诊断不包含模型定义或 ID。
376
+
304
377
  已知提供器仅模型列表变化、其他设置保持不变时可立即接受刷新,无需重启。更新按精确 registry 身份应用,只影响 owning project;同项目两个工作区注册不同列表时后注册者生效,不影响别的项目。模型条目可带 `baseUrl`/`headers`,覆盖该模型的提供器值;扩展仍是可信进程内代码,不是安全沙箱。
305
378
 
306
379
  daemon 日志记录忽略的配置变更与模型列表应用,不输出提供器配置或凭据,不生成浏览器通知。管理 registry 独立;不能为对齐上游全局刷新而恢复跨项目共享。
@@ -401,7 +474,7 @@ pi-web plugins safe-start clear --restart
401
474
 
402
475
  从 **设置 → 键盘** 编辑、录制、禁用或重置。`mod` 为 Ctrl/⌘,浏览器/系统可占用组合。应用支持单键和序列;无修饰键及仅 Shift 的绑定不在 input/textarea/select/contenteditable 内开始。序列 1.2 秒到期,Escape/焦点变化取消;自定义优先,同优先级按 action ID;短绑定遮蔽同前缀长序列。
403
476
 
404
- 编辑器发送绑定只接受一个组合。桌面默认 Enter;粗主指针(常见触屏)或 ≤760px 默认 Shift+Enter,键仍为 `composer.send.mobile`。未分配 Enter/Shift+Enter 插入换行;普通 Enter 优先接受选中补全。编辑器内发送绑定优先于应用快捷键,空草稿或不可发送时也如此。`null` 禁用键盘提交,不禁用按钮。
477
+ 编辑器发送绑定只接受一个组合。宽度 >760px 默认 Enter;宽度 ≤760px 默认 Shift+Enter,键仍为 `composer.send.mobile`,不因宽屏触控或粗指针改用窄屏规则。未分配 Enter/Shift+Enter 插入换行;普通 Enter 优先接受选中补全。编辑器内发送绑定优先于应用快捷键,空草稿或不可发送时也如此。`null` 禁用键盘提交,不禁用按钮。
405
478
 
406
479
  对应绑定未配置前保留浏览器旧 Enter 偏好,重置回该回退;不把旧偏好自动复制到共享配置。触屏键盘自动首字母大写不视为 Shift。
407
480
 
package/docs/plugins.md CHANGED
@@ -56,6 +56,44 @@
56
56
 
57
57
  在 `activate()` 中声明贡献,在 `start()` 中初始化依赖支持的工作,在 `dispose()` 中释放资源。长时间工作遵循 `lifetimeSignal`。简单浏览器插件仅需返回贡献。
58
58
 
59
+ <a id="scoped-discovery-and-backend"></a>
60
+ ### 作用域发现与后端
61
+
62
+ 浏览器 API v5 的 `catalog` 固定到创建上下文时的机器,只读查询公开项目、工作区和会话投影,不返回 transcript 或内部会话路径。切换选择不会改变已保留 catalog 的目标;会话使用完整、区分大小写的精确 ID,不接受缩写。
63
+
64
+ 可选 `backend` 指向同包配对的实际服务端入口:`backend.forScope({ kind: "machine" })`、`{ kind: "project", projectId }` 或 `{ kind: "workspace", projectId, workspaceId }` 返回请求/通道 peer。没有 session backend scope。宿主重新解析 authority,插件不传可信 cwd;机器与后端 revision 不匹配时拒绝,不静默使用网关同名后端。操作是否支持取决于实际 peer/capability,不由 API 版本单独保证。旧浏览器 v4 与服务端 v3 继续使用其原契约。
65
+
66
+ 服务端可声明 `PI_WEB_HOST_CATALOG_CAPABILITY` 获取目标宿主的公开 catalog;Pi 配套扩展通过公开服务端入口的 `createCompanionBackend(pi.events, pluginId)` 发现本地配对 backend,要求在 PI WEB 已托管事件总线上运行。普通宿主会话连接不开放管理会话,完整特权也不取消该边界。普通 catalog 排除当前配置的管理 root;它不替历史文件补写耐久 scope,曾更换管理 root 的遗留文件需人工隔离。
67
+
68
+ <a id="styles-highlighting-and-display"></a>
69
+ ### 样式、高亮与显示文本
70
+
71
+ v5 `stylesheets` 贡献包含 `id`、HTTP(S) `url` 和可选 `order`(默认 `1000`,较小先加载,同序按限定贡献 ID)。使用模块相对 URL 生成 CSS 文件地址,文件内资产相对 CSS 地址解析;不支持内联 CSS 或运行时 `@import`。v5 主题使用样式表;需要共享样式的组件使用公开 `StylesheetIntegrationCapabilityV1` 注册 shadow root 或创建 Lit lifecycle controller,并在断开时释放。主题属于网关应用,浏览器设备偏好优先于网关默认值。
72
+
73
+ 共享基础 UI 通过 `{ pluginId: "pi-web", id: "stylesheet-integration", version: 1, parse }` 声明依赖并在 `start` 中解析;组件使用 `createController(this, { sharedUi: true })` 或 `registerRoot(root, { sharedUi: true })`。省略 opt-in 只接收贡献样式,不接收共享按钮、选择器、工具栏、标签和文件行。宿主持有注入、排序与清理;原生事件、键盘交互、焦点与 ARIA 仍由消费者持有。共享 UI 不包含菜单、表单和对话框,插件不得深导入客户端私有样式。
74
+
75
+ `stylesheet-integration` 能力可由支持的浏览器 v4/v5 入口声明,能力版本与入口版本独立;这不使旧入口获得 v5 专属的 `stylesheets` 贡献字段。
76
+
77
+ 基础主题同步提供默认布局与控件表现,主题 CSS 可扩展配色与布局;基础规则在 `pi-web-base` cascade layer,普通未分层主题规则遵循 CSS cascade 覆盖。内部选择器、共享类和外观仍属实验性,不因能力版本而冻结;具体控件入口见[共享 UI 导航](https://github.com/nayuto-wakusei/pi-web-ChineseTranslation/blob/main/docs/ui-primitives.md)。
78
+
79
+ v5 `syntaxHighlighters` 返回有序、不重叠的 UTF-16 范围 token,不返回 HTML;宿主负责安全显示,插件遵守输入 `signal`。v5 内容渲染器还可提供 `title`、同步 `supports(request)`,并接收机器、语言和文件路径提示;正文仍是不可信输入,净化与清理要求不变。精确签名以公开声明为准。
80
+
81
+ Pi 的 Markdown transformer 链在 daemon 的浏览器投影阶段运行,仅对完成及历史的用户、assistant 文本和 thinking 派生 `displayText`;部分流式文本完成后才应用,文件预览不受影响。canonical 消息、持久化历史、模型输入、审计原文和实际 `thinkingLevel` 不变。“复制消息”和消息操作使用原文;代码围栏的 Raw/Copy 使用变换后的围栏源码。
82
+
83
+ ### 应用级面板与选择
84
+
85
+ `applicationPanels` 与 `workspacePanels` 由同一个浏览器工具区域装配。前者依附当前机器,无需先选项目、工作区或会话;后者需要已选工作区。应用级面板获得当前机器与公开选择快照,`workspace` 和工作区终端按可用性提供。内置 Info 使用应用级面板;无工作区时仍可显示机器和 PI WEB 状态。
86
+
87
+ 激活上下文的可选 `selection` 服务由宿主持有。`getSnapshot()` 返回独立的基本选择快照;`subscribe()` 在选择改变后通知,不做首次回调,面板关闭后仍可订阅。返回的取消函数可提前结束订阅,插件生命周期结束时统一清理。快照不包含内部会话文件路径、消息正文或整份应用状态。
88
+
89
+ 操作、应用级面板和工作区上下文的可选 `projects` 服务只读查询创建上下文时的机器:`listProjects()` 返回注册项目,`suggestDirectories(query)` 返回目录建议。保留的服务不会随之后的机器选择漂移;远端错误不会改查网关本机。旧宿主可能不提供这些可选服务。
90
+
91
+ ### 提示上下文 chip
92
+
93
+ `prompt.setChip({ id, label, text, onRemove? })` 将插件上下文暂存在该上下文捕获的机器和会话,作用域同时包含会话工作目录,不同工作区的同名会话不共享 chip;要求创建上下文时已有可用、非归档的会话。相同插件内的相同 `id` 替换内容与回调;`prompt.removeChip(id)` 可静默撤回。方法在旧宿主上可能不存在,不应从渲染回调中修改 chip。
94
+
95
+ chip 由浏览器宿主持有,不是持久化会话数据;关闭面板、切换会话后仍保留各自内容,刷新页面后清除。发送时正文以空行分隔附加到消息,带 chip 的输入作为普通提示词而非斜杠或 shell 命令提交。只有服务端接受后才消费本次提交的版本,失败时保留以便重试,不删除发送期间的替换内容。用户移除和成功提交分别通知 `onRemove("user")` 与 `onRemove("submitted")`;程序撤回不通知。
96
+
59
97
  ### 从聊天打开工作区文件
60
98
 
61
99
  聊天 Markdown 中的相对文件链接(包括 `./file`)和会话工作区内的绝对路径会在内置文件面板中打开。修饰键、新标签页点击或没有面板接受链接时仍使用下载 URL。文件访问仍经过服务端工作区包含检查。
@@ -86,23 +124,25 @@ Promise 在恢复完成时结束,也可在被较新导航取代时正常结束
86
124
 
87
125
  ### 聊天与文件内容预览
88
126
 
89
- 浏览器插件可贡献 `contentRenderers`:`id`、Markdown 围栏标签 `languages`、不含点的 `fileExtensions`,以及同步返回 Lit 模板的 `render(input)`。选择器不区分大小写,语言或扩展名任一匹配即可。`renderMode?: 'manual' | 'automatic'` 默认 `manual`:先显示源码与“渲染”按钮,不调用渲染器。这是初始策略,不限制用户显式预览;无关正文更新不重启已激活预览。作者可选择 `automatic`,并负责高效激活与异步工作。
127
+ 浏览器插件的 `contentRenderers` 提供 `id`、围栏 `languages` 或不含点的 `fileExtensions`,同步 `render(input)` 返回 Lit 模板。`renderMode` 默认为 `manual`,用户选择命名视图后才激活;`automatic` 可自动显示。v5 还可用 `title` 命名视图、同步 `supports(request)` 判断资格,并接收机器、语言和文件路径提示;旧 v4 输入不变。
90
128
 
91
- 同一渲染器用于聊天围栏、文件 Markdown 围栏和独立文本文件,遵循有效机器的插件可用性及便携/机器专属优先级。多个匹配项提供选择器,同时仅挂载选中项。默认按来源插件 ID(不是远端运行时前缀)、局部贡献 ID 的大小写敏感、与区域设置无关的码元顺序排序。标签同时标明插件与贡献;没有插件排序字段或排序 UI。
129
+ 同一渲染器用于聊天围栏、文件 Markdown 围栏和独立文本文件,并遵循所属机器可用性。浏览器先发现 bundled 默认插件,再发现 installed 覆盖,各组内部顺序保持不变。匹配项保持插件发现顺序,最后一个匹配的 automatic 渲染器是默认;后来的 manual 渲染器不抢占自动默认。异步加载完成顺序不决定优先级,用户显式选择优先。每个渲染器与“源码”(Raw)是单行横向滚动的命名按钮,同时仅挂载所选预览,不使用选择器菜单。
92
130
 
93
- 聊天按代码块在当前浏览器标签页记忆显式渲染器与“源码/预览”选择:从最后一次显式选择起 **15 分钟**,最多 **128** 个最近选择块。作用域包含机器、会话、消息/entry、part、块和精确源码。查看或重新挂载不延长期限;到期在再次访问时生效,不撤掉正在显示的预览。源码变化或选中渲染器不可用会失效该选择并恢复确定性默认策略。自动渲染不产生显式记忆;DOM 不缓存,重新挂载重新渲染。刷新或关闭标签页清除记忆。文件 Markdown 不使用聊天记忆。
131
+ 聊天按代码块在当前标签页记忆显式渲染器与源码选择:从最后一次显式选择起 **15 分钟**,最多 **128** 个最近选择块,作用域包含机器、会话、entry、part、块和精确源码。重新挂载不延长期限,源码变化或渲染器不可用时恢复默认;页面重载清除记忆。独立文件使用自己的浏览器源码/预览偏好,URL 模式优先,默认策略不自动变成用户偏好。
94
132
 
95
- 独立文件仅在没有浏览器本地“源码/预览”偏好时采用插件初始策略。已保存“预览”授权所有文件渲染,包括 Markdown 中的手动渲染器;已保存“源码”禁止预览。Markdown 预览内仍可逐块选择源码或渲染器,URL 模式优先。默认策略不会自动保存为用户选择,内置文件预览保留原默认行为。
133
+ Raw 始终提供未高亮源码,Copy 复制当前代码块源码,即使正在预览也不复制图形。未闭合围栏、截断及超过 **100,000 UTF-16 码元**的输入不渲染;文件另有内联字节限制。渲染失败回退源码;追加正文不重启未变的闭合块,切换视图中止旧工作。Mermaid 图形保持手动激活,代码高亮与图形预览是独立视图。
96
134
 
97
- 聊天图表块保留“源码”“预览”“复制源码”工具栏;独立文件在“下载”旁使用文件头部的“源码/预览”控件,遵循文件模式偏好。Markdown 文件图表保留逐块控件。未闭合围栏保持可复制源码;闭合围栏可在消息结束前预览。追加正文不重启未变的闭合块;失败回退源码;未知格式保持普通代码显示。
135
+ `input` 的 `signal` 和 `fail(error)` 用于生命周期及异步错误;断开或中止时清理,过期错误不影响新视图。正文不可信,保留聊天和文件各自的净化器,不执行源码或放宽策略。
98
136
 
99
- `input` 包含 `text`、中止 `signal`、`fail(error)`。同步渲染,组件自己管理异步工作,在断开连接或中止时清理,通过 `fail` 报告异步错误;过期错误被忽略。文本不可信:转义/净化输出,不执行源码,不放宽 Markdown 策略。宿主跳过截断输入及超过 **100,000 UTF-16 码元**的块,文件还保留内联字节大小限制。聊天与文件 Markdown 保留各自的净化器。
137
+ 消费者在 `requires` 声明 `{ pluginId: "pi-web", id: "content-rendering", version: 1, parse }`,在 `start` 解析。`ContentRenderingCapability` 提供 `listRenderers(request)`、`renderText(request)` 和 `renderMarkdown({ machineId, text, truncated?, toSafeHtml, allowManualPreview? })`。列表按发现顺序返回 `{ id, label, renderMode }`,不调用渲染器。
100
138
 
101
- 文件等消费者在 `requires` 声明 `{ pluginId: "pi-web", id: "content-rendering", version: 1, parse }`,在 `start` 中解析。公开 `ContentRenderingCapability` 描述 `listRenderers(request)`、`renderText(request)` 和 `renderMarkdown({ machineId, text, truncated?, toSafeHtml, allowManualPreview? })`。`listRenderers` 返回排序后的 `{ id, label, renderMode }`,不调用渲染器。
139
+ 只有 `controls: "external"` 的 `renderText` 接受 `rendererId`,缺失或不可用时使用上述默认规则;内嵌控件自己拥有选择。消费者使用外部控件时自己提供视图选择、源码访问及移除预览。`allowManualPreview: true` 可授权手动预览,但不覆盖逐块 Raw 选择;文件与聊天各自持有用户意图,能力不持久化偏好。`renderMarkdown` 使用消费者可信净化器。精确签名见[公开浏览器契约](https://github.com/nayuto-wakusei/pi-web-ChineseTranslation/blob/main/src/plugin-api.ts)。
102
140
 
103
- 只有 `controls: "external"` 的 `renderText` 接受可选 `rendererId`,缺失或不可用时选择首个匹配项。内嵌控件拥有选择,忽略外部 ID。消费者自己提供选择器、模式切换与源码访问(如文件头部)时使用外部控件,否则使用内嵌控件。外部“源码”控件必须移除预览。
141
+ ### 公开会话数据与消息操作
104
142
 
105
- 消费者管理用户意图,可用 `allowManualPreview: true` 显式授权手动预览;Markdown 授权符合条件的围栏,但不覆盖逐块“源码”选择。省略或 `false` 保留渲染器默认策略及自动预览;聊天不传此覆盖。公开能力不存用户意图,聊天有界记忆是宿主私有策略。Markdown 请求不带文件路径或语言选择器,语言来自围栏。创建 `renderText` 模板不调用渲染器。每个 Markdown 图表独立选择;切换渲染器中止旧预览并清除错误。`renderMarkdown` 必须使用消费者可信净化器,不允许插入不可信 HTML。参见[文件消费者](https://github.com/nayuto-wakusei/pi-web-ChineseTranslation/blob/main/pi-web-plugins/files/pi-web-plugin.ts)和 [Mermaid 贡献](https://github.com/nayuto-wakusei/pi-web-ChineseTranslation/tree/main/pi-web-plugins/mermaid)。
143
+ 会话快照中的 `metadata` 只包含主动发布的 UI-safe 命名空间数据,不暴露任意 custom entries。命名空间不构成权限或所有权隔离,插件须校验自己的 schema 并安全显示;旧宿主可省略该字段。服务端发布与浏览器读取都不应放入秘密。
144
+
145
+ `messageActions` 默认针对持久 entry,调用时提供受保护的 `history.fork()`/`goBack()`;`target: "display"` 针对当前显示切片,可包含未持久化文本,但没有历史操作助手。两者提供的普通原文均排除 thinking/tool payload,不使用派生 `displayText`。可见性和可用性判断同步且无副作用,真正操作由调用上下文固定到原机器/会话;插件自己决定确认。
106
146
 
107
147
  ### 会话与配套扩展
108
148
 
@@ -131,6 +171,8 @@ Promise 在恢复完成时结束,也可在被较新导航取代时正常结束
131
171
 
132
172
  在 **设置 → Pi 包** 安装、更新、移除 npm、git/URL 或本地来源的包;在 **设置 → PI WEB 插件** 启用/禁用集成,查看是否激活、是否需要重启。
133
173
 
174
+ 可在[社区插件目录](https://pi-web.dev/community-plugins)搜索 npm 上的包,再复制 `npm:package-name` 到目标机器安装。目录由静态网页直接查询 npm,不是 PI WEB 服务端 catalog,也不会自动安装。社区包未经审查或背书,只安装可信作者的包;更多发布约定见目录的[分享插件](https://pi-web.dev/community-plugins#publish)。
175
+
134
176
  | 变更 | 后续操作 |
135
177
  | --- | --- |
136
178
  | 安装或编辑纯浏览器插件 | 刷新浏览器 |
@@ -173,7 +215,7 @@ ln -s /path/to/plugin-folder ~/.pi-web/plugins/my-plugin
173
215
  - **文件**提供文件浏览、预览、上传;禁用面板不移除其他插件的文件帮助方法。
174
216
  - **Git**发现工作区并显示状态/差异;禁用后保留项目目录工作区,除非其他提供器认领。
175
217
  - **Mermaid**默认手动模式,点击“渲染”预览 `mermaid` 围栏和 `.mmd`/`.mermaid` 文件。内置引擎在不透明来源、网络受阻的沙箱中本地运行,不发送源码给图表服务。交互链接和外部资源不可用。禁用后保持代码显示;纯浏览器插件只需刷新页面。
176
- - **信息**显示 PI WEB 状态与可复制诊断。
218
+ - **信息**作为应用级面板显示 PI WEB 状态与可复制诊断,无需先选择工作区。
177
219
  - **更新**在需要时显示更新/重启建议,并提供手动检查。
178
220
  - **工作区任务**将项目命令显示为可运行操作。
179
221
 
@@ -199,6 +241,13 @@ ln -s /path/to/plugin-folder ~/.pi-web/plugins/my-plugin
199
241
 
200
242
  普通模式在当前 agent 配置未安装时自动安装 Relay;从 **设置 → Pi 包** 移除会被记忆,不静默重装,可从“可用包”恢复。单独禁用中继插件只隐藏标签,不移除代理资源。管理嵌入的 `relay` 与 `relay-runner` 模板同步继续限定在授权工作区,不改变普通启动的技能文件。
201
243
 
244
+ <a id="workflows"></a>
245
+ ### 工作流(Workflows)
246
+
247
+ Workflows 随包提供 Pi 工作流提示词和工作树操作。普通 profile 缺少默认包时自动安装,用户移除会被记忆,可从“可用包”恢复;禁用浏览器插件不移除已安装的 Pi 提示词资源。
248
+
249
+ 工作树操作选择 base 与用途后,由目标机器重验项目、工作区和 Git base 再派发;仅在普通模式及所需能力可用时提供。创建工作树、发布会话与打开页面是独立结果,派发结果不确定或导航失败时不自动重试,先查看目标机器已有结果,避免重复工作树。实现示例见 [Workflows 包](https://github.com/nayuto-wakusei/pi-web-ChineseTranslation/tree/main/pi-packages/workflows)。
250
+
202
251
  ### 试用 Captain's Log
203
252
 
204
253
  Captain's Log 是可选示例,将会话最近的助手回复改写为海盗风格简报,演示浏览器面板、后端和 Pi 配套扩展协作。
@@ -251,7 +300,7 @@ Pi 扩展可请求确认、选择或文本输入;问题以内联方式展示
251
300
  | 简单初始提示词工作流 | [工作区审查示例](https://github.com/nayuto-wakusei/pi-web-ChineseTranslation/tree/main/examples/session-bridge-plugin) |
252
301
  | 发现规则与诊断 | [插件目录](https://github.com/nayuto-wakusei/pi-web-ChineseTranslation/blob/main/src/server/piWebPluginCatalog.ts) |
253
302
 
254
- 当前浏览器契约是 **API v4**,服务端契约是 **API v3**。旧入口必须迁移,没有兼容 shim。公开源码契约和测试是签名、验证、限制与生命周期的依据。
303
+ 当前浏览器与服务端契约均为 **API v5**;宿主继续支持浏览器 **API v4** 和服务端 **API v3**,旧类型名兼容保留。catalog、作用域 backend 及 v5 贡献需使用对应 v5 入口,不将新功能直接塞进旧版本贡献。公开源码契约和已安装声明是签名、验证、限制与生命周期的依据。
255
304
 
256
305
  - 在 `package.json` 的 `piWeb.plugins` 声明入口,参考独立示例的打包方式;同一包可含多个入口。
257
306
  - 仅使用公开包入口,内部路由、服务及 `dist/**` 导入不是受支持 API。
@@ -8,8 +8,8 @@
8
8
  "scripts": { "build": "tsc -p tsconfig.json" },
9
9
  "devDependencies": {
10
10
  "@chainingintention/pi-web-cn": "^1.202609.1",
11
- "@earendil-works/pi-coding-agent": "^0.87.0",
12
- "@types/node": "^24.13.3",
11
+ "@earendil-works/pi-coding-agent": "1.3.0",
12
+ "@types/node": "^24.19.2",
13
13
  "typescript": "^6.0.3"
14
14
  },
15
15
  "peerDependencies": { "@earendil-works/pi-coding-agent": "*" },
@@ -5,7 +5,7 @@ interface PanelState { reviews: Review[]; selected?: Review; busy: boolean; stat
5
5
  function reviewStatusLabel(status: Review["status"]): string {
6
6
  return { running: "处理中", completed: "已完成", failed: "失败", interrupted: "已中断" }[status];
7
7
  }
8
- const plugin: PiWebPlugin = {
8
+ const plugin: Extract<PiWebPlugin, { apiVersion: 4 }> = {
9
9
  apiVersion: 4,
10
10
  name: "工作区审查",
11
11
  activate({ html }) {
@@ -13,7 +13,7 @@ export default function companion(pi: ExtensionAPI): void {
13
13
  });
14
14
  pi.on("before_agent_start", (event) => {
15
15
  if (!active) return;
16
- if (!active.started && event.prompt === active.prompt) active.started = true;
16
+ if (!active.started && "prompt" in event && event.prompt === active.prompt) active.started = true;
17
17
  else active.error = "Another prompt interfered with this review; findings were not saved";
18
18
  });
19
19
  pi.on("message_start", (event) => {
@@ -3,7 +3,7 @@ import { existsSync } from "node:fs";
3
3
  import { homedir } from "node:os";
4
4
  import { dirname, join } from "node:path";
5
5
  import { fileURLToPath } from "node:url";
6
- import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
6
+ import { getPackageDir, type ExtensionAPI } from "@earendil-works/pi-coding-agent";
7
7
 
8
8
  const packageRoot = dirname(dirname(fileURLToPath(import.meta.url)));
9
9
  const cliPath = join(packageRoot, "dist", "cli.js");
@@ -63,6 +63,8 @@ function run(command: string, args: string[], env: NodeJS.ProcessEnv = {}): Prom
63
63
  }
64
64
 
65
65
  async function runPiWeb(args: string[], env: NodeJS.ProcessEnv = {}): Promise<{ code: number; output: string }> {
66
+ // Pi resolves this import against its own installation, outside PI WEB's dependency tree.
67
+ env = { ...env, PI_WEB_PI_PACKAGE_DIR: getPackageDir() };
66
68
  if (existsSync(cliPath)) {
67
69
  return run(process.execPath, [cliPath, ...args], env);
68
70
  }