@progmruansilva/omp-web 1.202608.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 (234) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +181 -0
  3. package/dist/cli.js +1015 -0
  4. package/dist/cli.js.map +1 -0
  5. package/dist/client/assets/CodeViewer-Da66baHj.js +4 -0
  6. package/dist/client/assets/TerminalPanel-Bj9an79F.js +126 -0
  7. package/dist/client/assets/UnifiedDiffViewer-eK_kynTO.js +34 -0
  8. package/dist/client/assets/index-DytaeWNd.js +3070 -0
  9. package/dist/client/assets/vendor-editor-core-CL2gOCIg.js +12 -0
  10. package/dist/client/assets/vendor-editor-languages-zOM9I4iZ.js +26 -0
  11. package/dist/client/assets/vendor-editor-legacy-B4QLsWF8.js +1 -0
  12. package/dist/client/assets/vendor-terminal-DDGTF8rc.css +1 -0
  13. package/dist/client/assets/vendor-terminal-DjQ08hXu.js +16 -0
  14. package/dist/client/favicon-16x16.png +0 -0
  15. package/dist/client/favicon-180x180.png +0 -0
  16. package/dist/client/favicon-192x192.png +0 -0
  17. package/dist/client/favicon-32x32.png +0 -0
  18. package/dist/client/favicon-512x512.png +0 -0
  19. package/dist/client/favicon.ico +0 -0
  20. package/dist/client/favicon.png +0 -0
  21. package/dist/client/favicon.svg +11 -0
  22. package/dist/client/index.html +67 -0
  23. package/dist/client/manifest.webmanifest +36 -0
  24. package/dist/config.js +272 -0
  25. package/dist/config.js.map +1 -0
  26. package/dist/docker/ompWebDockerCommandPlan.js +211 -0
  27. package/dist/docker/ompWebDockerCommandPlan.js.map +1 -0
  28. package/dist/omp-web-plugins/info/omp-web-plugin.js +51 -0
  29. package/dist/omp-web-plugins/info/package.json +9 -0
  30. package/dist/omp-web-plugins/schedule-prompts/omp-web-plugin.js +43 -0
  31. package/dist/omp-web-plugins/schedule-prompts/package.json +9 -0
  32. package/dist/omp-web-plugins/schedule-prompts/schedulePromptsPanelElement.js +242 -0
  33. package/dist/omp-web-plugins/schedule-prompts/types.js +2 -0
  34. package/dist/omp-web-plugins/updates/omp-web-plugin.js +173 -0
  35. package/dist/omp-web-plugins/updates/package.json +9 -0
  36. package/dist/omp-web-plugins/updates/updatesLogic.js +97 -0
  37. package/dist/ompWebVersionReport.js +217 -0
  38. package/dist/ompWebVersionReport.js.map +1 -0
  39. package/dist/plugin-api/unstable.d.ts +22 -0
  40. package/dist/plugin-api.d.ts +197 -0
  41. package/dist/server/activity/workspaceActivityRoutes.js +4 -0
  42. package/dist/server/activity/workspaceActivityRoutes.js.map +1 -0
  43. package/dist/server/activity/workspaceActivityService.js +98 -0
  44. package/dist/server/activity/workspaceActivityService.js.map +1 -0
  45. package/dist/server/app.js +162 -0
  46. package/dist/server/app.js.map +1 -0
  47. package/dist/server/configRoutes.js +270 -0
  48. package/dist/server/configRoutes.js.map +1 -0
  49. package/dist/server/diagnostics/nodePtySpawnHelper.js +130 -0
  50. package/dist/server/diagnostics/nodePtySpawnHelper.js.map +1 -0
  51. package/dist/server/git/gitEnv.js +15 -0
  52. package/dist/server/git/gitEnv.js.map +1 -0
  53. package/dist/server/git/gitService.js +119 -0
  54. package/dist/server/git/gitService.js.map +1 -0
  55. package/dist/server/gitRoutes.js +23 -0
  56. package/dist/server/gitRoutes.js.map +1 -0
  57. package/dist/server/index.js +7 -0
  58. package/dist/server/index.js.map +1 -0
  59. package/dist/server/machines/machineClient.js +162 -0
  60. package/dist/server/machines/machineClient.js.map +1 -0
  61. package/dist/server/machines/machinePluginProxyRoutes.js +157 -0
  62. package/dist/server/machines/machinePluginProxyRoutes.js.map +1 -0
  63. package/dist/server/machines/machineProxyRoutes.js +127 -0
  64. package/dist/server/machines/machineProxyRoutes.js.map +1 -0
  65. package/dist/server/machines/machineRoutes.js +54 -0
  66. package/dist/server/machines/machineRoutes.js.map +1 -0
  67. package/dist/server/machines/machineService.js +230 -0
  68. package/dist/server/machines/machineService.js.map +1 -0
  69. package/dist/server/machines/machineStore.js +123 -0
  70. package/dist/server/machines/machineStore.js.map +1 -0
  71. package/dist/server/machines/proxyUtils.js +30 -0
  72. package/dist/server/machines/proxyUtils.js.map +1 -0
  73. package/dist/server/ompWebPluginService.js +279 -0
  74. package/dist/server/ompWebPluginService.js.map +1 -0
  75. package/dist/server/ompWebStatus.js +601 -0
  76. package/dist/server/ompWebStatus.js.map +1 -0
  77. package/dist/server/ompWebStatusCache.js +31 -0
  78. package/dist/server/ompWebStatusCache.js.map +1 -0
  79. package/dist/server/piPackageRoutes.js +82 -0
  80. package/dist/server/piPackageRoutes.js.map +1 -0
  81. package/dist/server/piPackageService.js +65 -0
  82. package/dist/server/piPackageService.js.map +1 -0
  83. package/dist/server/projects/directorySuggestions.js +37 -0
  84. package/dist/server/projects/directorySuggestions.js.map +1 -0
  85. package/dist/server/projects/projectService.js +31 -0
  86. package/dist/server/projects/projectService.js.map +1 -0
  87. package/dist/server/push/PushNotificationService.js +137 -0
  88. package/dist/server/push/PushNotificationService.js.map +1 -0
  89. package/dist/server/push/pushRoutes.js +55 -0
  90. package/dist/server/push/pushRoutes.js.map +1 -0
  91. package/dist/server/realtime/sessionEventHub.js +39 -0
  92. package/dist/server/realtime/sessionEventHub.js.map +1 -0
  93. package/dist/server/sessiond/sessionProxyRoutes.js +61 -0
  94. package/dist/server/sessiond/sessionProxyRoutes.js.map +1 -0
  95. package/dist/server/sessiond.js +92 -0
  96. package/dist/server/sessiond.js.map +1 -0
  97. package/dist/server/sessions/attachmentService.js +112 -0
  98. package/dist/server/sessions/attachmentService.js.map +1 -0
  99. package/dist/server/sessions/authProviderOptions.js +52 -0
  100. package/dist/server/sessions/authProviderOptions.js.map +1 -0
  101. package/dist/server/sessions/authRoutes.js +59 -0
  102. package/dist/server/sessions/authRoutes.js.map +1 -0
  103. package/dist/server/sessions/authService.js +105 -0
  104. package/dist/server/sessions/authService.js.map +1 -0
  105. package/dist/server/sessions/builtinCommands.js +29 -0
  106. package/dist/server/sessions/builtinCommands.js.map +1 -0
  107. package/dist/server/sessions/editPreview.js +196 -0
  108. package/dist/server/sessions/editPreview.js.map +1 -0
  109. package/dist/server/sessions/messagePaging.js +41 -0
  110. package/dist/server/sessions/messagePaging.js.map +1 -0
  111. package/dist/server/sessions/oauthLoginFlowService.js +136 -0
  112. package/dist/server/sessions/oauthLoginFlowService.js.map +1 -0
  113. package/dist/server/sessions/piSessionManagerGateway.js +97 -0
  114. package/dist/server/sessions/piSessionManagerGateway.js.map +1 -0
  115. package/dist/server/sessions/piSessionService.js +2401 -0
  116. package/dist/server/sessions/piSessionService.js.map +1 -0
  117. package/dist/server/sessions/schedulePrompt/schedulePromptService.js +46 -0
  118. package/dist/server/sessions/schedulePrompt/schedulePromptService.js.map +1 -0
  119. package/dist/server/sessions/schedulePrompt/scheduler.js +315 -0
  120. package/dist/server/sessions/schedulePrompt/scheduler.js.map +1 -0
  121. package/dist/server/sessions/schedulePrompt/storage.js +118 -0
  122. package/dist/server/sessions/schedulePrompt/storage.js.map +1 -0
  123. package/dist/server/sessions/schedulePrompt/tool.js +252 -0
  124. package/dist/server/sessions/schedulePrompt/tool.js.map +1 -0
  125. package/dist/server/sessions/schedulePrompt/types.js +2 -0
  126. package/dist/server/sessions/schedulePrompt/types.js.map +1 -0
  127. package/dist/server/sessions/sessionArchiveStore.js +254 -0
  128. package/dist/server/sessions/sessionArchiveStore.js.map +1 -0
  129. package/dist/server/sessions/sessionArchiveTree.js +35 -0
  130. package/dist/server/sessions/sessionArchiveTree.js.map +1 -0
  131. package/dist/server/sessions/sessionCleanup.js +157 -0
  132. package/dist/server/sessions/sessionCleanup.js.map +1 -0
  133. package/dist/server/sessions/sessionCommandService.js +260 -0
  134. package/dist/server/sessions/sessionCommandService.js.map +1 -0
  135. package/dist/server/sessions/sessionNameGenerator.js +61 -0
  136. package/dist/server/sessions/sessionNameGenerator.js.map +1 -0
  137. package/dist/server/sessions/sessionRoutes.js +344 -0
  138. package/dist/server/sessions/sessionRoutes.js.map +1 -0
  139. package/dist/server/sessions/sessionRuntimeStore.js +2 -0
  140. package/dist/server/sessions/sessionRuntimeStore.js.map +1 -0
  141. package/dist/server/sessions/spawnSessionTool.js +41 -0
  142. package/dist/server/sessions/spawnSessionTool.js.map +1 -0
  143. package/dist/server/sessions/spawnSubsessionTool.js +203 -0
  144. package/dist/server/sessions/spawnSubsessionTool.js.map +1 -0
  145. package/dist/server/sessions/spawnTargetResolver.js +36 -0
  146. package/dist/server/sessions/spawnTargetResolver.js.map +1 -0
  147. package/dist/server/sessions/subsessionTranscript.js +233 -0
  148. package/dist/server/sessions/subsessionTranscript.js.map +1 -0
  149. package/dist/server/storage/projectStore.js +83 -0
  150. package/dist/server/storage/projectStore.js.map +1 -0
  151. package/dist/server/terminalProxyRoutes.js +140 -0
  152. package/dist/server/terminalProxyRoutes.js.map +1 -0
  153. package/dist/server/terminals/terminalRoutes.js +153 -0
  154. package/dist/server/terminals/terminalRoutes.js.map +1 -0
  155. package/dist/server/terminals/terminalService.js +320 -0
  156. package/dist/server/terminals/terminalService.js.map +1 -0
  157. package/dist/server/terminals/terminalSize.js +17 -0
  158. package/dist/server/terminals/terminalSize.js.map +1 -0
  159. package/dist/server/types.js +2 -0
  160. package/dist/server/types.js.map +1 -0
  161. package/dist/server/utils.js +8 -0
  162. package/dist/server/utils.js.map +1 -0
  163. package/dist/server/webSocketBridge.js +32 -0
  164. package/dist/server/webSocketBridge.js.map +1 -0
  165. package/dist/server/workingDirectory.js +44 -0
  166. package/dist/server/workingDirectory.js.map +1 -0
  167. package/dist/server/workspaceExplorerRoutes.js +109 -0
  168. package/dist/server/workspaceExplorerRoutes.js.map +1 -0
  169. package/dist/server/workspaces/effectivePathAccess.js +27 -0
  170. package/dist/server/workspaces/effectivePathAccess.js.map +1 -0
  171. package/dist/server/workspaces/fileContentService.js +181 -0
  172. package/dist/server/workspaces/fileContentService.js.map +1 -0
  173. package/dist/server/workspaces/fileSuggestions.js +512 -0
  174. package/dist/server/workspaces/fileSuggestions.js.map +1 -0
  175. package/dist/server/workspaces/fileTreeService.js +27 -0
  176. package/dist/server/workspaces/fileTreeService.js.map +1 -0
  177. package/dist/server/workspaces/gitWorktreeDiscovery.js +34 -0
  178. package/dist/server/workspaces/gitWorktreeDiscovery.js.map +1 -0
  179. package/dist/server/workspaces/imagePreviewService.js +40 -0
  180. package/dist/server/workspaces/imagePreviewService.js.map +1 -0
  181. package/dist/server/workspaces/pathAccessPolicy.js +87 -0
  182. package/dist/server/workspaces/pathAccessPolicy.js.map +1 -0
  183. package/dist/server/workspaces/pathSafety.js +54 -0
  184. package/dist/server/workspaces/pathSafety.js.map +1 -0
  185. package/dist/server/workspaces/projectOmpWebConfig.js +56 -0
  186. package/dist/server/workspaces/projectOmpWebConfig.js.map +1 -0
  187. package/dist/server/workspaces/workspaceContext.js +8 -0
  188. package/dist/server/workspaces/workspaceContext.js.map +1 -0
  189. package/dist/server/workspaces/workspaceDeletionRoutes.js +111 -0
  190. package/dist/server/workspaces/workspaceDeletionRoutes.js.map +1 -0
  191. package/dist/server/workspaces/workspaceService.js +39 -0
  192. package/dist/server/workspaces/workspaceService.js.map +1 -0
  193. package/dist/sessiond/config.js +9 -0
  194. package/dist/sessiond/config.js.map +1 -0
  195. package/dist/sessiond/sessionDaemonClient.js +65 -0
  196. package/dist/sessiond/sessionDaemonClient.js.map +1 -0
  197. package/dist/shared/activity.js +26 -0
  198. package/dist/shared/activity.js.map +1 -0
  199. package/dist/shared/apiTypes.d.ts +688 -0
  200. package/dist/shared/apiTypes.js +11 -0
  201. package/dist/shared/apiTypes.js.map +1 -0
  202. package/dist/shared/capabilities.js +52 -0
  203. package/dist/shared/capabilities.js.map +1 -0
  204. package/dist/shared/federatedRoutes.js +79 -0
  205. package/dist/shared/federatedRoutes.js.map +1 -0
  206. package/dist/shared/machinePluginIds.js +41 -0
  207. package/dist/shared/machinePluginIds.js.map +1 -0
  208. package/dist/shared/ompWebStatusParsing.js +100 -0
  209. package/dist/shared/ompWebStatusParsing.js.map +1 -0
  210. package/dist/shared/pluginIds.js +5 -0
  211. package/dist/shared/pluginIds.js.map +1 -0
  212. package/dist/shared/promptAttachments.js +90 -0
  213. package/dist/shared/promptAttachments.js.map +1 -0
  214. package/dist/shared/thinkingLevels.d.ts +19 -0
  215. package/dist/shared/thinkingLevels.js +24 -0
  216. package/dist/shared/thinkingLevels.js.map +1 -0
  217. package/dist/shared/utils.js +4 -0
  218. package/dist/shared/utils.js.map +1 -0
  219. package/dist/shared/workspaceDeletion.js +12 -0
  220. package/dist/shared/workspaceDeletion.js.map +1 -0
  221. package/dist/shared/workspaceFiles.js +3 -0
  222. package/dist/shared/workspaceFiles.js.map +1 -0
  223. package/docs/assets/favicon.svg +11 -0
  224. package/docs/assets/omp-web-banner.png +0 -0
  225. package/docs/assets/omp-web-desktop.png +0 -0
  226. package/docs/assets/omp-web-mobile.png +0 -0
  227. package/docs/assets/omp-web-tablet.png +0 -0
  228. package/docs/config.md +208 -0
  229. package/docs/plugins.md +916 -0
  230. package/extensions/omp-web.ts +133 -0
  231. package/install.sh +5 -0
  232. package/package.json +141 -0
  233. package/plugin-api/unstable.d.ts +1 -0
  234. package/plugin-api.d.ts +1 -0
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
@@ -0,0 +1,11 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64">
2
+ <defs>
3
+ <linearGradient id="g" x1="0" y1="0" x2="1" y2="1">
4
+ <stop offset="0" stop-color="#ed4abf" />
5
+ <stop offset=".5" stop-color="#9b4dff" />
6
+ <stop offset="1" stop-color="#5ad8e6" />
7
+ </linearGradient>
8
+ </defs>
9
+ <rect width="64" height="64" rx="12" fill="#0f0a14" />
10
+ <path fill="url(#g)" d="M14 16h36v8H40v32h-8V24h-6v22h-8V24h-4z" />
11
+ </svg>
@@ -0,0 +1,67 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover" />
6
+ <title>OMP Web</title>
7
+ <meta name="theme-color" content="#0d1117" />
8
+ <link rel="icon" type="image/svg+xml" href="/favicon.svg" />
9
+ <link rel="icon" type="image/x-icon" href="/favicon.ico" sizes="any" />
10
+ <link rel="icon" type="image/png" sizes="256x256" href="/favicon.png" />
11
+ <link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png" />
12
+ <link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png" />
13
+ <link rel="apple-touch-icon" sizes="180x180" href="/favicon-180x180.png" />
14
+ <link rel="manifest" href="/manifest.webmanifest" />
15
+ <style>
16
+ :root {
17
+ color-scheme: dark;
18
+ --pi-control-font-size: 16px;
19
+ --pi-control-font-family: system-ui, sans-serif;
20
+ --pi-control-monospace-font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
21
+ --pi-bg: #0d1117;
22
+ --pi-surface: #161b22;
23
+ --pi-surface-hover: #21262d;
24
+ --pi-terminal-bg: #05070a;
25
+ --pi-terminal-text: #e6edf3;
26
+ --pi-border: #30363d;
27
+ --pi-border-muted: #21262d;
28
+ --pi-text: #e6edf3;
29
+ --pi-text-secondary: #c9d1d9;
30
+ --pi-text-bright: #f0f6fc;
31
+ --pi-muted: #8b949e;
32
+ --pi-dim: #6e7681;
33
+ --pi-accent: #58a6ff;
34
+ --pi-accent-border: #2f81f7;
35
+ --pi-selection-bg: #0d2847;
36
+ --pi-success: #3fb950;
37
+ --pi-success-border: #238636;
38
+ --pi-success-bg: #0f1b12;
39
+ --pi-success-surface: #0f2a16;
40
+ --pi-success-ring: #3fb95055;
41
+ --pi-warning: #d29922;
42
+ --pi-warning-border: #6e5200;
43
+ --pi-warning-surface: #1f1a10;
44
+ --pi-danger: #ff7b72;
45
+ --pi-purple: #d2a8ff;
46
+ --pi-purple-border: #a371f7;
47
+ --pi-purple-surface: #21132f;
48
+ --pi-overlay: #0008;
49
+ --pi-shadow-soft: #0006;
50
+ --pi-shadow: #0008;
51
+ --pi-shadow-strong: #000b;
52
+ --pi-bg-overlay-soft: #0d1117dd;
53
+ --pi-bg-overlay: #0d1117e6;
54
+ --pi-success-bg-overlay: #0f1b12ee;
55
+ --pi-terminal-selection: #264f78;
56
+ }
57
+ html, body { margin: 0; height: 100%; overflow: hidden; background: var(--pi-bg); color: var(--pi-text); }
58
+ body { min-height: 100dvh; }
59
+ </style>
60
+ <script type="module" crossorigin src="/assets/index-DytaeWNd.js"></script>
61
+ <link rel="modulepreload" crossorigin href="/assets/vendor-editor-core-CL2gOCIg.js">
62
+ <link rel="modulepreload" crossorigin href="/assets/vendor-editor-languages-zOM9I4iZ.js">
63
+ </head>
64
+ <body>
65
+ <omp-web-app></omp-web-app>
66
+ </body>
67
+ </html>
@@ -0,0 +1,36 @@
1
+ {
2
+ "name": "OMP Web",
3
+ "short_name": "OMP",
4
+ "description": "Remote web UI and browser control plane for persistent Pi Coding Agent sessions.",
5
+ "start_url": "/",
6
+ "scope": "/",
7
+ "display": "standalone",
8
+ "background_color": "#0d1117",
9
+ "theme_color": "#0d1117",
10
+ "icons": [
11
+ {
12
+ "src": "/favicon.svg",
13
+ "type": "image/svg+xml",
14
+ "sizes": "any",
15
+ "purpose": "any"
16
+ },
17
+ {
18
+ "src": "/favicon-192x192.png",
19
+ "sizes": "192x192",
20
+ "type": "image/png",
21
+ "purpose": "any maskable"
22
+ },
23
+ {
24
+ "src": "/favicon-512x512.png",
25
+ "sizes": "512x512",
26
+ "type": "image/png",
27
+ "purpose": "any maskable"
28
+ },
29
+ {
30
+ "src": "/favicon-180x180.png",
31
+ "sizes": "180x180",
32
+ "type": "image/png",
33
+ "purpose": "any maskable"
34
+ }
35
+ ]
36
+ }
package/dist/config.js ADDED
@@ -0,0 +1,272 @@
1
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
2
+ import { homedir } from "node:os";
3
+ import { dirname, isAbsolute, join, resolve } from "node:path";
4
+ import { isOmpWebPluginId, ompWebPluginIdPattern } from "./shared/pluginIds.js";
5
+ import { isRecord } from "./server/utils.js";
6
+ export function defaultOmpWebConfigPath(env = process.env) {
7
+ const xdgConfigHome = env["XDG_CONFIG_HOME"];
8
+ return join(xdgConfigHome !== undefined && xdgConfigHome !== "" ? xdgConfigHome : join(homedir(), ".config"), "omp-web", "config.json");
9
+ }
10
+ export function defaultOmpWebDataDir() {
11
+ return join(homedir(), ".omp-web");
12
+ }
13
+ /**
14
+ * Default maximum HTTP body size (bytes) for the web/API and session daemon.
15
+ * Generous headroom for base64 image attachments (well above pi's 4.5MB
16
+ * per-image inline limit so several images fit in one request).
17
+ */
18
+ export const DEFAULT_MAX_UPLOAD_BYTES = 64 * 1024 * 1024;
19
+ export const DEFAULT_UPLOADS_FOLDER = ".omp-web/uploads";
20
+ export function effectiveUploadsConfig(config = {}) {
21
+ return { defaultFolder: config.uploads?.defaultFolder ?? DEFAULT_UPLOADS_FOLDER };
22
+ }
23
+ export function maxUploadBytes(env = process.env, config = {}) {
24
+ const fromEnv = env["OMP_WEB_MAX_UPLOAD_BYTES"];
25
+ if (fromEnv !== undefined && fromEnv !== "") {
26
+ const parsed = Number(fromEnv);
27
+ if (Number.isInteger(parsed) && parsed > 0)
28
+ return parsed;
29
+ }
30
+ if (config.maxUploadBytes !== undefined)
31
+ return config.maxUploadBytes;
32
+ return DEFAULT_MAX_UPLOAD_BYTES;
33
+ }
34
+ export function ompWebDataDir(env = process.env, cwd = process.cwd()) {
35
+ const configured = env["OMP_WEB_DATA_DIR"];
36
+ if (configured === undefined || configured === "")
37
+ return defaultOmpWebDataDir();
38
+ return resolve(cwd, configured);
39
+ }
40
+ export function ompWebConfigPath(env = process.env, cwd = process.cwd()) {
41
+ const configured = env["OMP_WEB_CONFIG"];
42
+ if (configured === undefined || configured === "")
43
+ return defaultOmpWebConfigPath(env);
44
+ return resolve(cwd, configured);
45
+ }
46
+ export function loadOmpWebConfig(options = {}) {
47
+ const env = options.env ?? process.env;
48
+ const path = ompWebConfigPath(env, options.cwd ?? process.cwd());
49
+ if (!existsSync(path))
50
+ return { path, exists: false, config: {} };
51
+ const parsed = JSON.parse(readFileSync(path, "utf8"));
52
+ if (!isRecord(parsed))
53
+ throw new Error(`PI WEB config must be a JSON object: ${path}`);
54
+ return { path, exists: true, config: parseOmpWebConfig(parsed, path) };
55
+ }
56
+ export function effectiveOmpWebConfig(options = {}) {
57
+ const loaded = loadOmpWebConfig(options);
58
+ const env = options.env ?? process.env;
59
+ const host = env["OMP_WEB_HOST"];
60
+ const port = env["OMP_WEB_PORT"] ?? env["PORT"];
61
+ const allowedHosts = env["OMP_WEB_ALLOWED_HOSTS"];
62
+ const maxUpload = env["OMP_WEB_MAX_UPLOAD_BYTES"];
63
+ return {
64
+ ...loaded,
65
+ config: {
66
+ ...loaded.config,
67
+ ...(host !== undefined && host !== "" ? { host } : {}),
68
+ ...(port !== undefined && port !== "" ? { port: parsePort(port, "OMP_WEB_PORT") } : {}),
69
+ ...(allowedHosts !== undefined && allowedHosts !== "" ? { allowedHosts: parseAllowedHostsEnv(allowedHosts) } : {}),
70
+ ...(maxUpload !== undefined && maxUpload !== "" ? { maxUploadBytes: parseMaxUploadBytes(maxUpload, "OMP_WEB_MAX_UPLOAD_BYTES") } : {}),
71
+ uploads: effectiveUploadsConfig(loaded.config),
72
+ // Always resolved (on by default) so the effective config is the single
73
+ // source of truth for the runtime state and the settings UI toggle.
74
+ spawnSessions: spawnSessionsEnabled(env, loaded.config),
75
+ // Beta capability, resolved off by default.
76
+ subsessions: subsessionsEnabled(env, loaded.config),
77
+ },
78
+ };
79
+ }
80
+ export function saveOmpWebConfig(config, options = {}) {
81
+ const env = options.env ?? process.env;
82
+ const path = ompWebConfigPath(env, options.cwd ?? process.cwd());
83
+ const normalized = parseOmpWebConfig(ompWebConfigRecord(config), path);
84
+ const existing = readExistingConfigObject(path);
85
+ delete existing["host"];
86
+ delete existing["port"];
87
+ delete existing["allowedHosts"];
88
+ delete existing["shortcuts"];
89
+ delete existing["plugins"];
90
+ delete existing["pathAccess"];
91
+ delete existing["uploads"];
92
+ delete existing["maxUploadBytes"];
93
+ delete existing["spawnSessions"];
94
+ delete existing["subsessions"];
95
+ const merged = { ...existing, ...ompWebConfigRecord(normalized) };
96
+ mkdirSync(dirname(path), { recursive: true });
97
+ writeFileSync(path, `${JSON.stringify(merged, null, 2)}\n`, "utf8");
98
+ return { path, exists: true, config: normalized };
99
+ }
100
+ function readExistingConfigObject(path) {
101
+ if (!existsSync(path))
102
+ return {};
103
+ const parsed = JSON.parse(readFileSync(path, "utf8"));
104
+ if (!isRecord(parsed))
105
+ throw new Error(`PI WEB config must be a JSON object: ${path}`);
106
+ return parsed;
107
+ }
108
+ function ompWebConfigRecord(config) {
109
+ return {
110
+ ...(config.host !== undefined ? { host: config.host } : {}),
111
+ ...(config.port !== undefined ? { port: config.port } : {}),
112
+ ...(config.allowedHosts !== undefined ? { allowedHosts: config.allowedHosts } : {}),
113
+ ...(config.shortcuts !== undefined ? { shortcuts: config.shortcuts } : {}),
114
+ ...(config.plugins !== undefined ? { plugins: config.plugins } : {}),
115
+ ...(config.pathAccess !== undefined ? { pathAccess: config.pathAccess } : {}),
116
+ ...(config.uploads !== undefined ? { uploads: config.uploads } : {}),
117
+ ...(config.maxUploadBytes !== undefined ? { maxUploadBytes: config.maxUploadBytes } : {}),
118
+ ...(config.spawnSessions !== undefined ? { spawnSessions: config.spawnSessions } : {}),
119
+ ...(config.subsessions !== undefined ? { subsessions: config.subsessions } : {}),
120
+ };
121
+ }
122
+ function parseOmpWebConfig(value, path) {
123
+ return {
124
+ ...(value["host"] !== undefined ? { host: parseString(value["host"], "host", path) } : {}),
125
+ ...(value["port"] !== undefined ? { port: parsePort(value["port"], "port", path) } : {}),
126
+ ...(value["allowedHosts"] !== undefined ? { allowedHosts: parseAllowedHosts(value["allowedHosts"], path) } : {}),
127
+ ...(value["shortcuts"] !== undefined ? { shortcuts: parseShortcuts(value["shortcuts"], path) } : {}),
128
+ ...(value["plugins"] !== undefined ? { plugins: parsePlugins(value["plugins"], path) } : {}),
129
+ ...(value["pathAccess"] !== undefined ? { pathAccess: parsePathAccessConfig(value["pathAccess"], path) } : {}),
130
+ ...(value["uploads"] !== undefined ? { uploads: parseUploadsConfig(value["uploads"], path) } : {}),
131
+ ...(value["maxUploadBytes"] !== undefined ? { maxUploadBytes: parseMaxUploadBytes(value["maxUploadBytes"], "maxUploadBytes", path) } : {}),
132
+ ...(value["spawnSessions"] !== undefined ? { spawnSessions: parseSpawnSessions(value["spawnSessions"], path) } : {}),
133
+ ...(value["subsessions"] !== undefined ? { subsessions: parseSubsessions(value["subsessions"], path) } : {}),
134
+ };
135
+ }
136
+ function parseMaxUploadBytes(value, key, path = "environment") {
137
+ const bytes = typeof value === "number" ? value : typeof value === "string" && value !== "" ? Number(value) : NaN;
138
+ if (!Number.isInteger(bytes) || bytes < 1)
139
+ throw new Error(`PI WEB config ${key} must be a positive integer: ${path}`);
140
+ return bytes;
141
+ }
142
+ function parseSpawnSessions(value, path) {
143
+ if (typeof value !== "boolean")
144
+ throw new Error(`PI WEB config spawnSessions must be a boolean: ${path}`);
145
+ return value;
146
+ }
147
+ /**
148
+ * Whether LLMs may start new sessions via the spawn_session tool. On by default
149
+ * (spawned sessions appear in the session list, so humans notice them); set the
150
+ * env var `OMP_WEB_SPAWN_SESSIONS` or the `spawnSessions` config key to `false`
151
+ * to disable. The env var takes precedence over the config file.
152
+ */
153
+ export function spawnSessionsEnabled(env = process.env, config = {}) {
154
+ const fromEnv = env["OMP_WEB_SPAWN_SESSIONS"];
155
+ if (fromEnv !== undefined && fromEnv !== "")
156
+ return fromEnv === "1" || fromEnv.toLowerCase() === "true";
157
+ return config.spawnSessions ?? true;
158
+ }
159
+ function parseSubsessions(value, path) {
160
+ if (typeof value !== "boolean")
161
+ throw new Error(`PI WEB config subsessions must be a boolean: ${path}`);
162
+ return value;
163
+ }
164
+ /**
165
+ * Beta: whether LLMs may start tracked child sessions via the spawn_subsession
166
+ * family of tools. Off by default while the capability stabilizes, so it can
167
+ * ship in main without affecting releases; enable with the env var
168
+ * `OMP_WEB_SUBSESSIONS` or the `subsessions` config key. The env var takes
169
+ * precedence over the config file. Subsessions also require spawnSessions to be
170
+ * enabled (they share the same project-scope resolver).
171
+ */
172
+ export function subsessionsEnabled(env = process.env, config = {}) {
173
+ const fromEnv = env["OMP_WEB_SUBSESSIONS"];
174
+ if (fromEnv !== undefined && fromEnv !== "")
175
+ return fromEnv === "1" || fromEnv.toLowerCase() === "true";
176
+ return config.subsessions ?? false;
177
+ }
178
+ function parseString(value, key, path) {
179
+ if (typeof value !== "string" || value === "")
180
+ throw new Error(`PI WEB config ${key} must be a non-empty string: ${path}`);
181
+ return value;
182
+ }
183
+ function parsePort(value, key, path = "environment") {
184
+ const port = typeof value === "number" ? value : typeof value === "string" && value !== "" ? Number(value) : NaN;
185
+ if (!Number.isInteger(port) || port < 1 || port > 65535)
186
+ throw new Error(`PI WEB config ${key} must be an integer from 1 to 65535: ${path}`);
187
+ return port;
188
+ }
189
+ function parseAllowedHosts(value, path) {
190
+ if (value === true)
191
+ return true;
192
+ if (!isNonEmptyStringArray(value)) {
193
+ throw new Error(`PI WEB config allowedHosts must be true or an array of non-empty strings: ${path}`);
194
+ }
195
+ return value;
196
+ }
197
+ function parseAllowedHostsEnv(value) {
198
+ if (value === "true")
199
+ return true;
200
+ return value.split(",").map((host) => host.trim()).filter((host) => host !== "");
201
+ }
202
+ export function parsePathAccessConfig(value, path) {
203
+ if (!isRecord(value))
204
+ throw new Error(`PI WEB config pathAccess must be an object: ${path}`);
205
+ const allowedPaths = value["allowedPaths"];
206
+ return {
207
+ ...(allowedPaths !== undefined ? { allowedPaths: parseAllowedPaths(allowedPaths, path) } : {}),
208
+ };
209
+ }
210
+ function parseAllowedPaths(value, path) {
211
+ if (!isNonEmptyStringArray(value))
212
+ throw new Error(`PI WEB config pathAccess.allowedPaths must be an array of non-empty strings: ${path}`);
213
+ return value;
214
+ }
215
+ export function parseUploadsConfig(value, path) {
216
+ if (!isRecord(value))
217
+ throw new Error(`PI WEB config uploads must be an object: ${path}`);
218
+ const defaultFolder = value["defaultFolder"];
219
+ return {
220
+ ...(defaultFolder !== undefined ? { defaultFolder: parseWorkspaceRelativeFolder(defaultFolder, "uploads.defaultFolder", path) } : {}),
221
+ };
222
+ }
223
+ function parseWorkspaceRelativeFolder(value, key, path) {
224
+ if (typeof value !== "string" || value.trim() === "")
225
+ throw new Error(`PI WEB config ${key} must be a non-empty workspace-relative path: ${path}`);
226
+ if (isAbsoluteLike(value))
227
+ throw new Error(`PI WEB config ${key} must be workspace-relative: ${path}`);
228
+ const parts = value.split(/[\\/]+/).filter((part) => part !== "" && part !== ".");
229
+ if (parts.length === 0)
230
+ throw new Error(`PI WEB config ${key} must be a non-empty workspace-relative path: ${path}`);
231
+ if (parts.some((part) => part === ".."))
232
+ throw new Error(`PI WEB config ${key} must not contain path traversal: ${path}`);
233
+ return parts.join("/");
234
+ }
235
+ function isAbsoluteLike(value) {
236
+ const withForwardSlashes = value.replace(/\\/g, "/");
237
+ return isAbsolute(value) || withForwardSlashes.startsWith("/") || /^[A-Za-z]:\//.test(withForwardSlashes);
238
+ }
239
+ function parseShortcuts(value, path) {
240
+ if (!isRecord(value))
241
+ throw new Error(`PI WEB config shortcuts must be an object: ${path}`);
242
+ return Object.fromEntries(Object.entries(value).map(([actionId, shortcut]) => {
243
+ if (shortcut !== null && (typeof shortcut !== "string" || shortcut === "")) {
244
+ throw new Error(`PI WEB config shortcut values must be non-empty strings or null: ${path}`);
245
+ }
246
+ return [actionId, shortcut];
247
+ }));
248
+ }
249
+ function parsePlugins(value, path) {
250
+ if (!isRecord(value) || Array.isArray(value))
251
+ throw new Error(`PI WEB config plugins must be an object: ${path}`);
252
+ return Object.fromEntries(Object.entries(value).map(([pluginId, config]) => {
253
+ if (!isOmpWebPluginId(pluginId))
254
+ throw new Error(`PI WEB config plugin ids must match ${ompWebPluginIdPattern.source}: ${path}`);
255
+ if (!isRecord(config) || Array.isArray(config))
256
+ throw new Error(`PI WEB config plugin entries must be objects: ${path}`);
257
+ const enabled = config["enabled"];
258
+ if (enabled !== undefined && typeof enabled !== "boolean")
259
+ throw new Error(`PI WEB config plugin enabled values must be booleans: ${path}`);
260
+ const settings = config["settings"];
261
+ if (settings !== undefined && (!isRecord(settings) || Array.isArray(settings)))
262
+ throw new Error(`PI WEB config plugin settings must be objects: ${path}`);
263
+ return [pluginId, config];
264
+ }));
265
+ }
266
+ function isNonEmptyStringArray(value) {
267
+ return Array.isArray(value) && value.every((item) => typeof item === "string" && item !== "");
268
+ }
269
+ export function exampleOmpWebConfig(config = {}) {
270
+ return `${JSON.stringify({ host: config.host ?? "127.0.0.1", port: config.port ?? 8504, allowedHosts: config.allowedHosts ?? [] }, null, 2)}\n`;
271
+ }
272
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,211 @@
1
+ export const OMP_WEB_DOCKER_USER_COMMANDS = [
2
+ "install",
3
+ "start",
4
+ "stop",
5
+ "restart",
6
+ "restart-web",
7
+ "restart-sessiond",
8
+ "update",
9
+ "status",
10
+ "logs",
11
+ "shell",
12
+ "doctor",
13
+ "cli",
14
+ ];
15
+ const noArgumentCommands = new Set([
16
+ "start",
17
+ "stop",
18
+ "restart",
19
+ "restart-web",
20
+ "restart-sessiond",
21
+ "update",
22
+ "status",
23
+ "doctor",
24
+ "help",
25
+ ]);
26
+ const commands = new Set([...OMP_WEB_DOCKER_USER_COMMANDS, "help"]);
27
+ const logsTargets = new Set(["web", "sessiond", "data-init"]);
28
+ const shellTargets = new Set(["web", "sessiond"]);
29
+ export function ompWebDockerCommandPrefix(mode) {
30
+ return mode === "dev" ? "omp-web-docker --dev" : "omp-web-docker";
31
+ }
32
+ export function ompWebDockerCommand(mode, command) {
33
+ return `${ompWebDockerCommandPrefix(mode)} ${command}`;
34
+ }
35
+ export function planOmpWebDockerRuntimeHostCommand(plan) {
36
+ if (plan.mode !== "runtime")
37
+ return undefined;
38
+ switch (plan.command) {
39
+ case "install":
40
+ return { kind: "installer", action: "install", args: [...plan.args], useRuntimeRootAsInstallDir: false };
41
+ case "update":
42
+ return { kind: "installer", action: "update", args: [], useRuntimeRootAsInstallDir: true };
43
+ case "start":
44
+ return composeHostPlan("up", "-d");
45
+ case "stop":
46
+ return composeHostPlan("down");
47
+ case "restart":
48
+ return composeHostPlan("restart", "web", "sessiond");
49
+ case "restart-web":
50
+ return composeHostPlan("restart", "web");
51
+ case "restart-sessiond":
52
+ return composeHostPlan("restart", "sessiond");
53
+ case "status":
54
+ return composeHostPlan("ps");
55
+ case "logs":
56
+ return plan.target === undefined ? composeHostPlan("logs", "-f") : composeHostPlan("logs", "-f", plan.target);
57
+ case "shell":
58
+ return composeHostPlan("exec", plan.target ?? "web", "bash");
59
+ case "cli":
60
+ return { kind: "compose", args: ["exec", "web", "omp-web", ...plan.args] };
61
+ case "doctor":
62
+ return { kind: "diagnostics" };
63
+ case "help":
64
+ return { kind: "usage" };
65
+ }
66
+ }
67
+ export function planOmpWebDockerDevHostCommand(plan) {
68
+ if (plan.mode !== "dev")
69
+ return undefined;
70
+ switch (plan.command) {
71
+ case "install":
72
+ return undefined;
73
+ case "start":
74
+ return devComposeHostPlan("up", "-d", "--build");
75
+ case "stop":
76
+ return devComposeHostPlan("down");
77
+ case "restart":
78
+ return devComposeHostPlan("restart", "web", "sessiond");
79
+ case "restart-web":
80
+ return devComposeHostPlan("restart", "web");
81
+ case "restart-sessiond":
82
+ return devComposeHostPlan("restart", "sessiond");
83
+ case "update":
84
+ return {
85
+ kind: "composeSequence",
86
+ usesGeneratedEnv: true,
87
+ steps: [
88
+ { args: ["build", "--pull"] },
89
+ { args: ["up", "-d", "--force-recreate", "--remove-orphans"] },
90
+ ],
91
+ };
92
+ case "status":
93
+ return devComposeHostPlan("ps");
94
+ case "logs":
95
+ return plan.target === undefined ? devComposeHostPlan("logs", "-f") : devComposeHostPlan("logs", "-f", plan.target);
96
+ case "shell":
97
+ return devComposeHostPlan("exec", plan.target ?? "web", "bash");
98
+ case "cli":
99
+ return { kind: "compose", args: ["exec", "web", "omp-web", ...plan.args], usesGeneratedEnv: true };
100
+ case "doctor":
101
+ return { kind: "diagnostics", usesGeneratedEnv: true };
102
+ case "help":
103
+ return { kind: "usage" };
104
+ }
105
+ }
106
+ export function validateOmpWebDockerDevRootSafety(plan, uid) {
107
+ if (plan.mode !== "dev" || plan.allowRoot || plan.command === "help" || uid !== 0)
108
+ return undefined;
109
+ return "refusing to run Docker development mode as root; retry with --allow-root if this is intentional";
110
+ }
111
+ export function parseOmpWebDockerArgs(argv) {
112
+ let mode = "runtime";
113
+ let allowRoot = false;
114
+ let index = 0;
115
+ for (; index < argv.length; index += 1) {
116
+ const arg = argv[index];
117
+ if (arg === undefined)
118
+ break;
119
+ if (arg === "--") {
120
+ index += 1;
121
+ break;
122
+ }
123
+ if (arg === "--dev") {
124
+ mode = "dev";
125
+ continue;
126
+ }
127
+ if (arg === "--allow-root") {
128
+ allowRoot = true;
129
+ continue;
130
+ }
131
+ if (arg === "--help" || arg === "-h") {
132
+ return { ok: true, plan: { mode, command: "help", allowRoot, args: [] } };
133
+ }
134
+ if (arg.startsWith("-")) {
135
+ return { ok: false, errors: [`Unknown global option: ${arg}`] };
136
+ }
137
+ break;
138
+ }
139
+ const commandValue = argv[index];
140
+ if (commandValue === undefined)
141
+ return { ok: false, errors: ["Missing command"] };
142
+ if (!isOmpWebDockerCommand(commandValue))
143
+ return { ok: false, errors: [`Unknown command: ${commandValue}`] };
144
+ const args = argv.slice(index + 1);
145
+ const plan = { mode, command: commandValue, allowRoot, args };
146
+ return validatePlan(withDefaultTarget(plan));
147
+ }
148
+ function composeHostPlan(...args) {
149
+ return { kind: "compose", args };
150
+ }
151
+ function devComposeHostPlan(...args) {
152
+ return { kind: "compose", args, usesGeneratedEnv: true };
153
+ }
154
+ function withDefaultTarget(plan) {
155
+ if (plan.command === "shell" && plan.target === undefined && plan.args.length === 0)
156
+ return { ...plan, target: "web" };
157
+ return plan;
158
+ }
159
+ function validatePlan(plan) {
160
+ const errors = [];
161
+ if (plan.command === "install" && plan.mode === "dev") {
162
+ errors.push("install is only available in runtime mode");
163
+ }
164
+ if (noArgumentCommands.has(plan.command) && plan.args.length > 0) {
165
+ errors.push(`${plan.command} does not accept positional arguments`);
166
+ }
167
+ if (plan.command === "logs") {
168
+ validateOptionalTarget(plan.args, isLogsTarget, "logs", errors);
169
+ if (plan.args[0] === "data-init" && plan.mode !== "dev")
170
+ errors.push("logs data-init is only available in development mode");
171
+ }
172
+ if (plan.command === "shell") {
173
+ validateOptionalTarget(plan.args, isShellTarget, "shell", errors);
174
+ }
175
+ if (plan.command === "cli" && plan.args.length === 0) {
176
+ errors.push("cli requires omp-web arguments");
177
+ }
178
+ if (errors.length > 0)
179
+ return { ok: false, errors };
180
+ const target = targetFrom(plan.command, plan.args);
181
+ return { ok: true, plan: target === undefined ? plan : { ...plan, target } };
182
+ }
183
+ function validateOptionalTarget(args, isAllowed, command, errors) {
184
+ if (args.length > 1) {
185
+ errors.push(`${command} accepts at most one target`);
186
+ return;
187
+ }
188
+ const [target] = args;
189
+ if (target !== undefined && !isAllowed(target))
190
+ errors.push(`Invalid ${command} target: ${target}`);
191
+ }
192
+ function targetFrom(command, args) {
193
+ const [target] = args;
194
+ if (target === undefined)
195
+ return command === "shell" ? "web" : undefined;
196
+ if (command === "logs" && isLogsTarget(target))
197
+ return target;
198
+ if (command === "shell" && isShellTarget(target))
199
+ return target;
200
+ return undefined;
201
+ }
202
+ function isOmpWebDockerCommand(value) {
203
+ return commands.has(value);
204
+ }
205
+ function isLogsTarget(value) {
206
+ return logsTargets.has(value);
207
+ }
208
+ function isShellTarget(value) {
209
+ return shellTargets.has(value);
210
+ }
211
+ //# sourceMappingURL=ompWebDockerCommandPlan.js.map