@theruansilva/omp-web 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (280) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +181 -0
  3. package/dist/cli/doctor.js +118 -0
  4. package/dist/cli/doctor.js.map +1 -0
  5. package/dist/cli/serviceTemplates.js +55 -0
  6. package/dist/cli/serviceTemplates.js.map +1 -0
  7. package/dist/cli/types.js +2 -0
  8. package/dist/cli/types.js.map +1 -0
  9. package/dist/cli.js +872 -0
  10. package/dist/cli.js.map +1 -0
  11. package/dist/client/assets/CodeViewer-CJNBz-Ox.js +4 -0
  12. package/dist/client/assets/TerminalPanel-B9-LUv7E.js +126 -0
  13. package/dist/client/assets/UnifiedDiffViewer-BUqme4se.js +34 -0
  14. package/dist/client/assets/index-DGBYb2j9.css +1 -0
  15. package/dist/client/assets/index-uWm_YNRB.js +4427 -0
  16. package/dist/client/assets/vendor-editor-core-D9EJm1dE.js +10 -0
  17. package/dist/client/assets/vendor-editor-languages-N6dcxgRO.js +26 -0
  18. package/dist/client/assets/vendor-terminal-DDGTF8rc.css +1 -0
  19. package/dist/client/assets/vendor-terminal-DjQ08hXu.js +16 -0
  20. package/dist/client/favicon-16x16.png +0 -0
  21. package/dist/client/favicon-180x180.png +0 -0
  22. package/dist/client/favicon-192x192.png +0 -0
  23. package/dist/client/favicon-32x32.png +0 -0
  24. package/dist/client/favicon-512x512.png +0 -0
  25. package/dist/client/favicon.ico +0 -0
  26. package/dist/client/favicon.png +0 -0
  27. package/dist/client/favicon.svg +11 -0
  28. package/dist/client/index.html +68 -0
  29. package/dist/client/manifest.webmanifest +36 -0
  30. package/dist/client-react/assets/index-BQ6zLLfz.js +51 -0
  31. package/dist/client-react/assets/index-Befs78HG.css +1 -0
  32. package/dist/client-react/index.html +16 -0
  33. package/dist/config.js +272 -0
  34. package/dist/config.js.map +1 -0
  35. package/dist/docker/ompWebDockerCommandPlan.js +211 -0
  36. package/dist/docker/ompWebDockerCommandPlan.js.map +1 -0
  37. package/dist/docker/piWebDockerCommandPlan.js +211 -0
  38. package/dist/docker/piWebDockerCommandPlan.js.map +1 -0
  39. package/dist/omp-web-plugins/info/omp-web-plugin.js +51 -0
  40. package/dist/omp-web-plugins/info/package.json +9 -0
  41. package/dist/omp-web-plugins/schedule-prompts/omp-web-plugin.js +43 -0
  42. package/dist/omp-web-plugins/schedule-prompts/package.json +9 -0
  43. package/dist/omp-web-plugins/schedule-prompts/schedulePromptsPanelElement.js +242 -0
  44. package/dist/omp-web-plugins/schedule-prompts/types.js +2 -0
  45. package/dist/omp-web-plugins/updates/omp-web-plugin.js +173 -0
  46. package/dist/omp-web-plugins/updates/package.json +9 -0
  47. package/dist/omp-web-plugins/updates/updatesLogic.js +97 -0
  48. package/dist/ompWebVersionReport.js +217 -0
  49. package/dist/ompWebVersionReport.js.map +1 -0
  50. package/dist/pi-web-plugins/info/package.json +9 -0
  51. package/dist/pi-web-plugins/info/pi-web-plugin.js +51 -0
  52. package/dist/pi-web-plugins/schedule-prompts/package.json +9 -0
  53. package/dist/pi-web-plugins/schedule-prompts/pi-web-plugin.js +43 -0
  54. package/dist/pi-web-plugins/schedule-prompts/schedulePromptsPanelElement.js +226 -0
  55. package/dist/pi-web-plugins/schedule-prompts/types.js +2 -0
  56. package/dist/pi-web-plugins/updates/package.json +9 -0
  57. package/dist/pi-web-plugins/updates/pi-web-plugin.js +173 -0
  58. package/dist/pi-web-plugins/updates/updatesLogic.js +97 -0
  59. package/dist/piWebVersionReport.js +225 -0
  60. package/dist/piWebVersionReport.js.map +1 -0
  61. package/dist/plugin-api/unstable.d.ts +22 -0
  62. package/dist/plugin-api.d.ts +197 -0
  63. package/dist/server/activity/workspaceActivityRoutes.js +4 -0
  64. package/dist/server/activity/workspaceActivityRoutes.js.map +1 -0
  65. package/dist/server/activity/workspaceActivityService.js +98 -0
  66. package/dist/server/activity/workspaceActivityService.js.map +1 -0
  67. package/dist/server/app.js +217 -0
  68. package/dist/server/app.js.map +1 -0
  69. package/dist/server/configRoutes.js +278 -0
  70. package/dist/server/configRoutes.js.map +1 -0
  71. package/dist/server/diagnostics/nodePtySpawnHelper.js +130 -0
  72. package/dist/server/diagnostics/nodePtySpawnHelper.js.map +1 -0
  73. package/dist/server/git/gitEnv.js +15 -0
  74. package/dist/server/git/gitEnv.js.map +1 -0
  75. package/dist/server/git/gitService.js +119 -0
  76. package/dist/server/git/gitService.js.map +1 -0
  77. package/dist/server/gitRoutes.js +29 -0
  78. package/dist/server/gitRoutes.js.map +1 -0
  79. package/dist/server/index.js +16 -0
  80. package/dist/server/index.js.map +1 -0
  81. package/dist/server/machines/machineClient.js +162 -0
  82. package/dist/server/machines/machineClient.js.map +1 -0
  83. package/dist/server/machines/machinePluginProxyRoutes.js +151 -0
  84. package/dist/server/machines/machinePluginProxyRoutes.js.map +1 -0
  85. package/dist/server/machines/machineProxyRoutes.js +152 -0
  86. package/dist/server/machines/machineProxyRoutes.js.map +1 -0
  87. package/dist/server/machines/machineRoutes.js +61 -0
  88. package/dist/server/machines/machineRoutes.js.map +1 -0
  89. package/dist/server/machines/machineService.js +230 -0
  90. package/dist/server/machines/machineService.js.map +1 -0
  91. package/dist/server/machines/machineStore.js +123 -0
  92. package/dist/server/machines/machineStore.js.map +1 -0
  93. package/dist/server/machines/proxyUtils.js +39 -0
  94. package/dist/server/machines/proxyUtils.js.map +1 -0
  95. package/dist/server/ompWebPluginService.js +298 -0
  96. package/dist/server/ompWebPluginService.js.map +1 -0
  97. package/dist/server/ompWebStatus.js +604 -0
  98. package/dist/server/ompWebStatus.js.map +1 -0
  99. package/dist/server/ompWebStatusCache.js +31 -0
  100. package/dist/server/ompWebStatusCache.js.map +1 -0
  101. package/dist/server/piPackageRoutes.js +85 -0
  102. package/dist/server/piPackageRoutes.js.map +1 -0
  103. package/dist/server/piPackageService.js +65 -0
  104. package/dist/server/piPackageService.js.map +1 -0
  105. package/dist/server/piWebPluginService.js +283 -0
  106. package/dist/server/piWebPluginService.js.map +1 -0
  107. package/dist/server/piWebStatus.js +602 -0
  108. package/dist/server/piWebStatus.js.map +1 -0
  109. package/dist/server/piWebStatusCache.js +32 -0
  110. package/dist/server/piWebStatusCache.js.map +1 -0
  111. package/dist/server/projects/directorySuggestions.js +37 -0
  112. package/dist/server/projects/directorySuggestions.js.map +1 -0
  113. package/dist/server/projects/projectService.js +31 -0
  114. package/dist/server/projects/projectService.js.map +1 -0
  115. package/dist/server/push/PushNotificationService.js +137 -0
  116. package/dist/server/push/PushNotificationService.js.map +1 -0
  117. package/dist/server/push/pushRoutes.js +50 -0
  118. package/dist/server/push/pushRoutes.js.map +1 -0
  119. package/dist/server/realtime/honoRealtimeSocket.js +32 -0
  120. package/dist/server/realtime/honoRealtimeSocket.js.map +1 -0
  121. package/dist/server/realtime/sessionEventHub.js +39 -0
  122. package/dist/server/realtime/sessionEventHub.js.map +1 -0
  123. package/dist/server/sessiond/sessionProxyRoutes.js +85 -0
  124. package/dist/server/sessiond/sessionProxyRoutes.js.map +1 -0
  125. package/dist/server/sessiond.js +104 -0
  126. package/dist/server/sessiond.js.map +1 -0
  127. package/dist/server/sessions/attachmentService.js +112 -0
  128. package/dist/server/sessions/attachmentService.js.map +1 -0
  129. package/dist/server/sessions/authProviderOptions.js +52 -0
  130. package/dist/server/sessions/authProviderOptions.js.map +1 -0
  131. package/dist/server/sessions/authRoutes.js +75 -0
  132. package/dist/server/sessions/authRoutes.js.map +1 -0
  133. package/dist/server/sessions/authService.js +105 -0
  134. package/dist/server/sessions/authService.js.map +1 -0
  135. package/dist/server/sessions/builtinCommands.js +31 -0
  136. package/dist/server/sessions/builtinCommands.js.map +1 -0
  137. package/dist/server/sessions/editPreview.js +196 -0
  138. package/dist/server/sessions/editPreview.js.map +1 -0
  139. package/dist/server/sessions/editTool.js +46 -0
  140. package/dist/server/sessions/editTool.js.map +1 -0
  141. package/dist/server/sessions/messagePaging.js +41 -0
  142. package/dist/server/sessions/messagePaging.js.map +1 -0
  143. package/dist/server/sessions/oauthLoginFlowService.js +136 -0
  144. package/dist/server/sessions/oauthLoginFlowService.js.map +1 -0
  145. package/dist/server/sessions/piAgentSession.js +472 -0
  146. package/dist/server/sessions/piAgentSession.js.map +1 -0
  147. package/dist/server/sessions/piSessionManagerGateway.js +133 -0
  148. package/dist/server/sessions/piSessionManagerGateway.js.map +1 -0
  149. package/dist/server/sessions/piSessionService.js +1737 -0
  150. package/dist/server/sessions/piSessionService.js.map +1 -0
  151. package/dist/server/sessions/schedulePrompt/schedulePromptService.js +46 -0
  152. package/dist/server/sessions/schedulePrompt/schedulePromptService.js.map +1 -0
  153. package/dist/server/sessions/schedulePrompt/scheduler.js +317 -0
  154. package/dist/server/sessions/schedulePrompt/scheduler.js.map +1 -0
  155. package/dist/server/sessions/schedulePrompt/storage.js +118 -0
  156. package/dist/server/sessions/schedulePrompt/storage.js.map +1 -0
  157. package/dist/server/sessions/schedulePrompt/tool.js +251 -0
  158. package/dist/server/sessions/schedulePrompt/tool.js.map +1 -0
  159. package/dist/server/sessions/schedulePrompt/types.js +2 -0
  160. package/dist/server/sessions/schedulePrompt/types.js.map +1 -0
  161. package/dist/server/sessions/sessionArchiveHelpers.js +186 -0
  162. package/dist/server/sessions/sessionArchiveHelpers.js.map +1 -0
  163. package/dist/server/sessions/sessionArchiveStore.js +254 -0
  164. package/dist/server/sessions/sessionArchiveStore.js.map +1 -0
  165. package/dist/server/sessions/sessionArchiveTree.js +35 -0
  166. package/dist/server/sessions/sessionArchiveTree.js.map +1 -0
  167. package/dist/server/sessions/sessionCleanup.js +157 -0
  168. package/dist/server/sessions/sessionCleanup.js.map +1 -0
  169. package/dist/server/sessions/sessionCommandService.js +349 -0
  170. package/dist/server/sessions/sessionCommandService.js.map +1 -0
  171. package/dist/server/sessions/sessionEventMapper.js +115 -0
  172. package/dist/server/sessions/sessionEventMapper.js.map +1 -0
  173. package/dist/server/sessions/sessionNameGenerator.js +61 -0
  174. package/dist/server/sessions/sessionNameGenerator.js.map +1 -0
  175. package/dist/server/sessions/sessionRoutes.js +419 -0
  176. package/dist/server/sessions/sessionRoutes.js.map +1 -0
  177. package/dist/server/sessions/sessionRuntimeStore.js +2 -0
  178. package/dist/server/sessions/sessionRuntimeStore.js.map +1 -0
  179. package/dist/server/sessions/spawnSessionTool.js +41 -0
  180. package/dist/server/sessions/spawnSessionTool.js.map +1 -0
  181. package/dist/server/sessions/spawnSubsessionTool.js +203 -0
  182. package/dist/server/sessions/spawnSubsessionTool.js.map +1 -0
  183. package/dist/server/sessions/spawnTargetResolver.js +36 -0
  184. package/dist/server/sessions/spawnTargetResolver.js.map +1 -0
  185. package/dist/server/sessions/subsessionLinks.js +171 -0
  186. package/dist/server/sessions/subsessionLinks.js.map +1 -0
  187. package/dist/server/sessions/subsessionTranscript.js +233 -0
  188. package/dist/server/sessions/subsessionTranscript.js.map +1 -0
  189. package/dist/server/storage/projectStore.js +83 -0
  190. package/dist/server/storage/projectStore.js.map +1 -0
  191. package/dist/server/terminalProxyRoutes.js +168 -0
  192. package/dist/server/terminalProxyRoutes.js.map +1 -0
  193. package/dist/server/terminals/terminalRoutes.js +177 -0
  194. package/dist/server/terminals/terminalRoutes.js.map +1 -0
  195. package/dist/server/terminals/terminalService.js +309 -0
  196. package/dist/server/terminals/terminalService.js.map +1 -0
  197. package/dist/server/terminals/terminalSize.js +17 -0
  198. package/dist/server/terminals/terminalSize.js.map +1 -0
  199. package/dist/server/testUtils.js +43 -0
  200. package/dist/server/testUtils.js.map +1 -0
  201. package/dist/server/types.js +2 -0
  202. package/dist/server/types.js.map +1 -0
  203. package/dist/server/utils.js +2 -0
  204. package/dist/server/utils.js.map +1 -0
  205. package/dist/server/webSocketBridge.js +55 -0
  206. package/dist/server/webSocketBridge.js.map +1 -0
  207. package/dist/server/workingDirectory.js +44 -0
  208. package/dist/server/workingDirectory.js.map +1 -0
  209. package/dist/server/workspaceExplorerRoutes.js +148 -0
  210. package/dist/server/workspaceExplorerRoutes.js.map +1 -0
  211. package/dist/server/workspaces/effectivePathAccess.js +27 -0
  212. package/dist/server/workspaces/effectivePathAccess.js.map +1 -0
  213. package/dist/server/workspaces/fileContentService.js +200 -0
  214. package/dist/server/workspaces/fileContentService.js.map +1 -0
  215. package/dist/server/workspaces/fileSuggestions.js +512 -0
  216. package/dist/server/workspaces/fileSuggestions.js.map +1 -0
  217. package/dist/server/workspaces/fileTreeService.js +27 -0
  218. package/dist/server/workspaces/fileTreeService.js.map +1 -0
  219. package/dist/server/workspaces/gitWorktreeDiscovery.js +34 -0
  220. package/dist/server/workspaces/gitWorktreeDiscovery.js.map +1 -0
  221. package/dist/server/workspaces/imagePreviewService.js +40 -0
  222. package/dist/server/workspaces/imagePreviewService.js.map +1 -0
  223. package/dist/server/workspaces/pathAccessPolicy.js +87 -0
  224. package/dist/server/workspaces/pathAccessPolicy.js.map +1 -0
  225. package/dist/server/workspaces/pathSafety.js +54 -0
  226. package/dist/server/workspaces/pathSafety.js.map +1 -0
  227. package/dist/server/workspaces/projectOmpWebConfig.js +56 -0
  228. package/dist/server/workspaces/projectOmpWebConfig.js.map +1 -0
  229. package/dist/server/workspaces/projectPiWebConfig.js +61 -0
  230. package/dist/server/workspaces/projectPiWebConfig.js.map +1 -0
  231. package/dist/server/workspaces/workspaceContext.js +8 -0
  232. package/dist/server/workspaces/workspaceContext.js.map +1 -0
  233. package/dist/server/workspaces/workspaceDeletionRoutes.js +113 -0
  234. package/dist/server/workspaces/workspaceDeletionRoutes.js.map +1 -0
  235. package/dist/server/workspaces/workspaceService.js +39 -0
  236. package/dist/server/workspaces/workspaceService.js.map +1 -0
  237. package/dist/sessiond/config.js +9 -0
  238. package/dist/sessiond/config.js.map +1 -0
  239. package/dist/sessiond/sessionDaemonClient.js +34 -0
  240. package/dist/sessiond/sessionDaemonClient.js.map +1 -0
  241. package/dist/shared/activity.js +26 -0
  242. package/dist/shared/activity.js.map +1 -0
  243. package/dist/shared/apiTypes.d.ts +769 -0
  244. package/dist/shared/apiTypes.js +11 -0
  245. package/dist/shared/apiTypes.js.map +1 -0
  246. package/dist/shared/capabilities.js +52 -0
  247. package/dist/shared/capabilities.js.map +1 -0
  248. package/dist/shared/federatedRoutes.js +81 -0
  249. package/dist/shared/federatedRoutes.js.map +1 -0
  250. package/dist/shared/machinePluginIds.js +41 -0
  251. package/dist/shared/machinePluginIds.js.map +1 -0
  252. package/dist/shared/ompWebStatusParsing.js +100 -0
  253. package/dist/shared/ompWebStatusParsing.js.map +1 -0
  254. package/dist/shared/piWebStatusParsing.js +102 -0
  255. package/dist/shared/piWebStatusParsing.js.map +1 -0
  256. package/dist/shared/pluginIds.js +5 -0
  257. package/dist/shared/pluginIds.js.map +1 -0
  258. package/dist/shared/promptAttachments.js +90 -0
  259. package/dist/shared/promptAttachments.js.map +1 -0
  260. package/dist/shared/thinkingLevels.d.ts +19 -0
  261. package/dist/shared/thinkingLevels.js +24 -0
  262. package/dist/shared/thinkingLevels.js.map +1 -0
  263. package/dist/shared/utils.js +10 -0
  264. package/dist/shared/utils.js.map +1 -0
  265. package/dist/shared/workspaceDeletion.js +12 -0
  266. package/dist/shared/workspaceDeletion.js.map +1 -0
  267. package/dist/shared/workspaceFiles.js +3 -0
  268. package/dist/shared/workspaceFiles.js.map +1 -0
  269. package/docs/assets/favicon.svg +11 -0
  270. package/docs/assets/omp-web-banner.png +0 -0
  271. package/docs/assets/omp-web-desktop.png +0 -0
  272. package/docs/assets/omp-web-mobile.png +0 -0
  273. package/docs/assets/omp-web-tablet.png +0 -0
  274. package/docs/config.md +208 -0
  275. package/docs/plugins.md +916 -0
  276. package/extensions/omp-web.ts +133 -0
  277. package/install.sh +5 -0
  278. package/package.json +134 -0
  279. package/plugin-api/unstable.d.ts +1 -0
  280. package/plugin-api.d.ts +1 -0
@@ -0,0 +1,55 @@
1
+ import { WebSocket } from "ws";
2
+ export function bridgeSockets(client, upstream) {
3
+ const sendToClient = createBufferedSender(client);
4
+ const sendToUpstream = createBufferedSender(upstream);
5
+ client.on("message", (data) => { sendToUpstream(data); });
6
+ upstream.on("message", (data) => { sendToClient(data); });
7
+ client.on("close", () => { upstream.close(); });
8
+ upstream.on("close", () => { client.close(); });
9
+ upstream.on("error", () => { client.close(); });
10
+ client.on("error", () => { upstream.close(); });
11
+ }
12
+ export function bridgeHonoSocketToUpstream(ws, upstream) {
13
+ const sendToUpstream = createBufferedSender(upstream);
14
+ upstream.on("message", (data) => {
15
+ if (typeof data === "string") {
16
+ ws.send(data);
17
+ }
18
+ else if (data instanceof ArrayBuffer) {
19
+ ws.send(data);
20
+ }
21
+ else if (Array.isArray(data)) {
22
+ ws.send(Buffer.concat(data).toString("utf8"));
23
+ }
24
+ else {
25
+ ws.send(data.toString("utf8"));
26
+ }
27
+ });
28
+ upstream.on("close", () => {
29
+ ws.close();
30
+ });
31
+ upstream.on("error", () => {
32
+ ws.close();
33
+ });
34
+ }
35
+ export function createBufferedSender(socket) {
36
+ const queue = [];
37
+ const flush = () => {
38
+ while (socket.readyState === WebSocket.OPEN) {
39
+ const data = queue.shift();
40
+ if (data === undefined)
41
+ return;
42
+ socket.send(data);
43
+ }
44
+ };
45
+ socket.on("open", flush);
46
+ return (data) => {
47
+ if (socket.readyState === WebSocket.OPEN) {
48
+ socket.send(data);
49
+ return;
50
+ }
51
+ if (socket.readyState === WebSocket.CONNECTING)
52
+ queue.push(data);
53
+ };
54
+ }
55
+ //# sourceMappingURL=webSocketBridge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webSocketBridge.js","sourceRoot":"","sources":["../../src/server/webSocketBridge.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ import { isAbsolute, resolve } from "node:path";
2
+ /**
3
+ * Working-directory normalization boundaries.
4
+ *
5
+ * Cwd strings reach the server from three kinds of sources with different trust:
6
+ *
7
+ * 1. HTTP requests (web UI, federation proxies): normalize strictly with
8
+ * `normalizeRequestCwd` at route parsing. Relative paths are rejected instead
9
+ * of being silently resolved against the daemon's own working directory.
10
+ * 2. Data omp-web writes itself (archive store records): canonicalized on write
11
+ * and on load with `canonicalizeStoredCwd`, so internal `===` comparisons are
12
+ * safe by construction.
13
+ * 3. Data other writers own (Pi session file headers via the SDK): canonicalized
14
+ * on read at the gateway, and compared tolerantly with `cwdPathsEqual` where a
15
+ * raw value can still appear (e.g. runtime cwd of sessions opened from files).
16
+ *
17
+ * Inside these boundaries, plain string equality on cwd values is safe.
18
+ */
19
+ /**
20
+ * Strictly normalize a client-supplied working directory at an HTTP boundary.
21
+ * Throws for non-string, empty, or relative input; returns the resolved
22
+ * (separator- and trailing-slash-normalized) absolute path otherwise.
23
+ */
24
+ export function normalizeRequestCwd(cwd) {
25
+ if (typeof cwd !== "string" || cwd === "")
26
+ throw new Error("cwd is required");
27
+ if (!isAbsolute(cwd))
28
+ throw new Error("cwd must be an absolute path");
29
+ return resolve(cwd);
30
+ }
31
+ /**
32
+ * Leniently canonicalize a working directory loaded from stored data.
33
+ * Absolute paths are resolved to canonical form; anything else (legacy empty or
34
+ * relative values) is preserved as-is so a single bad record cannot fail a whole
35
+ * load, and never silently resolves against this process's working directory.
36
+ */
37
+ export function canonicalizeStoredCwd(cwd) {
38
+ return isAbsolute(cwd) ? resolve(cwd) : cwd;
39
+ }
40
+ /** Compare two working-directory paths, tolerating separator and normalization differences (e.g. Windows backslash vs forward slash). */
41
+ export function cwdPathsEqual(a, b) {
42
+ return resolve(a) === resolve(b);
43
+ }
44
+ //# sourceMappingURL=workingDirectory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workingDirectory.js","sourceRoot":"","sources":["../../src/server/workingDirectory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEhD;;;;;;;;;;;;;;;;GAgBG;AAEH;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CAAC,GAAY;IAC9C,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;IAC9E,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;IACtE,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC;AACtB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB,CAAC,GAAW;IAC/C,OAAO,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;AAC9C,CAAC;AAED,yIAAyI;AACzI,MAAM,UAAU,aAAa,CAAC,CAAS,EAAE,CAAS;IAChD,OAAO,OAAO,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC;AACnC,CAAC"}
@@ -0,0 +1,148 @@
1
+ import { deleteWorkspaceFile, moveWorkspaceFile, readWorkspaceFile, readWorkspaceFileRaw, writeWorkspaceFile } from "./workspaces/fileContentService.js";
2
+ import { isAbsoluteishFileSuggestionQuery, listFileSuggestions, listPathSuggestions } from "./workspaces/fileSuggestions.js";
3
+ import { listWorkspaceTree } from "./workspaces/fileTreeService.js";
4
+ import { readWorkspaceImagePreview } from "./workspaces/imagePreviewService.js";
5
+ import { resolveWorkspaceContext } from "./workspaces/workspaceContext.js";
6
+ import { pathAccessForWorkspaceContext } from "./workspaces/effectivePathAccess.js";
7
+ export function registerWorkspaceExplorerRoutes(app, projects, workspaces, prefix = "/api", options = {}) {
8
+ app.get(`${prefix}/projects/:projectId/workspaces/:workspaceId/tree`, async (c) => {
9
+ try {
10
+ const projectId = c.req.param("projectId");
11
+ const workspaceId = c.req.param("workspaceId");
12
+ const path = c.req.query("path");
13
+ const context = await resolveWorkspaceContext(projects, workspaces, projectId, workspaceId);
14
+ return c.json(await listWorkspaceTree(context.root, path, await pathAccessForWorkspaceContext(context, options.config)));
15
+ }
16
+ catch (error) {
17
+ return c.json({ error: error instanceof Error ? error.message : String(error) }, 400);
18
+ }
19
+ });
20
+ app.get(`${prefix}/projects/:projectId/workspaces/:workspaceId/file`, async (c) => {
21
+ try {
22
+ const projectId = c.req.param("projectId");
23
+ const workspaceId = c.req.param("workspaceId");
24
+ const path = c.req.query("path");
25
+ const context = await resolveWorkspaceContext(projects, workspaces, projectId, workspaceId);
26
+ return c.json(await readWorkspaceFile(context.root, path, await pathAccessForWorkspaceContext(context, options.config)));
27
+ }
28
+ catch (error) {
29
+ return c.json({ error: error instanceof Error ? error.message : String(error) }, 400);
30
+ }
31
+ });
32
+ app.put(`${prefix}/projects/:projectId/workspaces/:workspaceId/file`, async (c) => {
33
+ try {
34
+ const projectId = c.req.param("projectId");
35
+ const workspaceId = c.req.param("workspaceId");
36
+ const path = c.req.query("path");
37
+ const createDirs = c.req.query("createDirs");
38
+ const overwrite = c.req.query("overwrite");
39
+ const context = await resolveWorkspaceContext(projects, workspaces, projectId, workspaceId);
40
+ const writeOptions = {
41
+ createDirs: createDirs !== "false",
42
+ overwrite: overwrite !== "false",
43
+ };
44
+ const arrayBuffer = await c.req.arrayBuffer();
45
+ const buffer = Buffer.from(arrayBuffer);
46
+ return c.json(await writeWorkspaceFile(context.root, path, buffer, writeOptions));
47
+ }
48
+ catch (error) {
49
+ return c.json({ error: error instanceof Error ? error.message : String(error) }, 400);
50
+ }
51
+ });
52
+ app.delete(`${prefix}/projects/:projectId/workspaces/:workspaceId/file`, async (c) => {
53
+ try {
54
+ const projectId = c.req.param("projectId");
55
+ const workspaceId = c.req.param("workspaceId");
56
+ const path = c.req.query("path");
57
+ const context = await resolveWorkspaceContext(projects, workspaces, projectId, workspaceId);
58
+ return c.json(await deleteWorkspaceFile(context.root, path));
59
+ }
60
+ catch (error) {
61
+ return c.json({ error: error instanceof Error ? error.message : String(error) }, 400);
62
+ }
63
+ });
64
+ app.post(`${prefix}/projects/:projectId/workspaces/:workspaceId/file/move`, async (c) => {
65
+ try {
66
+ const projectId = c.req.param("projectId");
67
+ const workspaceId = c.req.param("workspaceId");
68
+ const fromPath = c.req.query("fromPath");
69
+ const toPath = c.req.query("toPath");
70
+ const createDirs = c.req.query("createDirs");
71
+ const overwrite = c.req.query("overwrite");
72
+ const context = await resolveWorkspaceContext(projects, workspaces, projectId, workspaceId);
73
+ return c.json(await moveWorkspaceFile(context.root, fromPath, toPath, {
74
+ createDirs: createDirs !== "false",
75
+ overwrite: overwrite === "true",
76
+ }));
77
+ }
78
+ catch (error) {
79
+ return c.json({ error: error instanceof Error ? error.message : String(error) }, 400);
80
+ }
81
+ });
82
+ app.get(`${prefix}/projects/:projectId/workspaces/:workspaceId/file/raw`, async (c) => {
83
+ try {
84
+ const projectId = c.req.param("projectId");
85
+ const workspaceId = c.req.param("workspaceId");
86
+ const path = c.req.query("path");
87
+ const context = await resolveWorkspaceContext(projects, workspaces, projectId, workspaceId);
88
+ const file = await readWorkspaceFileRaw(context.root, path, await pathAccessForWorkspaceContext(context, options.config));
89
+ const fallbackName = file.filename.replace(/[^\x20-\x7E]|["\\]/g, "_");
90
+ const utf8Name = encodeURIComponent(file.filename);
91
+ return new Response(file.stream, {
92
+ headers: {
93
+ "Content-Type": file.mimeType,
94
+ "Cache-Control": "private, no-cache",
95
+ "Content-Length": String(file.size),
96
+ "Content-Disposition": `attachment; filename="${fallbackName}"; filename*=UTF-8''${utf8Name}`,
97
+ "Content-Security-Policy": "sandbox; default-src 'none'",
98
+ "Last-Modified": new Date(file.modifiedAt).toUTCString(),
99
+ "X-Content-Type-Options": "nosniff",
100
+ },
101
+ });
102
+ }
103
+ catch (error) {
104
+ return c.json({ error: error instanceof Error ? error.message : String(error) }, 400);
105
+ }
106
+ });
107
+ app.get(`${prefix}/projects/:projectId/workspaces/:workspaceId/file/preview`, async (c) => {
108
+ try {
109
+ const projectId = c.req.param("projectId");
110
+ const workspaceId = c.req.param("workspaceId");
111
+ const path = c.req.query("path");
112
+ const context = await resolveWorkspaceContext(projects, workspaces, projectId, workspaceId);
113
+ const preview = await readWorkspaceImagePreview(context.root, path, await pathAccessForWorkspaceContext(context, options.config));
114
+ return new Response(preview.stream, {
115
+ headers: {
116
+ "Content-Type": preview.mimeType,
117
+ "Cache-Control": "private, max-age=3600",
118
+ "Content-Length": String(preview.size),
119
+ "Content-Security-Policy": "sandbox; default-src 'none'; img-src 'self' data: blob:; style-src 'unsafe-inline'",
120
+ "Last-Modified": new Date(preview.modifiedAt).toUTCString(),
121
+ "X-Content-Type-Options": "nosniff",
122
+ },
123
+ });
124
+ }
125
+ catch (error) {
126
+ return c.json({ error: error instanceof Error ? error.message : String(error) }, 400);
127
+ }
128
+ });
129
+ app.get(`${prefix}/projects/:projectId/workspaces/:workspaceId/files`, async (c) => {
130
+ try {
131
+ const projectId = c.req.param("projectId");
132
+ const workspaceId = c.req.param("workspaceId");
133
+ const context = await resolveWorkspaceContext(projects, workspaces, projectId, workspaceId);
134
+ const query = c.req.query("q") ?? "";
135
+ const kind = c.req.query("kind");
136
+ const mode = c.req.query("mode");
137
+ const scope = c.req.query("scope");
138
+ const pathAccess = isAbsoluteishFileSuggestionQuery(query) ? await pathAccessForWorkspaceContext(context, options.config) : undefined;
139
+ if (mode === "path")
140
+ return c.json(await listPathSuggestions(context.root, query, pathAccess));
141
+ return c.json(await listFileSuggestions(context.root, query, { kind, scope, pathAccess }));
142
+ }
143
+ catch (error) {
144
+ return c.json({ error: error instanceof Error ? error.message : String(error) }, 400);
145
+ }
146
+ });
147
+ }
148
+ //# sourceMappingURL=workspaceExplorerRoutes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspaceExplorerRoutes.js","sourceRoot":"","sources":["../../src/server/workspaceExplorerRoutes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import { cwdPathsEqual } from "../workingDirectory.js";
2
+ import { loadEffectiveProjectPathAccess } from "./projectOmpWebConfig.js";
3
+ export async function pathAccessForWorkspaceContext(context, config) {
4
+ if (config === undefined)
5
+ return undefined;
6
+ const response = await config.read();
7
+ return loadEffectiveProjectPathAccess(context.project.path, response.effectiveConfig);
8
+ }
9
+ export async function pathAccessForCwd(cwd, projects, workspaces, config) {
10
+ if (config === undefined)
11
+ return undefined;
12
+ const response = await config.read();
13
+ const projectPath = await projectPathForWorkspaceCwd(cwd, projects, workspaces);
14
+ if (projectPath === undefined)
15
+ return response.effectiveConfig.pathAccess;
16
+ return loadEffectiveProjectPathAccess(projectPath, response.effectiveConfig);
17
+ }
18
+ async function projectPathForWorkspaceCwd(cwd, projects, workspaces) {
19
+ for (const project of await projects.list()) {
20
+ if (cwdPathsEqual(project.path, cwd))
21
+ return project.path;
22
+ if ((await workspaces.list(project)).some((workspace) => cwdPathsEqual(workspace.path, cwd)))
23
+ return project.path;
24
+ }
25
+ return undefined;
26
+ }
27
+ //# sourceMappingURL=effectivePathAccess.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"effectivePathAccess.js","sourceRoot":"","sources":["../../../src/server/workspaces/effectivePathAccess.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,8BAA8B,EAAE,MAAM,0BAA0B,CAAC;AAE1E,MAAM,CAAC,KAAK,UAAU,6BAA6B,CAAC,OAAyB,EAAE,MAAqD;IAClI,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC3C,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;IACrC,OAAO,8BAA8B,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,eAAe,CAAC,CAAC;AACxF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,GAAW,EAAE,QAAwB,EAAE,UAA4B,EAAE,MAAqD;IAC/J,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC3C,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;IACrC,MAAM,WAAW,GAAG,MAAM,0BAA0B,CAAC,GAAG,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;IAChF,IAAI,WAAW,KAAK,SAAS;QAAE,OAAO,QAAQ,CAAC,eAAe,CAAC,UAAU,CAAC;IAC1E,OAAO,8BAA8B,CAAC,WAAW,EAAE,QAAQ,CAAC,eAAe,CAAC,CAAC;AAC/E,CAAC;AAED,KAAK,UAAU,0BAA0B,CAAC,GAAW,EAAE,QAAwB,EAAE,UAA4B;IAC3G,KAAK,MAAM,OAAO,IAAI,MAAM,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC;QAC5C,IAAI,aAAa,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC;YAAE,OAAO,OAAO,CAAC,IAAI,CAAC;QAC1D,IAAI,CAAC,MAAM,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,aAAa,CAAC,SAAS,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;YAAE,OAAO,OAAO,CAAC,IAAI,CAAC;IACpH,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC"}
@@ -0,0 +1,200 @@
1
+ import { createReadStream } from "node:fs";
2
+ import { lstat, mkdir, open, realpath, rename, stat, unlink, writeFile } from "node:fs/promises";
3
+ import { basename, dirname, join } from "node:path";
4
+ import { imageMimeTypeForPath } from "./imagePreviewService.js";
5
+ import { resolveWorkspacePathAccessTarget } from "./pathAccessPolicy.js";
6
+ import { ensureInside, isNodeErrorWithCode, resolveInsideWorkspace, resolveParentInsideWorkspace } from "./pathSafety.js";
7
+ const MAX_BYTES = 512 * 1024;
8
+ export async function readWorkspaceFile(rootPath, path, pathAccess) {
9
+ if (path === undefined || path === "")
10
+ throw new Error("path query parameter is required");
11
+ const { target, displayPath } = await resolveWorkspacePathAccessTarget(rootPath, path, pathAccess);
12
+ const s = await stat(target);
13
+ if (!s.isFile())
14
+ throw new Error("Path is not a file");
15
+ const bytesToRead = Math.min(s.size, MAX_BYTES);
16
+ const buffer = await readFilePrefix(target, bytesToRead);
17
+ const media = mediaForPath(displayPath);
18
+ const binary = media.mediaType === "image" || isProbablyBinary(buffer);
19
+ return {
20
+ path: displayPath,
21
+ ...languageForPath(displayPath),
22
+ ...media,
23
+ encoding: "utf8",
24
+ size: s.size,
25
+ modifiedAt: s.mtime.toISOString(),
26
+ content: binary ? "" : buffer.toString("utf8"),
27
+ truncated: s.size > MAX_BYTES,
28
+ binary,
29
+ };
30
+ }
31
+ async function readFilePrefix(target, bytesToRead) {
32
+ if (bytesToRead === 0)
33
+ return Buffer.alloc(0);
34
+ const buffer = Buffer.alloc(bytesToRead);
35
+ const handle = await open(target, "r");
36
+ try {
37
+ const result = await handle.read(buffer, 0, bytesToRead, 0);
38
+ return buffer.subarray(0, result.bytesRead);
39
+ }
40
+ finally {
41
+ await handle.close();
42
+ }
43
+ }
44
+ export async function readWorkspaceFileRaw(rootPath, path, pathAccess) {
45
+ if (path === undefined || path === "")
46
+ throw new Error("path query parameter is required");
47
+ const { target, displayPath } = await resolveWorkspacePathAccessTarget(rootPath, path, pathAccess);
48
+ const s = await stat(target);
49
+ if (!s.isFile())
50
+ throw new Error("Path is not a file");
51
+ const filename = basename(displayPath);
52
+ const mimeType = imageMimeTypeForPath(displayPath) ?? "application/octet-stream";
53
+ return {
54
+ path: displayPath,
55
+ filename,
56
+ mimeType,
57
+ size: s.size,
58
+ modifiedAt: s.mtime.toISOString(),
59
+ stream: createReadStream(target),
60
+ };
61
+ }
62
+ export async function writeWorkspaceFile(rootPath, path, content, options = {}) {
63
+ if (path === undefined || path === "")
64
+ throw new Error("path query parameter is required");
65
+ const createDirs = options.createDirs ?? true;
66
+ const overwrite = options.overwrite ?? true;
67
+ let exists = false;
68
+ try {
69
+ const { target, relativePath } = await resolveInsideWorkspace(rootPath, path);
70
+ const s = await stat(target);
71
+ if (!s.isFile())
72
+ throw new Error("Path is not a file");
73
+ if (!overwrite)
74
+ throw new Error(`File already exists: ${relativePath}`);
75
+ exists = true;
76
+ }
77
+ catch (error) {
78
+ if (error instanceof Error && error.message.startsWith("File already exists"))
79
+ throw error;
80
+ if (isNodeErrorWithCode(error, "ENOENT")) { /* expected for creation — continue */ }
81
+ else if (error instanceof Error && error.message === "Path does not exist") { /* expected for creation — continue */ }
82
+ else
83
+ throw error; // re-throw permission errors, "not a file", traversal errors, etc.
84
+ }
85
+ // Use resolveParentInsideWorkspace for the actual write since the target may not exist yet
86
+ const { root, target, relativePath } = await resolveParentInsideWorkspace(rootPath, path);
87
+ if (createDirs)
88
+ await mkdir(dirname(target), { recursive: true });
89
+ // Resolve symlinks in the parent path to prevent escape via symlink
90
+ const realParent = await realpath(dirname(target));
91
+ const realTarget = join(realParent, basename(target));
92
+ ensureInside(root, realTarget);
93
+ await writeFile(realTarget, content);
94
+ const s = await stat(realTarget);
95
+ return {
96
+ path: relativePath,
97
+ size: s.size,
98
+ modifiedAt: s.mtime.toISOString(),
99
+ created: !exists,
100
+ };
101
+ }
102
+ export async function deleteWorkspaceFile(rootPath, path) {
103
+ if (path === undefined || path === "")
104
+ throw new Error("path query parameter is required");
105
+ // Use resolveParentInsideWorkspace + lstat so that deleting a symlink
106
+ // deletes the symlink itself, not the target it points to.
107
+ // resolveInsideWorkspace would call realpath on the target, following
108
+ // symlinks and resolving the symlink's destination instead.
109
+ const { root, target, relativePath } = await resolveParentInsideWorkspace(rootPath, path);
110
+ try {
111
+ // Resolve symlinks in the parent path to prevent escape via a symlinked
112
+ // parent directory. The final path component is intentionally NOT resolved
113
+ // so that lstat/unlink act on the entry itself (deleting a symlink rather
114
+ // than the file it points to).
115
+ const realParent = await realpath(dirname(target));
116
+ const realTarget = join(realParent, basename(target));
117
+ ensureInside(root, realTarget);
118
+ const s = await lstat(realTarget);
119
+ // Allow deleting regular files and symlinks, but not directories
120
+ if (s.isDirectory())
121
+ throw new Error("Path is a directory, use directory deletion instead");
122
+ await unlink(realTarget);
123
+ return { path: relativePath, existed: true };
124
+ }
125
+ catch (error) {
126
+ if (isNodeErrorWithCode(error, "ENOENT"))
127
+ return { path: relativePath, existed: false };
128
+ if (error instanceof Error && error.message === "Path does not exist")
129
+ return { path: relativePath, existed: false };
130
+ throw error;
131
+ }
132
+ }
133
+ export async function moveWorkspaceFile(rootPath, fromPath, toPath, options = {}) {
134
+ if (fromPath === undefined || fromPath === "")
135
+ throw new Error("fromPath query parameter is required");
136
+ if (toPath === undefined || toPath === "")
137
+ throw new Error("toPath query parameter is required");
138
+ const createDirs = options.createDirs ?? true;
139
+ const overwrite = options.overwrite ?? false;
140
+ // Source: must exist and be a file (uses realpath via resolveInsideWorkspace)
141
+ const { target: source, relativePath: fromRelative } = await resolveInsideWorkspace(rootPath, fromPath);
142
+ const sourceStat = await stat(source);
143
+ if (!sourceStat.isFile())
144
+ throw new Error("Source path is not a file");
145
+ // Target: uses resolveParentInsideWorkspace + realpath(dirname) pattern (same as writeFile)
146
+ const { root, target: dest, relativePath: destRelative } = await resolveParentInsideWorkspace(rootPath, toPath);
147
+ if (createDirs)
148
+ await mkdir(dirname(dest), { recursive: true });
149
+ // Resolve symlinks in the parent path to prevent escape via symlink
150
+ const realParent = await realpath(dirname(dest));
151
+ const realDest = join(realParent, basename(dest));
152
+ ensureInside(root, realDest);
153
+ if (!overwrite) {
154
+ try {
155
+ const destStat = await stat(realDest);
156
+ if (destStat.isFile())
157
+ throw new Error(`File already exists: ${destRelative}`);
158
+ }
159
+ catch (error) {
160
+ if (isNodeErrorWithCode(error, "ENOENT")) { /* expected — target doesn't exist */ }
161
+ else if (error instanceof Error && error.message.startsWith("File already exists"))
162
+ throw error;
163
+ else
164
+ throw error;
165
+ }
166
+ }
167
+ await rename(source, realDest);
168
+ const finalStat = await stat(realDest);
169
+ return { fromPath: fromRelative, toPath: destRelative, size: finalStat.size, modifiedAt: finalStat.mtime.toISOString() };
170
+ }
171
+ function isProbablyBinary(buffer) {
172
+ const sample = buffer.subarray(0, Math.min(buffer.length, 8192));
173
+ return sample.includes(0);
174
+ }
175
+ function languageForPath(path) {
176
+ const ext = path.split(".").pop()?.toLowerCase();
177
+ const languages = {
178
+ ts: "typescript",
179
+ tsx: "typescript",
180
+ js: "javascript",
181
+ jsx: "javascript",
182
+ json: "json",
183
+ md: "markdown",
184
+ css: "css",
185
+ html: "html",
186
+ py: "python",
187
+ rs: "rust",
188
+ go: "go",
189
+ sh: "shell",
190
+ yml: "yaml",
191
+ yaml: "yaml",
192
+ };
193
+ const language = ext === undefined ? undefined : languages[ext];
194
+ return language === undefined ? {} : { language };
195
+ }
196
+ function mediaForPath(path) {
197
+ const mimeType = imageMimeTypeForPath(path);
198
+ return mimeType === undefined ? {} : { mediaType: "image", mimeType };
199
+ }
200
+ //# sourceMappingURL=fileContentService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fileContentService.js","sourceRoot":"","sources":["../../../src/server/workspaces/fileContentService.ts"],"names":[],"mappings":"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"}