@jmfederico/pi-web 1.202608.2 → 1.202609.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 (233) hide show
  1. package/README.md +3 -3
  2. package/dist/.plugins-ready +1 -0
  3. package/dist/cli.js +5 -2
  4. package/dist/cli.js.map +1 -1
  5. package/dist/client/apple-touch-icon-dev.png +0 -0
  6. package/dist/client/assets/index-AroYaCLx.js +4130 -0
  7. package/dist/client/assets/vendor-editor-core-YWog6mAR.js +10 -0
  8. package/dist/client/assets/vendor-editor-languages-DOCw3vc9.js +28 -0
  9. package/dist/client/favicon-dev.svg +8 -0
  10. package/dist/client/index.html +5 -5
  11. package/dist/client/pwa-icon-dev-192.png +0 -0
  12. package/dist/client/pwa-icon-dev-512.png +0 -0
  13. package/dist/config.js +20 -0
  14. package/dist/config.js.map +1 -1
  15. package/dist/docker/piWebDockerCommandPlan.js +9 -1
  16. package/dist/docker/piWebDockerCommandPlan.js.map +1 -1
  17. package/dist/nativeServices/installedServiceDefinitions.js +25 -19
  18. package/dist/nativeServices/installedServiceDefinitions.js.map +1 -1
  19. package/dist/nativeServices/serviceAction.js +38 -26
  20. package/dist/nativeServices/serviceAction.js.map +1 -1
  21. package/dist/nativeServices/servicePlan.js +3 -3
  22. package/dist/nativeServices/servicePlan.js.map +1 -1
  23. package/dist/pi-packages/captains-log/README.md +11 -0
  24. package/dist/pi-packages/captains-log/dist/browser/channelProtocol.js +29 -0
  25. package/dist/pi-packages/captains-log/dist/browser/index.js +144 -0
  26. package/dist/pi-packages/captains-log/dist/browser/markdown.js +67 -0
  27. package/dist/pi-packages/captains-log/dist/browser/panel.js +105 -0
  28. package/dist/pi-packages/captains-log/dist/browser/protocol.js +26 -0
  29. package/dist/pi-packages/captains-log/dist/companion.js +126 -0
  30. package/dist/pi-packages/captains-log/dist/roundtrip.js +62 -0
  31. package/dist/pi-packages/captains-log/dist/server.js +210 -0
  32. package/dist/pi-packages/captains-log/dist/store.js +75 -0
  33. package/dist/pi-packages/captains-log/docs/usage.md +30 -0
  34. package/dist/pi-packages/captains-log/package.json +35 -0
  35. package/dist/pi-packages/captains-log/tsconfig.json +21 -0
  36. package/dist/pi-packages/captains-log/vite.config.mjs +28 -0
  37. package/dist/pi-packages/relays/package.json +1 -1
  38. package/dist/pi-packages/relays/pi-web-plugin.js +1 -1
  39. package/dist/pi-packages/relays/prompts/relay-worktree.md +13 -142
  40. package/dist/pi-packages/relays/prompts/relay.md +25 -132
  41. package/dist/pi-packages/relays/relayDiscovery.js +2 -2
  42. package/dist/pi-packages/relays/relaysPanelElement.js +1 -1
  43. package/dist/pi-packages/relays/skills/relay/SKILL.md +59 -88
  44. package/dist/pi-packages/relays/skills/relay-runner/SKILL.md +253 -0
  45. package/dist/pi-web-plugins/files/browser/assets/files-icon-DZObYhxb.svg +3 -0
  46. package/dist/pi-web-plugins/files/browser/pi-web-plugin.js +439 -0
  47. package/dist/pi-web-plugins/files/package.json +15 -0
  48. package/dist/pi-web-plugins/git/browser/git-panel.js +54 -24
  49. package/dist/pi-web-plugins/git/browser/pi-web-plugin.js +1 -1
  50. package/dist/pi-web-plugins/git/git-backend.js +5 -5
  51. package/dist/pi-web-plugins/git/server-plugin.js +5 -3
  52. package/dist/pi-web-plugins/info/pi-web-plugin.js +1 -1
  53. package/dist/pi-web-plugins/mermaid/browser/mermaid-engine.js +3590 -0
  54. package/dist/pi-web-plugins/mermaid/browser/pi-web-plugin.js +6 -0
  55. package/dist/pi-web-plugins/mermaid/package.json +13 -0
  56. package/dist/pi-web-plugins/terminal/browser/pi-web-plugin.js +210 -0
  57. package/dist/pi-web-plugins/terminal/package.json +16 -0
  58. package/dist/pi-web-plugins/terminal/server-plugin.js +365 -0
  59. package/dist/{server/terminals → pi-web-plugins/terminal}/terminalService.js +162 -65
  60. package/dist/pi-web-plugins/updates/pi-web-plugin.js +45 -35
  61. package/dist/pi-web-plugins/workspace-tasks/pi-web-plugin.js +1 -1
  62. package/dist/piWebVersionReport.js +12 -4
  63. package/dist/piWebVersionReport.js.map +1 -1
  64. package/dist/plugin-api.d.ts +222 -23
  65. package/dist/plugin-api.js +1 -0
  66. package/dist/pluginRecoveryCli.js +3 -2
  67. package/dist/pluginRecoveryCli.js.map +1 -1
  68. package/dist/server/activity/workspaceActivityService.js.map +1 -1
  69. package/dist/server/app.js +33 -12
  70. package/dist/server/app.js.map +1 -1
  71. package/dist/server/configRoutes.js +6 -1
  72. package/dist/server/configRoutes.js.map +1 -1
  73. package/dist/server/deploymentIdentity.js +67 -0
  74. package/dist/server/deploymentIdentity.js.map +1 -0
  75. package/dist/server/deploymentIdentityRoutes.js +22 -0
  76. package/dist/server/deploymentIdentityRoutes.js.map +1 -0
  77. package/dist/server/knownAutoInstallPiPackages.js +1 -1
  78. package/dist/server/knownAutoInstallPiPackages.js.map +1 -1
  79. package/dist/server/knownPiPackages.js +12 -0
  80. package/dist/server/knownPiPackages.js.map +1 -0
  81. package/dist/server/machines/machineClient.js +2 -2
  82. package/dist/server/machines/machineClient.js.map +1 -1
  83. package/dist/server/machines/machinePluginProxyRoutes.js +53 -11
  84. package/dist/server/machines/machinePluginProxyRoutes.js.map +1 -1
  85. package/dist/server/machines/machineProxyRoutes.js +70 -7
  86. package/dist/server/machines/machineProxyRoutes.js.map +1 -1
  87. package/dist/server/notices/serverNoticeRoutes.js +34 -0
  88. package/dist/server/notices/serverNoticeRoutes.js.map +1 -0
  89. package/dist/server/notices/serverNoticeService.js +26 -0
  90. package/dist/server/notices/serverNoticeService.js.map +1 -0
  91. package/dist/server/notices/serverNoticeStore.js +119 -0
  92. package/dist/server/notices/serverNoticeStore.js.map +1 -0
  93. package/dist/server/piPackageService.js +5 -5
  94. package/dist/server/piPackageService.js.map +1 -1
  95. package/dist/server/piWebPluginCatalog.js +46 -12
  96. package/dist/server/piWebPluginCatalog.js.map +1 -1
  97. package/dist/server/piWebPluginLifecycle.js +26 -3
  98. package/dist/server/piWebPluginLifecycle.js.map +1 -1
  99. package/dist/server/piWebPluginService.js +37 -2
  100. package/dist/server/piWebPluginService.js.map +1 -1
  101. package/dist/server/piWebStatus.js +1 -1
  102. package/dist/server/piWebStatus.js.map +1 -1
  103. package/dist/server/pluginCallbackDrain.js +35 -0
  104. package/dist/server/pluginCallbackDrain.js.map +1 -0
  105. package/dist/server/plugins/pluginBackendChannelProxyAdmission.js +84 -0
  106. package/dist/server/plugins/pluginBackendChannelProxyAdmission.js.map +1 -0
  107. package/dist/server/plugins/pluginBackendChannelProxyCoordinator.js +234 -0
  108. package/dist/server/plugins/pluginBackendChannelProxyCoordinator.js.map +1 -0
  109. package/dist/server/plugins/pluginBackendChannelProxyRoutes.js +52 -0
  110. package/dist/server/plugins/pluginBackendChannelProxyRoutes.js.map +1 -0
  111. package/dist/server/plugins/pluginBackendProxyRoutes.js +38 -31
  112. package/dist/server/plugins/pluginBackendProxyRoutes.js.map +1 -1
  113. package/dist/server/plugins/pluginBackendRegistry.js +740 -0
  114. package/dist/server/plugins/pluginBackendRegistry.js.map +1 -0
  115. package/dist/server/plugins/serverPluginPiSessionEventsCapability.js +34 -0
  116. package/dist/server/plugins/serverPluginPiSessionEventsCapability.js.map +1 -0
  117. package/dist/server/plugins/serverPluginPiSessionsCapability.js +185 -0
  118. package/dist/server/plugins/serverPluginPiSessionsCapability.js.map +1 -0
  119. package/dist/server/plugins/serverPluginRuntime.js +1028 -107
  120. package/dist/server/plugins/serverPluginRuntime.js.map +1 -1
  121. package/dist/server/plugins/serverPluginWorkspacesCapability.js +114 -0
  122. package/dist/server/plugins/serverPluginWorkspacesCapability.js.map +1 -0
  123. package/dist/server/sessiond/pluginBackendChannelRoutes.js +393 -0
  124. package/dist/server/sessiond/pluginBackendChannelRoutes.js.map +1 -0
  125. package/dist/server/sessiond/pluginBackendRoutes.js +10 -7
  126. package/dist/server/sessiond/pluginBackendRoutes.js.map +1 -1
  127. package/dist/server/sessiond/sessionDaemonShutdown.js +9 -2
  128. package/dist/server/sessiond/sessionDaemonShutdown.js.map +1 -1
  129. package/dist/server/sessiond/sessionProxyRoutes.js +2 -0
  130. package/dist/server/sessiond/sessionProxyRoutes.js.map +1 -1
  131. package/dist/server/sessiond/sessionServiceDependencies.js +1 -0
  132. package/dist/server/sessiond/sessionServiceDependencies.js.map +1 -1
  133. package/dist/server/sessiond.js +82 -21
  134. package/dist/server/sessiond.js.map +1 -1
  135. package/dist/server/sessions/attachmentService.js +1 -5
  136. package/dist/server/sessions/attachmentService.js.map +1 -1
  137. package/dist/server/sessions/builtinCommands.js +2 -2
  138. package/dist/server/sessions/builtinCommands.js.map +1 -1
  139. package/dist/server/sessions/clientSessionPreview.js +14 -0
  140. package/dist/server/sessions/clientSessionPreview.js.map +1 -0
  141. package/dist/server/sessions/piSessionEventConnections.js +65 -0
  142. package/dist/server/sessions/piSessionEventConnections.js.map +1 -0
  143. package/dist/server/sessions/piSessionManagerGateway.js +171 -1
  144. package/dist/server/sessions/piSessionManagerGateway.js.map +1 -1
  145. package/dist/server/sessions/piSessionService.js +442 -90
  146. package/dist/server/sessions/piSessionService.js.map +1 -1
  147. package/dist/server/sessions/sessionActivityMarker.js +105 -0
  148. package/dist/server/sessions/sessionActivityMarker.js.map +1 -0
  149. package/dist/server/sessions/sessionEnvironmentFacts.js +5 -4
  150. package/dist/server/sessions/sessionEnvironmentFacts.js.map +1 -1
  151. package/dist/server/sessions/sessionNameGenerator.js +3 -2
  152. package/dist/server/sessions/sessionNameGenerator.js.map +1 -1
  153. package/dist/server/sessions/sessionRoutes.js +18 -0
  154. package/dist/server/sessions/sessionRoutes.js.map +1 -1
  155. package/dist/server/sessions/spawnSessionTool.js +1 -1
  156. package/dist/server/sessions/spawnSessionTool.js.map +1 -1
  157. package/dist/server/sessions/spawnSubsessionTool.js +1 -1
  158. package/dist/server/sessions/spawnSubsessionTool.js.map +1 -1
  159. package/dist/server/sessions/transcriptBranchCache.js +81 -0
  160. package/dist/server/sessions/transcriptBranchCache.js.map +1 -0
  161. package/dist/server/sessions/transcriptMessages.js +54 -0
  162. package/dist/server/sessions/transcriptMessages.js.map +1 -0
  163. package/dist/server/terminals/requiredTerminalService.js +103 -0
  164. package/dist/server/terminals/requiredTerminalService.js.map +1 -0
  165. package/dist/server/webSocketBridge.js +339 -0
  166. package/dist/server/webSocketBridge.js.map +1 -1
  167. package/dist/server/workspaces/projectPiWebConfig.js +6 -1
  168. package/dist/server/workspaces/projectPiWebConfig.js.map +1 -1
  169. package/dist/server/workspaces/sessionDaemonWorkspaceCatalog.js +23 -3
  170. package/dist/server/workspaces/sessionDaemonWorkspaceCatalog.js.map +1 -1
  171. package/dist/server/workspaces/workspaceCatalog.js +3 -1
  172. package/dist/server/workspaces/workspaceCatalog.js.map +1 -1
  173. package/dist/server/workspaces/workspaceProviderRegistry.js +64 -149
  174. package/dist/server/workspaces/workspaceProviderRegistry.js.map +1 -1
  175. package/dist/server/workspaces/workspaceRemovalService.js +38 -5
  176. package/dist/server/workspaces/workspaceRemovalService.js.map +1 -1
  177. package/dist/server-plugin-api.d.ts +216 -22
  178. package/dist/server-plugin-api.js +319 -2
  179. package/dist/server-plugin-api.js.map +1 -1
  180. package/dist/serverPluginRecovery.js +4 -0
  181. package/dist/serverPluginRecovery.js.map +1 -1
  182. package/dist/sessiond/sessionDaemonClient.js +3 -3
  183. package/dist/sessiond/sessionDaemonClient.js.map +1 -1
  184. package/dist/shared/apiTypes.js +1 -1
  185. package/dist/shared/apiTypes.js.map +1 -1
  186. package/dist/shared/federatedRoutes.js +47 -17
  187. package/dist/shared/federatedRoutes.js.map +1 -1
  188. package/dist/shared/machinePluginIds.js +28 -7
  189. package/dist/shared/machinePluginIds.js.map +1 -1
  190. package/dist/shared/pluginApiTypes.d.ts +21 -1
  191. package/dist/shared/pluginApiTypes.js +0 -1
  192. package/dist/shared/pluginBackendProtocol.js +163 -2
  193. package/dist/shared/pluginBackendProtocol.js.map +1 -1
  194. package/dist/shared/pluginIds.js +8 -1
  195. package/dist/shared/pluginIds.js.map +1 -1
  196. package/dist/shared/requiredTerminalPlugin.js +6 -0
  197. package/dist/shared/requiredTerminalPlugin.js.map +1 -0
  198. package/dist/shared/serverNoticeContract.js +88 -0
  199. package/dist/shared/serverNoticeContract.js.map +1 -0
  200. package/dist/shared/sessionDefaults.js +41 -0
  201. package/dist/shared/sessionDefaults.js.map +1 -0
  202. package/docs/config.md +77 -37
  203. package/docs/plugins.md +146 -1213
  204. package/examples/session-bridge-plugin/README.md +20 -0
  205. package/examples/session-bridge-plugin/docs/usage.md +54 -0
  206. package/examples/session-bridge-plugin/package.json +26 -0
  207. package/examples/session-bridge-plugin/src/browser/index.ts +84 -0
  208. package/examples/session-bridge-plugin/src/browser/protocol.ts +24 -0
  209. package/examples/session-bridge-plugin/src/companion.ts +65 -0
  210. package/examples/session-bridge-plugin/src/reviewRun.ts +39 -0
  211. package/examples/session-bridge-plugin/src/server.ts +85 -0
  212. package/examples/session-bridge-plugin/src/store.ts +57 -0
  213. package/examples/session-bridge-plugin/tsconfig.json +21 -0
  214. package/examples/workspace-provider-plugin/README.md +4 -4
  215. package/examples/workspace-provider-plugin/package.json +1 -1
  216. package/examples/workspace-provider-plugin/src/browser/index.ts +9 -9
  217. package/examples/workspace-provider-plugin/src/server.ts +15 -11
  218. package/package.json +17 -11
  219. package/dist/client/assets/CodeViewer-BMWwxG7q.js +0 -4
  220. package/dist/client/assets/TerminalPanel-CacQDIYn.js +0 -187
  221. package/dist/client/assets/index-DUW2xnoV.js +0 -4279
  222. package/dist/client/assets/vendor-editor-core-CXO8gGab.js +0 -12
  223. package/dist/client/assets/vendor-editor-languages-CpW4sJsX.js +0 -46
  224. package/dist/client/assets/vendor-editor-legacy-CYBnW6ZU.js +0 -1
  225. package/dist/client/assets/vendor-terminal-BrP-ENHg.css +0 -1
  226. package/dist/client/assets/vendor-terminal-D8k4UKM2.js +0 -35
  227. package/dist/server/terminalProxyRoutes.js +0 -141
  228. package/dist/server/terminalProxyRoutes.js.map +0 -1
  229. package/dist/server/terminals/terminalRoutes.js +0 -155
  230. package/dist/server/terminals/terminalRoutes.js.map +0 -1
  231. package/dist/server/terminals/terminalService.js.map +0 -1
  232. package/dist/server/terminals/terminalSize.js +0 -17
  233. package/dist/server/terminals/terminalSize.js.map +0 -1
@@ -0,0 +1,103 @@
1
+ import { REQUIRED_TERMINAL_PLUGIN_ID } from "../../shared/requiredTerminalPlugin.js";
2
+ /** Core's typed view of the bundled Terminal service capability. */
3
+ export const REQUIRED_TERMINAL_SERVICE_CAPABILITY = Object.freeze({
4
+ pluginId: REQUIRED_TERMINAL_PLUGIN_ID,
5
+ id: "service",
6
+ version: 1,
7
+ parse: snapshotRequiredTerminalService,
8
+ });
9
+ export class RequiredTerminalUnavailableError extends Error {
10
+ constructor() {
11
+ super(...arguments);
12
+ this.name = "RequiredTerminalUnavailableError";
13
+ }
14
+ }
15
+ export function snapshotRequiredTerminalService(value) {
16
+ if (!isRecord(value))
17
+ throw new Error("Required Terminal server entry did not provide its composition service");
18
+ const closeForCwd = value["closeForCwd"];
19
+ const runCommand = value["runCommand"];
20
+ const bindActivitySink = value["bindActivitySink"];
21
+ if (typeof closeForCwd !== "function" || typeof runCommand !== "function" || typeof bindActivitySink !== "function") {
22
+ throw new Error("Required Terminal server entry did not provide its composition service");
23
+ }
24
+ return Object.freeze({
25
+ closeForCwd: (cwd) => { Reflect.apply(closeForCwd, value, [cwd]); },
26
+ runCommand: (options) => requireCommandRun(Reflect.apply(runCommand, value, [options])),
27
+ bindActivitySink: (sink) => {
28
+ Reflect.apply(bindActivitySink, value, [Object.freeze({
29
+ updateTerminal: (terminal) => { sink.updateTerminal(terminal); },
30
+ removeTerminal: (terminalId, cwd) => { sink.removeTerminal(terminalId, cwd); },
31
+ })]);
32
+ },
33
+ });
34
+ }
35
+ export function unavailableRequiredTerminalService() {
36
+ const unavailable = () => {
37
+ throw new RequiredTerminalUnavailableError("Required Terminal plugin is unavailable in recovery safe start; workspace removal cannot continue");
38
+ };
39
+ return Object.freeze({
40
+ closeForCwd: unavailable,
41
+ runCommand: unavailable,
42
+ bindActivitySink: () => undefined,
43
+ });
44
+ }
45
+ function requireCommandRun(value) {
46
+ if (!isRecord(value))
47
+ throw invalidCommandRun();
48
+ const status = value["status"];
49
+ const exitCode = optionalFiniteNumber(value["exitCode"]);
50
+ const startedAt = optionalString(value["startedAt"]);
51
+ const completedAt = optionalString(value["completedAt"]);
52
+ if (typeof value["id"] !== "string"
53
+ || typeof value["origin"] !== "string"
54
+ || typeof value["projectId"] !== "string"
55
+ || typeof value["workspaceId"] !== "string"
56
+ || typeof value["terminalId"] !== "string"
57
+ || typeof value["title"] !== "string"
58
+ || typeof value["command"] !== "string"
59
+ || (status !== "queued" && status !== "running" && status !== "succeeded" && status !== "failed")
60
+ || exitCode === invalidOptionalField
61
+ || typeof value["createdAt"] !== "string"
62
+ || startedAt === invalidOptionalField
63
+ || completedAt === invalidOptionalField
64
+ || !isStringRecord(value["metadata"])) {
65
+ throw invalidCommandRun();
66
+ }
67
+ return {
68
+ id: value["id"],
69
+ origin: value["origin"],
70
+ projectId: value["projectId"],
71
+ workspaceId: value["workspaceId"],
72
+ terminalId: value["terminalId"],
73
+ title: value["title"],
74
+ command: value["command"],
75
+ status,
76
+ ...(exitCode === undefined ? {} : { exitCode }),
77
+ createdAt: value["createdAt"],
78
+ ...(startedAt === undefined ? {} : { startedAt }),
79
+ ...(completedAt === undefined ? {} : { completedAt }),
80
+ metadata: { ...value["metadata"] },
81
+ };
82
+ }
83
+ const invalidOptionalField = Symbol("invalid optional Terminal field");
84
+ function optionalFiniteNumber(value) {
85
+ if (value === undefined)
86
+ return undefined;
87
+ return typeof value === "number" && Number.isFinite(value) ? value : invalidOptionalField;
88
+ }
89
+ function optionalString(value) {
90
+ if (value === undefined)
91
+ return undefined;
92
+ return typeof value === "string" ? value : invalidOptionalField;
93
+ }
94
+ function isStringRecord(value) {
95
+ return isRecord(value) && Object.values(value).every((child) => typeof child === "string");
96
+ }
97
+ function invalidCommandRun() {
98
+ return new Error("Required Terminal server entry returned an invalid command run");
99
+ }
100
+ function isRecord(value) {
101
+ return typeof value === "object" && value !== null;
102
+ }
103
+ //# sourceMappingURL=requiredTerminalService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"requiredTerminalService.js","sourceRoot":"","sources":["../../../src/server/terminals/requiredTerminalService.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,2BAA2B,EAAE,MAAM,wCAAwC,CAAC;AAuCrF,oEAAoE;AACpE,MAAM,CAAC,MAAM,oCAAoC,GAAG,MAAM,CAAC,MAAM,CAAC;IAChE,QAAQ,EAAE,2BAA2B;IACrC,EAAE,EAAE,SAAS;IACb,OAAO,EAAE,CAAC;IACV,KAAK,EAAE,+BAA+B;CACvC,CAAwD,CAAC;AAE1D,MAAM,OAAO,gCAAiC,SAAQ,KAAK;IAA3D;;QACW,SAAI,GAAG,kCAAkC,CAAC;IACrD,CAAC;CAAA;AAED,MAAM,UAAU,+BAA+B,CAAC,KAAc;IAC5D,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,wEAAwE,CAAC,CAAC;IAChH,MAAM,WAAW,GAAG,KAAK,CAAC,aAAa,CAAC,CAAC;IACzC,MAAM,UAAU,GAAG,KAAK,CAAC,YAAY,CAAC,CAAC;IACvC,MAAM,gBAAgB,GAAG,KAAK,CAAC,kBAAkB,CAAC,CAAC;IACnD,IAAI,OAAO,WAAW,KAAK,UAAU,IAAI,OAAO,UAAU,KAAK,UAAU,IAAI,OAAO,gBAAgB,KAAK,UAAU,EAAE,CAAC;QACpH,MAAM,IAAI,KAAK,CAAC,wEAAwE,CAAC,CAAC;IAC5F,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,WAAW,EAAE,CAAC,GAAW,EAAE,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3E,UAAU,EAAE,CAAC,OAAkC,EAAE,EAAE,CAAC,iBAAiB,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;QAClH,gBAAgB,EAAE,CAAC,IAAkC,EAAE,EAAE;YACvD,OAAO,CAAC,KAAK,CAAC,gBAAgB,EAAE,KAAK,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC;oBACpD,cAAc,EAAE,CAAC,QAAkC,EAAE,EAAE,GAAG,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;oBAC1F,cAAc,EAAE,CAAC,UAAkB,EAAE,GAAY,EAAE,EAAE,GAAG,IAAI,CAAC,cAAc,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;iBAChG,CAAC,CAAC,CAAC,CAAC;QACP,CAAC;KACF,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,kCAAkC;IAChD,MAAM,WAAW,GAAG,GAAU,EAAE;QAC9B,MAAM,IAAI,gCAAgC,CACxC,mGAAmG,CACpG,CAAC;IACJ,CAAC,CAAC;IACF,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,WAAW,EAAE,WAAW;QACxB,UAAU,EAAE,WAAW;QACvB,gBAAgB,EAAE,GAAG,EAAE,CAAC,SAAS;KAClC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAc;IACvC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,MAAM,iBAAiB,EAAE,CAAC;IAChD,MAAM,MAAM,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC/B,MAAM,QAAQ,GAAG,oBAAoB,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC;IACzD,MAAM,SAAS,GAAG,cAAc,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC;IACrD,MAAM,WAAW,GAAG,cAAc,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC;IACzD,IAAI,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,QAAQ;WAC9B,OAAO,KAAK,CAAC,QAAQ,CAAC,KAAK,QAAQ;WACnC,OAAO,KAAK,CAAC,WAAW,CAAC,KAAK,QAAQ;WACtC,OAAO,KAAK,CAAC,aAAa,CAAC,KAAK,QAAQ;WACxC,OAAO,KAAK,CAAC,YAAY,CAAC,KAAK,QAAQ;WACvC,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,QAAQ;WAClC,OAAO,KAAK,CAAC,SAAS,CAAC,KAAK,QAAQ;WACpC,CAAC,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,WAAW,IAAI,MAAM,KAAK,QAAQ,CAAC;WAC9F,QAAQ,KAAK,oBAAoB;WACjC,OAAO,KAAK,CAAC,WAAW,CAAC,KAAK,QAAQ;WACtC,SAAS,KAAK,oBAAoB;WAClC,WAAW,KAAK,oBAAoB;WACpC,CAAC,cAAc,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC;QACxC,MAAM,iBAAiB,EAAE,CAAC;IAC5B,CAAC;IACD,OAAO;QACL,EAAE,EAAE,KAAK,CAAC,IAAI,CAAC;QACf,MAAM,EAAE,KAAK,CAAC,QAAQ,CAAC;QACvB,SAAS,EAAE,KAAK,CAAC,WAAW,CAAC;QAC7B,WAAW,EAAE,KAAK,CAAC,aAAa,CAAC;QACjC,UAAU,EAAE,KAAK,CAAC,YAAY,CAAC;QAC/B,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC;QACrB,OAAO,EAAE,KAAK,CAAC,SAAS,CAAC;QACzB,MAAM;QACN,GAAG,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC;QAC/C,SAAS,EAAE,KAAK,CAAC,WAAW,CAAC;QAC7B,GAAG,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC;QACjD,GAAG,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC;QACrD,QAAQ,EAAE,EAAE,GAAG,KAAK,CAAC,UAAU,CAAC,EAAE;KACnC,CAAC;AACJ,CAAC;AAED,MAAM,oBAAoB,GAAG,MAAM,CAAC,iCAAiC,CAAC,CAAC;AAEvE,SAAS,oBAAoB,CAAC,KAAc;IAC1C,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC1C,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,oBAAoB,CAAC;AAC5F,CAAC;AAED,SAAS,cAAc,CAAC,KAAc;IACpC,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC1C,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,oBAAoB,CAAC;AAClE,CAAC;AAED,SAAS,cAAc,CAAC,KAAc;IACpC,OAAO,QAAQ,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC;AAC7F,CAAC;AAED,SAAS,iBAAiB;IACxB,OAAO,IAAI,KAAK,CAAC,gEAAgE,CAAC,CAAC;AACrF,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,CAAC;AACrD,CAAC"}
@@ -1,4 +1,59 @@
1
1
  import { WebSocket } from "ws";
2
+ import { boundedPluginBackendChannelCloseReason, PLUGIN_BACKEND_CHANNEL_DATA_FRAME_MAX_BYTES, PLUGIN_BACKEND_CHANNEL_DRAIN_TIMEOUT_MS, PLUGIN_BACKEND_CHANNEL_OPEN_FRAME_MAX_BYTES, PLUGIN_BACKEND_CHANNEL_QUEUE_MAX_BYTES, PLUGIN_BACKEND_CHANNEL_QUEUE_MAX_FRAMES, PLUGIN_BACKEND_CHANNEL_SERVER_TO_BROWSER_QUEUE_MAX_BYTES, PLUGIN_BACKEND_CHANNEL_TEARDOWN_TIMEOUT_MS, utf8ByteLength, } from "../shared/pluginBackendProtocol.js";
3
+ const pluginChannelLimitedServers = new WeakSet();
4
+ const pendingPluginBackendChannelUpgrades = new WeakSet();
5
+ export class PluginBackendChannelTransportFrameError extends Error {
6
+ constructor(closeCode, message, options) {
7
+ super(message, options);
8
+ this.closeCode = closeCode;
9
+ this.name = "PluginBackendChannelTransportFrameError";
10
+ }
11
+ }
12
+ /** Decode one opaque text frame while enforcing only physical-hop bounds. */
13
+ export function decodeBoundedPluginBackendChannelTextFrame(data, isBinary, maxBytes, label) {
14
+ if (isBinary) {
15
+ throw new PluginBackendChannelTransportFrameError(1003, "Plugin backend channels accept text frames only");
16
+ }
17
+ if (typeof data === "string") {
18
+ if (utf8ByteLength(data) > maxBytes) {
19
+ throw new PluginBackendChannelTransportFrameError(1009, `${label} exceeds the ${String(maxBytes)} byte transport limit`);
20
+ }
21
+ return data;
22
+ }
23
+ const bytes = data instanceof ArrayBuffer
24
+ ? new Uint8Array(data)
25
+ : Array.isArray(data)
26
+ ? Buffer.concat(data)
27
+ : data;
28
+ if (bytes.byteLength > maxBytes) {
29
+ throw new PluginBackendChannelTransportFrameError(1009, `${label} exceeds the ${String(maxBytes)} byte transport limit`);
30
+ }
31
+ try {
32
+ return new TextDecoder("utf-8", { fatal: true }).decode(bytes);
33
+ }
34
+ catch (error) {
35
+ throw new PluginBackendChannelTransportFrameError(1007, `${label} must be valid UTF-8 text`, { cause: error });
36
+ }
37
+ }
38
+ /** Mark a Fastify-matched paired-channel request before ws allocates its receiver. */
39
+ export function markPluginBackendChannelUpgradeRequest(request) {
40
+ pendingPluginBackendChannelUpgrades.add(request);
41
+ }
42
+ /** Select the plugin-channel ingress cap before ws allocates its receiver. */
43
+ export function installPluginBackendChannelWebSocketPayloadLimit(server) {
44
+ if (pluginChannelLimitedServers.has(server))
45
+ return;
46
+ pluginChannelLimitedServers.add(server);
47
+ const defaultMaxPayload = server.options.maxPayload;
48
+ server.on("headers", (_headers, request) => {
49
+ // The ws `headers` event runs synchronously immediately before setSocket()
50
+ // reads this option. Reset every unrelated upgrade so session protocols keep
51
+ // the server's configured allowance.
52
+ server.options.maxPayload = pendingPluginBackendChannelUpgrades.delete(request)
53
+ ? PLUGIN_BACKEND_CHANNEL_OPEN_FRAME_MAX_BYTES
54
+ : defaultMaxPayload;
55
+ });
56
+ }
2
57
  export function bridgeSockets(client, upstream) {
3
58
  const sendToClient = createBufferedSender(client);
4
59
  const sendToUpstream = createBufferedSender(upstream);
@@ -29,4 +84,288 @@ export function createBufferedSender(socket) {
29
84
  queue.push(data);
30
85
  };
31
86
  }
87
+ /** One-at-a-time sender whose connecting and socket-write queue is explicitly bounded. */
88
+ export function createBoundedTextWebSocketSender(socket, options = {}) {
89
+ const maxFrames = options.maxFrames ?? PLUGIN_BACKEND_CHANNEL_QUEUE_MAX_FRAMES;
90
+ const maxBytes = options.maxBytes ?? PLUGIN_BACKEND_CHANNEL_QUEUE_MAX_BYTES;
91
+ const queue = [];
92
+ const drainWaiters = new Set();
93
+ let queuedBytes = 0;
94
+ let sending = false;
95
+ let failure;
96
+ const settleDrainWaiters = () => {
97
+ if (failure === undefined && (sending || queue.length !== 0))
98
+ return;
99
+ for (const waiter of drainWaiters) {
100
+ clearTimeout(waiter.timer);
101
+ if (failure === undefined)
102
+ waiter.resolve();
103
+ else
104
+ waiter.reject(failure);
105
+ }
106
+ drainWaiters.clear();
107
+ };
108
+ const fail = (error) => {
109
+ if (failure !== undefined)
110
+ return;
111
+ failure = error;
112
+ options.onOverflow?.(error);
113
+ settleDrainWaiters();
114
+ };
115
+ const flush = () => {
116
+ if (sending || failure !== undefined || socket.readyState !== WebSocket.OPEN)
117
+ return;
118
+ const frame = queue[0];
119
+ if (frame === undefined) {
120
+ settleDrainWaiters();
121
+ return;
122
+ }
123
+ sending = true;
124
+ try {
125
+ socket.send(frame.text, { binary: false }, (error) => {
126
+ sending = false;
127
+ if (queue[0] === frame) {
128
+ queue.shift();
129
+ queuedBytes -= frame.bytes;
130
+ }
131
+ if (error) {
132
+ fail(new Error(`Plugin backend channel socket send failed: ${error.message}`, { cause: error }));
133
+ return;
134
+ }
135
+ flush();
136
+ });
137
+ }
138
+ catch (error) {
139
+ sending = false;
140
+ if (queue[0] === frame) {
141
+ queue.shift();
142
+ queuedBytes -= frame.bytes;
143
+ }
144
+ fail(error instanceof Error ? error : new Error(String(error)));
145
+ }
146
+ };
147
+ if (socket.readyState === WebSocket.CONNECTING)
148
+ socket.once("open", flush);
149
+ const send = (text) => {
150
+ if (failure !== undefined || (socket.readyState !== WebSocket.OPEN && socket.readyState !== WebSocket.CONNECTING)) {
151
+ throw new Error("Plugin backend channel socket is not open");
152
+ }
153
+ const bytes = utf8ByteLength(text);
154
+ if (queue.length >= maxFrames || queuedBytes + bytes > maxBytes) {
155
+ const error = new Error("Plugin backend channel socket queue limit was exceeded");
156
+ fail(error);
157
+ throw error;
158
+ }
159
+ queue.push({ text, bytes });
160
+ queuedBytes += bytes;
161
+ flush();
162
+ };
163
+ const drain = (timeoutMs = PLUGIN_BACKEND_CHANNEL_DRAIN_TIMEOUT_MS) => {
164
+ if (failure !== undefined)
165
+ return Promise.reject(failure);
166
+ if (!sending && queue.length === 0)
167
+ return Promise.resolve();
168
+ return new Promise((resolve, reject) => {
169
+ const waiter = {
170
+ resolve,
171
+ reject,
172
+ timer: setTimeout(() => {
173
+ drainWaiters.delete(waiter);
174
+ reject(new Error(`Plugin backend channel socket drain timed out after ${String(timeoutMs)}ms`));
175
+ }, timeoutMs),
176
+ };
177
+ waiter.timer.unref();
178
+ drainWaiters.add(waiter);
179
+ });
180
+ };
181
+ return Object.assign(send, { drain });
182
+ }
183
+ /**
184
+ * Boundedly bridge opaque generic-channel text without reading plugin or host
185
+ * envelope semantics. The returned lifetime resolves only after both physical
186
+ * sockets have closed and accepted clean-close frames have drained.
187
+ */
188
+ export function bridgePluginBackendChannelSockets(client, upstream, options = {}) {
189
+ setPluginBackendChannelSocketPayloadLimit(client, PLUGIN_BACKEND_CHANNEL_OPEN_FRAME_MAX_BYTES);
190
+ let closing = false;
191
+ let closeNotified = false;
192
+ let receivedClientFrame = false;
193
+ let resolveCompletion = () => undefined;
194
+ const completion = new Promise((resolve) => { resolveCompletion = resolve; });
195
+ const isClosing = () => closing;
196
+ const detachBridgeListeners = () => {
197
+ client.off("message", onClientMessage);
198
+ upstream.off("message", onUpstreamMessage);
199
+ client.off("close", onClientClose);
200
+ upstream.off("close", onUpstreamClose);
201
+ client.off("error", onClientError);
202
+ upstream.off("error", onUpstreamError);
203
+ };
204
+ const notifyClosed = () => {
205
+ if (closeNotified)
206
+ return;
207
+ closeNotified = true;
208
+ detachBridgeListeners();
209
+ resolveCompletion();
210
+ };
211
+ const fail = (code, reason) => {
212
+ if (closing)
213
+ return;
214
+ closing = true;
215
+ void Promise.allSettled([
216
+ closePluginBackendChannelWebSocket(client, code, reason),
217
+ closePluginBackendChannelWebSocket(upstream, code, reason),
218
+ ]).finally(notifyClosed);
219
+ };
220
+ const sendToClient = createBoundedTextWebSocketSender(client, {
221
+ maxBytes: PLUGIN_BACKEND_CHANNEL_SERVER_TO_BROWSER_QUEUE_MAX_BYTES,
222
+ onOverflow: (error) => { fail(1013, error.message); },
223
+ });
224
+ const sendToUpstream = createBoundedTextWebSocketSender(upstream, {
225
+ onOverflow: (error) => { fail(1013, error.message); },
226
+ });
227
+ const forwardClientFrame = (data, isBinary) => {
228
+ const firstFrame = !receivedClientFrame;
229
+ const text = decodeBoundedPluginBackendChannelTextFrame(data, isBinary, firstFrame ? PLUGIN_BACKEND_CHANNEL_OPEN_FRAME_MAX_BYTES : PLUGIN_BACKEND_CHANNEL_DATA_FRAME_MAX_BYTES, firstFrame ? "Plugin backend channel first client frame" : "Plugin backend channel client frame");
230
+ if (firstFrame) {
231
+ receivedClientFrame = true;
232
+ setPluginBackendChannelSocketPayloadLimit(client, PLUGIN_BACKEND_CHANNEL_DATA_FRAME_MAX_BYTES);
233
+ }
234
+ sendToUpstream(text);
235
+ };
236
+ function onClientMessage(data, isBinary) {
237
+ try {
238
+ forwardClientFrame(data, isBinary);
239
+ }
240
+ catch (error) {
241
+ fail(transportFrameCloseCode(error), bridgeErrorMessage(error));
242
+ }
243
+ }
244
+ function onUpstreamMessage(data, isBinary) {
245
+ try {
246
+ const text = decodeBoundedPluginBackendChannelTextFrame(data, isBinary, PLUGIN_BACKEND_CHANNEL_DATA_FRAME_MAX_BYTES, "Plugin backend channel upstream frame");
247
+ sendToClient(text);
248
+ }
249
+ catch (error) {
250
+ fail(transportFrameCloseCode(error), bridgeErrorMessage(error));
251
+ }
252
+ }
253
+ function onClientClose(code, reason) {
254
+ if (closing)
255
+ return;
256
+ closing = true;
257
+ void propagatePluginChannelClose(upstream, sendToUpstream, code, decodeCloseReason(reason)).finally(notifyClosed);
258
+ }
259
+ function onUpstreamClose(code, reason) {
260
+ if (closing)
261
+ return;
262
+ closing = true;
263
+ void propagatePluginChannelClose(client, sendToClient, code, decodeCloseReason(reason)).finally(notifyClosed);
264
+ }
265
+ function onClientError(error) {
266
+ fail(1011, `Plugin backend channel client transport failed: ${bridgeErrorMessage(error)}`);
267
+ }
268
+ function onUpstreamError(error) {
269
+ fail(1011, `Plugin backend channel upstream transport failed: ${bridgeErrorMessage(error)}`);
270
+ }
271
+ client.on("message", onClientMessage);
272
+ upstream.on("message", onUpstreamMessage);
273
+ client.once("close", onClientClose);
274
+ upstream.once("close", onUpstreamClose);
275
+ client.once("error", onClientError);
276
+ upstream.once("error", onUpstreamError);
277
+ for (const text of options.initialClientFrames ?? []) {
278
+ if (isClosing())
279
+ break;
280
+ try {
281
+ forwardClientFrame(text, false);
282
+ }
283
+ catch (error) {
284
+ fail(transportFrameCloseCode(error), bridgeErrorMessage(error));
285
+ }
286
+ }
287
+ return completion;
288
+ }
289
+ async function propagatePluginChannelClose(target, sender, code, reason) {
290
+ const closeCode = transferableCloseCode(code);
291
+ if (closeCode === 1000) {
292
+ try {
293
+ await sender.drain();
294
+ }
295
+ catch (error) {
296
+ await closePluginBackendChannelWebSocket(target, 1011, `Plugin backend channel clean-close drain failed: ${bridgeErrorMessage(error)}`);
297
+ return;
298
+ }
299
+ }
300
+ await closePluginBackendChannelWebSocket(target, closeCode, reason);
301
+ }
302
+ /**
303
+ * `@fastify/websocket` owns one ws server for unrelated routes, so its public
304
+ * maxPayload option cannot express this route's smaller protocol bound. Update
305
+ * the ws receiver before route listeners run, then tighten it after the larger
306
+ * first open frame. Keep this compatibility seam isolated and fail loudly if a
307
+ * future ws version changes the receiver shape.
308
+ */
309
+ export function setPluginBackendChannelSocketPayloadLimit(socket, maxPayload) {
310
+ const receiver = Reflect.get(socket, "_receiver");
311
+ if (typeof receiver !== "object" || receiver === null || typeof Reflect.get(receiver, "_maxPayload") !== "number") {
312
+ throw new Error("Plugin backend channel transport cannot apply its payload limit");
313
+ }
314
+ if (!Reflect.set(receiver, "_maxPayload", maxPayload)) {
315
+ throw new Error("Plugin backend channel transport cannot apply its payload limit");
316
+ }
317
+ }
318
+ function transportFrameCloseCode(error) {
319
+ return error instanceof PluginBackendChannelTransportFrameError ? error.closeCode : 1011;
320
+ }
321
+ function decodeCloseReason(reason) {
322
+ try {
323
+ return new TextDecoder("utf-8", { fatal: true }).decode(reason);
324
+ }
325
+ catch {
326
+ return "Invalid close reason";
327
+ }
328
+ }
329
+ function transferableCloseCode(code) {
330
+ return code === 1000 || (code >= 1001 && code <= 1014 && code !== 1004 && code !== 1005 && code !== 1006)
331
+ ? code
332
+ : 1011;
333
+ }
334
+ /** Resolve only after the physical socket closes, terminating a non-cooperating peer at the hard deadline. */
335
+ export function closePluginBackendChannelWebSocket(socket, code, reason, options = {}) {
336
+ if (socket.readyState === WebSocket.CLOSED)
337
+ return Promise.resolve();
338
+ return new Promise((resolve) => {
339
+ let settled = false;
340
+ const consumeExpectedError = () => undefined;
341
+ const finish = () => {
342
+ if (settled)
343
+ return;
344
+ settled = true;
345
+ clearTimeout(timer);
346
+ socket.off("close", finish);
347
+ socket.off("error", consumeExpectedError);
348
+ resolve();
349
+ };
350
+ const timer = setTimeout(() => {
351
+ if (socket.readyState !== WebSocket.CLOSED)
352
+ socket.terminate();
353
+ }, options.teardownTimeoutMs ?? PLUGIN_BACKEND_CHANNEL_TEARDOWN_TIMEOUT_MS);
354
+ timer.unref();
355
+ socket.once("close", finish);
356
+ socket.once("error", consumeExpectedError);
357
+ if (options.terminateImmediately === true || socket.readyState === WebSocket.CONNECTING) {
358
+ socket.terminate();
359
+ }
360
+ else if (socket.readyState === WebSocket.OPEN) {
361
+ socket.close(code, boundedPluginBackendChannelCloseReason(reason));
362
+ }
363
+ if (socket.readyState === WebSocket.CLOSED)
364
+ finish();
365
+ });
366
+ }
367
+ function bridgeErrorMessage(error) {
368
+ const message = error instanceof Error ? error.message : String(error);
369
+ return boundedPluginBackendChannelCloseReason(message);
370
+ }
32
371
  //# sourceMappingURL=webSocketBridge.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"webSocketBridge.js","sourceRoot":"","sources":["../../src/server/webSocketBridge.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAa,MAAM,IAAI,CAAC;AAE1C,MAAM,UAAU,aAAa,CAAC,MAAiB,EAAE,QAAmB;IAClE,MAAM,YAAY,GAAG,oBAAoB,CAAC,MAAM,CAAC,CAAC;IAClD,MAAM,cAAc,GAAG,oBAAoB,CAAC,QAAQ,CAAC,CAAC;IACtD,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,IAAI,EAAE,EAAE,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1D,QAAQ,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,IAAI,EAAE,EAAE,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1D,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAChD,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAChD,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAChD,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;AAClD,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,MAAiB;IACpD,MAAM,KAAK,GAAW,EAAE,CAAC;IACzB,MAAM,KAAK,GAAG,GAAG,EAAE;QACjB,OAAO,MAAM,CAAC,UAAU,KAAK,SAAS,CAAC,IAAI,EAAE,CAAC;YAC5C,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC;YAC3B,IAAI,IAAI,KAAK,SAAS;gBAAE,OAAO;YAC/B,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpB,CAAC;IACH,CAAC,CAAC;IACF,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IACzB,OAAO,CAAC,IAAI,EAAE,EAAE;QACd,IAAI,MAAM,CAAC,UAAU,KAAK,SAAS,CAAC,IAAI,EAAE,CAAC;YACzC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAClB,OAAO;QACT,CAAC;QACD,IAAI,MAAM,CAAC,UAAU,KAAK,SAAS,CAAC,UAAU;YAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnE,CAAC,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"webSocketBridge.js","sourceRoot":"","sources":["../../src/server/webSocketBridge.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { readFile } from "node:fs/promises";
2
2
  import { join } from "node:path";
3
- import { effectiveUploadsConfig, parsePathAccessConfig, parseUploadsConfig } from "../../config.js";
3
+ import { effectiveAttachmentsConfig, effectiveUploadsConfig, parseAttachmentsConfig, parsePathAccessConfig, parseUploadsConfig } from "../../config.js";
4
4
  export const PROJECT_PI_WEB_CONFIG_PATH = ".pi-web/config.json";
5
5
  export async function loadProjectPiWebConfig(projectPath) {
6
6
  const path = join(projectPath, PROJECT_PI_WEB_CONFIG_PATH);
@@ -24,6 +24,10 @@ export async function loadEffectiveProjectUploadsConfig(projectPath, globalConfi
24
24
  const projectConfig = await loadProjectPiWebConfig(projectPath);
25
25
  return effectiveUploadsConfig({ uploads: { ...(globalConfig.uploads ?? {}), ...(projectConfig.config.uploads ?? {}) } });
26
26
  }
27
+ export async function loadEffectiveProjectAttachmentsConfig(projectPath, globalConfig) {
28
+ const projectConfig = await loadProjectPiWebConfig(projectPath);
29
+ return effectiveAttachmentsConfig({ attachments: { ...(globalConfig.attachments ?? {}), ...(projectConfig.config.attachments ?? {}) } });
30
+ }
27
31
  export function mergePathAccessConfigs(...configs) {
28
32
  const allowedPaths = dedupe(configs.flatMap((config) => config?.allowedPaths ?? []));
29
33
  return allowedPaths.length === 0 ? undefined : { allowedPaths };
@@ -34,6 +38,7 @@ function parseProjectPiWebConfig(value, path) {
34
38
  ...(version !== undefined ? { version: parseProjectConfigVersion(version, path) } : {}),
35
39
  ...(value["pathAccess"] !== undefined ? { pathAccess: parsePathAccessConfig(value["pathAccess"], path) } : {}),
36
40
  ...(value["uploads"] !== undefined ? { uploads: parseUploadsConfig(value["uploads"], path) } : {}),
41
+ ...(value["attachments"] !== undefined ? { attachments: parseAttachmentsConfig(value["attachments"], path) } : {}),
37
42
  };
38
43
  }
39
44
  function parseProjectConfigVersion(value, path) {
@@ -1 +1 @@
1
- {"version":3,"file":"projectPiWebConfig.js","sourceRoot":"","sources":["../../../src/server/workspaces/projectPiWebConfig.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"projectPiWebConfig.js","sourceRoot":"","sources":["../../../src/server/workspaces/projectPiWebConfig.ts"],"names":[],"mappings":"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"}
@@ -169,7 +169,6 @@ function parseProvider(value, workspaceLabel) {
169
169
  return Object.freeze({
170
170
  pluginId: requirePluginId(value, "pluginId", label),
171
171
  capabilities: Object.freeze({
172
- request: requireBoolean(capabilities, "request", `${label} capabilities`),
173
172
  remove: requireBoolean(capabilities, "remove", `${label} capabilities`),
174
173
  }),
175
174
  ...(metadata === undefined ? {} : { metadata }),
@@ -191,12 +190,17 @@ function parseProviderRuntimeSnapshot(value) {
191
190
  if (value["protocolVersion"] !== WORKSPACE_PROVIDER_RUNTIME_PROTOCOL_VERSION) {
192
191
  throw protocolError("provider runtime protocol is unsupported; restart or upgrade the session daemon");
193
192
  }
193
+ const terminalMode = parseTerminalMode(value["terminalMode"]);
194
194
  const safeStart = parseSafeStart(value["safeStart"]);
195
+ if ((safeStart === "none") !== (terminalMode === "recovery-disabled")) {
196
+ throw protocolError("provider runtime terminalMode does not match safeStart");
197
+ }
195
198
  const records = parseArray(value["records"], "provider runtime records", parseRuntimeRecord);
196
199
  const health = parseArray(value["health"], "provider runtime health", parseHealthInspection);
197
200
  const diagnostics = parseArray(value["diagnostics"], "provider runtime diagnostics", parseCatalogDiagnostic);
198
201
  return Object.freeze({
199
202
  protocolVersion: WORKSPACE_PROVIDER_RUNTIME_PROTOCOL_VERSION,
203
+ terminalMode,
200
204
  ...(safeStart === undefined ? {} : { safeStart }),
201
205
  records: Object.freeze(records),
202
206
  health: Object.freeze(health),
@@ -220,6 +224,8 @@ function parseRuntimeRecord(value, index) {
220
224
  const name = optionalString(value, "name", label);
221
225
  const message = optionalString(value, "message", label);
222
226
  const browserRevision = optionalString(value, "browserRevision", label);
227
+ const pairedRequestVersion = parsePairedCapabilityVersion(value["pairedRequestVersion"], label, "request");
228
+ const pairedChannelVersion = parsePairedCapabilityVersion(value["pairedChannelVersion"], label, "channel");
223
229
  return Object.freeze({
224
230
  pluginId: requirePluginId(value, "pluginId", label),
225
231
  source: requireString(value, "source", label),
@@ -228,12 +234,21 @@ function parseRuntimeRecord(value, index) {
228
234
  ...(browserRevision === undefined ? {} : { browserRevision }),
229
235
  settingsRevision: requireString(value, "settingsRevision", label),
230
236
  machineSpecific: requireBoolean(value, "machineSpecific", label),
237
+ ...(pairedRequestVersion === undefined ? {} : { pairedRequestVersion }),
238
+ ...(pairedChannelVersion === undefined ? {} : { pairedChannelVersion }),
231
239
  state,
232
240
  ...(name === undefined ? {} : { name }),
233
241
  ...(phase === undefined ? {} : { phase }),
234
242
  ...(message === undefined ? {} : { message }),
235
243
  });
236
244
  }
245
+ function parsePairedCapabilityVersion(value, label, capability) {
246
+ if (value === undefined)
247
+ return undefined;
248
+ if (value !== 1)
249
+ throw protocolError(`${label} paired ${capability} version is invalid`);
250
+ return value;
251
+ }
237
252
  function parseCatalogDiagnostic(value, index) {
238
253
  const label = `provider runtime diagnostic ${String(index + 1)}`;
239
254
  if (!isRecord(value))
@@ -280,6 +295,11 @@ function parseHealth(value, inspectionLabel) {
280
295
  ...(details === undefined ? {} : { details }),
281
296
  });
282
297
  }
298
+ function parseTerminalMode(value) {
299
+ if (value === "required" || value === "recovery-disabled")
300
+ return value;
301
+ throw protocolError("provider runtime terminalMode is invalid");
302
+ }
283
303
  function parseSafeStart(value) {
284
304
  if (value === undefined)
285
305
  return undefined;
@@ -349,10 +369,10 @@ function isRuntimeState(value) {
349
369
  return value === "active" || value === "failed" || value === "incompatible" || value === "disabled";
350
370
  }
351
371
  function isLifecyclePhase(value) {
352
- return value === "import" || value === "activate" || value === "validate" || value === "start" || value === "health" || value === "stop";
372
+ return value === "import" || value === "activate" || value === "validate" || value === "start" || value === "health" || value === "dispose";
353
373
  }
354
374
  function isCatalogDiagnosticCode(value) {
355
- return value === "invalid-package" || value === "duplicate-id";
375
+ return value === "invalid-package" || value === "reserved-id" || value === "duplicate-id" || value === "required-plugin-config";
356
376
  }
357
377
  function encodedId(value, label) {
358
378
  if (value === "")