@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,14 +1,20 @@
1
+ import { UserFacingError, userFacingErrorMessage } from "../../shared/i18n.js";
2
+ import { loadNodeTranslator } from "../../localization.js";
1
3
  import { ASK_USER_ID_MAX_LENGTH, ASK_USER_OPTION_LIMIT, ASK_USER_OTHER_TEXT_MAX_LENGTH, ASK_USER_QUESTION_LIMIT, EXTENSION_DIALOG_ID_MAX_LENGTH, EXTENSION_DIALOG_INPUT_MAX_LENGTH, SESSION_TREE_CUSTOM_INSTRUCTIONS_MAX_LENGTH, SESSION_UNREAD_CATALOG_ID_MAX_LENGTH, SESSION_UNREAD_CWD_MAX_LENGTH, SESSION_UNREAD_SESSION_ID_MAX_LENGTH } from "../../shared/apiTypes.js";
2
- import { projectBrowserMessageResponse } from "../browserMessageProjection.js";
4
+ import { parseSessionDefaultsUpdate } from "../../shared/sessionDefaults.js";
5
+ import { projectBrowserMessageResponse, projectBrowserStreamSnapshot, projectBrowserTranscriptSnapshot } from "../browserMessageProjection.js";
6
+ import { isSessionMediaId, SESSION_MEDIA_MODE } from "../../shared/sessionMedia.js";
7
+ import { isSessionImageMimeType } from "./sessionMediaIndex.js";
3
8
  import { normalizeRequestCwd } from "../workingDirectory.js";
4
9
  import { attachWorkbenchAccessHandle, decodeManagementContext, MANAGEMENT_EMBED_CONTEXT_HEADER, WORKBENCH_ACCESS_HANDLE_HEADER } from "../managementEmbed.js";
5
10
  import { eventScopeFromManagementContext } from "../realtime/sessionEventScope.js";
6
11
  import { normalizeSessionCleanupRequest } from "./sessionCleanup.js";
12
+ import { parseQueueMessageMutation } from "./queuedMessageMutation.js";
7
13
  const MAX_NOTIFICATION_SESSION_ID_LENGTH = 512;
8
14
  const MAX_NOTIFICATION_CWD_LENGTH = 32 * 1024;
9
15
  const MAX_NOTIFICATION_DAEMON_ID_LENGTH = 512;
10
16
  const MAX_NOTIFICATION_ID_LENGTH = 1024;
11
- export function registerSessionRoutes(app, sessions, eventHub, prefix = "") {
17
+ export function registerSessionRoutes(app, sessions, eventHub, prefix = "", t = loadNodeTranslator("server")) {
12
18
  app.get(`${prefix}/sessions`, async (request, reply) => {
13
19
  if (request.query.cwd === undefined || request.query.cwd === "")
14
20
  return reply.code(400).send({ error: "cwd query parameter is required" });
@@ -16,7 +22,7 @@ export function registerSessionRoutes(app, sessions, eventHub, prefix = "") {
16
22
  return await sessions.list(normalizeRequestCwd(request.query.cwd), managementContextFromHeaders(request.headers));
17
23
  }
18
24
  catch (error) {
19
- return reply.code(400).send({ error: errorMessage(error) });
25
+ return reply.code(400).send({ error: errorMessage(error, t) });
20
26
  }
21
27
  });
22
28
  app.get(`${prefix}/sessions/search`, async (request, reply) => {
@@ -28,7 +34,7 @@ export function registerSessionRoutes(app, sessions, eventHub, prefix = "") {
28
34
  return await sessions.search(normalizeRequestCwd(request.query.cwd), request.query.q, managementContextFromHeaders(request.headers));
29
35
  }
30
36
  catch (error) {
31
- return reply.code(400).send({ error: errorMessage(error) });
37
+ return reply.code(400).send({ error: errorMessage(error, t) });
32
38
  }
33
39
  });
34
40
  app.get(`${prefix}/sessions/pins`, async (request, reply) => {
@@ -38,7 +44,7 @@ export function registerSessionRoutes(app, sessions, eventHub, prefix = "") {
38
44
  return await sessions.listPinned(normalizeRequestCwd(request.query.cwd), managementContextFromHeaders(request.headers));
39
45
  }
40
46
  catch (error) {
41
- return reply.code(400).send({ error: errorMessage(error) });
47
+ return reply.code(400).send({ error: errorMessage(error, t) });
42
48
  }
43
49
  });
44
50
  app.post(`${prefix}/sessions`, async (request, reply) => {
@@ -55,23 +61,23 @@ export function registerSessionRoutes(app, sessions, eventHub, prefix = "") {
55
61
  });
56
62
  }
57
63
  catch (error) {
58
- return reply.code(400).send({ error: errorMessage(error) });
64
+ return reply.code(400).send({ error: errorMessage(error, t) });
59
65
  }
60
66
  });
61
- app.get(`${prefix}/sessions/notifications`, async (_request, reply) => {
67
+ app.get(`${prefix}/sessions/notifications`, async (request, reply) => {
62
68
  try {
63
- return await sessions.notificationCatalog();
69
+ return await sessions.notificationCatalog(managementContextFromHeaders(request.headers));
64
70
  }
65
71
  catch (error) {
66
- return reply.code(400).send({ error: errorMessage(error) });
72
+ return reply.code(400).send({ error: errorMessage(error, t) });
67
73
  }
68
74
  });
69
- app.get(`${prefix}/sessions/unread`, async (_request, reply) => {
75
+ app.get(`${prefix}/sessions/unread`, async (request, reply) => {
70
76
  try {
71
- return await sessions.unreadCatalog();
77
+ return await sessions.unreadCatalog(managementContextFromHeaders(request.headers));
72
78
  }
73
79
  catch (error) {
74
- return reply.code(503).send({ error: errorMessage(error) });
80
+ return reply.code(503).send({ error: errorMessage(error, t) });
75
81
  }
76
82
  });
77
83
  app.post(`${prefix}/sessions/:sessionId/unread/acknowledge`, async (request, reply) => {
@@ -87,13 +93,13 @@ export function registerSessionRoutes(app, sessions, eventHub, prefix = "") {
87
93
  };
88
94
  }
89
95
  catch (error) {
90
- return reply.code(400).send({ error: errorMessage(error) });
96
+ return reply.code(400).send({ error: errorMessage(error, t) });
91
97
  }
92
98
  try {
93
- return await sessions.acknowledgeUnread(sessionId, acknowledgement);
99
+ return await sessions.acknowledgeUnread(sessionId, acknowledgement, managementContextFromHeaders(request.headers));
94
100
  }
95
101
  catch (error) {
96
- return reply.code(503).send({ error: errorMessage(error) });
102
+ return reply.code(503).send({ error: errorMessage(error, t) });
97
103
  }
98
104
  });
99
105
  app.post(`${prefix}/sessions/cleanup/preview`, async (request, reply) => {
@@ -101,15 +107,15 @@ export function registerSessionRoutes(app, sessions, eventHub, prefix = "") {
101
107
  return await sessions.cleanupPreview(normalizeSessionCleanupRequest(optionalRecord(request.body)));
102
108
  }
103
109
  catch (error) {
104
- return reply.code(400).send({ error: errorMessage(error) });
110
+ return reply.code(400).send({ error: errorMessage(error, t) });
105
111
  }
106
112
  });
107
113
  app.post(`${prefix}/sessions/cleanup`, async (request, reply) => {
108
114
  try {
109
- return await sessions.cleanup(normalizeSessionCleanupRequest(optionalRecord(request.body)));
115
+ return await sessions.cleanup(normalizeSessionCleanupRequest(optionalRecord(request.body)), managementContextFromHeaders(request.headers));
110
116
  }
111
117
  catch (error) {
112
- return reply.code(400).send({ error: errorMessage(error) });
118
+ return reply.code(400).send({ error: errorMessage(error, t) });
113
119
  }
114
120
  });
115
121
  app.post(`${prefix}/sessions/bulk/archive`, async (request, reply) => {
@@ -117,7 +123,7 @@ export function registerSessionRoutes(app, sessions, eventHub, prefix = "") {
117
123
  return await sessions.archiveMany(bulkMutationRefsFromBody(request.body), managementContextFromHeaders(request.headers));
118
124
  }
119
125
  catch (error) {
120
- return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error) });
126
+ return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error, t) });
121
127
  }
122
128
  });
123
129
  app.post(`${prefix}/sessions/bulk/delete-archived`, async (request, reply) => {
@@ -125,7 +131,7 @@ export function registerSessionRoutes(app, sessions, eventHub, prefix = "") {
125
131
  return await sessions.deleteArchivedMany(bulkMutationRefsFromBody(request.body), managementContextFromHeaders(request.headers));
126
132
  }
127
133
  catch (error) {
128
- return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error) });
134
+ return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error, t) });
129
135
  }
130
136
  });
131
137
  app.put(`${prefix}/sessions/:sessionId/pin`, async (request, reply) => {
@@ -134,7 +140,7 @@ export function registerSessionRoutes(app, sessions, eventHub, prefix = "") {
134
140
  return await sessions.setPinned(sessionLookupFromRequiredCwd(request.params.sessionId, body), true, managementContextFromHeaders(request.headers));
135
141
  }
136
142
  catch (error) {
137
- return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error) });
143
+ return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error, t) });
138
144
  }
139
145
  });
140
146
  app.delete(`${prefix}/sessions/:sessionId/pin`, async (request, reply) => {
@@ -142,15 +148,15 @@ export function registerSessionRoutes(app, sessions, eventHub, prefix = "") {
142
148
  return await sessions.setPinned(sessionLookupFromRequiredCwd(request.params.sessionId, request.query), false, managementContextFromHeaders(request.headers));
143
149
  }
144
150
  catch (error) {
145
- return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error) });
151
+ return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error, t) });
146
152
  }
147
153
  });
148
154
  app.get(`${prefix}/sessions/:sessionId/notifications`, async (request, reply) => {
149
155
  try {
150
- return await sessions.notificationInbox(notificationRefFromQuery(request.params.sessionId, request.query));
156
+ return await sessions.notificationInbox(notificationRefFromQuery(request.params.sessionId, request.query), managementContextFromHeaders(request.headers));
151
157
  }
152
158
  catch (error) {
153
- return reply.code(notificationErrorStatus(error)).send({ error: errorMessage(error) });
159
+ return reply.code(notificationErrorStatus(error)).send({ error: errorMessage(error, t) });
154
160
  }
155
161
  });
156
162
  app.post(`${prefix}/sessions/:sessionId/notifications/dismiss`, async (request, reply) => {
@@ -160,10 +166,10 @@ export function registerSessionRoutes(app, sessions, eventHub, prefix = "") {
160
166
  return await sessions.dismissNotification(ref, {
161
167
  daemonInstanceId: requireNonEmptyBoundedString(body["daemonInstanceId"], "daemonInstanceId", MAX_NOTIFICATION_DAEMON_ID_LENGTH),
162
168
  notificationId: requireNonEmptyBoundedString(body["notificationId"], "notificationId", MAX_NOTIFICATION_ID_LENGTH),
163
- });
169
+ }, managementContextFromHeaders(request.headers));
164
170
  }
165
171
  catch (error) {
166
- return reply.code(notificationErrorStatus(error)).send({ error: errorMessage(error) });
172
+ return reply.code(notificationErrorStatus(error)).send({ error: errorMessage(error, t) });
167
173
  }
168
174
  });
169
175
  app.post(`${prefix}/sessions/:sessionId/notifications/dismiss-all`, async (request, reply) => {
@@ -174,28 +180,59 @@ export function registerSessionRoutes(app, sessions, eventHub, prefix = "") {
174
180
  daemonInstanceId: requireNonEmptyBoundedString(body["daemonInstanceId"], "daemonInstanceId", MAX_NOTIFICATION_DAEMON_ID_LENGTH),
175
181
  throughOrder: requireNonNegativeSafeInteger(body["throughOrder"], "throughOrder"),
176
182
  throughOverflowWatermark: requireNonNegativeSafeInteger(body["throughOverflowWatermark"], "throughOverflowWatermark"),
177
- });
183
+ }, managementContextFromHeaders(request.headers));
178
184
  }
179
185
  catch (error) {
180
- return reply.code(notificationErrorStatus(error)).send({ error: errorMessage(error) });
186
+ return reply.code(notificationErrorStatus(error)).send({ error: errorMessage(error, t) });
181
187
  }
182
188
  });
183
189
  app.get(`${prefix}/sessions/:sessionId/messages`, async (request, reply) => {
190
+ const ref = sessionRefFromQueryOr400(request.params.sessionId, request.query, reply, t);
191
+ if (ref === undefined)
192
+ return reply;
184
193
  try {
185
194
  const page = { ...optionalField("before", optionalNumber(request.query.before)), ...optionalField("limit", optionalNumber(request.query.limit)) };
186
- const messages = await sessions.messages(sessionLookupFromQuery(request.params.sessionId, request.query), page, managementContextFromHeaders(request.headers));
187
- return projectBrowserMessageResponse(messages);
195
+ const messages = await sessions.messages(ref, page, managementContextFromHeaders(request.headers));
196
+ return projectBrowserMessageResponse(messages, imageProjector(request.query, eventHub, ref, eventScopeFromHeaders(request.headers)));
197
+ }
198
+ catch (error) {
199
+ return reply.code(404).send({ error: errorMessage(error, t) });
200
+ }
201
+ });
202
+ app.get(`${prefix}/sessions/:sessionId/media/:mediaId`, async (request, reply) => {
203
+ const ref = sessionRefFromQueryOr400(request.params.sessionId, request.query, reply, t);
204
+ if (ref === undefined)
205
+ return reply;
206
+ if (!isSessionMediaId(request.params.mediaId))
207
+ return reply.code(400).send({ error: "Invalid media id" });
208
+ try {
209
+ const media = await sessions.media(ref, request.params.mediaId, managementContextFromHeaders(request.headers));
210
+ if (media === undefined)
211
+ return await reply.code(404).send({ error: "Session media not found" });
212
+ if (!isSessionImageMimeType(media.mimeType))
213
+ throw new Error("Unsupported session image MIME type");
214
+ return await reply
215
+ .type(media.mimeType)
216
+ .header("Cache-Control", "private, max-age=31536000, immutable")
217
+ .header("Content-Length", media.data.byteLength)
218
+ .header("X-Content-Type-Options", "nosniff")
219
+ .send(media.data);
188
220
  }
189
221
  catch (error) {
190
- return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error) });
222
+ if (isSessionNotFoundError(error))
223
+ return reply.code(404).send({ error: errorMessage(error, t) });
224
+ throw error; // Fastify logs unexpected failures and returns 500, not a false miss.
191
225
  }
192
226
  });
193
227
  app.get(`${prefix}/sessions/:sessionId/status`, async (request, reply) => {
228
+ const ref = sessionRefFromQueryOr400(request.params.sessionId, request.query, reply, t);
229
+ if (ref === undefined)
230
+ return reply;
194
231
  try {
195
- return await sessions.status(sessionLookupFromQuery(request.params.sessionId, request.query), managementContextFromHeaders(request.headers));
232
+ return await sessions.status(ref, managementContextFromHeaders(request.headers));
196
233
  }
197
234
  catch (error) {
198
- return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error) });
235
+ return reply.code(404).send({ error: errorMessage(error, t) });
199
236
  }
200
237
  });
201
238
  app.get(`${prefix}/sessions/search-content`, async (request, reply) => {
@@ -207,23 +244,73 @@ export function registerSessionRoutes(app, sessions, eventHub, prefix = "") {
207
244
  return await sessions.searchContent(normalizeRequestCwd(request.query.cwd), request.query.q, managementContextFromHeaders(request.headers));
208
245
  }
209
246
  catch (error) {
210
- return reply.code(400).send({ error: errorMessage(error) });
247
+ return reply.code(400).send({ error: errorMessage(error, t) });
248
+ }
249
+ });
250
+ app.get(`${prefix}/sessions/:sessionId/transcript-snapshot`, async (request, reply) => {
251
+ const ref = sessionRefFromQueryOr400(request.params.sessionId, request.query, reply, t);
252
+ if (ref === undefined)
253
+ return reply;
254
+ try {
255
+ const snapshot = await sessions.transcriptSnapshot(ref, { ...optionalField("limit", optionalNumber(request.query.limit)) }, managementContextFromHeaders(request.headers));
256
+ return projectBrowserTranscriptSnapshot(snapshot, imageProjector(request.query, eventHub, ref, eventScopeFromHeaders(request.headers)));
257
+ }
258
+ catch (error) {
259
+ return reply.code(404).send({ error: errorMessage(error, t) });
211
260
  }
212
261
  });
213
262
  app.get(`${prefix}/sessions/:sessionId/stream-snapshot`, async (request, reply) => {
263
+ const ref = sessionRefFromQueryOr400(request.params.sessionId, request.query, reply, t);
264
+ if (ref === undefined)
265
+ return reply;
214
266
  try {
215
- return await sessions.streamSnapshot(sessionLookupFromQuery(request.params.sessionId, request.query), managementContextFromHeaders(request.headers));
267
+ return projectBrowserStreamSnapshot(await sessions.streamSnapshot(ref, managementContextFromHeaders(request.headers)), imageProjector(request.query, eventHub, ref, eventScopeFromHeaders(request.headers)));
216
268
  }
217
269
  catch (error) {
218
- return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error) });
270
+ return reply.code(404).send({ error: errorMessage(error, t) });
219
271
  }
220
272
  });
221
273
  app.get(`${prefix}/sessions/:sessionId/models`, async (request, reply) => {
274
+ const ref = sessionRefFromQueryOr400(request.params.sessionId, request.query, reply, t);
275
+ if (ref === undefined)
276
+ return reply;
277
+ try {
278
+ return { models: await sessions.availableModels(ref, managementContextFromHeaders(request.headers)) };
279
+ }
280
+ catch (error) {
281
+ return reply.code(404).send({ error: errorMessage(error, t) });
282
+ }
283
+ });
284
+ app.get(`${prefix}/sessions/:sessionId/models/catalog`, async (request, reply) => {
285
+ const ref = sessionRefFromQueryOr400(request.params.sessionId, request.query, reply, t);
286
+ if (ref === undefined)
287
+ return reply;
288
+ try {
289
+ return { models: await sessions.modelCatalog(ref, managementContextFromHeaders(request.headers)) };
290
+ }
291
+ catch (error) {
292
+ return reply.code(404).send({ error: errorMessage(error, t) });
293
+ }
294
+ });
295
+ app.post(`${prefix}/sessions/:sessionId/models/enabled`, async (request, reply) => {
296
+ try {
297
+ const body = optionalRecord(request.body);
298
+ return { models: await sessions.setModelEnabled(sessionLookupFromBody(request.params.sessionId, body), requireString(body, "provider"), requireString(body, "modelId"), requireBoolean(body, "enabled"), managementContextFromHeaders(request.headers)) };
299
+ }
300
+ catch (error) {
301
+ return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error, t) });
302
+ }
303
+ });
304
+ app.post(`${prefix}/sessions/:sessionId/models/scope`, async (request, reply) => {
222
305
  try {
223
- return { models: await sessions.availableModels(sessionLookupFromQuery(request.params.sessionId, request.query), managementContextFromHeaders(request.headers)) };
306
+ const body = optionalRecord(request.body);
307
+ const mode = body["mode"];
308
+ if (!isSessionModelScopeMode(mode))
309
+ throw new Error(t("server.main.6a6ece1f173c", "mode field must be all or current"));
310
+ return { models: await sessions.setModelScope(sessionLookupFromBody(request.params.sessionId, body), mode, managementContextFromHeaders(request.headers)) };
224
311
  }
225
312
  catch (error) {
226
- return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error) });
313
+ return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error, t) });
227
314
  }
228
315
  });
229
316
  app.post(`${prefix}/sessions/:sessionId/model`, async (request, reply) => {
@@ -232,7 +319,7 @@ export function registerSessionRoutes(app, sessions, eventHub, prefix = "") {
232
319
  return await sessions.setModel(sessionLookupFromBody(request.params.sessionId, body), requireString(body, "provider"), requireString(body, "modelId"), managementContextFromHeaders(request.headers));
233
320
  }
234
321
  catch (error) {
235
- return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error) });
322
+ return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error, t) });
236
323
  }
237
324
  });
238
325
  app.post(`${prefix}/sessions/:sessionId/model/cycle`, async (request, reply) => {
@@ -244,15 +331,35 @@ export function registerSessionRoutes(app, sessions, eventHub, prefix = "") {
244
331
  return await sessions.cycleModel(sessionLookupFromBody(request.params.sessionId, body), direction ?? "forward", managementContextFromHeaders(request.headers));
245
332
  }
246
333
  catch (error) {
247
- return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error) });
334
+ return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error, t) });
335
+ }
336
+ });
337
+ app.get(`${prefix}/sessions/:sessionId/defaults`, async (request, reply) => {
338
+ try {
339
+ return await sessions.getSessionDefaults(sessionLookupFromQuery(request.params.sessionId, request.query), managementContextFromHeaders(request.headers));
340
+ }
341
+ catch (error) {
342
+ return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error, t) });
343
+ }
344
+ });
345
+ app.post(`${prefix}/sessions/:sessionId/defaults`, async (request, reply) => {
346
+ try {
347
+ const body = requireRecord(request.body);
348
+ return await sessions.setSessionDefaults(sessionLookupFromBody(request.params.sessionId, body), parseSessionDefaultsUpdate(body), managementContextFromHeaders(request.headers));
349
+ }
350
+ catch (error) {
351
+ return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error, t) });
248
352
  }
249
353
  });
250
354
  app.get(`${prefix}/sessions/:sessionId/thinking-levels`, async (request, reply) => {
355
+ const ref = sessionRefFromQueryOr400(request.params.sessionId, request.query, reply, t);
356
+ if (ref === undefined)
357
+ return reply;
251
358
  try {
252
- return { levels: await sessions.availableThinkingLevels(sessionLookupFromQuery(request.params.sessionId, request.query), managementContextFromHeaders(request.headers)) };
359
+ return { levels: await sessions.availableThinkingLevels(ref, managementContextFromHeaders(request.headers)) };
253
360
  }
254
361
  catch (error) {
255
- return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error) });
362
+ return reply.code(404).send({ error: errorMessage(error, t) });
256
363
  }
257
364
  });
258
365
  app.post(`${prefix}/sessions/:sessionId/thinking-level`, async (request, reply) => {
@@ -263,7 +370,7 @@ export function registerSessionRoutes(app, sessions, eventHub, prefix = "") {
263
370
  return await sessions.setThinkingLevel(sessionLookupFromBody(request.params.sessionId, body), requireThinkingLevel(body["level"]), managementContextFromHeaders(request.headers));
264
371
  }
265
372
  catch (error) {
266
- return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error) });
373
+ return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error, t) });
267
374
  }
268
375
  });
269
376
  app.post(`${prefix}/sessions/:sessionId/thinking-level/cycle`, async (request, reply) => {
@@ -272,15 +379,18 @@ export function registerSessionRoutes(app, sessions, eventHub, prefix = "") {
272
379
  return await sessions.cycleThinkingLevel(sessionLookupFromBody(request.params.sessionId, body), managementContextFromHeaders(request.headers));
273
380
  }
274
381
  catch (error) {
275
- return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error) });
382
+ return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error, t) });
276
383
  }
277
384
  });
278
385
  app.get(`${prefix}/sessions/:sessionId/commands`, async (request, reply) => {
386
+ const ref = sessionRefFromQueryOr400(request.params.sessionId, request.query, reply, t);
387
+ if (ref === undefined)
388
+ return reply;
279
389
  try {
280
- return await sessions.commands(sessionLookupFromQuery(request.params.sessionId, request.query), managementContextFromHeaders(request.headers));
390
+ return await sessions.commands(ref, managementContextFromHeaders(request.headers));
281
391
  }
282
392
  catch (error) {
283
- return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error) });
393
+ return reply.code(404).send({ error: errorMessage(error, t) });
284
394
  }
285
395
  });
286
396
  app.post(`${prefix}/sessions/:sessionId/prompt`, async (request, reply) => {
@@ -291,7 +401,16 @@ export function registerSessionRoutes(app, sessions, eventHub, prefix = "") {
291
401
  return { accepted: true };
292
402
  }
293
403
  catch (error) {
294
- return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error) });
404
+ return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error, t) });
405
+ }
406
+ });
407
+ app.post(`${prefix}/sessions/:sessionId/queue/message`, async (request, reply) => {
408
+ try {
409
+ const body = requireRecord(request.body);
410
+ return await sessions.mutateQueueMessage(sessionLookupFromRequiredCwd(request.params.sessionId, body), parseQueueMessageMutation(body), managementContextFromHeaders(request.headers));
411
+ }
412
+ catch (error) {
413
+ return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error, t) });
295
414
  }
296
415
  });
297
416
  app.post(`${prefix}/sessions/:sessionId/queue/clear`, async (request, reply) => {
@@ -299,7 +418,7 @@ export function registerSessionRoutes(app, sessions, eventHub, prefix = "") {
299
418
  return await sessions.clearQueue(sessionLookupFromBody(request.params.sessionId, optionalRecord(request.body)), managementContextFromHeaders(request.headers));
300
419
  }
301
420
  catch (error) {
302
- return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error) });
421
+ return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error, t) });
303
422
  }
304
423
  });
305
424
  app.post(`${prefix}/sessions/:sessionId/ask/submit`, async (request, reply) => {
@@ -309,7 +428,7 @@ export function registerSessionRoutes(app, sessions, eventHub, prefix = "") {
309
428
  return await sessions.submitAsk(sessionLookupFromBody(request.params.sessionId, body), askId, askUserSubmissionFromBody(body), managementContextFromHeaders(request.headers));
310
429
  }
311
430
  catch (error) {
312
- return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error) });
431
+ return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error, t) });
313
432
  }
314
433
  });
315
434
  app.post(`${prefix}/sessions/:sessionId/ask/cancel`, async (request, reply) => {
@@ -318,7 +437,7 @@ export function registerSessionRoutes(app, sessions, eventHub, prefix = "") {
318
437
  return await sessions.cancelAsk(sessionLookupFromBody(request.params.sessionId, body), requireBoundedId(body["askId"], "askId"), managementContextFromHeaders(request.headers));
319
438
  }
320
439
  catch (error) {
321
- return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error) });
440
+ return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error, t) });
322
441
  }
323
442
  });
324
443
  app.post(`${prefix}/sessions/:sessionId/dialogs/answer`, async (request, reply) => {
@@ -328,7 +447,7 @@ export function registerSessionRoutes(app, sessions, eventHub, prefix = "") {
328
447
  return await sessions.answerDialog(sessionLookupFromBody(request.params.sessionId, body), answer.dialogId, answer.value, managementContextFromHeaders(request.headers));
329
448
  }
330
449
  catch (error) {
331
- return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error) });
450
+ return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error, t) });
332
451
  }
333
452
  });
334
453
  app.post(`${prefix}/sessions/:sessionId/dialogs/cancel`, async (request, reply) => {
@@ -338,16 +457,16 @@ export function registerSessionRoutes(app, sessions, eventHub, prefix = "") {
338
457
  return await sessions.cancelDialog(sessionLookupFromBody(request.params.sessionId, body), cancel.dialogId, managementContextFromHeaders(request.headers));
339
458
  }
340
459
  catch (error) {
341
- return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error) });
460
+ return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error, t) });
342
461
  }
343
462
  });
344
463
  app.post(`${prefix}/sessions/:sessionId/warnings/dismiss`, async (request, reply) => {
345
464
  try {
346
465
  const body = optionalRecord(request.body);
347
- return await sessions.dismissWarning(sessionLookupFromBody(request.params.sessionId, body), requireString(body, "dismissId"));
466
+ return await sessions.dismissWarning(sessionLookupFromBody(request.params.sessionId, body), requireString(body, "dismissId"), managementContextFromHeaders(request.headers));
348
467
  }
349
468
  catch (error) {
350
- return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error) });
469
+ return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error, t) });
351
470
  }
352
471
  });
353
472
  app.post(`${prefix}/sessions/:sessionId/attachments`, async (request, reply) => {
@@ -360,7 +479,7 @@ export function registerSessionRoutes(app, sessions, eventHub, prefix = "") {
360
479
  return { attachments };
361
480
  }
362
481
  catch (error) {
363
- return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error) });
482
+ return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error, t) });
364
483
  }
365
484
  });
366
485
  app.post(`${prefix}/sessions/:sessionId/shell`, async (request, reply) => {
@@ -370,7 +489,7 @@ export function registerSessionRoutes(app, sessions, eventHub, prefix = "") {
370
489
  return { accepted: true };
371
490
  }
372
491
  catch (error) {
373
- return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error) });
492
+ return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error, t) });
374
493
  }
375
494
  });
376
495
  app.post(`${prefix}/sessions/:sessionId/commands/run`, async (request, reply) => {
@@ -379,7 +498,7 @@ export function registerSessionRoutes(app, sessions, eventHub, prefix = "") {
379
498
  return await sessions.runCommand(sessionLookupFromBody(request.params.sessionId, body), requireString(body, "text"), managementContextFromHeaders(request.headers));
380
499
  }
381
500
  catch (error) {
382
- return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error) });
501
+ return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error, t) });
383
502
  }
384
503
  });
385
504
  app.post(`${prefix}/sessions/:sessionId/commands/respond`, async (request, reply) => {
@@ -388,7 +507,7 @@ export function registerSessionRoutes(app, sessions, eventHub, prefix = "") {
388
507
  return await sessions.respondToCommand(sessionLookupFromBody(request.params.sessionId, body), requireString(body, "requestId"), requireString(body, "value"), managementContextFromHeaders(request.headers));
389
508
  }
390
509
  catch (error) {
391
- return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error) });
510
+ return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error, t) });
392
511
  }
393
512
  });
394
513
  app.post(`${prefix}/sessions/:sessionId/tree/navigate`, async (request, reply) => {
@@ -397,7 +516,7 @@ export function registerSessionRoutes(app, sessions, eventHub, prefix = "") {
397
516
  return await sessions.navigateTree(sessionLookupFromBody(request.params.sessionId, body), sessionTreeNavigateRequestFromBody(body), managementContextFromHeaders(request.headers));
398
517
  }
399
518
  catch (error) {
400
- return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error) });
519
+ return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error, t) });
401
520
  }
402
521
  });
403
522
  app.post(`${prefix}/sessions/:sessionId/tree/fork`, async (request, reply) => {
@@ -406,7 +525,7 @@ export function registerSessionRoutes(app, sessions, eventHub, prefix = "") {
406
525
  return await sessions.forkFromTree(sessionLookupFromBody(request.params.sessionId, body), sessionTreeForkRequestFromBody(body), managementContextFromHeaders(request.headers));
407
526
  }
408
527
  catch (error) {
409
- return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error) });
528
+ return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error, t) });
410
529
  }
411
530
  });
412
531
  app.post(`${prefix}/sessions/:sessionId/abort`, async (request, reply) => {
@@ -415,7 +534,7 @@ export function registerSessionRoutes(app, sessions, eventHub, prefix = "") {
415
534
  return { aborted: true };
416
535
  }
417
536
  catch (error) {
418
- return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error) });
537
+ return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error, t) });
419
538
  }
420
539
  });
421
540
  app.post(`${prefix}/sessions/:sessionId/stop`, async (request, reply) => {
@@ -424,7 +543,7 @@ export function registerSessionRoutes(app, sessions, eventHub, prefix = "") {
424
543
  return { stopped: true };
425
544
  }
426
545
  catch (error) {
427
- return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error) });
546
+ return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error, t) });
428
547
  }
429
548
  });
430
549
  app.post(`${prefix}/sessions/:sessionId/archive`, async (request, reply) => {
@@ -433,7 +552,7 @@ export function registerSessionRoutes(app, sessions, eventHub, prefix = "") {
433
552
  return { archived: true };
434
553
  }
435
554
  catch (error) {
436
- return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error) });
555
+ return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error, t) });
437
556
  }
438
557
  });
439
558
  app.post(`${prefix}/sessions/:sessionId/archive-tree`, async (request, reply) => {
@@ -441,7 +560,7 @@ export function registerSessionRoutes(app, sessions, eventHub, prefix = "") {
441
560
  return await sessions.archiveTree(sessionLookupFromBody(request.params.sessionId, optionalRecord(request.body)), managementContextFromHeaders(request.headers));
442
561
  }
443
562
  catch (error) {
444
- return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error) });
563
+ return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error, t) });
445
564
  }
446
565
  });
447
566
  app.post(`${prefix}/sessions/:sessionId/restore`, async (request, reply) => {
@@ -450,7 +569,7 @@ export function registerSessionRoutes(app, sessions, eventHub, prefix = "") {
450
569
  return { restored: true };
451
570
  }
452
571
  catch (error) {
453
- return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error) });
572
+ return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error, t) });
454
573
  }
455
574
  });
456
575
  app.delete(`${prefix}/sessions/:sessionId`, async (request, reply) => {
@@ -459,7 +578,7 @@ export function registerSessionRoutes(app, sessions, eventHub, prefix = "") {
459
578
  return { deleted: true };
460
579
  }
461
580
  catch (error) {
462
- return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error) });
581
+ return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error, t) });
463
582
  }
464
583
  });
465
584
  app.post(`${prefix}/sessions/:sessionId/reload`, async (request, reply) => {
@@ -468,7 +587,7 @@ export function registerSessionRoutes(app, sessions, eventHub, prefix = "") {
468
587
  return { reloaded: true };
469
588
  }
470
589
  catch (error) {
471
- return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error) });
590
+ return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error, t) });
472
591
  }
473
592
  });
474
593
  app.post(`${prefix}/sessions/:sessionId/detach-parent`, async (request, reply) => {
@@ -477,13 +596,13 @@ export function registerSessionRoutes(app, sessions, eventHub, prefix = "") {
477
596
  return { detached: true };
478
597
  }
479
598
  catch (error) {
480
- return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error) });
599
+ return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error, t) });
481
600
  }
482
601
  });
483
602
  app.get(`${prefix}/sessions/:sessionId/events`, { websocket: true }, (socket, request) => {
484
603
  // Only the id matters for event subscription; cwd is intentionally ignored
485
604
  // so a malformed value cannot throw inside the websocket handler.
486
- eventHub.add(request.params.sessionId, socket, eventScopeFromHeaders(request.headers));
605
+ eventHub.add(request.params.sessionId, socket, eventScopeFromHeaders(request.headers), request.query.media === SESSION_MEDIA_MODE ? SESSION_MEDIA_MODE : undefined);
487
606
  });
488
607
  app.get(`${prefix}/sessions/events`, { websocket: true }, (socket, request) => {
489
608
  eventHub.addGlobal(socket, eventScopeFromHeaders(request.headers));
@@ -492,6 +611,9 @@ export function registerSessionRoutes(app, sessions, eventHub, prefix = "") {
492
611
  eventHub.addGlobal(socket, eventScopeFromHeaders(request.headers));
493
612
  });
494
613
  }
614
+ function imageProjector(query, hub, ref, eventScope) {
615
+ return query.media === SESSION_MEDIA_MODE ? (image) => hub.mediaIndex.reference({ ...ref, eventScope }, image) : undefined;
616
+ }
495
617
  function bulkMutationRefsFromBody(body) {
496
618
  const record = requireRecord(body);
497
619
  const sessions = record["sessions"];
@@ -506,7 +628,7 @@ function parseBulkMutationRef(value) {
506
628
  throw new Error("id field must not be empty");
507
629
  const cwd = record["cwd"];
508
630
  if (typeof cwd !== "string" || cwd === "")
509
- throw new Error("cwd field is required");
631
+ throw new UserFacingError("routing.cwdRequired", "cwd field is required");
510
632
  return { id, cwd: normalizeRequestCwd(cwd) };
511
633
  }
512
634
  function notificationRefFromQuery(id, query) {
@@ -523,6 +645,15 @@ function notificationRef(id, cwd) {
523
645
  cwd: normalizeRequestCwd(cwd),
524
646
  };
525
647
  }
648
+ function sessionRefFromQueryOr400(id, query, reply, t) {
649
+ try {
650
+ return sessionLookupFromQuery(id, query);
651
+ }
652
+ catch (error) {
653
+ reply.code(400).send({ error: errorMessage(error, t) });
654
+ return undefined;
655
+ }
656
+ }
526
657
  function sessionLookupFromQuery(id, query) {
527
658
  return sessionLookupFromRequiredCwd(id, query, "cwd query parameter is required");
528
659
  }
@@ -543,13 +674,13 @@ function sessionLookupFromBody(id, body) {
543
674
  function sessionLookupFromRequiredCwd(id, value, message = "cwd query parameter is required") {
544
675
  const cwd = value.cwd;
545
676
  if (typeof cwd !== "string" || cwd === "")
546
- throw new Error(message);
677
+ throw new UserFacingError(message === "cwd field is required" ? "routing.cwdRequired" : "routing.cwdQueryRequired", message);
547
678
  return { id, cwd: normalizeRequestCwd(cwd) };
548
679
  }
549
680
  function sessionTreeNavigateRequestFromBody(body) {
550
681
  const targetId = requireNonEmptyString(body, "targetId");
551
682
  const expectedLeafId = requireNullableString(body, "expectedLeafId");
552
- return { targetId, expectedLeafId, summary: sessionTreeSummaryChoice(body["summary"]) };
683
+ return { targetId, expectedLeafId, summary: sessionTreeSummaryChoice(body["summary"]), ...optionalField("retainCheckpoint", optionalBoolean(body, "retainCheckpoint")) };
553
684
  }
554
685
  function sessionTreeSummaryChoice(value) {
555
686
  const summary = requireRecord(value);
@@ -615,7 +746,7 @@ function requireBoundedId(value, field) {
615
746
  function sessionTreeForkRequestFromBody(body) {
616
747
  const entryId = requireNonEmptyString(body, "entryId");
617
748
  const expectedLeafId = requireNullableString(body, "expectedLeafId");
618
- return { entryId, expectedLeafId };
749
+ return { entryId, expectedLeafId, ...optionalField("retainCheckpoint", optionalBoolean(body, "retainCheckpoint")) };
619
750
  }
620
751
  function extensionDialogAnswerFromBody(body) {
621
752
  const dialogId = requireNonEmptyBoundedString(body["dialogId"], "dialogId", EXTENSION_DIALOG_ID_MAX_LENGTH);
@@ -624,10 +755,10 @@ function extensionDialogAnswerFromBody(body) {
624
755
  return { dialogId, value };
625
756
  if (typeof value === "string") {
626
757
  if (value.length > EXTENSION_DIALOG_INPUT_MAX_LENGTH)
627
- throw new Error("value exceeds its length limit");
758
+ throw new UserFacingError("routing.valueLength", "value exceeds its length limit");
628
759
  return { dialogId, value };
629
760
  }
630
- throw new Error("value must be a boolean or string");
761
+ throw new UserFacingError("routing.valueType", "value must be a boolean or string");
631
762
  }
632
763
  function extensionDialogCancelFromBody(body) {
633
764
  return { dialogId: requireNonEmptyBoundedString(body["dialogId"], "dialogId", EXTENSION_DIALOG_ID_MAX_LENGTH) };
@@ -648,6 +779,15 @@ function requireString(record, field) {
648
779
  throw new Error(`${field} field must be a string`);
649
780
  return value;
650
781
  }
782
+ function requireBoolean(record, field) {
783
+ const value = record[field];
784
+ if (typeof value !== "boolean")
785
+ throw new Error(`${field} field must be a boolean`);
786
+ return value;
787
+ }
788
+ function optionalBoolean(record, field) {
789
+ return record[field] === undefined ? undefined : requireBoolean(record, field);
790
+ }
651
791
  function requireNonEmptyString(record, field) {
652
792
  const value = requireString(record, field);
653
793
  if (value.trim() === "")
@@ -701,8 +841,11 @@ function optionalNumber(value) {
701
841
  const parsed = Number(value);
702
842
  return Number.isFinite(parsed) ? parsed : undefined;
703
843
  }
704
- function errorMessage(error) {
705
- return error instanceof Error ? error.message : String(error);
844
+ function isSessionModelScopeMode(value) {
845
+ return value === "all" || value === "current";
846
+ }
847
+ function errorMessage(error, t = loadNodeTranslator("server")) {
848
+ return userFacingErrorMessage(error, t);
706
849
  }
707
850
  function mutationErrorStatus(error) {
708
851
  return isSessionNotFoundError(error) ? 404 : 400;
@@ -711,7 +854,7 @@ function notificationErrorStatus(error) {
711
854
  return isSessionNotFoundError(error) ? 404 : 400;
712
855
  }
713
856
  function isSessionNotFoundError(error) {
714
- const message = errorMessage(error);
857
+ const message = error instanceof Error ? error.message : String(error);
715
858
  return message === "Session not found" || message === "Archived session not found" || message === "未找到会话" || message === "未找到已归档会话";
716
859
  }
717
860
  function isRecord(value) {