@jmfederico/pi-web 1.202608.0 → 1.202608.1

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 (216) hide show
  1. package/README.md +4 -4
  2. package/dist/cli.js +69 -7
  3. package/dist/cli.js.map +1 -1
  4. package/dist/client/assets/{CodeViewer-D91Sp61M.js → CodeViewer-mEiBZFA5.js} +2 -2
  5. package/dist/client/assets/{TerminalPanel-fYrKc3jh.js → TerminalPanel-O9381Eme.js} +6 -6
  6. package/dist/client/assets/index-uI2AGFUy.js +4091 -0
  7. package/dist/client/index.html +1 -1
  8. package/dist/config.js +109 -73
  9. package/dist/config.js.map +1 -1
  10. package/dist/docker/piWebDockerCommandPlan.js +4 -3
  11. package/dist/docker/piWebDockerCommandPlan.js.map +1 -1
  12. package/dist/nativeServices/servicePlan.js +1 -1
  13. package/dist/nativeServices/servicePlan.js.map +1 -1
  14. package/dist/pi-web-plugins/git/browser/git-contract.js +108 -0
  15. package/dist/pi-web-plugins/git/browser/git-panel.js +609 -0
  16. package/dist/pi-web-plugins/git/browser/gitFileList.js +43 -0
  17. package/dist/pi-web-plugins/git/browser/gitFileShared.js +16 -0
  18. package/dist/pi-web-plugins/git/browser/gitFileTree.js +81 -0
  19. package/dist/pi-web-plugins/git/browser/gitFileViewPreference.js +35 -0
  20. package/dist/pi-web-plugins/git/browser/gitRoute.js +42 -0
  21. package/dist/pi-web-plugins/git/browser/pi-web-plugin.js +10 -0
  22. package/dist/pi-web-plugins/git/browser/unifiedDiff.js +301 -0
  23. package/dist/{server/git/gitService.js → pi-web-plugins/git/git-backend.js} +209 -60
  24. package/dist/pi-web-plugins/git/package.json +16 -0
  25. package/dist/pi-web-plugins/git/server-plugin.js +176 -0
  26. package/dist/pi-web-plugins/info/infoInternals.js +1 -2
  27. package/dist/pi-web-plugins/info/package.json +1 -1
  28. package/dist/pi-web-plugins/info/pi-web-plugin.js +2 -2
  29. package/dist/pi-web-plugins/relays/package.json +1 -1
  30. package/dist/pi-web-plugins/relays/pi-web-plugin.js +3 -3
  31. package/dist/pi-web-plugins/updates/package.json +1 -1
  32. package/dist/pi-web-plugins/updates/pi-web-plugin.js +1 -1
  33. package/dist/pi-web-plugins/workspace-tasks/package.json +1 -1
  34. package/dist/pi-web-plugins/workspace-tasks/pi-web-plugin.js +3 -3
  35. package/dist/plugin-api.d.ts +33 -16
  36. package/dist/pluginRecoveryCli.js +172 -0
  37. package/dist/pluginRecoveryCli.js.map +1 -0
  38. package/dist/server/activity/workspaceActivityService.js +27 -19
  39. package/dist/server/activity/workspaceActivityService.js.map +1 -1
  40. package/dist/server/app.js +35 -15
  41. package/dist/server/app.js.map +1 -1
  42. package/dist/server/configRoutes.js +3 -21
  43. package/dist/server/configRoutes.js.map +1 -1
  44. package/dist/server/machines/machineClient.js +23 -4
  45. package/dist/server/machines/machineClient.js.map +1 -1
  46. package/dist/server/machines/machinePluginProxyRoutes.js +74 -17
  47. package/dist/server/machines/machinePluginProxyRoutes.js.map +1 -1
  48. package/dist/server/machines/machineProxyRoutes.js +165 -8
  49. package/dist/server/machines/machineProxyRoutes.js.map +1 -1
  50. package/dist/server/machines/machineService.js +22 -0
  51. package/dist/server/machines/machineService.js.map +1 -1
  52. package/dist/server/piWebPluginCatalog.js +584 -0
  53. package/dist/server/piWebPluginCatalog.js.map +1 -0
  54. package/dist/server/piWebPluginLifecycle.js +162 -0
  55. package/dist/server/piWebPluginLifecycle.js.map +1 -0
  56. package/dist/server/piWebPluginService.js +159 -261
  57. package/dist/server/piWebPluginService.js.map +1 -1
  58. package/dist/server/piWebStatus.js +28 -7
  59. package/dist/server/piWebStatus.js.map +1 -1
  60. package/dist/server/plugins/pluginBackendProxyRoutes.js +69 -0
  61. package/dist/server/plugins/pluginBackendProxyRoutes.js.map +1 -0
  62. package/dist/server/plugins/serverPluginExec.js +184 -0
  63. package/dist/server/plugins/serverPluginExec.js.map +1 -0
  64. package/dist/server/plugins/serverPluginRuntime.js +480 -0
  65. package/dist/server/plugins/serverPluginRuntime.js.map +1 -0
  66. package/dist/server/realtime/sessionEventHub.js +26 -11
  67. package/dist/server/realtime/sessionEventHub.js.map +1 -1
  68. package/dist/server/requestCancellation.js +32 -0
  69. package/dist/server/requestCancellation.js.map +1 -0
  70. package/dist/server/sessiond/agentProcessEnvironment.js +29 -30
  71. package/dist/server/sessiond/agentProcessEnvironment.js.map +1 -1
  72. package/dist/server/sessiond/pluginBackendRoutes.js +64 -0
  73. package/dist/server/sessiond/pluginBackendRoutes.js.map +1 -0
  74. package/dist/server/sessiond/sessionDaemonShutdown.js +24 -0
  75. package/dist/server/sessiond/sessionDaemonShutdown.js.map +1 -0
  76. package/dist/server/sessiond/sessionProxyRoutes.js +2 -2
  77. package/dist/server/sessiond/sessionProxyRoutes.js.map +1 -1
  78. package/dist/server/sessiond/sessionServiceDependencies.js +2 -1
  79. package/dist/server/sessiond/sessionServiceDependencies.js.map +1 -1
  80. package/dist/server/sessiond/sessiondStateOwnership.js +235 -0
  81. package/dist/server/sessiond/sessiondStateOwnership.js.map +1 -0
  82. package/dist/server/sessiond/workspaceCatalogRoutes.js +31 -0
  83. package/dist/server/sessiond/workspaceCatalogRoutes.js.map +1 -0
  84. package/dist/server/sessiond/workspaceRemovalRoutes.js +41 -0
  85. package/dist/server/sessiond/workspaceRemovalRoutes.js.map +1 -0
  86. package/dist/server/sessiond.js +265 -99
  87. package/dist/server/sessiond.js.map +1 -1
  88. package/dist/server/sessions/authService.js +15 -54
  89. package/dist/server/sessions/authService.js.map +1 -1
  90. package/dist/server/sessions/dockerEnvironmentFacts.js +254 -0
  91. package/dist/server/sessions/dockerEnvironmentFacts.js.map +1 -0
  92. package/dist/server/sessions/modelCatalogRefresher.js +4 -3
  93. package/dist/server/sessions/modelCatalogRefresher.js.map +1 -1
  94. package/dist/server/sessions/piSessionManagerGateway.js +18 -67
  95. package/dist/server/sessions/piSessionManagerGateway.js.map +1 -1
  96. package/dist/server/sessions/piSessionService.js +141 -134
  97. package/dist/server/sessions/piSessionService.js.map +1 -1
  98. package/dist/server/sessions/sessionCommandService.js +24 -1
  99. package/dist/server/sessions/sessionCommandService.js.map +1 -1
  100. package/dist/server/sessions/sessionEnvironmentFacts.js +48 -0
  101. package/dist/server/sessions/sessionEnvironmentFacts.js.map +1 -0
  102. package/dist/server/sessions/sessionFileFormat.js +27 -0
  103. package/dist/server/sessions/sessionFileFormat.js.map +1 -0
  104. package/dist/server/sessions/sessionFileHeader.js +1 -14
  105. package/dist/server/sessions/sessionFileHeader.js.map +1 -1
  106. package/dist/server/sessions/sessionRoutes.js +14 -0
  107. package/dist/server/sessions/sessionRoutes.js.map +1 -1
  108. package/dist/server/sessions/sessionSummaryScanner.js +96 -224
  109. package/dist/server/sessions/sessionSummaryScanner.js.map +1 -1
  110. package/dist/server/sessions/spawnSubsessionTool.js +5 -9
  111. package/dist/server/sessions/spawnSubsessionTool.js.map +1 -1
  112. package/dist/server/sessions/spawnTargetResolver.js +1 -1
  113. package/dist/server/status/machineStatusRoutes.js +8 -0
  114. package/dist/server/status/machineStatusRoutes.js.map +1 -0
  115. package/dist/server/status/machineStatusService.js +181 -0
  116. package/dist/server/status/machineStatusService.js.map +1 -0
  117. package/dist/server/status/workspaceAttribution.js +87 -0
  118. package/dist/server/status/workspaceAttribution.js.map +1 -0
  119. package/dist/server/terminalProxyRoutes.js +2 -1
  120. package/dist/server/terminalProxyRoutes.js.map +1 -1
  121. package/dist/server/workspaceExplorerRoutes.js +20 -13
  122. package/dist/server/workspaceExplorerRoutes.js.map +1 -1
  123. package/dist/server/workspaces/fileContentService.js +18 -9
  124. package/dist/server/workspaces/fileContentService.js.map +1 -1
  125. package/dist/server/workspaces/filePreviewResponseHeaders.js +18 -0
  126. package/dist/server/workspaces/filePreviewResponseHeaders.js.map +1 -0
  127. package/dist/server/workspaces/filePreviewResponsePolicy.js +55 -0
  128. package/dist/server/workspaces/filePreviewResponsePolicy.js.map +1 -0
  129. package/dist/server/workspaces/filePreviewService.js +81 -0
  130. package/dist/server/workspaces/filePreviewService.js.map +1 -0
  131. package/dist/server/workspaces/projectWorkspaceCwds.js +0 -5
  132. package/dist/server/workspaces/projectWorkspaceCwds.js.map +1 -1
  133. package/dist/server/workspaces/sessionDaemonWorkspaceCatalog.js +402 -0
  134. package/dist/server/workspaces/sessionDaemonWorkspaceCatalog.js.map +1 -0
  135. package/dist/server/workspaces/workspaceCatalog.js +47 -0
  136. package/dist/server/workspaces/workspaceCatalog.js.map +1 -0
  137. package/dist/server/workspaces/workspaceContext.js +1 -3
  138. package/dist/server/workspaces/workspaceContext.js.map +1 -1
  139. package/dist/server/workspaces/workspaceDeletionRoutes.js +35 -125
  140. package/dist/server/workspaces/workspaceDeletionRoutes.js.map +1 -1
  141. package/dist/server/workspaces/workspaceProviderRegistry.js +651 -0
  142. package/dist/server/workspaces/workspaceProviderRegistry.js.map +1 -0
  143. package/dist/server/workspaces/workspaceRemovalService.js +256 -0
  144. package/dist/server/workspaces/workspaceRemovalService.js.map +1 -0
  145. package/dist/server/workspaces/workspaceRouteErrors.js +7 -0
  146. package/dist/server/workspaces/workspaceRouteErrors.js.map +1 -0
  147. package/dist/server/workspaces/worktreePreRemoveHook.js +39 -0
  148. package/dist/server/workspaces/worktreePreRemoveHook.js.map +1 -0
  149. package/dist/server-plugin-api.d.ts +140 -0
  150. package/dist/server-plugin-api.js +2 -0
  151. package/dist/server-plugin-api.js.map +1 -0
  152. package/dist/serverPluginRecovery.js +138 -0
  153. package/dist/serverPluginRecovery.js.map +1 -0
  154. package/dist/sessiond/activeAgentProfile.js +3 -22
  155. package/dist/sessiond/activeAgentProfile.js.map +1 -1
  156. package/dist/sessiond/config.js +11 -0
  157. package/dist/sessiond/config.js.map +1 -1
  158. package/dist/sessiond/sessionDaemonClient.js +11 -9
  159. package/dist/sessiond/sessionDaemonClient.js.map +1 -1
  160. package/dist/shared/activeAgentProfile.js +2 -41
  161. package/dist/shared/activeAgentProfile.js.map +1 -1
  162. package/dist/shared/activity.js +0 -3
  163. package/dist/shared/activity.js.map +1 -1
  164. package/dist/shared/apiTypes.js +7 -5
  165. package/dist/shared/apiTypes.js.map +1 -1
  166. package/dist/shared/capabilities.js +8 -6
  167. package/dist/shared/capabilities.js.map +1 -1
  168. package/dist/shared/federatedRoutes.js +28 -5
  169. package/dist/shared/federatedRoutes.js.map +1 -1
  170. package/dist/shared/machinePluginIds.js +4 -2
  171. package/dist/shared/machinePluginIds.js.map +1 -1
  172. package/dist/shared/machineStatus.js +94 -0
  173. package/dist/shared/machineStatus.js.map +1 -0
  174. package/dist/shared/piWebStatusParsing.js +29 -0
  175. package/dist/shared/piWebStatusParsing.js.map +1 -1
  176. package/dist/shared/pluginApiTypes.d.ts +148 -0
  177. package/dist/shared/pluginApiTypes.js +3 -0
  178. package/dist/shared/pluginApiTypes.js.map +1 -0
  179. package/dist/shared/pluginBackendProtocol.js +110 -0
  180. package/dist/shared/pluginBackendProtocol.js.map +1 -0
  181. package/dist/shared/pluginIds.js +5 -0
  182. package/dist/shared/pluginIds.js.map +1 -1
  183. package/dist/shared/pluginRecoveryCommands.js +14 -0
  184. package/dist/shared/pluginRecoveryCommands.js.map +1 -0
  185. package/dist/shared/workspaceFiles.js +41 -2
  186. package/dist/shared/workspaceFiles.js.map +1 -1
  187. package/dist/shared/workspaceRemovalProtocol.js +24 -0
  188. package/dist/shared/workspaceRemovalProtocol.js.map +1 -0
  189. package/docs/config.md +89 -51
  190. package/docs/plugins.md +383 -136
  191. package/examples/workspace-provider-plugin/README.md +52 -0
  192. package/examples/workspace-provider-plugin/package.json +25 -0
  193. package/examples/workspace-provider-plugin/src/browser/index.ts +69 -0
  194. package/examples/workspace-provider-plugin/src/server.ts +64 -0
  195. package/examples/workspace-provider-plugin/tsconfig.json +21 -0
  196. package/package.json +29 -10
  197. package/server-plugin-api.d.ts +1 -0
  198. package/dist/client/assets/UnifiedDiffViewer-BafLWGtF.js +0 -39
  199. package/dist/client/assets/index-CA8q9_o7.js +0 -4025
  200. package/dist/plugin-api/unstable.d.ts +0 -22
  201. package/dist/server/activity/workspaceActivityRoutes.js +0 -4
  202. package/dist/server/activity/workspaceActivityRoutes.js.map +0 -1
  203. package/dist/server/git/gitService.js.map +0 -1
  204. package/dist/server/gitRoutes.js +0 -23
  205. package/dist/server/gitRoutes.js.map +0 -1
  206. package/dist/server/sessions/parentSessionLocator.js +0 -75
  207. package/dist/server/sessions/parentSessionLocator.js.map +0 -1
  208. package/dist/server/workspaces/gitWorktreeDiscovery.js +0 -43
  209. package/dist/server/workspaces/gitWorktreeDiscovery.js.map +0 -1
  210. package/dist/server/workspaces/imagePreviewService.js +0 -40
  211. package/dist/server/workspaces/imagePreviewService.js.map +0 -1
  212. package/dist/server/workspaces/workspaceService.js +0 -52
  213. package/dist/server/workspaces/workspaceService.js.map +0 -1
  214. package/dist/shared/apiTypes.d.ts +0 -1217
  215. package/dist/shared/thinkingLevels.d.ts +0 -27
  216. package/plugin-api/unstable.d.ts +0 -1
@@ -0,0 +1,55 @@
1
+ import { classifyWorkspaceFile, workspaceFileName } from "../../shared/workspaceFiles.js";
2
+ const IMAGE_CONTENT_SECURITY_POLICY = "sandbox; default-src 'none'; base-uri 'none'; form-action 'none'; frame-src 'none'; object-src 'none'; script-src 'none'; connect-src 'none'; img-src data: blob:; media-src 'none'; font-src 'none'; style-src 'unsafe-inline'; worker-src 'none'; frame-ancestors 'self'";
3
+ const HTML_CONTENT_SECURITY_POLICY = "sandbox; default-src 'none'; base-uri 'none'; form-action 'none'; frame-src 'none'; object-src 'none'; script-src 'none'; connect-src 'none'; img-src data:; media-src 'none'; font-src 'none'; style-src 'unsafe-inline'; worker-src 'none'; frame-ancestors 'self'";
4
+ // Native PDF viewers refuse to run in any sandboxed context, so this policy
5
+ // deliberately omits the `sandbox` directive and the embedding frame omits the
6
+ // sandbox attribute. Isolation comes from the response itself: `application/pdf`
7
+ // plus `nosniff` means these bytes can only reach the browser's PDF handler and
8
+ // can never become an active same-origin document, while `default-src 'none'`
9
+ // denies scripts, navigation helpers, and every subresource except the
10
+ // same-origin plugin document (`object-src 'self'`) that the viewer embeds.
11
+ const PDF_CONTENT_SECURITY_POLICY = "default-src 'none'; base-uri 'none'; form-action 'none'; frame-src 'none'; object-src 'self'; script-src 'none'; connect-src 'none'; img-src 'none'; media-src 'none'; font-src 'none'; style-src 'none'; worker-src 'none'; frame-ancestors 'self'";
12
+ const DOWNLOAD_CONTENT_SECURITY_POLICY = "sandbox; default-src 'none'; base-uri 'none'; form-action 'none'; frame-src 'none'; object-src 'none'; script-src 'none'; connect-src 'none'; img-src 'none'; media-src 'none'; font-src 'none'; style-src 'none'; worker-src 'none'; frame-ancestors 'none'";
13
+ const ERROR_CONTENT_SECURITY_POLICY = "sandbox; default-src 'none'; base-uri 'none'; form-action 'none'; frame-src 'none'; object-src 'none'; script-src 'none'; connect-src 'none'; img-src 'none'; media-src 'none'; font-src 'none'; style-src 'none'; worker-src 'none'; frame-ancestors 'self'";
14
+ export function workspaceFilePreviewResponsePolicy(path, options = {}) {
15
+ const filename = workspaceFileName(path);
16
+ if (filename === "")
17
+ throw new Error("Workspace file path must include a filename");
18
+ if (options.download === true) {
19
+ return responsePolicy("application/octet-stream", "attachment", filename, DOWNLOAD_CONTENT_SECURITY_POLICY);
20
+ }
21
+ const classification = classifyWorkspaceFile(path);
22
+ if (classification === undefined || !("previewMimeType" in classification)) {
23
+ throw new Error("Inline preview is not supported for this file type");
24
+ }
25
+ const contentSecurityPolicy = classification.mediaType === "image"
26
+ ? IMAGE_CONTENT_SECURITY_POLICY
27
+ : classification.mediaType === "html"
28
+ ? HTML_CONTENT_SECURITY_POLICY
29
+ : PDF_CONTENT_SECURITY_POLICY;
30
+ return responsePolicy(classification.previewMimeType, "inline", filename, contentSecurityPolicy);
31
+ }
32
+ function responsePolicy(contentType, disposition, filename, contentSecurityPolicy) {
33
+ return {
34
+ contentType,
35
+ contentDisposition: contentDisposition(disposition, filename),
36
+ contentSecurityPolicy,
37
+ contentTypeOptions: "nosniff",
38
+ };
39
+ }
40
+ export function workspaceFilePreviewErrorResponsePolicy() {
41
+ return {
42
+ contentType: "application/json; charset=utf-8",
43
+ contentDisposition: "inline",
44
+ contentSecurityPolicy: ERROR_CONTENT_SECURITY_POLICY,
45
+ contentTypeOptions: "nosniff",
46
+ };
47
+ }
48
+ function contentDisposition(disposition, filename) {
49
+ const asciiFallback = filename.replace(/[^\x20-\x7e]|["\\]/gu, "_");
50
+ return `${disposition}; filename="${asciiFallback}"; filename*=UTF-8''${encodeRfc5987Value(filename)}`;
51
+ }
52
+ function encodeRfc5987Value(value) {
53
+ return encodeURIComponent(value).replace(/['()*]/gu, (character) => `%${character.charCodeAt(0).toString(16).toUpperCase()}`);
54
+ }
55
+ //# sourceMappingURL=filePreviewResponsePolicy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filePreviewResponsePolicy.js","sourceRoot":"","sources":["../../../src/server/workspaces/filePreviewResponsePolicy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AAS1F,MAAM,6BAA6B,GAAG,4QAA4Q,CAAC;AACnT,MAAM,4BAA4B,GAAG,sQAAsQ,CAAC;AAC5S,4EAA4E;AAC5E,+EAA+E;AAC/E,iFAAiF;AACjF,gFAAgF;AAChF,8EAA8E;AAC9E,uEAAuE;AACvE,4EAA4E;AAC5E,MAAM,2BAA2B,GAAG,qPAAqP,CAAC;AAC1R,MAAM,gCAAgC,GAAG,8PAA8P,CAAC;AACxS,MAAM,6BAA6B,GAAG,8PAA8P,CAAC;AAErS,MAAM,UAAU,kCAAkC,CAAC,IAAY,EAAE,UAAkC,EAAE;IACnG,MAAM,QAAQ,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;IACzC,IAAI,QAAQ,KAAK,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;IACpF,IAAI,OAAO,CAAC,QAAQ,KAAK,IAAI,EAAE,CAAC;QAC9B,OAAO,cAAc,CAAC,0BAA0B,EAAE,YAAY,EAAE,QAAQ,EAAE,gCAAgC,CAAC,CAAC;IAC9G,CAAC;IAED,MAAM,cAAc,GAAG,qBAAqB,CAAC,IAAI,CAAC,CAAC;IACnD,IAAI,cAAc,KAAK,SAAS,IAAI,CAAC,CAAC,iBAAiB,IAAI,cAAc,CAAC,EAAE,CAAC;QAC3E,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;IACxE,CAAC;IAED,MAAM,qBAAqB,GAAG,cAAc,CAAC,SAAS,KAAK,OAAO;QAChE,CAAC,CAAC,6BAA6B;QAC/B,CAAC,CAAC,cAAc,CAAC,SAAS,KAAK,MAAM;YACnC,CAAC,CAAC,4BAA4B;YAC9B,CAAC,CAAC,2BAA2B,CAAC;IAClC,OAAO,cAAc,CAAC,cAAc,CAAC,eAAe,EAAE,QAAQ,EAAE,QAAQ,EAAE,qBAAqB,CAAC,CAAC;AACnG,CAAC;AAED,SAAS,cAAc,CAAC,WAAmB,EAAE,WAAoC,EAAE,QAAgB,EAAE,qBAA6B;IAChI,OAAO;QACL,WAAW;QACX,kBAAkB,EAAE,kBAAkB,CAAC,WAAW,EAAE,QAAQ,CAAC;QAC7D,qBAAqB;QACrB,kBAAkB,EAAE,SAAS;KAC9B,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,uCAAuC;IACrD,OAAO;QACL,WAAW,EAAE,iCAAiC;QAC9C,kBAAkB,EAAE,QAAQ;QAC5B,qBAAqB,EAAE,6BAA6B;QACpD,kBAAkB,EAAE,SAAS;KAC9B,CAAC;AACJ,CAAC;AAED,SAAS,kBAAkB,CAAC,WAAoC,EAAE,QAAgB;IAChF,MAAM,aAAa,GAAG,QAAQ,CAAC,OAAO,CAAC,sBAAsB,EAAE,GAAG,CAAC,CAAC;IACpE,OAAO,GAAG,WAAW,eAAe,aAAa,uBAAuB,kBAAkB,CAAC,QAAQ,CAAC,EAAE,CAAC;AACzG,CAAC;AAED,SAAS,kBAAkB,CAAC,KAAa;IACvC,OAAO,kBAAkB,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,SAAS,EAAE,EAAE,CAAC,IAAI,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;AAChI,CAAC"}
@@ -0,0 +1,81 @@
1
+ import { open } from "node:fs/promises";
2
+ import { pipeline, Transform } from "node:stream";
3
+ import { classifyWorkspaceFile, MAX_INLINE_PREVIEW_BYTES, MAX_INLINE_PREVIEW_LABEL, workspaceFileName } from "../../shared/workspaceFiles.js";
4
+ import { resolveWorkspacePathAccessTarget } from "./pathAccessPolicy.js";
5
+ export async function readWorkspaceFilePreview(rootPath, path, pathAccess, options = {}) {
6
+ if (path === undefined || path === "")
7
+ throw new Error("path query parameter is required");
8
+ const { target, displayPath } = await resolveWorkspacePathAccessTarget(rootPath, path, pathAccess);
9
+ // Serve only from this descriptor. Path resolution is a snapshot: a rename,
10
+ // symlink swap, or resize after validation must not be able to change which
11
+ // bytes this response carries, how many of them it carries, or whether they
12
+ // are still inside the workspace or an allowed root.
13
+ const handle = await open(target, "r");
14
+ let streamOwnsHandle = false;
15
+ try {
16
+ const stats = await handle.stat();
17
+ if (!stats.isFile())
18
+ throw new Error("Path is not a file");
19
+ const metadata = { path: displayPath, filename: workspaceFileName(displayPath), modifiedAt: stats.mtime.toISOString() };
20
+ // Download mode serves any file as an opaque octet-stream attachment. No
21
+ // size cap: the response is streamed, and the browser writes it straight to
22
+ // disk. The stream still cannot exceed the validated size.
23
+ if (options.download === true) {
24
+ if (stats.size === 0)
25
+ return { ...metadata, size: 0, body: Buffer.alloc(0) };
26
+ streamOwnsHandle = true;
27
+ return { ...metadata, size: stats.size, body: validatedFileStream(handle, stats.size) };
28
+ }
29
+ const classification = classifyWorkspaceFile(displayPath);
30
+ if (classification === undefined || !("previewMimeType" in classification))
31
+ throw new Error("Inline preview is not supported for this file type");
32
+ if (stats.size > MAX_INLINE_PREVIEW_BYTES)
33
+ throw new Error(`File is too large to preview (limit ${MAX_INLINE_PREVIEW_LABEL})`);
34
+ const body = await readValidatedSnapshot(handle, stats.size);
35
+ return { ...metadata, mediaType: classification.mediaType, size: body.byteLength, body };
36
+ }
37
+ finally {
38
+ if (!streamOwnsHandle)
39
+ await handle.close();
40
+ }
41
+ }
42
+ /**
43
+ * Read exactly the validated number of bytes. Growth after validation is
44
+ * ignored, and a file that shrank fails the request before any header is sent
45
+ * instead of desynchronizing the advertised length.
46
+ */
47
+ async function readValidatedSnapshot(handle, size) {
48
+ if (size === 0)
49
+ return Buffer.alloc(0);
50
+ const buffer = Buffer.alloc(size);
51
+ let offset = 0;
52
+ while (offset < size) {
53
+ const { bytesRead } = await handle.read(buffer, offset, size - offset, offset);
54
+ if (bytesRead === 0)
55
+ throw new Error("File changed while it was being read");
56
+ offset += bytesRead;
57
+ }
58
+ return buffer;
59
+ }
60
+ /**
61
+ * Stream the validated byte range from the open descriptor. Extra bytes written
62
+ * after validation are never sent, and a short read fails the response instead
63
+ * of silently truncating an advertised `Content-Length`.
64
+ */
65
+ function validatedFileStream(handle, size) {
66
+ const source = handle.createReadStream({ start: 0, end: size - 1, autoClose: true });
67
+ let streamed = 0;
68
+ const exactLength = new Transform({
69
+ transform(chunk, _encoding, done) {
70
+ streamed += chunk.byteLength;
71
+ done(null, chunk);
72
+ },
73
+ flush(done) {
74
+ done(streamed === size ? null : new Error("File changed while it was being read"));
75
+ },
76
+ });
77
+ // The callback keeps a teardown failure from becoming an unhandled error; the
78
+ // returned stream still emits it, which fails the in-flight response.
79
+ return pipeline(source, exactLength, () => { });
80
+ }
81
+ //# sourceMappingURL=filePreviewService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filePreviewService.js","sourceRoot":"","sources":["../../../src/server/workspaces/filePreviewService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAmB,MAAM,kBAAkB,CAAC;AACzD,OAAO,EAAE,QAAQ,EAAY,SAAS,EAAE,MAAM,aAAa,CAAC;AAE5D,OAAO,EAAE,qBAAqB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AAC9I,OAAO,EAAE,gCAAgC,EAAE,MAAM,uBAAuB,CAAC;AAoBzE,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,QAAgB,EAChB,IAAwB,EACxB,UAAkC,EAClC,UAA2C,EAAE;IAE7C,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;IAC3F,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,gCAAgC,CAAC,QAAQ,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;IAEnG,4EAA4E;IAC5E,4EAA4E;IAC5E,4EAA4E;IAC5E,qDAAqD;IACrD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACvC,IAAI,gBAAgB,GAAG,KAAK,CAAC;IAC7B,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;QAClC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;QAC3D,MAAM,QAAQ,GAAG,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,iBAAiB,CAAC,WAAW,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;QAExH,yEAAyE;QACzE,4EAA4E;QAC5E,2DAA2D;QAC3D,IAAI,OAAO,CAAC,QAAQ,KAAK,IAAI,EAAE,CAAC;YAC9B,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC;gBAAE,OAAO,EAAE,GAAG,QAAQ,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7E,gBAAgB,GAAG,IAAI,CAAC;YACxB,OAAO,EAAE,GAAG,QAAQ,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,mBAAmB,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1F,CAAC;QAED,MAAM,cAAc,GAAG,qBAAqB,CAAC,WAAW,CAAC,CAAC;QAC1D,IAAI,cAAc,KAAK,SAAS,IAAI,CAAC,CAAC,iBAAiB,IAAI,cAAc,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;QAClJ,IAAI,KAAK,CAAC,IAAI,GAAG,wBAAwB;YAAE,MAAM,IAAI,KAAK,CAAC,uCAAuC,wBAAwB,GAAG,CAAC,CAAC;QAC/H,MAAM,IAAI,GAAG,MAAM,qBAAqB,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QAC7D,OAAO,EAAE,GAAG,QAAQ,EAAE,SAAS,EAAE,cAAc,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC;IAC3F,CAAC;YAAS,CAAC;QACT,IAAI,CAAC,gBAAgB;YAAE,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;IAC9C,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,KAAK,UAAU,qBAAqB,CAAC,MAAkB,EAAE,IAAY;IACnE,IAAI,IAAI,KAAK,CAAC;QAAE,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACvC,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAClC,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,OAAO,MAAM,GAAG,IAAI,EAAE,CAAC;QACrB,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,GAAG,MAAM,EAAE,MAAM,CAAC,CAAC;QAC/E,IAAI,SAAS,KAAK,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;QAC7E,MAAM,IAAI,SAAS,CAAC;IACtB,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;GAIG;AACH,SAAS,mBAAmB,CAAC,MAAkB,EAAE,IAAY;IAC3D,MAAM,MAAM,GAAG,MAAM,CAAC,gBAAgB,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,IAAI,GAAG,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACrF,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,MAAM,WAAW,GAAG,IAAI,SAAS,CAAC;QAChC,SAAS,CAAC,KAAa,EAAE,SAAS,EAAE,IAAI;YACtC,QAAQ,IAAI,KAAK,CAAC,UAAU,CAAC;YAC7B,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACpB,CAAC;QACD,KAAK,CAAC,IAAI;YACR,IAAI,CAAC,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC,CAAC;QACrF,CAAC;KACF,CAAC,CAAC;IACH,8EAA8E;IAC9E,sEAAsE;IACtE,OAAO,QAAQ,CAAC,MAAM,EAAE,WAAW,EAAE,GAAG,EAAE,GAAyC,CAAC,CAAC,CAAC;AACxF,CAAC"}
@@ -14,9 +14,4 @@ export class RegisteredProjectWorkspaceCwds {
14
14
  return undefined;
15
15
  }
16
16
  }
17
- /** Workspace paths of `cwd`'s project other than `cwd` itself. */
18
- export async function siblingWorkspaceCwds(locator, cwd) {
19
- const paths = await locator.forCwd(cwd);
20
- return (paths ?? []).filter((path) => !cwdPathsEqual(path, cwd));
21
- }
22
17
  //# sourceMappingURL=projectWorkspaceCwds.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"projectWorkspaceCwds.js","sourceRoot":"","sources":["../../../src/server/workspaces/projectWorkspaceCwds.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAgCvD,MAAM,OAAO,8BAA8B;IACzC,YAA6B,IAA8B;QAA9B,SAAI,GAAJ,IAAI,CAA0B;IAAG,CAAC;IAE/D,KAAK,CAAC,MAAM,CAAC,GAAW;QACtB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;QACjD,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC5D,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;YAC5D,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,aAAa,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;gBAAE,OAAO,KAAK,CAAC;QACnE,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;CACF;AAED,kEAAkE;AAClE,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,OAA6B,EAAE,GAAW;IACnF,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACxC,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,aAAa,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC;AACnE,CAAC"}
1
+ {"version":3,"file":"projectWorkspaceCwds.js","sourceRoot":"","sources":["../../../src/server/workspaces/projectWorkspaceCwds.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAgCvD,MAAM,OAAO,8BAA8B;IACzC,YAA6B,IAA8B;QAA9B,SAAI,GAAJ,IAAI,CAA0B;IAAG,CAAC;IAE/D,KAAK,CAAC,MAAM,CAAC,GAAW;QACtB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;QACjD,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC5D,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;YAC5D,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,aAAa,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;gBAAE,OAAO,KAAK,CAAC;QACnE,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;CACF"}
@@ -0,0 +1,402 @@
1
+ import { isAbsolute } from "node:path";
2
+ import { isPiWebPluginId } from "../../shared/pluginIds.js";
3
+ import { WorkspaceCatalogProtocolError, WorkspaceCatalogRequestError, WorkspaceCatalogUnavailableError, WORKSPACE_PROVIDER_RUNTIME_PROTOCOL_VERSION, } from "./workspaceCatalog.js";
4
+ const WORKSPACE_CATALOG_PATH = "/workspace-catalog";
5
+ /** Narrow web adapter over sessiond's internal workspace-authority protocol. */
6
+ export class SessionDaemonWorkspaceCatalog {
7
+ constructor(daemon) {
8
+ this.daemon = daemon;
9
+ }
10
+ async resolveProject(projectId) {
11
+ const value = await this.requestJson(`${WORKSPACE_CATALOG_PATH}/projects/${encodedId(projectId, "project")}/workspaces`);
12
+ return parseWorkspaceProviderResolution(value, projectId);
13
+ }
14
+ async list(projectId) {
15
+ return [...(await this.resolveProject(projectId)).workspaces];
16
+ }
17
+ async resolve(projectId, workspaceId) {
18
+ const value = await this.requestJson(`${WORKSPACE_CATALOG_PATH}/projects/${encodedId(projectId, "project")}/workspaces/${encodedId(workspaceId, "workspace")}`);
19
+ const workspace = parseWorkspace(value, "workspace resolution response");
20
+ if (workspace.projectId !== projectId || workspace.id !== workspaceId) {
21
+ throw protocolError("workspace resolution response did not match the requested project and workspace");
22
+ }
23
+ return workspace;
24
+ }
25
+ async providerRuntime() {
26
+ return parseProviderRuntimeSnapshot(await this.requestJson(`${WORKSPACE_CATALOG_PATH}/provider-runtime`));
27
+ }
28
+ async requestJson(path) {
29
+ let response;
30
+ try {
31
+ response = await this.daemon.request("GET", path);
32
+ }
33
+ catch (error) {
34
+ throw new WorkspaceCatalogUnavailableError(`Session daemon workspace authority unavailable: ${errorMessage(error)}`, { cause: error });
35
+ }
36
+ if (response.statusCode < 200 || response.statusCode >= 300) {
37
+ if (isUnknownWorkspaceCatalogRoute(response.statusCode, response.body)) {
38
+ throw new WorkspaceCatalogProtocolError("Session daemon does not support workspace authority operations; restart or upgrade the session daemon");
39
+ }
40
+ throw new WorkspaceCatalogRequestError(workspaceCatalogRequestMessage(response.statusCode, response.body), response.statusCode);
41
+ }
42
+ try {
43
+ if (response.body === "")
44
+ return undefined;
45
+ const value = JSON.parse(response.body);
46
+ return value;
47
+ }
48
+ catch (error) {
49
+ throw new WorkspaceCatalogProtocolError("Session daemon workspace authority returned invalid JSON", { cause: error });
50
+ }
51
+ }
52
+ }
53
+ function parseWorkspaceProviderResolution(value, expectedProjectId) {
54
+ if (!isRecord(value))
55
+ throw protocolError("workspace resolution response must be an object");
56
+ const status = parseWorkspaceProviderResolutionStatus(value["status"]);
57
+ const projectId = requireString(value, "projectId", "workspace resolution response");
58
+ if (projectId !== expectedProjectId)
59
+ throw protocolError("workspace resolution response did not match the requested project");
60
+ const ownerPluginId = optionalPluginId(value, "ownerPluginId", "workspace resolution response");
61
+ if (status === "provider" && ownerPluginId === undefined) {
62
+ throw protocolError("provider workspace resolution must identify its owner");
63
+ }
64
+ if (status === "folder" && ownerPluginId !== undefined) {
65
+ throw protocolError("folder workspace resolution must not identify a provider owner");
66
+ }
67
+ const workspaces = parseWorkspaceList(value["workspaces"], projectId);
68
+ const diagnostics = parseArray(value["diagnostics"], "workspace provider diagnostics", parseWorkspaceProviderDiagnostic);
69
+ return Object.freeze({
70
+ status,
71
+ projectId,
72
+ ...(ownerPluginId === undefined ? {} : { ownerPluginId }),
73
+ workspaces: Object.freeze(workspaces),
74
+ diagnostics: Object.freeze(diagnostics),
75
+ });
76
+ }
77
+ function parseWorkspaceProviderResolutionStatus(value) {
78
+ if (value === "provider" || value === "folder" || value === "degraded")
79
+ return value;
80
+ throw protocolError("workspace resolution status is invalid");
81
+ }
82
+ function parseWorkspaceProviderDiagnostic(value, index) {
83
+ const label = `workspace provider diagnostic ${String(index + 1)}`;
84
+ if (!isRecord(value))
85
+ throw protocolError(`${label} must be an object`);
86
+ const code = parseWorkspaceProviderDiagnosticCode(value["code"], label);
87
+ const tier = parseWorkspaceProviderTier(value["tier"], label);
88
+ const pluginId = optionalPluginId(value, "pluginId", label);
89
+ const pluginIds = value["pluginIds"] === undefined
90
+ ? undefined
91
+ : parsePluginIds(value["pluginIds"], `${label} pluginIds`);
92
+ return Object.freeze({
93
+ code,
94
+ message: requireString(value, "message", label),
95
+ tier,
96
+ ...(pluginId === undefined ? {} : { pluginId }),
97
+ ...(pluginIds === undefined ? {} : { pluginIds: Object.freeze(pluginIds) }),
98
+ });
99
+ }
100
+ function parseWorkspaceProviderDiagnosticCode(value, label) {
101
+ if (value === "probe-failed" || value === "claim-conflict" || value === "list-failed")
102
+ return value;
103
+ throw protocolError(`${label} code is invalid`);
104
+ }
105
+ function parseWorkspaceProviderTier(value, label) {
106
+ if (value === "primary" || value === "fallback")
107
+ return value;
108
+ throw protocolError(`${label} tier is invalid`);
109
+ }
110
+ function parsePluginIds(value, label) {
111
+ if (!Array.isArray(value))
112
+ throw protocolError(`${label} must be an array`);
113
+ return value.map((pluginId, index) => {
114
+ if (typeof pluginId !== "string" || !isPiWebPluginId(pluginId)) {
115
+ throw protocolError(`${label} item ${String(index + 1)} is invalid`);
116
+ }
117
+ return pluginId;
118
+ });
119
+ }
120
+ function parseWorkspaceList(value, projectId) {
121
+ if (!Array.isArray(value) || value.length === 0)
122
+ throw protocolError("workspace list must be a non-empty array");
123
+ const ids = new Set();
124
+ const paths = new Set();
125
+ const workspaces = value.map((item, index) => parseWorkspace(item, `workspace list item ${String(index + 1)}`));
126
+ let mainCount = 0;
127
+ for (const workspace of workspaces) {
128
+ if (workspace.projectId !== projectId)
129
+ throw protocolError("workspace list contained a workspace for another project");
130
+ if (ids.has(workspace.id))
131
+ throw protocolError(`workspace list contained duplicate id: ${workspace.id}`);
132
+ if (paths.has(workspace.path))
133
+ throw protocolError(`workspace list contained duplicate path: ${workspace.path}`);
134
+ ids.add(workspace.id);
135
+ paths.add(workspace.path);
136
+ if (workspace.isMain)
137
+ mainCount += 1;
138
+ }
139
+ if (mainCount !== 1)
140
+ throw protocolError("workspace list must contain exactly one main workspace");
141
+ return workspaces;
142
+ }
143
+ function parseWorkspace(value, label) {
144
+ if (!isRecord(value))
145
+ throw protocolError(`${label} must be an object`);
146
+ const path = requireString(value, "path", label);
147
+ if (!isAbsolute(path))
148
+ throw protocolError(`${label} path must be absolute`);
149
+ const provider = value["provider"] === undefined ? undefined : parseProvider(value["provider"], label);
150
+ const removal = value["removal"] === undefined ? undefined : parseRemoval(value["removal"], label);
151
+ return Object.freeze({
152
+ id: requireString(value, "id", label),
153
+ projectId: requireString(value, "projectId", label),
154
+ path,
155
+ label: requireString(value, "label", label),
156
+ isMain: requireBoolean(value, "isMain", label),
157
+ ...(provider === undefined ? {} : { provider }),
158
+ ...(removal === undefined ? {} : { removal }),
159
+ });
160
+ }
161
+ function parseProvider(value, workspaceLabel) {
162
+ const label = `${workspaceLabel} provider`;
163
+ if (!isRecord(value))
164
+ throw protocolError(`${label} must be an object`);
165
+ const capabilities = value["capabilities"];
166
+ if (!isRecord(capabilities))
167
+ throw protocolError(`${label} capabilities must be an object`);
168
+ const metadata = value["metadata"] === undefined ? undefined : parseJsonObject(value["metadata"], `${label} metadata`);
169
+ return Object.freeze({
170
+ pluginId: requirePluginId(value, "pluginId", label),
171
+ capabilities: Object.freeze({
172
+ request: requireBoolean(capabilities, "request", `${label} capabilities`),
173
+ remove: requireBoolean(capabilities, "remove", `${label} capabilities`),
174
+ }),
175
+ ...(metadata === undefined ? {} : { metadata }),
176
+ });
177
+ }
178
+ function parseRemoval(value, workspaceLabel) {
179
+ const label = `${workspaceLabel} removal`;
180
+ if (!isRecord(value))
181
+ throw protocolError(`${label} must be an object`);
182
+ return Object.freeze({
183
+ actionLabel: requireString(value, "actionLabel", label),
184
+ confirmation: requireString(value, "confirmation", label),
185
+ precondition: requireString(value, "precondition", label),
186
+ });
187
+ }
188
+ function parseProviderRuntimeSnapshot(value) {
189
+ if (!isRecord(value))
190
+ throw protocolError("provider runtime response must be an object");
191
+ if (value["protocolVersion"] !== WORKSPACE_PROVIDER_RUNTIME_PROTOCOL_VERSION) {
192
+ throw protocolError("provider runtime protocol is unsupported; restart or upgrade the session daemon");
193
+ }
194
+ const safeStart = parseSafeStart(value["safeStart"]);
195
+ const records = parseArray(value["records"], "provider runtime records", parseRuntimeRecord);
196
+ const health = parseArray(value["health"], "provider runtime health", parseHealthInspection);
197
+ const diagnostics = parseArray(value["diagnostics"], "provider runtime diagnostics", parseCatalogDiagnostic);
198
+ return Object.freeze({
199
+ protocolVersion: WORKSPACE_PROVIDER_RUNTIME_PROTOCOL_VERSION,
200
+ ...(safeStart === undefined ? {} : { safeStart }),
201
+ records: Object.freeze(records),
202
+ health: Object.freeze(health),
203
+ diagnostics: Object.freeze(diagnostics),
204
+ });
205
+ }
206
+ function parseRuntimeRecord(value, index) {
207
+ const label = `provider runtime record ${String(index + 1)}`;
208
+ if (!isRecord(value))
209
+ throw protocolError(`${label} must be an object`);
210
+ const state = value["state"];
211
+ const scope = value["scope"];
212
+ const phase = value["phase"];
213
+ if (!isRuntimeState(state))
214
+ throw protocolError(`${label} state is invalid`);
215
+ if (scope !== "bundled" && scope !== "local" && scope !== "user" && scope !== "project") {
216
+ throw protocolError(`${label} scope is invalid`);
217
+ }
218
+ if (phase !== undefined && !isLifecyclePhase(phase))
219
+ throw protocolError(`${label} phase is invalid`);
220
+ const name = optionalString(value, "name", label);
221
+ const message = optionalString(value, "message", label);
222
+ const browserRevision = optionalString(value, "browserRevision", label);
223
+ return Object.freeze({
224
+ pluginId: requirePluginId(value, "pluginId", label),
225
+ source: requireString(value, "source", label),
226
+ scope,
227
+ moduleRevision: requireString(value, "moduleRevision", label),
228
+ ...(browserRevision === undefined ? {} : { browserRevision }),
229
+ settingsRevision: requireString(value, "settingsRevision", label),
230
+ machineSpecific: requireBoolean(value, "machineSpecific", label),
231
+ state,
232
+ ...(name === undefined ? {} : { name }),
233
+ ...(phase === undefined ? {} : { phase }),
234
+ ...(message === undefined ? {} : { message }),
235
+ });
236
+ }
237
+ function parseCatalogDiagnostic(value, index) {
238
+ const label = `provider runtime diagnostic ${String(index + 1)}`;
239
+ if (!isRecord(value))
240
+ throw protocolError(`${label} must be an object`);
241
+ const code = value["code"];
242
+ if (!isCatalogDiagnosticCode(code))
243
+ throw protocolError(`${label} code is invalid`);
244
+ const pluginId = optionalPluginId(value, "pluginId", label);
245
+ return Object.freeze({
246
+ code,
247
+ source: requireString(value, "source", label),
248
+ message: requireString(value, "message", label),
249
+ ...(pluginId === undefined ? {} : { pluginId }),
250
+ });
251
+ }
252
+ function parseHealthInspection(value, index) {
253
+ const label = `provider runtime health item ${String(index + 1)}`;
254
+ if (!isRecord(value))
255
+ throw protocolError(`${label} must be an object`);
256
+ const phase = value["phase"];
257
+ if (phase !== undefined && phase !== "health")
258
+ throw protocolError(`${label} phase is invalid`);
259
+ const error = optionalString(value, "error", label);
260
+ return Object.freeze({
261
+ pluginId: requirePluginId(value, "pluginId", label),
262
+ health: parseHealth(value["health"], label),
263
+ ...(phase === undefined ? {} : { phase }),
264
+ ...(error === undefined ? {} : { error }),
265
+ });
266
+ }
267
+ function parseHealth(value, inspectionLabel) {
268
+ const label = `${inspectionLabel} health`;
269
+ if (!isRecord(value))
270
+ throw protocolError(`${label} must be an object`);
271
+ const status = value["status"];
272
+ if (status !== "healthy" && status !== "degraded" && status !== "unhealthy") {
273
+ throw protocolError(`${label} status is invalid`);
274
+ }
275
+ const message = optionalString(value, "message", label);
276
+ const details = value["details"] === undefined ? undefined : parseJsonObject(value["details"], `${label} details`);
277
+ return Object.freeze({
278
+ status,
279
+ ...(message === undefined ? {} : { message }),
280
+ ...(details === undefined ? {} : { details }),
281
+ });
282
+ }
283
+ function parseSafeStart(value) {
284
+ if (value === undefined)
285
+ return undefined;
286
+ if (value === "bundled-only" || value === "none")
287
+ return value;
288
+ throw protocolError("provider runtime safeStart is invalid");
289
+ }
290
+ function parseArray(value, label, parse) {
291
+ if (!Array.isArray(value))
292
+ throw protocolError(`${label} must be an array`);
293
+ return value.map(parse);
294
+ }
295
+ function parseJsonObject(value, label) {
296
+ if (!isRecord(value))
297
+ throw protocolError(`${label} must be a JSON object`);
298
+ const output = Object.fromEntries(Object.entries(value).map(([key, child]) => [key, parseJsonValue(child, label)]));
299
+ Object.freeze(output);
300
+ return output;
301
+ }
302
+ function parseJsonValue(value, label) {
303
+ if (value === null || typeof value === "string" || typeof value === "boolean")
304
+ return value;
305
+ if (typeof value === "number" && Number.isFinite(value))
306
+ return value;
307
+ if (Array.isArray(value)) {
308
+ const output = value.map((item) => parseJsonValue(item, label));
309
+ Object.freeze(output);
310
+ return output;
311
+ }
312
+ if (isRecord(value))
313
+ return parseJsonObject(value, label);
314
+ throw protocolError(`${label} must contain only JSON values`);
315
+ }
316
+ function requireString(record, field, label) {
317
+ const value = record[field];
318
+ if (typeof value !== "string" || value === "")
319
+ throw protocolError(`${label} ${field} must be a non-empty string`);
320
+ return value;
321
+ }
322
+ function optionalString(record, field, label) {
323
+ const value = record[field];
324
+ if (value === undefined)
325
+ return undefined;
326
+ if (typeof value !== "string")
327
+ throw protocolError(`${label} ${field} must be a string`);
328
+ return value;
329
+ }
330
+ function requirePluginId(record, field, label) {
331
+ const value = requireString(record, field, label);
332
+ if (!isPiWebPluginId(value))
333
+ throw protocolError(`${label} ${field} is invalid`);
334
+ return value;
335
+ }
336
+ function optionalPluginId(record, field, label) {
337
+ const value = optionalString(record, field, label);
338
+ if (value !== undefined && !isPiWebPluginId(value))
339
+ throw protocolError(`${label} ${field} is invalid`);
340
+ return value;
341
+ }
342
+ function requireBoolean(record, field, label) {
343
+ const value = record[field];
344
+ if (typeof value !== "boolean")
345
+ throw protocolError(`${label} ${field} must be a boolean`);
346
+ return value;
347
+ }
348
+ function isRuntimeState(value) {
349
+ return value === "active" || value === "failed" || value === "incompatible" || value === "disabled";
350
+ }
351
+ function isLifecyclePhase(value) {
352
+ return value === "import" || value === "activate" || value === "validate" || value === "start" || value === "health" || value === "stop";
353
+ }
354
+ function isCatalogDiagnosticCode(value) {
355
+ return value === "invalid-package" || value === "duplicate-id";
356
+ }
357
+ function encodedId(value, label) {
358
+ if (value === "")
359
+ throw new Error(`${label} id must be a non-empty string`);
360
+ return encodeURIComponent(value);
361
+ }
362
+ function workspaceCatalogRequestMessage(statusCode, body) {
363
+ const detail = responseError(body);
364
+ if (statusCode < 500 && detail !== undefined)
365
+ return detail;
366
+ return `Session daemon workspace authority returned HTTP ${String(statusCode)}${detail === undefined ? "" : `: ${detail}`}`;
367
+ }
368
+ function responseError(body) {
369
+ const value = parseResponseBody(body);
370
+ return isRecord(value) && typeof value["error"] === "string" ? value["error"] : undefined;
371
+ }
372
+ function isUnknownWorkspaceCatalogRoute(statusCode, body) {
373
+ if (statusCode !== 404)
374
+ return false;
375
+ const value = parseResponseBody(body);
376
+ if (!isRecord(value))
377
+ return true;
378
+ const error = value["error"];
379
+ const message = value["message"];
380
+ return error === "Not Found" || (typeof message === "string" && /^Route .* not found$/u.test(message));
381
+ }
382
+ function parseResponseBody(body) {
383
+ try {
384
+ if (body === "")
385
+ return undefined;
386
+ const value = JSON.parse(body);
387
+ return value;
388
+ }
389
+ catch {
390
+ return undefined;
391
+ }
392
+ }
393
+ function protocolError(message) {
394
+ return new WorkspaceCatalogProtocolError(`Invalid session daemon workspace authority response: ${message}`);
395
+ }
396
+ function errorMessage(error) {
397
+ return error instanceof Error ? error.message : String(error);
398
+ }
399
+ function isRecord(value) {
400
+ return typeof value === "object" && value !== null && !Array.isArray(value);
401
+ }
402
+ //# sourceMappingURL=sessionDaemonWorkspaceCatalog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sessionDaemonWorkspaceCatalog.js","sourceRoot":"","sources":["../../../src/server/workspaces/sessionDaemonWorkspaceCatalog.ts"],"names":[],"mappings":"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"}