@jmfederico/pi-web 1.202609.0 → 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 (196) 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/assets/index-AroYaCLx.js +4130 -0
  6. package/dist/client/assets/vendor-editor-core-YWog6mAR.js +10 -0
  7. package/dist/client/assets/vendor-editor-languages-DOCw3vc9.js +28 -0
  8. package/dist/client/index.html +4 -4
  9. package/dist/docker/piWebDockerCommandPlan.js +9 -1
  10. package/dist/docker/piWebDockerCommandPlan.js.map +1 -1
  11. package/dist/nativeServices/installedServiceDefinitions.js +24 -17
  12. package/dist/nativeServices/installedServiceDefinitions.js.map +1 -1
  13. package/dist/nativeServices/serviceAction.js +38 -26
  14. package/dist/nativeServices/serviceAction.js.map +1 -1
  15. package/dist/nativeServices/servicePlan.js +3 -3
  16. package/dist/nativeServices/servicePlan.js.map +1 -1
  17. package/dist/pi-packages/captains-log/README.md +11 -0
  18. package/dist/pi-packages/captains-log/dist/browser/channelProtocol.js +29 -0
  19. package/dist/pi-packages/captains-log/dist/browser/index.js +144 -0
  20. package/dist/pi-packages/captains-log/dist/browser/markdown.js +67 -0
  21. package/dist/pi-packages/captains-log/dist/browser/panel.js +105 -0
  22. package/dist/pi-packages/captains-log/dist/browser/protocol.js +26 -0
  23. package/dist/pi-packages/captains-log/dist/companion.js +126 -0
  24. package/dist/pi-packages/captains-log/dist/roundtrip.js +62 -0
  25. package/dist/pi-packages/captains-log/dist/server.js +210 -0
  26. package/dist/pi-packages/captains-log/dist/store.js +75 -0
  27. package/dist/pi-packages/captains-log/docs/usage.md +30 -0
  28. package/dist/pi-packages/captains-log/package.json +35 -0
  29. package/dist/pi-packages/captains-log/tsconfig.json +21 -0
  30. package/dist/pi-packages/captains-log/vite.config.mjs +28 -0
  31. package/dist/pi-packages/relays/pi-web-plugin.js +1 -1
  32. package/dist/pi-packages/relays/prompts/relay.md +1 -1
  33. package/dist/pi-packages/relays/skills/relay-runner/SKILL.md +21 -13
  34. package/dist/pi-web-plugins/files/browser/assets/files-icon-DZObYhxb.svg +3 -0
  35. package/dist/pi-web-plugins/files/browser/pi-web-plugin.js +439 -0
  36. package/dist/pi-web-plugins/files/package.json +15 -0
  37. package/dist/pi-web-plugins/git/browser/git-panel.js +54 -24
  38. package/dist/pi-web-plugins/git/browser/pi-web-plugin.js +1 -1
  39. package/dist/pi-web-plugins/git/git-backend.js +5 -5
  40. package/dist/pi-web-plugins/git/server-plugin.js +5 -3
  41. package/dist/pi-web-plugins/info/pi-web-plugin.js +1 -1
  42. package/dist/pi-web-plugins/mermaid/browser/mermaid-engine.js +3590 -0
  43. package/dist/pi-web-plugins/mermaid/browser/pi-web-plugin.js +6 -0
  44. package/dist/pi-web-plugins/mermaid/package.json +13 -0
  45. package/dist/pi-web-plugins/terminal/browser/pi-web-plugin.js +210 -0
  46. package/dist/pi-web-plugins/terminal/package.json +16 -0
  47. package/dist/pi-web-plugins/terminal/server-plugin.js +365 -0
  48. package/dist/{server/terminals → pi-web-plugins/terminal}/terminalService.js +159 -79
  49. package/dist/pi-web-plugins/updates/pi-web-plugin.js +1 -1
  50. package/dist/pi-web-plugins/workspace-tasks/pi-web-plugin.js +1 -1
  51. package/dist/piWebVersionReport.js +12 -4
  52. package/dist/piWebVersionReport.js.map +1 -1
  53. package/dist/plugin-api.d.ts +222 -23
  54. package/dist/plugin-api.js +1 -0
  55. package/dist/pluginRecoveryCli.js +3 -2
  56. package/dist/pluginRecoveryCli.js.map +1 -1
  57. package/dist/server/activity/workspaceActivityService.js.map +1 -1
  58. package/dist/server/app.js +20 -9
  59. package/dist/server/app.js.map +1 -1
  60. package/dist/server/knownPiPackages.js +12 -0
  61. package/dist/server/knownPiPackages.js.map +1 -0
  62. package/dist/server/machines/machineClient.js +2 -2
  63. package/dist/server/machines/machineClient.js.map +1 -1
  64. package/dist/server/machines/machinePluginProxyRoutes.js +53 -11
  65. package/dist/server/machines/machinePluginProxyRoutes.js.map +1 -1
  66. package/dist/server/machines/machineProxyRoutes.js +70 -7
  67. package/dist/server/machines/machineProxyRoutes.js.map +1 -1
  68. package/dist/server/notices/serverNoticeStore.js +45 -4
  69. package/dist/server/notices/serverNoticeStore.js.map +1 -1
  70. package/dist/server/piPackageService.js +5 -5
  71. package/dist/server/piPackageService.js.map +1 -1
  72. package/dist/server/piWebPluginCatalog.js +46 -12
  73. package/dist/server/piWebPluginCatalog.js.map +1 -1
  74. package/dist/server/piWebPluginLifecycle.js +26 -3
  75. package/dist/server/piWebPluginLifecycle.js.map +1 -1
  76. package/dist/server/piWebPluginService.js +37 -2
  77. package/dist/server/piWebPluginService.js.map +1 -1
  78. package/dist/server/pluginCallbackDrain.js +35 -0
  79. package/dist/server/pluginCallbackDrain.js.map +1 -0
  80. package/dist/server/plugins/pluginBackendChannelProxyAdmission.js +84 -0
  81. package/dist/server/plugins/pluginBackendChannelProxyAdmission.js.map +1 -0
  82. package/dist/server/plugins/pluginBackendChannelProxyCoordinator.js +234 -0
  83. package/dist/server/plugins/pluginBackendChannelProxyCoordinator.js.map +1 -0
  84. package/dist/server/plugins/pluginBackendChannelProxyRoutes.js +52 -0
  85. package/dist/server/plugins/pluginBackendChannelProxyRoutes.js.map +1 -0
  86. package/dist/server/plugins/pluginBackendProxyRoutes.js +38 -31
  87. package/dist/server/plugins/pluginBackendProxyRoutes.js.map +1 -1
  88. package/dist/server/plugins/pluginBackendRegistry.js +740 -0
  89. package/dist/server/plugins/pluginBackendRegistry.js.map +1 -0
  90. package/dist/server/plugins/serverPluginPiSessionEventsCapability.js +34 -0
  91. package/dist/server/plugins/serverPluginPiSessionEventsCapability.js.map +1 -0
  92. package/dist/server/plugins/serverPluginPiSessionsCapability.js +185 -0
  93. package/dist/server/plugins/serverPluginPiSessionsCapability.js.map +1 -0
  94. package/dist/server/plugins/serverPluginRuntime.js +1028 -107
  95. package/dist/server/plugins/serverPluginRuntime.js.map +1 -1
  96. package/dist/server/plugins/serverPluginWorkspacesCapability.js +114 -0
  97. package/dist/server/plugins/serverPluginWorkspacesCapability.js.map +1 -0
  98. package/dist/server/sessiond/pluginBackendChannelRoutes.js +393 -0
  99. package/dist/server/sessiond/pluginBackendChannelRoutes.js.map +1 -0
  100. package/dist/server/sessiond/pluginBackendRoutes.js +10 -7
  101. package/dist/server/sessiond/pluginBackendRoutes.js.map +1 -1
  102. package/dist/server/sessiond/sessionDaemonShutdown.js +9 -2
  103. package/dist/server/sessiond/sessionDaemonShutdown.js.map +1 -1
  104. package/dist/server/sessiond.js +71 -21
  105. package/dist/server/sessiond.js.map +1 -1
  106. package/dist/server/sessions/builtinCommands.js +2 -2
  107. package/dist/server/sessions/builtinCommands.js.map +1 -1
  108. package/dist/server/sessions/clientSessionPreview.js +14 -0
  109. package/dist/server/sessions/clientSessionPreview.js.map +1 -0
  110. package/dist/server/sessions/piSessionEventConnections.js +65 -0
  111. package/dist/server/sessions/piSessionEventConnections.js.map +1 -0
  112. package/dist/server/sessions/piSessionService.js +269 -86
  113. package/dist/server/sessions/piSessionService.js.map +1 -1
  114. package/dist/server/sessions/sessionActivityMarker.js +105 -0
  115. package/dist/server/sessions/sessionActivityMarker.js.map +1 -0
  116. package/dist/server/sessions/sessionEnvironmentFacts.js +5 -4
  117. package/dist/server/sessions/sessionEnvironmentFacts.js.map +1 -1
  118. package/dist/server/sessions/sessionNameGenerator.js +3 -2
  119. package/dist/server/sessions/sessionNameGenerator.js.map +1 -1
  120. package/dist/server/sessions/sessionRoutes.js +18 -0
  121. package/dist/server/sessions/sessionRoutes.js.map +1 -1
  122. package/dist/server/sessions/spawnSessionTool.js +1 -1
  123. package/dist/server/sessions/spawnSessionTool.js.map +1 -1
  124. package/dist/server/sessions/spawnSubsessionTool.js +1 -1
  125. package/dist/server/sessions/spawnSubsessionTool.js.map +1 -1
  126. package/dist/server/sessions/transcriptMessages.js +54 -0
  127. package/dist/server/sessions/transcriptMessages.js.map +1 -0
  128. package/dist/server/terminals/requiredTerminalService.js +103 -0
  129. package/dist/server/terminals/requiredTerminalService.js.map +1 -0
  130. package/dist/server/webSocketBridge.js +339 -0
  131. package/dist/server/webSocketBridge.js.map +1 -1
  132. package/dist/server/workspaces/sessionDaemonWorkspaceCatalog.js +23 -3
  133. package/dist/server/workspaces/sessionDaemonWorkspaceCatalog.js.map +1 -1
  134. package/dist/server/workspaces/workspaceCatalog.js +3 -1
  135. package/dist/server/workspaces/workspaceCatalog.js.map +1 -1
  136. package/dist/server/workspaces/workspaceProviderRegistry.js +64 -149
  137. package/dist/server/workspaces/workspaceProviderRegistry.js.map +1 -1
  138. package/dist/server/workspaces/workspaceRemovalService.js +23 -1
  139. package/dist/server/workspaces/workspaceRemovalService.js.map +1 -1
  140. package/dist/server-plugin-api.d.ts +216 -22
  141. package/dist/server-plugin-api.js +319 -2
  142. package/dist/server-plugin-api.js.map +1 -1
  143. package/dist/serverPluginRecovery.js +4 -0
  144. package/dist/serverPluginRecovery.js.map +1 -1
  145. package/dist/sessiond/sessionDaemonClient.js +3 -3
  146. package/dist/sessiond/sessionDaemonClient.js.map +1 -1
  147. package/dist/shared/apiTypes.js +1 -1
  148. package/dist/shared/apiTypes.js.map +1 -1
  149. package/dist/shared/federatedRoutes.js +45 -17
  150. package/dist/shared/federatedRoutes.js.map +1 -1
  151. package/dist/shared/machinePluginIds.js +28 -7
  152. package/dist/shared/machinePluginIds.js.map +1 -1
  153. package/dist/shared/pluginApiTypes.d.ts +21 -1
  154. package/dist/shared/pluginApiTypes.js +0 -1
  155. package/dist/shared/pluginBackendProtocol.js +163 -2
  156. package/dist/shared/pluginBackendProtocol.js.map +1 -1
  157. package/dist/shared/pluginIds.js +8 -1
  158. package/dist/shared/pluginIds.js.map +1 -1
  159. package/dist/shared/requiredTerminalPlugin.js +6 -0
  160. package/dist/shared/requiredTerminalPlugin.js.map +1 -0
  161. package/dist/shared/serverNoticeContract.js +88 -0
  162. package/dist/shared/serverNoticeContract.js.map +1 -0
  163. package/dist/shared/sessionDefaults.js +41 -0
  164. package/dist/shared/sessionDefaults.js.map +1 -0
  165. package/docs/config.md +50 -36
  166. package/docs/plugins.md +146 -1217
  167. package/examples/session-bridge-plugin/README.md +20 -0
  168. package/examples/session-bridge-plugin/docs/usage.md +54 -0
  169. package/examples/session-bridge-plugin/package.json +26 -0
  170. package/examples/session-bridge-plugin/src/browser/index.ts +84 -0
  171. package/examples/session-bridge-plugin/src/browser/protocol.ts +24 -0
  172. package/examples/session-bridge-plugin/src/companion.ts +65 -0
  173. package/examples/session-bridge-plugin/src/reviewRun.ts +39 -0
  174. package/examples/session-bridge-plugin/src/server.ts +85 -0
  175. package/examples/session-bridge-plugin/src/store.ts +57 -0
  176. package/examples/session-bridge-plugin/tsconfig.json +21 -0
  177. package/examples/workspace-provider-plugin/README.md +4 -4
  178. package/examples/workspace-provider-plugin/package.json +1 -1
  179. package/examples/workspace-provider-plugin/src/browser/index.ts +9 -9
  180. package/examples/workspace-provider-plugin/src/server.ts +15 -11
  181. package/package.json +17 -11
  182. package/dist/client/assets/CodeViewer-CGAlg9S8.js +0 -4
  183. package/dist/client/assets/TerminalPanel-xhJRhOas.js +0 -187
  184. package/dist/client/assets/index-DXQKhn1P.js +0 -4326
  185. package/dist/client/assets/vendor-editor-core-CXO8gGab.js +0 -12
  186. package/dist/client/assets/vendor-editor-languages-CpW4sJsX.js +0 -46
  187. package/dist/client/assets/vendor-editor-legacy-CYBnW6ZU.js +0 -1
  188. package/dist/client/assets/vendor-terminal-BrP-ENHg.css +0 -1
  189. package/dist/client/assets/vendor-terminal-D8k4UKM2.js +0 -35
  190. package/dist/server/terminalProxyRoutes.js +0 -141
  191. package/dist/server/terminalProxyRoutes.js.map +0 -1
  192. package/dist/server/terminals/terminalRoutes.js +0 -155
  193. package/dist/server/terminals/terminalRoutes.js.map +0 -1
  194. package/dist/server/terminals/terminalService.js.map +0 -1
  195. package/dist/server/terminals/terminalSize.js +0 -17
  196. package/dist/server/terminals/terminalSize.js.map +0 -1
@@ -0,0 +1,393 @@
1
+ import { isPiWebPluginId } from "../../shared/pluginIds.js";
2
+ import { PAIRED_PLUGIN_BACKEND_CHANNEL_ROUTE_PATH, parsePluginBackendChannelClientEnvelope, PLUGIN_BACKEND_CHANNEL_DATA_FRAME_MAX_BYTES, PLUGIN_BACKEND_CHANNEL_DRAIN_TIMEOUT_MS, PLUGIN_BACKEND_CHANNEL_ERROR_MESSAGE_MAX_BYTES, PLUGIN_BACKEND_CHANNEL_OPEN_FRAME_MAX_BYTES, PLUGIN_BACKEND_CHANNEL_OPEN_TIMEOUT_MS, 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, requirePluginBackendOperation, serializePluginBackendChannelDataEnvelope, serializePluginBackendChannelErrorEnvelope, serializePluginBackendChannelReadyEnvelope, utf8ByteLength, } from "../../shared/pluginBackendProtocol.js";
3
+ import { PluginBackendChannelError, } from "../plugins/pluginBackendRegistry.js";
4
+ import { closePluginBackendChannelWebSocket, createBoundedTextWebSocketSender, markPluginBackendChannelUpgradeRequest, setPluginBackendChannelSocketPayloadLimit, } from "../webSocketBridge.js";
5
+ /** Sessiond-owned endpoint for one scoped, revision-paired plugin channel. */
6
+ export function registerPluginBackendChannelRoutes(app, dependencies, prefix = "") {
7
+ app.get(`${prefix}${PAIRED_PLUGIN_BACKEND_CHANNEL_ROUTE_PATH}`, {
8
+ websocket: true,
9
+ onRequest(request, _reply, done) {
10
+ markPluginBackendChannelUpgradeRequest(request.raw);
11
+ done();
12
+ },
13
+ }, (socket, request) => {
14
+ const controller = new PluginBackendChannelSocketController(socket, request.params, dependencies, app.log);
15
+ controller.start();
16
+ });
17
+ }
18
+ class PluginBackendChannelSocketController {
19
+ constructor(socket, params, dependencies, logger) {
20
+ this.socket = socket;
21
+ this.params = params;
22
+ this.dependencies = dependencies;
23
+ this.logger = logger;
24
+ this.lifetime = new AbortController();
25
+ this.state = "awaiting-open";
26
+ this.incoming = [];
27
+ this.incomingBytes = 0;
28
+ this.writer = new ChannelRouteWriter(socket, (error) => {
29
+ void this.fail("queue-overflow", boundedErrorMessage(error), 1013);
30
+ });
31
+ this.handshakeTimer = setTimeout(() => {
32
+ void this.fail("open-timeout", "Plugin backend channel open handshake timed out", 1011);
33
+ }, PLUGIN_BACKEND_CHANNEL_OPEN_TIMEOUT_MS);
34
+ this.handshakeTimer.unref();
35
+ }
36
+ start() {
37
+ try {
38
+ setPluginBackendChannelSocketPayloadLimit(this.socket, PLUGIN_BACKEND_CHANNEL_OPEN_FRAME_MAX_BYTES);
39
+ }
40
+ catch (error) {
41
+ void this.fail("transport-limit-unavailable", boundedErrorMessage(error), 1011);
42
+ return;
43
+ }
44
+ this.socket.on("message", (data, isBinary) => {
45
+ this.onMessage(data, isBinary);
46
+ });
47
+ this.socket.once("close", (code, reason) => {
48
+ void this.onClosed(code, decodeCloseReason(reason));
49
+ });
50
+ this.socket.once("error", (error) => {
51
+ void this.fail("transport-error", `Plugin backend channel transport failed: ${boundedErrorMessage(error)}`, 1011);
52
+ });
53
+ try {
54
+ if (!isPiWebPluginId(this.params.pluginId))
55
+ throw new Error(`Invalid PI WEB plugin id: ${this.params.pluginId}`);
56
+ this.params.operation = requirePluginBackendOperation(this.params.operation);
57
+ if (this.params.projectId === "")
58
+ throw new Error("Project id is required");
59
+ if (this.params.workspaceId === "")
60
+ throw new Error("Workspace id is required");
61
+ this.admission = this.dependencies.backends.reserveChannel({
62
+ pluginId: this.params.pluginId,
63
+ projectId: this.params.projectId,
64
+ workspaceId: this.params.workspaceId,
65
+ });
66
+ this.admission.signal.addEventListener("abort", () => {
67
+ void this.fail("shutdown", "Plugin backend channels are shutting down", 1012);
68
+ }, { once: true });
69
+ }
70
+ catch (error) {
71
+ if (error instanceof PluginBackendChannelError) {
72
+ void this.fail(error.code, error.message, error.closeCode);
73
+ }
74
+ else {
75
+ void this.fail("invalid-request", boundedErrorMessage(error), 1008);
76
+ }
77
+ }
78
+ }
79
+ onMessage(data, isBinary) {
80
+ if (this.state === "closed")
81
+ return;
82
+ if (isBinary) {
83
+ void this.fail("binary-frame", "Plugin backend channels accept text JSON frames only", 1003);
84
+ return;
85
+ }
86
+ let text;
87
+ let envelope;
88
+ try {
89
+ text = decodeTextFrame(data);
90
+ envelope = parsePluginBackendChannelClientEnvelope(text);
91
+ }
92
+ catch (error) {
93
+ void this.fail("invalid-frame", boundedErrorMessage(error), 1008);
94
+ return;
95
+ }
96
+ if (this.state === "awaiting-open") {
97
+ if (envelope.kind !== "open") {
98
+ void this.fail("open-required", "The first plugin backend channel frame must be an open envelope", 1008);
99
+ return;
100
+ }
101
+ this.state = "opening";
102
+ setPluginBackendChannelSocketPayloadLimit(this.socket, PLUGIN_BACKEND_CHANNEL_DATA_FRAME_MAX_BYTES);
103
+ void this.open(envelope.revision, envelope.input);
104
+ return;
105
+ }
106
+ if (this.state !== "ready" || envelope.kind !== "data") {
107
+ void this.fail("unexpected-frame", "Plugin backend channel data is allowed only after the ready envelope", 1008);
108
+ return;
109
+ }
110
+ this.enqueueIncoming(envelope.data, utf8ByteLength(text));
111
+ }
112
+ async open(revision, input) {
113
+ try {
114
+ const project = await this.dependencies.projects.requireProject(this.params.projectId);
115
+ const session = await this.dependencies.backends.openChannel({
116
+ pluginId: this.params.pluginId,
117
+ moduleRevision: revision,
118
+ project,
119
+ workspaceId: this.params.workspaceId,
120
+ operation: this.params.operation,
121
+ input,
122
+ }, this.writer, this.lifetime.signal, this.admission);
123
+ this.session = session;
124
+ if (this.state === "closed") {
125
+ await session.close(1001, "Browser disconnected during channel open");
126
+ return;
127
+ }
128
+ clearTimeout(this.handshakeTimer);
129
+ this.state = "ready";
130
+ this.writer.ready();
131
+ }
132
+ catch (error) {
133
+ if (this.state === "closed")
134
+ return;
135
+ if (error instanceof PluginBackendChannelError) {
136
+ await this.fail(error.code, error.message, error.closeCode);
137
+ return;
138
+ }
139
+ const projectMissing = error instanceof Error && error.message === "Project not found";
140
+ await this.fail(projectMissing ? "project-not-found" : "open-failed", projectMissing ? "Project not found" : `Plugin backend channel failed to open: ${boundedErrorMessage(error)}`, projectMissing ? 1008 : 1011);
141
+ }
142
+ }
143
+ enqueueIncoming(data, bytes) {
144
+ if (this.incoming.length >= PLUGIN_BACKEND_CHANNEL_QUEUE_MAX_FRAMES || this.incomingBytes + bytes > PLUGIN_BACKEND_CHANNEL_QUEUE_MAX_BYTES) {
145
+ void this.fail("queue-overflow", "Plugin backend channel browser queue limit was exceeded", 1013);
146
+ return;
147
+ }
148
+ this.incoming.push({ data, bytes });
149
+ this.incomingBytes += bytes;
150
+ this.startIncomingDrain();
151
+ }
152
+ startIncomingDrain() {
153
+ if (this.incomingDrainTask !== undefined)
154
+ return;
155
+ const task = this.drainIncoming();
156
+ this.incomingDrainTask = task;
157
+ const finish = (restart) => {
158
+ if (this.incomingDrainTask !== task)
159
+ return;
160
+ this.incomingDrainTask = undefined;
161
+ if (restart && this.incoming.length !== 0 && (this.state === "ready" || this.state === "draining-close")) {
162
+ this.startIncomingDrain();
163
+ }
164
+ };
165
+ void task.then(() => { finish(true); }, () => { finish(false); });
166
+ }
167
+ async drainIncoming() {
168
+ while (this.state === "ready" || this.state === "draining-close") {
169
+ const next = this.incoming[0];
170
+ if (next === undefined)
171
+ return;
172
+ try {
173
+ await this.session?.receive(next.data);
174
+ }
175
+ catch (error) {
176
+ if (this.state === "draining-close")
177
+ throw error;
178
+ if (error instanceof PluginBackendChannelError)
179
+ await this.fail(error.code, error.message, error.closeCode);
180
+ else
181
+ await this.fail("receive-failed", boundedErrorMessage(error), 1011);
182
+ return;
183
+ }
184
+ finally {
185
+ if (this.incoming[0] === next) {
186
+ this.incoming.shift();
187
+ this.incomingBytes -= next.bytes;
188
+ }
189
+ }
190
+ }
191
+ }
192
+ async awaitIncomingDrain() {
193
+ while (this.incoming.length !== 0 || this.incomingDrainTask !== undefined) {
194
+ this.startIncomingDrain();
195
+ const task = this.incomingDrainTask;
196
+ if (task !== undefined)
197
+ await task;
198
+ }
199
+ }
200
+ async fail(code, message, closeCode) {
201
+ if (this.state === "closed")
202
+ return;
203
+ this.state = "closed";
204
+ clearTimeout(this.handshakeTimer);
205
+ if (!this.lifetime.signal.aborted)
206
+ this.lifetime.abort(new Error(message));
207
+ this.writer.sendError(code, message);
208
+ this.incoming.length = 0;
209
+ this.incomingBytes = 0;
210
+ try {
211
+ await this.session?.close(closeCode, message);
212
+ }
213
+ catch (error) {
214
+ this.logger.error({ err: error, pluginId: this.params.pluginId, operation: this.params.operation }, "plugin backend channel cleanup failed after transport failure");
215
+ }
216
+ finally {
217
+ try {
218
+ await this.writer.close(closeCode, message, { terminateImmediately: this.admission === undefined });
219
+ }
220
+ finally {
221
+ this.admission?.release();
222
+ }
223
+ }
224
+ }
225
+ async onClosed(code, reason) {
226
+ if (this.state === "closed")
227
+ return;
228
+ clearTimeout(this.handshakeTimer);
229
+ let cleanupCode = code;
230
+ let cleanupReason = reason || "Browser disconnected";
231
+ if (code === 1000 && this.state === "ready") {
232
+ this.state = "draining-close";
233
+ try {
234
+ await withTimeout(this.awaitIncomingDrain(), PLUGIN_BACKEND_CHANNEL_DRAIN_TIMEOUT_MS, "Plugin backend channel accepted receive drain");
235
+ }
236
+ catch (error) {
237
+ cleanupCode = 1011;
238
+ cleanupReason = `Plugin backend channel accepted receive drain failed: ${boundedErrorMessage(error)}`;
239
+ this.logger.error({ err: error, pluginId: this.params.pluginId, operation: this.params.operation }, "plugin backend channel receive drain failed after clean disconnect");
240
+ }
241
+ }
242
+ if (this.channelIsClosed())
243
+ return;
244
+ this.state = "closed";
245
+ if (!this.lifetime.signal.aborted)
246
+ this.lifetime.abort(new DOMException(cleanupReason, "AbortError"));
247
+ this.incoming.length = 0;
248
+ this.incomingBytes = 0;
249
+ try {
250
+ await this.session?.close(cleanupCode, cleanupReason);
251
+ }
252
+ catch (error) {
253
+ this.logger.error({ err: error, pluginId: this.params.pluginId, operation: this.params.operation }, "plugin backend channel cleanup failed after disconnect");
254
+ }
255
+ finally {
256
+ this.admission?.release();
257
+ }
258
+ }
259
+ channelIsClosed() {
260
+ return this.state === "closed";
261
+ }
262
+ }
263
+ class ChannelRouteWriter {
264
+ constructor(socket, onFailure) {
265
+ this.socket = socket;
266
+ this.pending = [];
267
+ this.pendingBytes = 0;
268
+ this.isReady = false;
269
+ this.closing = false;
270
+ this.sender = createBoundedTextWebSocketSender(socket, {
271
+ maxBytes: PLUGIN_BACKEND_CHANNEL_SERVER_TO_BROWSER_QUEUE_MAX_BYTES,
272
+ onOverflow: onFailure,
273
+ });
274
+ }
275
+ send(data) {
276
+ const text = serializePluginBackendChannelDataEnvelope(data);
277
+ if (this.closing)
278
+ throw new Error("Plugin backend channel transport is closed");
279
+ if (this.isReady) {
280
+ this.sender(text);
281
+ return;
282
+ }
283
+ const bytes = utf8ByteLength(text);
284
+ const readyBytes = utf8ByteLength(serializePluginBackendChannelReadyEnvelope());
285
+ if (this.pending.length >= PLUGIN_BACKEND_CHANNEL_QUEUE_MAX_FRAMES - 1
286
+ || this.pendingBytes + bytes + readyBytes > PLUGIN_BACKEND_CHANNEL_SERVER_TO_BROWSER_QUEUE_MAX_BYTES) {
287
+ throw new Error("Plugin backend channel plugin queue limit was exceeded");
288
+ }
289
+ this.pending.push({ text, bytes });
290
+ this.pendingBytes += bytes;
291
+ }
292
+ sendError(code, message) {
293
+ if (this.closing)
294
+ return;
295
+ this.pending.length = 0;
296
+ this.pendingBytes = 0;
297
+ try {
298
+ this.sender(serializePluginBackendChannelErrorEnvelope(code, boundedChannelErrorMessage(message)));
299
+ }
300
+ catch {
301
+ // A closing or overflowing transport cannot carry another attributed envelope.
302
+ }
303
+ }
304
+ close(code, reason, options = {}) {
305
+ if (this.closePromise !== undefined)
306
+ return this.closePromise;
307
+ if (code === 1000)
308
+ this.ready();
309
+ this.closing = true;
310
+ this.closePromise = this.performClose(code, reason, options);
311
+ return this.closePromise;
312
+ }
313
+ async performClose(code, reason, options) {
314
+ if (code === 1000) {
315
+ try {
316
+ await this.sender.drain();
317
+ }
318
+ catch (error) {
319
+ await closePluginBackendChannelWebSocket(this.socket, 1011, `Plugin backend channel clean-close drain failed: ${boundedErrorMessage(error)}`);
320
+ throw error;
321
+ }
322
+ }
323
+ else {
324
+ try {
325
+ // Give the attributed error envelope a bounded chance to reach a
326
+ // cooperative peer without draining indefinitely on abnormal close.
327
+ await this.sender.drain(PLUGIN_BACKEND_CHANNEL_TEARDOWN_TIMEOUT_MS);
328
+ }
329
+ catch {
330
+ // Physical teardown below remains authoritative.
331
+ }
332
+ }
333
+ await closePluginBackendChannelWebSocket(this.socket, code, reason, options);
334
+ }
335
+ ready() {
336
+ if (this.closing || this.isReady)
337
+ return;
338
+ this.isReady = true;
339
+ this.sender(serializePluginBackendChannelReadyEnvelope());
340
+ for (const frame of this.pending)
341
+ this.sender(frame.text);
342
+ this.pending.length = 0;
343
+ this.pendingBytes = 0;
344
+ }
345
+ }
346
+ function decodeTextFrame(data) {
347
+ const bytes = typeof data === "string"
348
+ ? new TextEncoder().encode(data)
349
+ : data instanceof ArrayBuffer
350
+ ? new Uint8Array(data)
351
+ : Array.isArray(data)
352
+ ? Buffer.concat(data)
353
+ : data;
354
+ return new TextDecoder("utf-8", { fatal: true }).decode(bytes);
355
+ }
356
+ function decodeCloseReason(reason) {
357
+ try {
358
+ return new TextDecoder("utf-8", { fatal: true }).decode(reason);
359
+ }
360
+ catch {
361
+ return "Invalid close reason";
362
+ }
363
+ }
364
+ async function withTimeout(operation, timeoutMs, label) {
365
+ let timer;
366
+ const deadline = new Promise((_resolve, reject) => {
367
+ timer = setTimeout(() => { reject(new Error(`${label} timed out after ${String(timeoutMs)}ms`)); }, timeoutMs);
368
+ timer.unref();
369
+ });
370
+ try {
371
+ return await Promise.race([operation, deadline]);
372
+ }
373
+ finally {
374
+ if (timer !== undefined)
375
+ clearTimeout(timer);
376
+ }
377
+ }
378
+ function boundedChannelErrorMessage(value) {
379
+ if (utf8ByteLength(value) <= PLUGIN_BACKEND_CHANNEL_ERROR_MESSAGE_MAX_BYTES)
380
+ return value || "Plugin backend channel failed";
381
+ let output = "";
382
+ for (const character of value) {
383
+ if (utf8ByteLength(`${output}${character}`) > PLUGIN_BACKEND_CHANNEL_ERROR_MESSAGE_MAX_BYTES)
384
+ break;
385
+ output += character;
386
+ }
387
+ return output || "Plugin backend channel failed";
388
+ }
389
+ function boundedErrorMessage(error) {
390
+ const message = error instanceof Error ? error.message : String(error);
391
+ return boundedChannelErrorMessage(message);
392
+ }
393
+ //# sourceMappingURL=pluginBackendChannelRoutes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pluginBackendChannelRoutes.js","sourceRoot":"","sources":["../../../src/server/sessiond/pluginBackendChannelRoutes.ts"],"names":[],"mappings":"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"}
@@ -1,9 +1,10 @@
1
1
  import { isPiWebPluginId } from "../../shared/pluginIds.js";
2
- import { parsePluginBackendRequestEnvelope, PLUGIN_BACKEND_REQUEST_BODY_MAX_BYTES, PLUGIN_BACKEND_RESPONSE_JSON_MAX_BYTES, requirePluginBackendOperation, serializeBoundedPluginBackendJson, } from "../../shared/pluginBackendProtocol.js";
3
- import { WorkspaceProviderRequestError, } from "../workspaces/workspaceProviderRegistry.js";
4
- /** JSON-only sessiond boundary for the active owner of one current workspace. */
5
- export function registerPluginBackendRoutes(app, dependencies, prefix = "/plugin-backends") {
6
- app.post(`${prefix}/:pluginId/projects/:projectId/workspaces/:workspaceId/:operation`, { bodyLimit: PLUGIN_BACKEND_REQUEST_BODY_MAX_BYTES }, async (request, reply) => {
2
+ import { PAIRED_PLUGIN_BACKEND_REQUEST_ROUTE_PATH, parsePluginBackendRequestEnvelope, PLUGIN_BACKEND_REQUEST_BODY_MAX_BYTES, PLUGIN_BACKEND_RESPONSE_JSON_MAX_BYTES, requirePluginBackendOperation, serializeBoundedPluginBackendJson, } from "../../shared/pluginBackendProtocol.js";
3
+ import { requestCancellation } from "../requestCancellation.js";
4
+ import { PluginBackendRequestError, } from "../plugins/pluginBackendRegistry.js";
5
+ /** JSON-only sessiond boundary for one revision-paired package and current workspace. */
6
+ export function registerPairedPluginBackendRoutes(app, dependencies) {
7
+ app.post(PAIRED_PLUGIN_BACKEND_REQUEST_ROUTE_PATH, { bodyLimit: PLUGIN_BACKEND_REQUEST_BODY_MAX_BYTES }, async (request, reply) => {
7
8
  const { pluginId, projectId, workspaceId } = request.params;
8
9
  let operation = request.params.operation;
9
10
  let envelope;
@@ -28,6 +29,7 @@ export function registerPluginBackendRoutes(app, dependencies, prefix = "/plugin
28
29
  const message = boundedErrorMessage(error);
29
30
  return attributedError(reply, message === "Project not found" ? 404 : 500, message, message === "Project not found" ? "project-not-found" : "project-resolution-failed", pluginId, operation);
30
31
  }
32
+ const cancellation = requestCancellation(request, reply);
31
33
  try {
32
34
  const result = await dependencies.backends.request({
33
35
  pluginId,
@@ -36,7 +38,7 @@ export function registerPluginBackendRoutes(app, dependencies, prefix = "/plugin
36
38
  workspaceId,
37
39
  operation,
38
40
  input: envelope.input,
39
- });
41
+ }, cancellation.signal);
40
42
  const serialized = serializeBoundedPluginBackendJson(result, `Server plugin ${pluginId} operation ${operation} result`, PLUGIN_BACKEND_RESPONSE_JSON_MAX_BYTES);
41
43
  return await reply.type("application/json; charset=utf-8").send(serialized);
42
44
  }
@@ -45,11 +47,12 @@ export function registerPluginBackendRoutes(app, dependencies, prefix = "/plugin
45
47
  }
46
48
  finally {
47
49
  dependencies.onWorkspacesMutated();
50
+ cancellation.dispose();
48
51
  }
49
52
  });
50
53
  }
51
54
  function pluginBackendRequestFailed(reply, error, pluginId, operation) {
52
- if (error instanceof WorkspaceProviderRequestError) {
55
+ if (error instanceof PluginBackendRequestError) {
53
56
  return attributedError(reply, error.statusCode, error.message, error.code, pluginId, operation);
54
57
  }
55
58
  return attributedError(reply, 502, `Plugin backend request failed: ${boundedErrorMessage(error)}`, "request-failed", pluginId, operation);
@@ -1 +1 @@
1
- {"version":3,"file":"pluginBackendRoutes.js","sourceRoot":"","sources":["../../../src/server/sessiond/pluginBackendRoutes.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"pluginBackendRoutes.js","sourceRoot":"","sources":["../../../src/server/sessiond/pluginBackendRoutes.ts"],"names":[],"mappings":"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"}
@@ -3,11 +3,18 @@ export async function runSessionDaemonShutdown(options) {
3
3
  const { dependencies } = options;
4
4
  const operations = [
5
5
  ["quiesce server", () => dependencies.quiesceServer()],
6
- ["dispose terminals", () => dependencies.terminals.dispose()],
6
+ // Revoke plugin-owned admission as soon as host ingress is closed.
7
+ // beginShutdown retains publications while admitted contribution callbacks
8
+ // and host-owned resources observe cancellation and drain below.
9
+ ["cancel server plugin lifetimes", () => dependencies.serverPlugins.beginShutdown()],
7
10
  ["dispose catalog refresher", () => dependencies.catalogRefresher.dispose()],
11
+ ["close workspace removal work", () => dependencies.workspaceRemovals.closeAll()],
12
+ ["close plugin backend work", () => dependencies.pluginBackends.closeAll()],
13
+ ["close workspace provider work", () => dependencies.workspaceProviders.closeAll()],
14
+ // Plugin capability cleanup must finish while its host-owned sessions remain available.
15
+ ["stop server plugins", () => dependencies.serverPlugins.stop()],
8
16
  ["dispose sessions", () => dependencies.sessions.dispose()],
9
17
  ["close server", () => dependencies.closeServer()],
10
- ["stop server plugins", () => dependencies.serverPlugins.stop()],
11
18
  ["dispose auth", () => dependencies.auth.dispose()],
12
19
  ["flush session unread state", () => dependencies.unreadStore.flush()],
13
20
  ];
@@ -1 +1 @@
1
- {"version":3,"file":"sessionDaemonShutdown.js","sourceRoot":"","sources":["../../../src/server/sessiond/sessionDaemonShutdown.ts"],"names":[],"mappings":"AAqBA,+FAA+F;AAC/F,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAAC,OAAqC;IAClF,MAAM,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC;IACjC,MAAM,UAAU,GAA+D;QAC7E,CAAC,gBAAgB,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,aAAa,EAAE,CAAC;QACtD,CAAC,mBAAmB,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;QAC7D,CAAC,2BAA2B,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC;QAC5E,CAAC,kBAAkB,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;QAC3D,CAAC,cAAc,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,WAAW,EAAE,CAAC;QAClD,CAAC,qBAAqB,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;QAChE,CAAC,cAAc,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;QACnD,CAAC,4BAA4B,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;KACvE,CAAC;IAEF,KAAK,MAAM,CAAC,SAAS,EAAE,GAAG,CAAC,IAAI,UAAU,EAAE,CAAC;QAC1C,IAAI,CAAC;YACH,MAAM,GAAG,EAAE,CAAC;QACd,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC;YACtB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,0CAA0C,CAAC,CAAC;QAC9F,CAAC;IACH,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"sessionDaemonShutdown.js","sourceRoot":"","sources":["../../../src/server/sessiond/sessionDaemonShutdown.ts"],"names":[],"mappings":"AA0BA,+FAA+F;AAC/F,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAAC,OAAqC;IAClF,MAAM,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC;IACjC,MAAM,UAAU,GAA+D;QAC7E,CAAC,gBAAgB,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,aAAa,EAAE,CAAC;QACtD,mEAAmE;QACnE,2EAA2E;QAC3E,iEAAiE;QACjE,CAAC,gCAAgC,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,aAAa,CAAC,aAAa,EAAE,CAAC;QACpF,CAAC,2BAA2B,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC;QAC5E,CAAC,8BAA8B,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,iBAAiB,CAAC,QAAQ,EAAE,CAAC;QACjF,CAAC,2BAA2B,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,cAAc,CAAC,QAAQ,EAAE,CAAC;QAC3E,CAAC,+BAA+B,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,kBAAkB,CAAC,QAAQ,EAAE,CAAC;QACnF,wFAAwF;QACxF,CAAC,qBAAqB,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;QAChE,CAAC,kBAAkB,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;QAC3D,CAAC,cAAc,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,WAAW,EAAE,CAAC;QAClD,CAAC,cAAc,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;QACnD,CAAC,4BAA4B,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;KACvE,CAAC;IAEF,KAAK,MAAM,CAAC,SAAS,EAAE,GAAG,CAAC,IAAI,UAAU,EAAE,CAAC;QAC1C,IAAI,CAAC;YACH,MAAM,GAAG,EAAE,CAAC;QACd,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC;YACtB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,0CAA0C,CAAC,CAAC;QAC9F,CAAC;IACH,CAAC;AACH,CAAC"}