@chainingintention/pi-web-cn 2.0.0 → 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 (584) hide show
  1. package/README.md +61 -106
  2. package/dist/.plugins-ready +1 -0
  3. package/dist/cli.js +331 -174
  4. package/dist/cli.js.map +1 -1
  5. package/dist/client/apple-touch-icon-dev.png +0 -0
  6. package/dist/client/assets/PiWebApp-BXSziMEg.js +4921 -0
  7. package/dist/client/assets/classic-CyM97Akm.css +54 -0
  8. package/dist/client/assets/external-B9K8duyP.js +2 -0
  9. package/dist/client/assets/graphite-DquaqFXU.css +54 -0
  10. package/dist/client/assets/index-cdtUOfOW.js +2 -0
  11. package/dist/client/assets/paper-CB1oLuRr.css +54 -0
  12. package/dist/client/assets/pi-web-dark-D_KtbM95.css +54 -0
  13. package/dist/client/assets/pi-web-light-DSNLMIBI.css +54 -0
  14. package/dist/client/assets/vendor-editor-core-BfnHL1Dg.js +10 -0
  15. package/dist/client/assets/vendor-editor-languages-bNquDJP0.js +28 -0
  16. package/dist/client/favicon-dev.svg +8 -0
  17. package/dist/client/index.html +7 -51
  18. package/dist/client/manifest.webmanifest +2 -1
  19. package/dist/client/pwa-icon-dev-192.png +0 -0
  20. package/dist/client/pwa-icon-dev-512.png +0 -0
  21. package/dist/config.js +55 -8
  22. package/dist/config.js.map +1 -1
  23. package/dist/docker/piWebDockerCommandPlan.js +13 -4
  24. package/dist/docker/piWebDockerCommandPlan.js.map +1 -1
  25. package/dist/environment.js +4 -0
  26. package/dist/environment.js.map +1 -0
  27. package/dist/localization.js +24 -0
  28. package/dist/localization.js.map +1 -0
  29. package/dist/nativeServices/installedServiceDefinitions.js +617 -0
  30. package/dist/nativeServices/installedServiceDefinitions.js.map +1 -0
  31. package/dist/nativeServices/serviceAction.js +78 -20
  32. package/dist/nativeServices/serviceAction.js.map +1 -1
  33. package/dist/nativeServices/serviceDoctor.js +418 -114
  34. package/dist/nativeServices/serviceDoctor.js.map +1 -1
  35. package/dist/nativeServices/servicePlan.js +2 -2
  36. package/dist/nativeServices/servicePlan.js.map +1 -1
  37. package/dist/pi-packages/captains-log/README.md +11 -0
  38. package/dist/pi-packages/captains-log/dist/browser/channelProtocol.js +29 -0
  39. package/dist/pi-packages/captains-log/dist/browser/index.js +143 -0
  40. package/dist/pi-packages/captains-log/dist/browser/markdown.js +68 -0
  41. package/dist/pi-packages/captains-log/dist/browser/panel.js +148 -0
  42. package/dist/pi-packages/captains-log/dist/browser/protocol.js +26 -0
  43. package/dist/pi-packages/captains-log/dist/companion.js +126 -0
  44. package/dist/pi-packages/captains-log/dist/roundtrip.js +62 -0
  45. package/dist/pi-packages/captains-log/dist/server.js +210 -0
  46. package/dist/pi-packages/captains-log/dist/store.js +75 -0
  47. package/dist/pi-packages/captains-log/docs/usage.md +29 -0
  48. package/dist/pi-packages/captains-log/i18n.js +7 -0
  49. package/dist/pi-packages/captains-log/package.json +35 -0
  50. package/dist/pi-packages/captains-log/tsconfig.json +21 -0
  51. package/dist/pi-packages/captains-log/vite.config.mjs +28 -0
  52. package/dist/pi-packages/relays/extensions/index.js +61 -0
  53. package/dist/pi-packages/relays/i18n.js +7 -0
  54. package/dist/{pi-web-plugins → pi-packages}/relays/markdownDocument.js +3 -2
  55. package/dist/pi-packages/relays/package.json +20 -0
  56. package/dist/pi-packages/relays/pi-web-plugin.js +96 -0
  57. package/dist/pi-packages/relays/prompts/relay-worktree.md +18 -0
  58. package/dist/pi-packages/relays/prompts/relay.md +18 -0
  59. package/dist/{pi-web-plugins → pi-packages}/relays/relayDiscovery.js +2 -2
  60. package/dist/pi-packages/relays/relayDispatch.js +67 -0
  61. package/dist/pi-packages/relays/relayIdentity.js +37 -0
  62. package/dist/{pi-web-plugins → pi-packages}/relays/relaysPanelElement.js +98 -59
  63. package/dist/pi-packages/relays/skills/relay/SKILL.md +50 -0
  64. package/dist/pi-packages/relays/skills/relay-runner/SKILL.md +74 -0
  65. package/dist/pi-packages/workflows/browser/pi-web-plugin.js +42 -0
  66. package/dist/pi-packages/workflows/browser/worktreeDialog.js +170 -0
  67. package/dist/pi-packages/workflows/package.json +23 -0
  68. package/dist/pi-packages/workflows/prompts/worktree.md +21 -0
  69. package/dist/pi-packages/workflows/server-plugin.js +586 -0
  70. package/dist/pi-packages/workflows/vite.config.mjs +17 -0
  71. package/dist/pi-web-plugins/code-highlight/browser/pi-web-plugin.js +22 -0
  72. package/dist/pi-web-plugins/code-highlight/package.json +13 -0
  73. package/dist/pi-web-plugins/files/browser/assets/files-icon-DZObYhxb.svg +3 -0
  74. package/dist/pi-web-plugins/files/browser/pi-web-plugin.js +466 -0
  75. package/dist/pi-web-plugins/files/package.json +15 -0
  76. package/dist/pi-web-plugins/git/browser/git-contract.js +22 -11
  77. package/dist/pi-web-plugins/git/browser/git-panel.js +228 -100
  78. package/dist/pi-web-plugins/git/browser/i18n.js +7 -0
  79. package/dist/pi-web-plugins/git/browser/pi-web-plugin.js +28 -4
  80. package/dist/pi-web-plugins/git/git-backend.js +61 -21
  81. package/dist/pi-web-plugins/git/gitStatusCache.js +48 -0
  82. package/dist/pi-web-plugins/git/i18n.js +7 -0
  83. package/dist/pi-web-plugins/git/package.json +1 -0
  84. package/dist/pi-web-plugins/git/server-plugin.js +45 -24
  85. package/dist/pi-web-plugins/git/workspace-discovery-notify.cjs +14 -0
  86. package/dist/pi-web-plugins/git/workspaceDiscoveryHooks.js +186 -0
  87. package/dist/pi-web-plugins/info/i18n.js +7 -0
  88. package/dist/pi-web-plugins/info/infoInternals.js +76 -65
  89. package/dist/pi-web-plugins/info/package.json +1 -1
  90. package/dist/pi-web-plugins/info/pi-web-plugin.js +40 -42
  91. package/dist/pi-web-plugins/mermaid/browser/mermaid-engine.js +4255 -0
  92. package/dist/pi-web-plugins/mermaid/browser/pi-web-plugin.js +11 -0
  93. package/dist/pi-web-plugins/mermaid/package.json +13 -0
  94. package/dist/pi-web-plugins/terminal/browser/pi-web-plugin.js +219 -0
  95. package/dist/pi-web-plugins/terminal/i18n.js +7 -0
  96. package/dist/pi-web-plugins/terminal/package.json +16 -0
  97. package/dist/pi-web-plugins/terminal/server-plugin.js +367 -0
  98. package/dist/pi-web-plugins/terminal/terminalService.js +436 -0
  99. package/dist/pi-web-plugins/updates/i18n.js +7 -0
  100. package/dist/pi-web-plugins/updates/package.json +1 -1
  101. package/dist/pi-web-plugins/updates/pi-web-plugin.js +143 -140
  102. package/dist/pi-web-plugins/updates/updatesLogic.js +24 -24
  103. package/dist/pi-web-plugins/workspace-tasks/config.js +12 -11
  104. package/dist/pi-web-plugins/workspace-tasks/i18n.js +7 -0
  105. package/dist/pi-web-plugins/workspace-tasks/package.json +1 -1
  106. package/dist/pi-web-plugins/workspace-tasks/pi-web-plugin.js +31 -9
  107. package/dist/pi-web-plugins/workspace-tasks/tasksPanelElement.js +54 -36
  108. package/dist/pi-web-plugins/workspace-tasks/workspaceTasksClient.js +12 -11
  109. package/dist/pi-web-plugins/zh-cn/auth.json +9 -0
  110. package/dist/pi-web-plugins/zh-cn/bundled.json +219 -0
  111. package/dist/pi-web-plugins/zh-cn/cli.json +230 -0
  112. package/dist/pi-web-plugins/zh-cn/client.json +225 -0
  113. package/dist/pi-web-plugins/zh-cn/components.json +1252 -0
  114. package/dist/pi-web-plugins/zh-cn/config-errors.json +188 -0
  115. package/dist/pi-web-plugins/zh-cn/files.json +50 -0
  116. package/dist/pi-web-plugins/zh-cn/machines.json +28 -0
  117. package/dist/pi-web-plugins/zh-cn/main.json +459 -0
  118. package/dist/pi-web-plugins/zh-cn/management-errors.json +23 -0
  119. package/dist/pi-web-plugins/zh-cn/manifest.webmanifest +25 -0
  120. package/dist/pi-web-plugins/zh-cn/metadata.json +3 -0
  121. package/dist/pi-web-plugins/zh-cn/package.json +10 -0
  122. package/dist/pi-web-plugins/zh-cn/pi-web-plugin.js +16 -0
  123. package/dist/pi-web-plugins/zh-cn/projects.json +6 -0
  124. package/dist/pi-web-plugins/zh-cn/provider-auth.json +18 -0
  125. package/dist/pi-web-plugins/zh-cn/routing.json +68 -0
  126. package/dist/pi-web-plugins/zh-cn/server-main.json +99 -0
  127. package/dist/pi-web-plugins/zh-cn/server.json +256 -0
  128. package/dist/piAi.js +4 -0
  129. package/dist/piAi.js.map +1 -0
  130. package/dist/piRuntime.js +150 -0
  131. package/dist/piRuntime.js.map +1 -0
  132. package/dist/piSdk.js +5 -0
  133. package/dist/piSdk.js.map +1 -0
  134. package/dist/piWebUpdate.js +508 -0
  135. package/dist/piWebUpdate.js.map +1 -0
  136. package/dist/piWebVersionReport.js +109 -41
  137. package/dist/piWebVersionReport.js.map +1 -1
  138. package/dist/plugin-api.d.ts +609 -29
  139. package/dist/plugin-api.js +1 -0
  140. package/dist/pluginRecoveryCli.js +27 -25
  141. package/dist/pluginRecoveryCli.js.map +1 -1
  142. package/dist/server/activity/workspaceActivityService.js +13 -6
  143. package/dist/server/activity/workspaceActivityService.js.map +1 -1
  144. package/dist/server/app.js +155 -77
  145. package/dist/server/app.js.map +1 -1
  146. package/dist/server/audit/managementAuditStore.js +6 -1
  147. package/dist/server/audit/managementAuditStore.js.map +1 -1
  148. package/dist/server/audit/normalToolAuditCli.js +45 -43
  149. package/dist/server/audit/normalToolAuditCli.js.map +1 -1
  150. package/dist/server/browserMessageProjection.js +39 -22
  151. package/dist/server/browserMessageProjection.js.map +1 -1
  152. package/dist/server/configRoutes.js +54 -33
  153. package/dist/server/configRoutes.js.map +1 -1
  154. package/dist/server/deploymentIdentity.js +67 -0
  155. package/dist/server/deploymentIdentity.js.map +1 -0
  156. package/dist/server/deploymentIdentityRoutes.js +22 -0
  157. package/dist/server/deploymentIdentityRoutes.js.map +1 -0
  158. package/dist/server/diagnostics/nodePtyNativeModule.js +7 -6
  159. package/dist/server/diagnostics/nodePtyNativeModule.js.map +1 -1
  160. package/dist/server/diagnostics/nodePtySpawnHelper.js +21 -20
  161. package/dist/server/diagnostics/nodePtySpawnHelper.js.map +1 -1
  162. package/dist/server/index.js +10 -1
  163. package/dist/server/index.js.map +1 -1
  164. package/dist/server/knownAutoInstallPiPackages.js +36 -0
  165. package/dist/server/knownAutoInstallPiPackages.js.map +1 -0
  166. package/dist/server/knownPiPackages.js +12 -0
  167. package/dist/server/knownPiPackages.js.map +1 -0
  168. package/dist/server/machines/machineClient.js +23 -19
  169. package/dist/server/machines/machineClient.js.map +1 -1
  170. package/dist/server/machines/machinePluginProxyRoutes.js +131 -31
  171. package/dist/server/machines/machinePluginProxyRoutes.js.map +1 -1
  172. package/dist/server/machines/machineProxyRoutes.js +138 -47
  173. package/dist/server/machines/machineProxyRoutes.js.map +1 -1
  174. package/dist/server/machines/machineRoutes.js +18 -13
  175. package/dist/server/machines/machineRoutes.js.map +1 -1
  176. package/dist/server/machines/machineService.js +40 -18
  177. package/dist/server/machines/machineService.js.map +1 -1
  178. package/dist/server/managementEmbed.js +149 -30
  179. package/dist/server/managementEmbed.js.map +1 -1
  180. package/dist/server/managementPrivileges.js +21 -0
  181. package/dist/server/managementPrivileges.js.map +1 -0
  182. package/dist/server/managementTerminalProxyRoutes.js +124 -0
  183. package/dist/server/managementTerminalProxyRoutes.js.map +1 -0
  184. package/dist/server/navigationPreferenceRoutes.js +59 -0
  185. package/dist/server/navigationPreferenceRoutes.js.map +1 -0
  186. package/dist/server/normalAuth.js +77 -53
  187. package/dist/server/normalAuth.js.map +1 -1
  188. package/dist/server/notices/serverNoticeRoutes.js +43 -0
  189. package/dist/server/notices/serverNoticeRoutes.js.map +1 -0
  190. package/dist/server/notices/serverNoticeService.js +26 -0
  191. package/dist/server/notices/serverNoticeService.js.map +1 -0
  192. package/dist/server/notices/serverNoticeStore.js +122 -0
  193. package/dist/server/notices/serverNoticeStore.js.map +1 -0
  194. package/dist/server/passwordVerifier.js +91 -0
  195. package/dist/server/passwordVerifier.js.map +1 -0
  196. package/dist/server/piPackageIdentity.js +25 -0
  197. package/dist/server/piPackageIdentity.js.map +1 -0
  198. package/dist/server/piPackageService.js +72 -9
  199. package/dist/server/piPackageService.js.map +1 -1
  200. package/dist/server/piWebPluginCatalog.js +212 -35
  201. package/dist/server/piWebPluginCatalog.js.map +1 -1
  202. package/dist/server/piWebPluginLifecycle.js +29 -3
  203. package/dist/server/piWebPluginLifecycle.js.map +1 -1
  204. package/dist/server/piWebPluginService.js +199 -292
  205. package/dist/server/piWebPluginService.js.map +1 -1
  206. package/dist/server/piWebStatus.js +57 -100
  207. package/dist/server/piWebStatus.js.map +1 -1
  208. package/dist/server/pluginCallbackDrain.js +35 -0
  209. package/dist/server/pluginCallbackDrain.js.map +1 -0
  210. package/dist/server/plugins/pluginBackendChannelProxyAdmission.js +84 -0
  211. package/dist/server/plugins/pluginBackendChannelProxyAdmission.js.map +1 -0
  212. package/dist/server/plugins/pluginBackendChannelProxyCoordinator.js +234 -0
  213. package/dist/server/plugins/pluginBackendChannelProxyCoordinator.js.map +1 -0
  214. package/dist/server/plugins/pluginBackendChannelProxyRoutes.js +61 -0
  215. package/dist/server/plugins/pluginBackendChannelProxyRoutes.js.map +1 -0
  216. package/dist/server/plugins/pluginBackendProxyRoutes.js +47 -57
  217. package/dist/server/plugins/pluginBackendProxyRoutes.js.map +1 -1
  218. package/dist/server/plugins/pluginBackendRegistry.js +804 -0
  219. package/dist/server/plugins/pluginBackendRegistry.js.map +1 -0
  220. package/dist/server/plugins/projectPluginSettings.js +95 -0
  221. package/dist/server/plugins/projectPluginSettings.js.map +1 -0
  222. package/dist/server/plugins/serverPluginCatalogCapability.js +106 -0
  223. package/dist/server/plugins/serverPluginCatalogCapability.js.map +1 -0
  224. package/dist/server/plugins/serverPluginPiSessionEventsCapability.js +34 -0
  225. package/dist/server/plugins/serverPluginPiSessionEventsCapability.js.map +1 -0
  226. package/dist/server/plugins/serverPluginPiSessionsCapability.js +185 -0
  227. package/dist/server/plugins/serverPluginPiSessionsCapability.js.map +1 -0
  228. package/dist/server/plugins/serverPluginRuntime.js +1088 -108
  229. package/dist/server/plugins/serverPluginRuntime.js.map +1 -1
  230. package/dist/server/plugins/serverPluginWorkspacesCapability.js +114 -0
  231. package/dist/server/plugins/serverPluginWorkspacesCapability.js.map +1 -0
  232. package/dist/server/projectTrustRoutes.js +86 -0
  233. package/dist/server/projectTrustRoutes.js.map +1 -0
  234. package/dist/server/projects/projectLifecycleService.js +94 -0
  235. package/dist/server/projects/projectLifecycleService.js.map +1 -0
  236. package/dist/server/projects/projectService.js +7 -4
  237. package/dist/server/projects/projectService.js.map +1 -1
  238. package/dist/server/realtime/sessionEventHub.js +58 -39
  239. package/dist/server/realtime/sessionEventHub.js.map +1 -1
  240. package/dist/server/realtime/sessionEventScope.js +4 -0
  241. package/dist/server/realtime/sessionEventScope.js.map +1 -1
  242. package/dist/server/requestCancellation.js +15 -1
  243. package/dist/server/requestCancellation.js.map +1 -1
  244. package/dist/server/sessiond/agentHttpDispatcher.js +108 -0
  245. package/dist/server/sessiond/agentHttpDispatcher.js.map +1 -0
  246. package/dist/server/sessiond/autoInstallPiPackages.js +63 -0
  247. package/dist/server/sessiond/autoInstallPiPackages.js.map +1 -0
  248. package/dist/server/sessiond/pluginBackendChannelRoutes.js +410 -0
  249. package/dist/server/sessiond/pluginBackendChannelRoutes.js.map +1 -0
  250. package/dist/server/sessiond/pluginBackendRoutes.js +64 -47
  251. package/dist/server/sessiond/pluginBackendRoutes.js.map +1 -1
  252. package/dist/server/sessiond/pluginCatalogRoutes.js +41 -0
  253. package/dist/server/sessiond/pluginCatalogRoutes.js.map +1 -0
  254. package/dist/server/sessiond/projectMutationRoutes.js +39 -0
  255. package/dist/server/sessiond/projectMutationRoutes.js.map +1 -0
  256. package/dist/server/sessiond/sessionDaemonShutdown.js +36 -0
  257. package/dist/server/sessiond/sessionDaemonShutdown.js.map +1 -0
  258. package/dist/server/sessiond/sessionDaemonStartup.js +30 -4
  259. package/dist/server/sessiond/sessionDaemonStartup.js.map +1 -1
  260. package/dist/server/sessiond/sessionProxyRoutes.js +263 -91
  261. package/dist/server/sessiond/sessionProxyRoutes.js.map +1 -1
  262. package/dist/server/sessiond/sessionServiceDependencies.js +5 -0
  263. package/dist/server/sessiond/sessionServiceDependencies.js.map +1 -1
  264. package/dist/server/sessiond/sessiondStateOwnership.js +174 -39
  265. package/dist/server/sessiond/sessiondStateOwnership.js.map +1 -1
  266. package/dist/server/sessiond/workspaceCatalogRoutes.js +11 -5
  267. package/dist/server/sessiond/workspaceCatalogRoutes.js.map +1 -1
  268. package/dist/server/sessiond/workspaceNotificationRoutes.js +55 -0
  269. package/dist/server/sessiond/workspaceNotificationRoutes.js.map +1 -0
  270. package/dist/server/sessiond/workspaceRemovalRoutes.js +1 -1
  271. package/dist/server/sessiond/workspaceRemovalRoutes.js.map +1 -1
  272. package/dist/server/sessiond.js +313 -69
  273. package/dist/server/sessiond.js.map +1 -1
  274. package/dist/server/sessions/askUserDomain.js +232 -0
  275. package/dist/server/sessions/askUserDomain.js.map +1 -0
  276. package/dist/server/sessions/askUserTool.js +18 -21
  277. package/dist/server/sessions/askUserTool.js.map +1 -1
  278. package/dist/server/sessions/attachmentService.js +2 -6
  279. package/dist/server/sessions/attachmentService.js.map +1 -1
  280. package/dist/server/sessions/authRoutes.js +32 -19
  281. package/dist/server/sessions/authRoutes.js.map +1 -1
  282. package/dist/server/sessions/authService.js +31 -11
  283. package/dist/server/sessions/authService.js.map +1 -1
  284. package/dist/server/sessions/builtinCommands.js +28 -21
  285. package/dist/server/sessions/builtinCommands.js.map +1 -1
  286. package/dist/server/sessions/builtinExtensionFactories.js +36 -0
  287. package/dist/server/sessions/builtinExtensionFactories.js.map +1 -0
  288. package/dist/server/sessions/clientSessionPreview.js +14 -0
  289. package/dist/server/sessions/clientSessionPreview.js.map +1 -0
  290. package/dist/server/sessions/companionBackend.js +286 -0
  291. package/dist/server/sessions/companionBackend.js.map +1 -0
  292. package/dist/server/sessions/dockerEnvironmentFacts.js +98 -10
  293. package/dist/server/sessions/dockerEnvironmentFacts.js.map +1 -1
  294. package/dist/server/sessions/extensionSessionDispatch.js +76 -0
  295. package/dist/server/sessions/extensionSessionDispatch.js.map +1 -0
  296. package/dist/server/sessions/globalProviderPolicy.js +88 -19
  297. package/dist/server/sessions/globalProviderPolicy.js.map +1 -1
  298. package/dist/server/sessions/managementAgentTools.js +116 -6
  299. package/dist/server/sessions/managementAgentTools.js.map +1 -1
  300. package/dist/server/sessions/managementPermissionSystem.js +36 -14
  301. package/dist/server/sessions/managementPermissionSystem.js.map +1 -1
  302. package/dist/server/sessions/managementSandbox.js +7 -18
  303. package/dist/server/sessions/managementSandbox.js.map +1 -1
  304. package/dist/server/sessions/mcpAuthFlowService.js +289 -0
  305. package/dist/server/sessions/mcpAuthFlowService.js.map +1 -0
  306. package/dist/server/sessions/mcpAuthRoutes.js +104 -0
  307. package/dist/server/sessions/mcpAuthRoutes.js.map +1 -0
  308. package/dist/server/sessions/mcpOAuthCredentialAdapter.js +92 -0
  309. package/dist/server/sessions/mcpOAuthCredentialAdapter.js.map +1 -0
  310. package/dist/server/sessions/messageHistoryTarget.js +79 -0
  311. package/dist/server/sessions/messageHistoryTarget.js.map +1 -0
  312. package/dist/server/sessions/messagePaging.js +2 -2
  313. package/dist/server/sessions/messagePaging.js.map +1 -1
  314. package/dist/server/sessions/modelCatalogRefresher.js +4 -3
  315. package/dist/server/sessions/modelCatalogRefresher.js.map +1 -1
  316. package/dist/server/sessions/oauthLoginFlowService.js +19 -20
  317. package/dist/server/sessions/oauthLoginFlowService.js.map +1 -1
  318. package/dist/server/sessions/piSessionEventConnections.js +68 -0
  319. package/dist/server/sessions/piSessionEventConnections.js.map +1 -0
  320. package/dist/server/sessions/piSessionManagerGateway.js +206 -27
  321. package/dist/server/sessions/piSessionManagerGateway.js.map +1 -1
  322. package/dist/server/sessions/piSessionService.js +2508 -991
  323. package/dist/server/sessions/piSessionService.js.map +1 -1
  324. package/dist/server/sessions/plainTextTheme.js +1 -1
  325. package/dist/server/sessions/plainTextTheme.js.map +1 -1
  326. package/dist/server/sessions/projectAuthService.js +35 -6
  327. package/dist/server/sessions/projectAuthService.js.map +1 -1
  328. package/dist/server/sessions/projectSettingsScope.js +88 -33
  329. package/dist/server/sessions/projectSettingsScope.js.map +1 -1
  330. package/dist/server/sessions/projectTrust.js +119 -0
  331. package/dist/server/sessions/projectTrust.js.map +1 -0
  332. package/dist/server/sessions/queuedMessageMutation.js +170 -0
  333. package/dist/server/sessions/queuedMessageMutation.js.map +1 -0
  334. package/dist/server/sessions/relaySkill.js +169 -0
  335. package/dist/server/sessions/relaySkill.js.map +1 -0
  336. package/dist/server/sessions/sessionActivityMarker.js +105 -0
  337. package/dist/server/sessions/sessionActivityMarker.js.map +1 -0
  338. package/dist/server/sessions/sessionArchiveMapping.js +16 -15
  339. package/dist/server/sessions/sessionArchiveMapping.js.map +1 -1
  340. package/dist/server/sessions/sessionArchiveStore.js +5 -1
  341. package/dist/server/sessions/sessionArchiveStore.js.map +1 -1
  342. package/dist/server/sessions/sessionArchiveTree.js +2 -2
  343. package/dist/server/sessions/sessionArchiveTree.js.map +1 -1
  344. package/dist/server/sessions/sessionCleanup.js +4 -3
  345. package/dist/server/sessions/sessionCleanup.js.map +1 -1
  346. package/dist/server/sessions/sessionCommandService.js +79 -87
  347. package/dist/server/sessions/sessionCommandService.js.map +1 -1
  348. package/dist/server/sessions/sessionEnvironmentFacts.js +5 -4
  349. package/dist/server/sessions/sessionEnvironmentFacts.js.map +1 -1
  350. package/dist/server/sessions/sessionFileHeader.js +41 -0
  351. package/dist/server/sessions/sessionFileHeader.js.map +1 -1
  352. package/dist/server/sessions/sessionImageDimensions.js +31 -0
  353. package/dist/server/sessions/sessionImageDimensions.js.map +1 -0
  354. package/dist/server/sessions/sessionMediaIndex.js +191 -0
  355. package/dist/server/sessions/sessionMediaIndex.js.map +1 -0
  356. package/dist/server/sessions/sessionMetadata.js +51 -0
  357. package/dist/server/sessions/sessionMetadata.js.map +1 -0
  358. package/dist/server/sessions/sessionModelScope.js +160 -0
  359. package/dist/server/sessions/sessionModelScope.js.map +1 -0
  360. package/dist/server/sessions/sessionNameGenerator.js +16 -35
  361. package/dist/server/sessions/sessionNameGenerator.js.map +1 -1
  362. package/dist/server/sessions/sessionNotificationStore.js +14 -11
  363. package/dist/server/sessions/sessionNotificationStore.js.map +1 -1
  364. package/dist/server/sessions/sessionReadAccess.js +41 -0
  365. package/dist/server/sessions/sessionReadAccess.js.map +1 -0
  366. package/dist/server/sessions/sessionRoutes.js +221 -78
  367. package/dist/server/sessions/sessionRoutes.js.map +1 -1
  368. package/dist/server/sessions/sessionSummaryScanner.js +62 -5
  369. package/dist/server/sessions/sessionSummaryScanner.js.map +1 -1
  370. package/dist/server/sessions/sessionTreeProjection.js +50 -49
  371. package/dist/server/sessions/sessionTreeProjection.js.map +1 -1
  372. package/dist/server/sessions/sessionUiEvents.js +22 -10
  373. package/dist/server/sessions/sessionUiEvents.js.map +1 -1
  374. package/dist/server/sessions/sessionUnreadStore.js +53 -3
  375. package/dist/server/sessions/sessionUnreadStore.js.map +1 -1
  376. package/dist/server/sessions/spawnSessionTool.js +14 -6
  377. package/dist/server/sessions/spawnSessionTool.js.map +1 -1
  378. package/dist/server/sessions/spawnSubsessionTool.js +40 -24
  379. package/dist/server/sessions/spawnSubsessionTool.js.map +1 -1
  380. package/dist/server/sessions/spawnTargetResolver.js +1 -1
  381. package/dist/server/sessions/subsessionCompletionDelivery.js +15 -0
  382. package/dist/server/sessions/subsessionCompletionDelivery.js.map +1 -0
  383. package/dist/server/sessions/subsessionCompletionInbox.js +134 -0
  384. package/dist/server/sessions/subsessionCompletionInbox.js.map +1 -0
  385. package/dist/server/sessions/subsessionProvenance.js +27 -0
  386. package/dist/server/sessions/subsessionProvenance.js.map +1 -0
  387. package/dist/server/sessions/transcriptBranchCache.js +81 -0
  388. package/dist/server/sessions/transcriptBranchCache.js.map +1 -0
  389. package/dist/server/sessions/transcriptMarkdown.js +48 -0
  390. package/dist/server/sessions/transcriptMarkdown.js.map +1 -0
  391. package/dist/server/sessions/transcriptMessages.js +57 -0
  392. package/dist/server/sessions/transcriptMessages.js.map +1 -0
  393. package/dist/server/startupLogger.js +13 -0
  394. package/dist/server/startupLogger.js.map +1 -0
  395. package/dist/server/startupUrls.js +27 -0
  396. package/dist/server/startupUrls.js.map +1 -0
  397. package/dist/server/status/machineStatusService.js +15 -7
  398. package/dist/server/status/machineStatusService.js.map +1 -1
  399. package/dist/server/storage/navigationPreferenceStore.js +138 -0
  400. package/dist/server/storage/navigationPreferenceStore.js.map +1 -0
  401. package/dist/server/storage/piPackageDismissalStore.js +78 -0
  402. package/dist/server/storage/piPackageDismissalStore.js.map +1 -0
  403. package/dist/server/terminals/{terminalService.js → managementCommandRunService.js} +98 -102
  404. package/dist/server/terminals/managementCommandRunService.js.map +1 -0
  405. package/dist/server/terminals/managementTerminalRoutes.js +91 -0
  406. package/dist/server/terminals/managementTerminalRoutes.js.map +1 -0
  407. package/dist/server/terminals/requiredTerminalService.js +103 -0
  408. package/dist/server/terminals/requiredTerminalService.js.map +1 -0
  409. package/dist/server/webSocketBridge.js +348 -0
  410. package/dist/server/webSocketBridge.js.map +1 -1
  411. package/dist/server/workbench/accessStateStore.js +33 -5
  412. package/dist/server/workbench/accessStateStore.js.map +1 -1
  413. package/dist/server/workbench/capabilitySearch.js +3 -2
  414. package/dist/server/workbench/capabilitySearch.js.map +1 -1
  415. package/dist/server/workbench/gatewayIntegration.js +40 -13
  416. package/dist/server/workbench/gatewayIntegration.js.map +1 -1
  417. package/dist/server/workbench/knowledgeSearch.js +100 -0
  418. package/dist/server/workbench/knowledgeSearch.js.map +1 -0
  419. package/dist/server/workbench/mcpClient.js +41 -8
  420. package/dist/server/workbench/mcpClient.js.map +1 -1
  421. package/dist/server/workbench/skillSync.js +11 -3
  422. package/dist/server/workbench/skillSync.js.map +1 -1
  423. package/dist/server/workbench/workbenchClient.js +130 -7
  424. package/dist/server/workbench/workbenchClient.js.map +1 -1
  425. package/dist/server/workbench/workbenchTools.js +196 -14
  426. package/dist/server/workbench/workbenchTools.js.map +1 -1
  427. package/dist/server/workingDirectory.js +3 -2
  428. package/dist/server/workingDirectory.js.map +1 -1
  429. package/dist/server/workspaceExplorerRoutes.js +53 -21
  430. package/dist/server/workspaceExplorerRoutes.js.map +1 -1
  431. package/dist/server/workspaces/fileContentService.js +31 -16
  432. package/dist/server/workspaces/fileContentService.js.map +1 -1
  433. package/dist/server/workspaces/fileOperationService.js +11 -9
  434. package/dist/server/workspaces/fileOperationService.js.map +1 -1
  435. package/dist/server/workspaces/filePreviewService.js +10 -6
  436. package/dist/server/workspaces/filePreviewService.js.map +1 -1
  437. package/dist/server/workspaces/fileSuggestions.js +77 -10
  438. package/dist/server/workspaces/fileSuggestions.js.map +1 -1
  439. package/dist/server/workspaces/fileTreeService.js +103 -15
  440. package/dist/server/workspaces/fileTreeService.js.map +1 -1
  441. package/dist/server/workspaces/normalProjectCwdResolver.js +35 -0
  442. package/dist/server/workspaces/normalProjectCwdResolver.js.map +1 -0
  443. package/dist/server/workspaces/pathAccessPolicy.js +24 -18
  444. package/dist/server/workspaces/pathAccessPolicy.js.map +1 -1
  445. package/dist/server/workspaces/pathSafety.js +6 -5
  446. package/dist/server/workspaces/pathSafety.js.map +1 -1
  447. package/dist/server/workspaces/projectPiWebConfig.js +95 -8
  448. package/dist/server/workspaces/projectPiWebConfig.js.map +1 -1
  449. package/dist/server/workspaces/projectWorkspaceCwds.js +0 -5
  450. package/dist/server/workspaces/projectWorkspaceCwds.js.map +1 -1
  451. package/dist/server/workspaces/sessionDaemonWorkspaceCatalog.js +37 -22
  452. package/dist/server/workspaces/sessionDaemonWorkspaceCatalog.js.map +1 -1
  453. package/dist/server/workspaces/workspaceCatalog.js +6 -4
  454. package/dist/server/workspaces/workspaceCatalog.js.map +1 -1
  455. package/dist/server/workspaces/workspaceChangeNotifier.js +12 -0
  456. package/dist/server/workspaces/workspaceChangeNotifier.js.map +1 -0
  457. package/dist/server/workspaces/workspaceDeletionRoutes.js +9 -70
  458. package/dist/server/workspaces/workspaceDeletionRoutes.js.map +1 -1
  459. package/dist/server/workspaces/workspaceNotificationCommand.js +64 -0
  460. package/dist/server/workspaces/workspaceNotificationCommand.js.map +1 -0
  461. package/dist/server/workspaces/workspaceProviderRegistry.js +128 -24
  462. package/dist/server/workspaces/workspaceProviderRegistry.js.map +1 -1
  463. package/dist/server/workspaces/workspaceRemovalService.js +41 -7
  464. package/dist/server/workspaces/workspaceRemovalService.js.map +1 -1
  465. package/dist/server/workspaces/workspaceRouteContext.js +1 -1
  466. package/dist/server/workspaces/workspaceRouteContext.js.map +1 -1
  467. package/dist/server/workspaces/workspaceRouteErrors.js +4 -2
  468. package/dist/server/workspaces/workspaceRouteErrors.js.map +1 -1
  469. package/dist/server/workspaces/workspaceUserError.js +18 -0
  470. package/dist/server/workspaces/workspaceUserError.js.map +1 -0
  471. package/dist/server-plugin-api.d.ts +349 -49
  472. package/dist/server-plugin-api.js +344 -2
  473. package/dist/server-plugin-api.js.map +1 -1
  474. package/dist/serverPluginRecovery.js +6 -1
  475. package/dist/serverPluginRecovery.js.map +1 -1
  476. package/dist/sessiond/activeAgentProfile.js +27 -2
  477. package/dist/sessiond/activeAgentProfile.js.map +1 -1
  478. package/dist/sessiond/config.js +4 -3
  479. package/dist/sessiond/config.js.map +1 -1
  480. package/dist/sessiond/sessionDaemonClient.js +75 -19
  481. package/dist/sessiond/sessionDaemonClient.js.map +1 -1
  482. package/dist/sessiond/sessionDaemonErrors.js +49 -0
  483. package/dist/sessiond/sessionDaemonErrors.js.map +1 -0
  484. package/dist/shared/activeAgentProfile.js +2 -34
  485. package/dist/shared/activeAgentProfile.js.map +1 -1
  486. package/dist/shared/activity.js +0 -3
  487. package/dist/shared/activity.js.map +1 -1
  488. package/dist/shared/apiTypes.js +10 -3
  489. package/dist/shared/apiTypes.js.map +1 -1
  490. package/dist/shared/capabilities.js +8 -0
  491. package/dist/shared/capabilities.js.map +1 -1
  492. package/dist/shared/federatedRoutes.js +77 -11
  493. package/dist/shared/federatedRoutes.js.map +1 -1
  494. package/dist/shared/i18n.js +41 -0
  495. package/dist/shared/i18n.js.map +1 -0
  496. package/dist/shared/machinePluginIds.js +30 -7
  497. package/dist/shared/machinePluginIds.js.map +1 -1
  498. package/dist/shared/machineStatus.js +46 -3
  499. package/dist/shared/machineStatus.js.map +1 -1
  500. package/dist/shared/navigationPreferences.js +6 -0
  501. package/dist/shared/navigationPreferences.js.map +1 -0
  502. package/dist/shared/piWebConfigParsing.js +118 -49
  503. package/dist/shared/piWebConfigParsing.js.map +1 -1
  504. package/dist/shared/piWebStatusParsing.js +33 -0
  505. package/dist/shared/piWebStatusParsing.js.map +1 -1
  506. package/dist/shared/pluginApiTypes.d.ts +87 -8
  507. package/dist/shared/pluginApiTypes.js +2 -0
  508. package/dist/shared/pluginApiTypes.js.map +1 -0
  509. package/dist/shared/pluginBackendProtocol.js +218 -2
  510. package/dist/shared/pluginBackendProtocol.js.map +1 -1
  511. package/dist/shared/pluginCatalogTypes.d.ts +49 -0
  512. package/dist/shared/pluginCatalogTypes.js +156 -0
  513. package/dist/shared/pluginCatalogTypes.js.map +1 -0
  514. package/dist/shared/pluginIds.js +10 -1
  515. package/dist/shared/pluginIds.js.map +1 -1
  516. package/dist/shared/requiredTerminalPlugin.js +6 -0
  517. package/dist/shared/requiredTerminalPlugin.js.map +1 -0
  518. package/dist/shared/serverNoticeContract.js +88 -0
  519. package/dist/shared/serverNoticeContract.js.map +1 -0
  520. package/dist/shared/sessionDefaults.js +42 -0
  521. package/dist/shared/sessionDefaults.js.map +1 -0
  522. package/dist/shared/sessionMedia.js +12 -0
  523. package/dist/shared/sessionMedia.js.map +1 -0
  524. package/dist/shared/streamingBehavior.js +8 -0
  525. package/dist/shared/streamingBehavior.js.map +1 -0
  526. package/dist/shared/themePreference.js +24 -0
  527. package/dist/shared/themePreference.js.map +1 -0
  528. package/dist/shared/thinkingLevels.js +17 -16
  529. package/dist/shared/thinkingLevels.js.map +1 -1
  530. package/dist/shared/workspaceFiles.js.map +1 -1
  531. package/dist/workspaceNotificationCli.js +95 -0
  532. package/dist/workspaceNotificationCli.js.map +1 -0
  533. package/docs/README.md +31 -0
  534. package/docs/config.md +344 -277
  535. package/docs/plugins.md +204 -930
  536. package/examples/session-bridge-plugin/README.md +20 -0
  537. package/examples/session-bridge-plugin/docs/usage.md +54 -0
  538. package/examples/session-bridge-plugin/package.json +26 -0
  539. package/examples/session-bridge-plugin/src/browser/index.ts +87 -0
  540. package/examples/session-bridge-plugin/src/browser/protocol.ts +24 -0
  541. package/examples/session-bridge-plugin/src/companion.ts +65 -0
  542. package/examples/session-bridge-plugin/src/reviewRun.ts +39 -0
  543. package/examples/session-bridge-plugin/src/server.ts +85 -0
  544. package/examples/session-bridge-plugin/src/store.ts +80 -0
  545. package/examples/session-bridge-plugin/tsconfig.json +21 -0
  546. package/examples/workspace-provider-plugin/README.md +39 -0
  547. package/examples/workspace-provider-plugin/package.json +25 -0
  548. package/examples/workspace-provider-plugin/src/browser/index.ts +69 -0
  549. package/examples/workspace-provider-plugin/src/server.ts +68 -0
  550. package/examples/workspace-provider-plugin/tsconfig.json +21 -0
  551. package/extensions/pi-web.ts +3 -1
  552. package/package.json +59 -36
  553. package/skills/README.md +28 -2
  554. package/skills/relay/SKILL.md +24 -89
  555. package/skills/relay-runner/SKILL.md +74 -0
  556. package/dist/client/assets/CodeViewer-DCl56K0Z.js +0 -4
  557. package/dist/client/assets/TerminalPanel-DCvoEjUF.js +0 -187
  558. package/dist/client/assets/index-CMvms5cF.js +0 -4325
  559. package/dist/client/assets/vendor-editor-core-vUi74DnD.js +0 -12
  560. package/dist/client/assets/vendor-editor-languages-DoaXUodB.js +0 -46
  561. package/dist/client/assets/vendor-editor-legacy-CYBnW6ZU.js +0 -1
  562. package/dist/client/assets/vendor-terminal-BrP-ENHg.css +0 -1
  563. package/dist/client/assets/vendor-terminal-D8k4UKM2.js +0 -35
  564. package/dist/pi-web-plugins/relays/package.json +0 -9
  565. package/dist/pi-web-plugins/relays/pi-web-plugin.js +0 -44
  566. package/dist/server/git/gitService.js +0 -290
  567. package/dist/server/git/gitService.js.map +0 -1
  568. package/dist/server/gitRoutes.js +0 -23
  569. package/dist/server/gitRoutes.js.map +0 -1
  570. package/dist/server/sessions/pendingAskStore.js +0 -278
  571. package/dist/server/sessions/pendingAskStore.js.map +0 -1
  572. package/dist/server/terminalProxyRoutes.js +0 -178
  573. package/dist/server/terminalProxyRoutes.js.map +0 -1
  574. package/dist/server/terminals/terminalRoutes.js +0 -164
  575. package/dist/server/terminals/terminalRoutes.js.map +0 -1
  576. package/dist/server/terminals/terminalService.js.map +0 -1
  577. package/dist/server/terminals/terminalSize.js +0 -17
  578. package/dist/server/terminals/terminalSize.js.map +0 -1
  579. package/dist/server/workspaces/gitWorktreeDiscovery.js +0 -43
  580. package/dist/server/workspaces/gitWorktreeDiscovery.js.map +0 -1
  581. package/dist/server/workspaces/workspaceService.js +0 -52
  582. package/dist/server/workspaces/workspaceService.js.map +0 -1
  583. /package/dist/{pi-web-plugins → pi-packages}/relays/vendor/README.md +0 -0
  584. /package/dist/{pi-web-plugins → pi-packages}/relays/vendor/marked.esm.js +0 -0
@@ -1,37 +1,50 @@
1
1
  #!/usr/bin/env node
2
2
  import { mkdir, rm } from "node:fs/promises";
3
+ import { loadNodeTranslator } from "../localization.js";
3
4
  import { dirname, join } from "node:path";
4
5
  import { homedir } from "node:os";
5
6
  import Fastify from "fastify";
6
7
  import fastifyWebsocket from "@fastify/websocket";
8
+ import { handleWebSocketError, installPluginBackendChannelWebSocketPayloadLimit } from "./webSocketBridge.js";
7
9
  import { WorkspaceActivityService } from "./activity/workspaceActivityService.js";
8
10
  import { registerWorkspaceActivityRoutes } from "./activity/workspaceActivityRoutes.js";
9
11
  import { MachineStatusService } from "./status/machineStatusService.js";
10
12
  import { registerMachineStatusRoutes } from "./status/machineStatusRoutes.js";
11
13
  import { CachedWorkspaceAttribution } from "./status/workspaceAttribution.js";
12
14
  import { SessionEventHub } from "./realtime/sessionEventHub.js";
13
- import { AuthService, createLocalOnlyModelRuntime } from "./sessions/authService.js";
15
+ import { ServerNoticeStore } from "./notices/serverNoticeStore.js";
16
+ import { ServerNoticeService } from "./notices/serverNoticeService.js";
17
+ import { registerServerNoticeRoutes } from "./notices/serverNoticeRoutes.js";
18
+ import { AuthService } from "./sessions/authService.js";
14
19
  import { ProjectAuthService } from "./sessions/projectAuthService.js";
20
+ import { ModelCatalogRefresher } from "./sessions/modelCatalogRefresher.js";
21
+ import { SessionArchiveStore, defaultSessionArchiveFilePath } from "./sessions/sessionArchiveStore.js";
22
+ import { SessionNotificationStore } from "./sessions/sessionNotificationStore.js";
15
23
  import { registerAuthRoutes } from "./sessions/authRoutes.js";
24
+ import { registerMcpAuthRoutes } from "./sessions/mcpAuthRoutes.js";
16
25
  import { PiSessionService } from "./sessions/piSessionService.js";
17
26
  import { createPiSessionManagerGateway } from "./sessions/piSessionManagerGateway.js";
18
27
  import { registerSessionRoutes } from "./sessions/sessionRoutes.js";
19
28
  import { ProjectScopedSpawnTargetResolver } from "./sessions/spawnTargetResolver.js";
20
29
  import { ProjectService } from "./projects/projectService.js";
21
- import { ProjectStore } from "./storage/projectStore.js";
22
- import { WorkspaceService } from "./workspaces/workspaceService.js";
30
+ import { ProjectLifecycleService } from "./projects/projectLifecycleService.js";
31
+ import { ProjectStore, projectStorePath } from "./storage/projectStore.js";
32
+ import { FileSessionUnreadPersistence, SessionUnreadStore, defaultSessionUnreadFilePath } from "./sessions/sessionUnreadStore.js";
23
33
  import { sessiondSocketPath } from "../sessiond/config.js";
24
- import { TerminalService } from "./terminals/terminalService.js";
25
- import { registerTerminalRoutes } from "./terminals/terminalRoutes.js";
34
+ import { ManagementCommandRunService } from "./terminals/managementCommandRunService.js";
35
+ import { registerManagementTerminalRoutes } from "./terminals/managementTerminalRoutes.js";
36
+ import { REQUIRED_TERMINAL_SERVICE_CAPABILITY, unavailableRequiredTerminalService } from "./terminals/requiredTerminalService.js";
26
37
  import { getPiWebRuntimeComponent } from "./piWebStatus.js";
27
38
  import { SESSIOND_RUNTIME_CAPABILITIES } from "../shared/capabilities.js";
28
- import { DEFAULT_MANAGEMENT_AUDIT_INDEX_PREFIX, DEFAULT_MANAGEMENT_AUDIT_RETENTION_DAYS, DEFAULT_NORMAL_TOOL_AUDIT_MAX_ROWS, DEFAULT_NORMAL_TOOL_AUDIT_RETENTION_DAYS, PI_CODING_AGENT_DIR_ENV, PI_CODING_AGENT_SESSION_DIR_ENV, agentSessionDirEnvKeys, agentSessionDirEnvOverride, effectivePiWebConfig, maxUploadBytes, piWebDataDir } from "../config.js";
29
- import { createActiveAgentProfileDescriptor } from "../sessiond/activeAgentProfile.js";
39
+ import { DEFAULT_MANAGEMENT_AUDIT_INDEX_PREFIX, DEFAULT_MANAGEMENT_AUDIT_RETENTION_DAYS, DEFAULT_NORMAL_TOOL_AUDIT_MAX_ROWS, DEFAULT_NORMAL_TOOL_AUDIT_RETENTION_DAYS, PI_CODING_AGENT_DIR_ENV, PI_CODING_AGENT_SESSION_DIR_ENV, agentSessionDirEnvKeys, agentSessionDirEnvOverride, effectivePiWebConfig, maxUploadBytes, offlineModeEnabled, piWebDataDir, sessionArchiveDirectory } from "../config.js";
40
+ import { createActiveAgentProfileDescriptor, publicActiveAgentProfileDescriptor } from "../sessiond/activeAgentProfile.js";
30
41
  import { scrubNonAgentVisibleEnvKeys } from "./sessiond/agentProcessEnvironment.js";
31
42
  import { claimSessiondStateOwnership } from "./sessiond/sessiondStateOwnership.js";
32
43
  import { dockerEnvironmentPromptSections } from "./sessions/dockerEnvironmentFacts.js";
33
44
  import { PI_WEB_SESSION_ENV, sessionEnvironmentPromptSections } from "./sessions/sessionEnvironmentFacts.js";
34
45
  import { runSessionDaemonStartup } from "./sessiond/sessionDaemonStartup.js";
46
+ import { runSessionDaemonShutdown } from "./sessiond/sessionDaemonShutdown.js";
47
+ import { applyAgentHttpIdleTimeout } from "./sessiond/agentHttpDispatcher.js";
35
48
  import { requestLoggerOptions } from "./requestLogging.js";
36
49
  import { WorkbenchAccessStateStore } from "./workbench/accessStateStore.js";
37
50
  import { registerWorkbenchAccessStateRoutes } from "./workbench/accessStateRoutes.js";
@@ -42,19 +55,45 @@ import { NormalToolAuditStore, normalToolAuditDatabasePath } from "./audit/norma
42
55
  import { ManagementAuditStore } from "./audit/managementAuditStore.js";
43
56
  import { managementProjectIdForCwd, projectsFromManagedEmbedContext } from "./managementEmbed.js";
44
57
  import { managementContextFromEventScope, NORMAL_SESSION_EVENT_SCOPE } from "./realtime/sessionEventScope.js";
45
- import { PiWebPluginCatalog } from "./piWebPluginCatalog.js";
58
+ import { DefaultPiPackageProvider, PiWebPluginCatalog } from "./piWebPluginCatalog.js";
59
+ import { createDefaultPiPackageService } from "./piPackageService.js";
60
+ import { PiPackageDismissalStore, piPackageDismissalStorePath } from "./storage/piPackageDismissalStore.js";
61
+ import { reconcileAutoInstallablePiPackages } from "./sessiond/autoInstallPiPackages.js";
46
62
  import { loadServerPluginRecoveryConfig } from "../serverPluginRecovery.js";
47
63
  import { createServerPluginExecFile } from "./plugins/serverPluginExec.js";
64
+ import { PI_WEB_HOST_PI_SESSION_EVENTS_CAPABILITY, PI_WEB_HOST_PI_SESSIONS_CAPABILITY, PI_WEB_HOST_WORKSPACES_CAPABILITY, } from "../server-plugin-api.js";
48
65
  import { createServerPluginRuntime } from "./plugins/serverPluginRuntime.js";
66
+ import { ProjectPluginSettingsSnapshots } from "./plugins/projectPluginSettings.js";
67
+ import { createWorkspaceNotificationCommandFactory } from "./workspaces/workspaceNotificationCommand.js";
68
+ import { WorkspaceChangeNotifier } from "./workspaces/workspaceChangeNotifier.js";
69
+ import { registerWorkspaceNotificationRoutes } from "./sessiond/workspaceNotificationRoutes.js";
70
+ import { createServerPluginPiSessionEventsCapabilityFactory } from "./plugins/serverPluginPiSessionEventsCapability.js";
71
+ import { createServerPluginPiSessionsCapabilityFactory } from "./plugins/serverPluginPiSessionsCapability.js";
72
+ import { createServerPluginWorkspacesCapabilityFactory } from "./plugins/serverPluginWorkspacesCapability.js";
49
73
  import { eligibleWorkspaceProviderContributions, WorkspaceProviderRegistry } from "./workspaces/workspaceProviderRegistry.js";
74
+ import { eligiblePluginBackendContributions, PluginBackendRegistry } from "./plugins/pluginBackendRegistry.js";
75
+ import { createServerPluginCatalogCapabilityFactory } from "./plugins/serverPluginCatalogCapability.js";
76
+ import { PI_WEB_HOST_CATALOG_CAPABILITY } from "../shared/pluginCatalogTypes.js";
77
+ import { registerPluginCatalogRoutes } from "./sessiond/pluginCatalogRoutes.js";
78
+ import { PiSessionEventConnections } from "./sessions/piSessionEventConnections.js";
79
+ import { bindCompanionBackend } from "./sessions/companionBackend.js";
50
80
  import { createWorkspaceProviderRuntimeSnapshot } from "./workspaces/workspaceCatalog.js";
51
81
  import { WorkspaceRemovalService } from "./workspaces/workspaceRemovalService.js";
52
82
  import { registerPluginBackendRoutes } from "./sessiond/pluginBackendRoutes.js";
83
+ import { registerPluginBackendChannelRoutes } from "./sessiond/pluginBackendChannelRoutes.js";
53
84
  import { registerWorkspaceCatalogRoutes } from "./sessiond/workspaceCatalogRoutes.js";
54
85
  import { registerWorkspaceRemovalRoutes } from "./sessiond/workspaceRemovalRoutes.js";
86
+ import { registerProjectMutationRoutes } from "./sessiond/projectMutationRoutes.js";
87
+ import { createFilePiWebConfigService } from "./configRoutes.js";
55
88
  const daemonEnvironment = { ...process.env };
56
89
  const serverPluginRecovery = loadServerPluginRecoveryConfig({ env: daemonEnvironment });
57
- const { config } = effectivePiWebConfig({ env: daemonEnvironment });
90
+ const { config, deprecatedAgentInputs } = effectivePiWebConfig({ env: daemonEnvironment });
91
+ const configuredManagementProjectRoot = config.managementEmbed === undefined
92
+ ? undefined
93
+ : config.managementEmbed.projectRoot ?? join(homedir(), "PiWeb");
94
+ const translator = loadNodeTranslator("server", config);
95
+ // Request-time defaults must observe Settings edits without restarting sessiond.
96
+ const configService = createFilePiWebConfigService({ env: daemonEnvironment });
58
97
  // The embedded Pi SDK and every child process use the same resolved profile.
59
98
  daemonEnvironment[PI_CODING_AGENT_DIR_ENV] = config.agent.dir;
60
99
  process.env[PI_CODING_AGENT_DIR_ENV] = config.agent.dir;
@@ -65,51 +104,144 @@ if (sessionDirOverride !== undefined) {
65
104
  }
66
105
  process.env[PI_WEB_SESSION_ENV] = "1";
67
106
  daemonEnvironment[PI_WEB_SESSION_ENV] = "1";
68
- scrubNonAgentVisibleEnvKeys(process.env);
107
+ const scrubbedEnvKeys = scrubNonAgentVisibleEnvKeys(process.env);
69
108
  let stateOwnership;
70
109
  const activeAgentProfile = createActiveAgentProfileDescriptor({
71
110
  command: config.agent.command,
72
111
  dir: config.agent.dir,
73
112
  sessionDirEnvKeys: agentSessionDirEnvKeys(config.agent.command),
74
113
  });
114
+ Object.freeze(daemonEnvironment);
75
115
  const app = Fastify({ logger: requestLoggerOptions(), bodyLimit: maxUploadBytes(daemonEnvironment, config) });
116
+ if (deprecatedAgentInputs.length > 0) {
117
+ app.log.warn({ deprecatedAgentInputs }, "deprecated agent configuration inputs detected; support will be removed in a future release");
118
+ }
119
+ app.log.info({ scrubbedEnvKeys }, "daemon-only environment keys hidden from agent processes");
120
+ if (serverPluginRecovery.safeStartDiagnostic !== undefined) {
121
+ app.log.error({ component: "server-plugins", configPath: serverPluginRecovery.path }, serverPluginRecovery.safeStartDiagnostic);
122
+ }
123
+ let serverQuiescing = false;
124
+ app.addHook("onRequest", async (_request, reply) => {
125
+ if (serverQuiescing)
126
+ await reply.code(503).send({ error: "Session daemon is shutting down" });
127
+ });
76
128
  const serverPluginCatalog = new PiWebPluginCatalog({
77
129
  cwd: process.cwd(),
78
130
  agentDir: activeAgentProfile.dir,
79
131
  configProvider: () => config,
80
132
  warningSink: (message) => { app.log.warn({ component: "server-plugins" }, message); },
81
133
  });
82
- await app.register(fastifyWebsocket);
134
+ await app.register(fastifyWebsocket, { errorHandler: handleWebSocketError });
135
+ installPluginBackendChannelWebSocketPayloadLimit(app.websocketServer);
136
+ let runtimeShutdown;
137
+ let pendingShutdownSignal;
138
+ let shutdownStarted = false;
139
+ async function requestShutdown(signal) {
140
+ if (shutdownStarted)
141
+ return;
142
+ if (runtimeShutdown === undefined) {
143
+ pendingShutdownSignal = signal;
144
+ return;
145
+ }
146
+ shutdownStarted = true;
147
+ app.log.info({ signal }, "shutting down session daemon");
148
+ await runtimeShutdown();
149
+ }
150
+ process.once("SIGINT", (signal) => { void requestShutdown(signal); });
151
+ process.once("SIGTERM", (signal) => { void requestShutdown(signal); });
83
152
  await runSessionDaemonStartup({
84
153
  logger: app.log,
85
- async createRuntime() {
154
+ async createRuntime(registerCleanup) {
86
155
  stateOwnership = await claimSessiondStateOwnership({ env: daemonEnvironment, logger: app.log });
156
+ registerCleanup(() => stateOwnership?.release());
157
+ registerCleanup(() => app.close());
158
+ const appliedHttpIdleTimeout = applyAgentHttpIdleTimeout({ agentDir: activeAgentProfile.dir, cwd: process.cwd() });
159
+ if (appliedHttpIdleTimeout.warning !== undefined) {
160
+ app.log.warn({ httpIdleTimeoutMs: appliedHttpIdleTimeout.timeoutMs }, appliedHttpIdleTimeout.warning);
161
+ }
162
+ else {
163
+ app.log.info({ httpIdleTimeoutMs: appliedHttpIdleTimeout.timeoutMs }, "applied agent profile HTTP idle timeout to the session daemon HTTP stack");
164
+ }
165
+ void reconcileAutoInstallablePiPackages({
166
+ profileDir: activeAgentProfile.dir,
167
+ packageProvider: new DefaultPiPackageProvider(process.cwd(), activeAgentProfile.dir),
168
+ installer: createDefaultPiPackageService(process.cwd(), activeAgentProfile.dir),
169
+ dismissalChecker: new PiPackageDismissalStore(piPackageDismissalStorePath(daemonEnvironment)),
170
+ logger: app.log,
171
+ }).catch((error) => {
172
+ app.log.warn({ err: error }, "Pi package auto-install reconciliation failed unexpectedly; continuing without it");
173
+ });
87
174
  const eventHub = new SessionEventHub();
175
+ const serverNotices = new ServerNoticeService(new ServerNoticeStore(), eventHub);
88
176
  const workspaceActivity = new WorkspaceActivityService(eventHub, (scope) => { machineStatus.notifyChanged(scope); });
89
- const projects = new ProjectService(new ProjectStore());
90
- const workspaces = new WorkspaceService();
177
+ const projects = new ProjectService(new ProjectStore(projectStorePath(daemonEnvironment)));
178
+ const projectSettings = new ProjectPluginSettingsSnapshots(projects);
179
+ await projectSettings.initialize(await projects.list());
180
+ const unreadStore = new SessionUnreadStore({
181
+ persistence: new FileSessionUnreadPersistence(defaultSessionUnreadFilePath(daemonEnvironment)),
182
+ onPersistenceError(operation, error) {
183
+ app.log.error({ err: error, operation }, "session unread persistence failed");
184
+ },
185
+ });
186
+ await unreadStore.load();
187
+ registerCleanup(() => unreadStore.flush());
188
+ let normalToolAudit;
189
+ let managementAudit;
190
+ const constructed = {};
191
+ // Construction failures must keep auth and sessions alive until plugin cleanup finishes.
192
+ registerCleanup(() => normalToolAudit?.close());
193
+ registerCleanup(() => managementAudit?.close());
194
+ registerCleanup(() => constructed.projectAuth?.dispose());
195
+ registerCleanup(() => { constructed.managementAuth?.dispose(); });
196
+ registerCleanup(() => constructed.sessions?.dispose());
91
197
  const serverPlugins = await createServerPluginRuntime({
198
+ translator,
92
199
  catalog: serverPluginCatalog,
200
+ dataDir: piWebDataDir(daemonEnvironment),
93
201
  ...(serverPluginRecovery.safeStart === undefined ? {} : { safeStart: serverPluginRecovery.safeStart }),
94
202
  logger: app.log,
95
203
  execFile: createServerPluginExecFile({ env: daemonEnvironment }),
204
+ projectSettingsResolver: (pluginId, settings, project, signal) => projectSettings.resolve(pluginId, settings, project, signal),
205
+ workspaceNotificationsFactory: createWorkspaceNotificationCommandFactory({
206
+ env: daemonEnvironment,
207
+ listeningPort: () => {
208
+ const address = app.server.address();
209
+ return typeof address === "object" && address !== null ? address.port : undefined;
210
+ },
211
+ }),
212
+ noticeSink: (source, input) => { serverNotices.record({ ...input, source }); },
213
+ lateHostCapabilities: [
214
+ PI_WEB_HOST_WORKSPACES_CAPABILITY,
215
+ PI_WEB_HOST_PI_SESSIONS_CAPABILITY,
216
+ PI_WEB_HOST_PI_SESSION_EVENTS_CAPABILITY,
217
+ PI_WEB_HOST_CATALOG_CAPABILITY,
218
+ ],
96
219
  });
97
- const providerHealth = await serverPlugins.inspectHealth();
220
+ registerCleanup(() => serverPlugins.stop());
221
+ const providerContributions = serverPlugins.providerContributions();
222
+ const providerPluginIds = providerContributions.map(({ pluginId }) => pluginId);
223
+ const providerHealth = await serverPlugins.inspectHealth(providerPluginIds);
98
224
  const workspaceProviders = new WorkspaceProviderRegistry({
99
- contributions: eligibleWorkspaceProviderContributions(serverPlugins.providerContributions(), providerHealth),
225
+ contributions: eligibleWorkspaceProviderContributions(providerContributions, providerHealth),
100
226
  logger: app.log,
101
227
  });
102
- const workspaceProviderRuntime = createWorkspaceProviderRuntimeSnapshot(serverPlugins.healthRecords(), providerHealth, serverPlugins.safeStartLevel(), serverPlugins.catalogDiagnostics());
103
- const projectAuth = new ProjectAuthService({ projects, workspaces });
104
- const managementAuth = new AuthService({
105
- modelRuntime: await createLocalOnlyModelRuntime({
106
- authPath: join(piWebDataDir(), "management-embed", "auth.json"),
107
- modelsPath: join(activeAgentProfile.dir, "models.json"),
108
- }),
228
+ registerCleanup(() => workspaceProviders.closeAll());
229
+ const projectAuth = new ProjectAuthService({ projects, workspaces: workspaceProviders, globalAgentDir: activeAgentProfile.dir, logger: app.log, offline: offlineModeEnabled(daemonEnvironment) });
230
+ constructed.projectAuth = projectAuth;
231
+ const managementAuth = await AuthService.create({
232
+ agentDir: join(piWebDataDir(daemonEnvironment), "management-embed"),
109
233
  });
234
+ constructed.managementAuth = managementAuth;
235
+ const managementCatalogRefresher = new ModelCatalogRefresher({
236
+ runtime: managementAuth.runtime,
237
+ logger: app.log,
238
+ offline: offlineModeEnabled(daemonEnvironment),
239
+ });
240
+ registerCleanup(() => { managementCatalogRefresher.dispose(); });
241
+ managementCatalogRefresher.start();
242
+ managementAuth.subscribe(() => { managementCatalogRefresher.requestRefresh(); });
110
243
  const accessStates = new WorkbenchAccessStateStore();
111
244
  const normalAuditConfig = config.auditLog?.normalMode;
112
- let normalToolAudit;
113
245
  if (normalAuditConfig?.enabled !== false) {
114
246
  try {
115
247
  normalToolAudit = new NormalToolAuditStore({
@@ -126,7 +258,6 @@ await runSessionDaemonStartup({
126
258
  }
127
259
  }
128
260
  const managementAuditConfig = config.auditLog?.managementMode;
129
- let managementAudit;
130
261
  if (managementAuditConfig?.enabled === true && managementAuditConfig.baseUrl !== undefined) {
131
262
  const apiKeyValue = daemonEnvironment["PI_WEB_AUDIT_ES_API_KEY"]?.trim();
132
263
  const usernameValue = daemonEnvironment["PI_WEB_AUDIT_ES_USERNAME"]?.trim();
@@ -156,13 +287,14 @@ await runSessionDaemonStartup({
156
287
  requestTimeoutMs: config.workbenchIntegration.requestTimeoutMs ?? 10_000,
157
288
  });
158
289
  return {
290
+ translator,
159
291
  accessStates,
160
292
  client,
161
293
  mcp: new WorkbenchMcpClient({
162
294
  mcpUrl: config.workbenchIntegration.mcpUrl,
163
295
  timeoutMs: config.workbenchIntegration.capabilityTimeoutMs ?? 30_000,
164
296
  }),
165
- skills: new WorkbenchSkillSynchronizer(config.workbenchIntegration, client, piWebDataDir(daemonEnvironment), fetch, app.log),
297
+ skills: new WorkbenchSkillSynchronizer(config.workbenchIntegration, client, piWebDataDir(daemonEnvironment), fetch, app.log, translator),
166
298
  };
167
299
  })();
168
300
  const projectsForScope = (scope = NORMAL_SESSION_EVENT_SCOPE) => {
@@ -174,11 +306,22 @@ await runSessionDaemonStartup({
174
306
  return projectsFromManagedEmbedContext(config.managementEmbed.projectRoot ?? join(homedir(), "PiWeb"), managementContext);
175
307
  };
176
308
  const spawnTargets = config.spawnSessions
177
- ? new ProjectScopedSpawnTargetResolver({ projects: { list: projectsForScope }, workspaces })
309
+ ? new ProjectScopedSpawnTargetResolver({ projects: { list: projectsForScope }, workspaces: workspaceProviders })
178
310
  : undefined;
311
+ const managementAllowPrivileged = config.managementEmbed?.allowPrivileged === true;
312
+ const companionOptions = {};
313
+ const sessionEvents = new PiSessionEventConnections((bus) => bindCompanionBackend(bus, () => {
314
+ if (companionOptions.current === undefined)
315
+ throw new Error("PI WEB companion backends are not ready during daemon startup");
316
+ return companionOptions.current;
317
+ }));
318
+ const projectLifecycleRef = {};
179
319
  const sessions = new PiSessionService(eventHub, {
320
+ sessionEvents,
321
+ translator,
180
322
  modelRuntime: managementAuth.modelRuntime,
181
323
  managementModelRuntime: managementAuth.modelRuntime,
324
+ ...(configuredManagementProjectRoot === undefined ? {} : { managementProjectRoot: configuredManagementProjectRoot }),
182
325
  normalModelRuntimeForCwd: async (cwd) => (await projectAuth.forCwd(cwd)).modelRuntime,
183
326
  projectPathForCwd: async (cwd) => {
184
327
  try {
@@ -190,10 +333,18 @@ await runSessionDaemonStartup({
190
333
  return undefined;
191
334
  }
192
335
  },
193
- dataDir: piWebDataDir(),
336
+ dataDir: piWebDataDir(daemonEnvironment),
194
337
  agentDir: activeAgentProfile.dir,
195
338
  workspaceActivity,
196
- onUnreadChanged: (scope) => { machineStatus.notifyChanged(scope); },
339
+ unreadStore,
340
+ archiveStore: new SessionArchiveStore(defaultSessionArchiveFilePath(daemonEnvironment), sessionArchiveDirectory(daemonEnvironment, config)),
341
+ notificationStore: new SessionNotificationStore(),
342
+ catalogRefreshStatus: projectAuth,
343
+ onUnreadChanged: (scope, hasNewCompletion) => {
344
+ machineStatus.notifyChanged(scope);
345
+ if (scope === NORMAL_SESSION_EVENT_SCOPE && hasNewCompletion)
346
+ projectLifecycleRef.current?.scheduleCleanup();
347
+ },
197
348
  logger: app.log,
198
349
  ...(normalToolAudit === undefined ? {} : { normalToolAudit }),
199
350
  ...(managementAudit === undefined ? {} : {
@@ -204,17 +355,20 @@ await runSessionDaemonStartup({
204
355
  subsessionsEnabled: spawnTargets !== undefined && config.subsessions,
205
356
  askUserEnabled: config.askUser,
206
357
  extensionDialogsTimeoutMs: config.extensionDialogsTimeoutMs,
358
+ config: configService,
207
359
  appendSystemPromptSections: [
208
360
  ...sessionEnvironmentPromptSections({ env: daemonEnvironment, enabled: config.environmentFacts }),
209
361
  ...dockerEnvironmentPromptSections({ env: daemonEnvironment, enabled: config.environmentFacts, logger: app.log }),
210
362
  ],
211
363
  ...(workbench === undefined ? {} : { workbench }),
364
+ managementAllowPrivileged,
212
365
  sessionManager: createPiSessionManagerGateway({
213
366
  agentDir: activeAgentProfile.dir,
214
367
  env: daemonEnvironment,
215
368
  sessionDirEnvKeys: activeAgentProfile.sessionDirEnvKeys,
216
369
  }),
217
370
  });
371
+ constructed.sessions = sessions;
218
372
  const statusAttribution = new CachedWorkspaceAttribution({
219
373
  projects: { list: projectsForScope },
220
374
  workspaces: { list: (project) => workspaceProviders.list(project) },
@@ -228,30 +382,134 @@ await runSessionDaemonStartup({
228
382
  logger: app.log,
229
383
  });
230
384
  eventHub.setGlobalJoinFrame((scope) => ({ type: "machine.status", status: machineStatus.snapshot(scope) }));
385
+ const workspaceChanges = new WorkspaceChangeNotifier({
386
+ attribution: statusAttribution,
387
+ status: machineStatus,
388
+ publish: (event) => { eventHub.publishRealtime(event, NORMAL_SESSION_EVENT_SCOPE); },
389
+ });
390
+ await serverPlugins.resumeWithHostCapabilityFactories([
391
+ createServerPluginWorkspacesCapabilityFactory({ projects, workspaces: workspaceProviders }),
392
+ createServerPluginCatalogCapabilityFactory({ projects, workspaces: workspaceProviders, sessions }),
393
+ createServerPluginPiSessionsCapabilityFactory({ projects, workspaces: workspaceProviders, sessions }),
394
+ createServerPluginPiSessionEventsCapabilityFactory({ projects, workspaces: workspaceProviders, sessions }),
395
+ ]);
396
+ const projectLifecycle = new ProjectLifecycleService({
397
+ projects,
398
+ workspaces: workspaceProviders,
399
+ hasUnread: () => unreadStore.hasUnread(),
400
+ reconcileUnreadWorkspaces: (cwds) => sessions.reconcileUnreadWorkspaces(cwds),
401
+ logger: app.log,
402
+ onProjectsChanged: () => {
403
+ statusAttribution.invalidate();
404
+ machineStatus.notifyChanged();
405
+ },
406
+ });
407
+ projectLifecycleRef.current = projectLifecycle;
408
+ registerCleanup(() => projectLifecycle.closeAll());
231
409
  machineStatus.notifyChanged();
232
410
  projectAuth.subscribe((change) => { sessions.applyAuthChange(change); });
233
411
  managementAuth.subscribe((change) => { sessions.applyAuthChange(change); });
234
- const terminals = new TerminalService(eventHub, workspaceActivity);
235
- const workspaceRemovals = new WorkspaceRemovalService(workspaceProviders, terminals);
412
+ const managementTerminals = new ManagementCommandRunService(eventHub, workspaceActivity, undefined, managementAllowPrivileged);
413
+ registerCleanup(() => { managementTerminals.dispose(); });
414
+ const terminals = serverPlugins.safeStartLevel() === "none"
415
+ ? unavailableRequiredTerminalService()
416
+ : serverPlugins.resolve(REQUIRED_TERMINAL_SERVICE_CAPABILITY);
417
+ terminals.bindActivitySink({
418
+ updateTerminal: (terminal) => { workspaceActivity.updateTerminal(terminal); },
419
+ removeTerminal: (terminalId, cwd) => { workspaceActivity.removeTerminal(terminalId, cwd); },
420
+ });
421
+ const providerPluginIdSet = new Set(providerPluginIds);
422
+ const remainingActivePluginIds = serverPlugins.healthRecords()
423
+ .filter(({ pluginId, state }) => state === "active" && !providerPluginIdSet.has(pluginId))
424
+ .map(({ pluginId }) => pluginId);
425
+ const remainingHealth = await serverPlugins.inspectHealth(remainingActivePluginIds);
426
+ const pluginHealth = Object.freeze([...providerHealth, ...remainingHealth]
427
+ .sort((left, right) => left.pluginId.localeCompare(right.pluginId)));
428
+ const workspaceProviderRuntime = createWorkspaceProviderRuntimeSnapshot(serverPlugins.healthRecords(), pluginHealth, serverPlugins.safeStartLevel(), serverPlugins.catalogDiagnostics());
429
+ const pluginBackends = new PluginBackendRegistry({
430
+ contributions: eligiblePluginBackendContributions(serverPlugins.pairedBackendContributions(), pluginHealth),
431
+ workspaces: workspaceProviders,
432
+ logger: app.log,
433
+ });
434
+ companionOptions.current = { backends: pluginBackends, contributions: eligiblePluginBackendContributions(serverPlugins.pairedBackendContributions(), pluginHealth), projects };
435
+ const workspaceRemovals = new WorkspaceRemovalService(workspaceProviders, {
436
+ closeForCwd(cwd, managementContext) {
437
+ if (managementContext === undefined)
438
+ terminals.closeForCwd(cwd);
439
+ else
440
+ managementTerminals.closeForCwd(cwd, managementContext);
441
+ },
442
+ runCommand: (options) => options.managementContext === undefined
443
+ ? terminals.runCommand(options)
444
+ : managementTerminals.runCommand(options),
445
+ }, { notices: serverNotices });
446
+ registerCleanup(() => pluginBackends.closeAll());
447
+ registerCleanup(() => workspaceRemovals.closeAll());
236
448
  const runtimeComponent = Object.freeze({
237
- ...getPiWebRuntimeComponent("sessiond", SESSIOND_RUNTIME_CAPABILITIES),
238
- activeAgentProfile,
449
+ ...getPiWebRuntimeComponent("sessiond", SESSIOND_RUNTIME_CAPABILITIES, deprecatedAgentInputs),
450
+ activeAgentProfile: publicActiveAgentProfileDescriptor(activeAgentProfile),
239
451
  });
240
- return { eventHub, machineStatus, statusAttribution, workspaceActivity, projectAuth, managementAuth, sessions, terminals, accessStates, normalToolAudit, managementAudit, activeAgentProfile, runtimeComponent, serverPlugins, workspaceProviders, workspaceProviderRuntime, workspaceRemovals, projects };
452
+ projectLifecycle.scheduleCleanup();
453
+ let shutdownPromise;
454
+ const shutdown = () => {
455
+ shutdownPromise ??= runSessionDaemonShutdown({
456
+ logger: app.log,
457
+ onFailure: () => { process.exitCode = 1; },
458
+ dependencies: {
459
+ quiesceServer: async () => {
460
+ serverQuiescing = true;
461
+ await projectLifecycle.closeAll();
462
+ },
463
+ serverPlugins,
464
+ catalogRefresher: managementCatalogRefresher,
465
+ auth: managementAuth,
466
+ projectAuth,
467
+ sessions,
468
+ terminals: managementTerminals,
469
+ unreadStore,
470
+ pluginBackends,
471
+ workspaceProviders,
472
+ workspaceRemovals,
473
+ closeServer: () => app.close(),
474
+ ...(normalToolAudit === undefined ? {} : { normalToolAudit }),
475
+ ...(managementAudit === undefined ? {} : { managementAudit }),
476
+ releaseStateOwnership: () => stateOwnership?.release(),
477
+ },
478
+ });
479
+ return shutdownPromise;
480
+ };
481
+ return { eventHub, machineStatus, statusAttribution, workspaceChanges, projectLifecycle, workspaceActivity, projectAuth, managementAuth, sessions, managementTerminals, serverNotices, accessStates, normalToolAudit, managementAudit, activeAgentProfile, runtimeComponent, serverPlugins, workspaceProviders, pluginBackends, workspaceProviderRuntime, workspaceRemovals, projects, shutdown };
241
482
  },
242
- registerRoutes({ eventHub, machineStatus, statusAttribution, workspaceActivity, projectAuth, managementAuth, sessions, terminals, accessStates, runtimeComponent, projects, workspaceProviders, workspaceProviderRuntime, workspaceRemovals }) {
483
+ disposeRuntime: ({ shutdown }) => shutdown(),
484
+ registerRoutes({ eventHub, machineStatus, statusAttribution, workspaceChanges, projectLifecycle, workspaceActivity, projectAuth, managementAuth, sessions, managementTerminals, serverNotices, accessStates, runtimeComponent, projects, workspaceProviders, pluginBackends, workspaceProviderRuntime, workspaceRemovals }) {
485
+ registerProjectMutationRoutes(app, projectLifecycle, translator);
486
+ registerPluginCatalogRoutes(app, { projects, workspaces: workspaceProviders, sessions });
243
487
  registerWorkspaceActivityRoutes(app, workspaceActivity);
244
488
  registerMachineStatusRoutes(app, machineStatus);
489
+ registerServerNoticeRoutes(app, serverNotices);
245
490
  registerAuthRoutes(app, { normal: projectAuth, management: managementAuth });
491
+ registerMcpAuthRoutes(app, sessions);
246
492
  registerSessionRoutes(app, sessions, eventHub);
247
- registerTerminalRoutes(app, terminals);
493
+ registerManagementTerminalRoutes(app, managementTerminals);
248
494
  registerWorkbenchAccessStateRoutes(app, accessStates);
249
495
  const managementProjectRoot = config.managementEmbed?.enabled === true
250
- ? config.managementEmbed.projectRoot ?? join(homedir(), "PiWeb")
496
+ ? configuredManagementProjectRoot
251
497
  : undefined;
252
- registerWorkspaceCatalogRoutes(app, { projects, workspaces: workspaceProviders, providerRuntime: workspaceProviderRuntime, managementProjectRoot });
253
- registerPluginBackendRoutes(app, { projects, backends: workspaceProviders, managementProjectRoot, onWorkspacesMutated: (scope) => { statusAttribution.invalidate(); machineStatus.notifyChanged(scope); } });
254
- registerWorkspaceRemovalRoutes(app, { projects, removals: workspaceRemovals, managementProjectRoot, onWorkspacesMutated: (scope) => { statusAttribution.invalidate(); machineStatus.notifyChanged(scope); } });
498
+ registerWorkspaceCatalogRoutes(app, { projects, workspaces: workspaceProviders, providerRuntime: workspaceProviderRuntime, managementProjectRoot, translator });
499
+ registerWorkspaceNotificationRoutes(app, { projects, workspaces: workspaceProviders, changes: workspaceChanges, translator });
500
+ registerPluginBackendRoutes(app, { projects, backends: pluginBackends, managementProjectRoot, onWorkspacesMutated: (scope) => {
501
+ statusAttribution.invalidate();
502
+ machineStatus.notifyChanged(scope);
503
+ if (scope === NORMAL_SESSION_EVENT_SCOPE)
504
+ projectLifecycle.scheduleCleanup();
505
+ } });
506
+ registerPluginBackendChannelRoutes(app, { projects, backends: pluginBackends, managementProjectRoot });
507
+ registerWorkspaceRemovalRoutes(app, { projects, removals: workspaceRemovals, managementProjectRoot, onWorkspacesMutated: (scope) => {
508
+ statusAttribution.invalidate();
509
+ machineStatus.notifyChanged(scope);
510
+ if (scope === NORMAL_SESSION_EVENT_SCOPE)
511
+ projectLifecycle.scheduleCleanup();
512
+ } });
255
513
  app.get("/health", () => ({
256
514
  ok: true,
257
515
  activeSessions: sessions.activeCount(),
@@ -260,41 +518,19 @@ await runSessionDaemonStartup({
260
518
  component: runtimeComponent.component,
261
519
  label: runtimeComponent.label,
262
520
  ...(runtimeComponent.runtimeVersion === undefined ? {} : { runtimeVersion: runtimeComponent.runtimeVersion }),
521
+ ...(runtimeComponent.piVersion === undefined ? {} : { piVersion: runtimeComponent.piVersion }),
263
522
  stale: false,
264
523
  available: runtimeComponent.available,
265
524
  },
266
525
  }));
267
526
  app.get("/runtime", () => runtimeComponent);
268
527
  },
269
- async listen({ projectAuth, managementAuth, sessions, terminals, normalToolAudit, managementAudit, serverPlugins }) {
270
- let shuttingDown = false;
271
- async function shutdown(signal) {
272
- if (shuttingDown)
273
- return;
274
- shuttingDown = true;
275
- app.log.info({ signal }, "shutting down session daemon");
276
- terminals.dispose();
277
- await serverPlugins.stop();
278
- await projectAuth.dispose();
279
- managementAuth.dispose();
280
- await sessions.dispose();
281
- try {
282
- normalToolAudit?.close();
283
- }
284
- catch (error) {
285
- app.log.info({ error: error instanceof Error ? error.message : String(error) }, "failed to close ordinary-mode tool audit database");
286
- }
287
- try {
288
- await managementAudit?.close();
289
- }
290
- catch (error) {
291
- app.log.info({ error: error instanceof Error ? error.message : String(error) }, "failed to flush management audit Elasticsearch queue");
292
- }
293
- await stateOwnership?.release();
294
- await app.close();
528
+ async listen({ shutdown, projects, workspaceProviders }) {
529
+ runtimeShutdown = shutdown;
530
+ if (pendingShutdownSignal !== undefined) {
531
+ await requestShutdown(pendingShutdownSignal);
532
+ return;
295
533
  }
296
- process.once("SIGINT", (signal) => { void shutdown(signal); });
297
- process.once("SIGTERM", (signal) => { void shutdown(signal); });
298
534
  const portValue = daemonEnvironment["PI_WEB_SESSIOND_PORT"];
299
535
  const port = portValue !== undefined && portValue !== "" ? Number(portValue) : undefined;
300
536
  const host = daemonEnvironment["PI_WEB_SESSIOND_HOST"] ?? "127.0.0.1";
@@ -302,12 +538,20 @@ await runSessionDaemonStartup({
302
538
  await app.listen({ port, host });
303
539
  }
304
540
  else {
305
- const path = sessiondSocketPath();
541
+ const path = sessiondSocketPath(daemonEnvironment);
306
542
  await mkdir(dirname(path), { recursive: true });
307
543
  await rm(path, { force: true });
308
544
  await app.listen({ path });
309
545
  process.on("exit", () => void rm(path, { force: true }));
310
546
  }
547
+ // Hooks need the actual bound endpoint, including ephemeral TCP listeners.
548
+ try {
549
+ await Promise.all((await projects.list()).map((project) => workspaceProviders.reconcileProject(project)));
550
+ }
551
+ catch (error) {
552
+ if (!shutdownStarted)
553
+ throw error;
554
+ }
311
555
  },
312
556
  });
313
557
  //# sourceMappingURL=sessiond.js.map