@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.
- package/LICENSE +21 -0
- package/README.md +181 -0
- package/dist/cli/doctor.js +118 -0
- package/dist/cli/doctor.js.map +1 -0
- package/dist/cli/serviceTemplates.js +55 -0
- package/dist/cli/serviceTemplates.js.map +1 -0
- package/dist/cli/types.js +2 -0
- package/dist/cli/types.js.map +1 -0
- package/dist/cli.js +872 -0
- package/dist/cli.js.map +1 -0
- package/dist/client/assets/CodeViewer-CJNBz-Ox.js +4 -0
- package/dist/client/assets/TerminalPanel-B9-LUv7E.js +126 -0
- package/dist/client/assets/UnifiedDiffViewer-BUqme4se.js +34 -0
- package/dist/client/assets/index-DGBYb2j9.css +1 -0
- package/dist/client/assets/index-uWm_YNRB.js +4427 -0
- package/dist/client/assets/vendor-editor-core-D9EJm1dE.js +10 -0
- package/dist/client/assets/vendor-editor-languages-N6dcxgRO.js +26 -0
- package/dist/client/assets/vendor-terminal-DDGTF8rc.css +1 -0
- package/dist/client/assets/vendor-terminal-DjQ08hXu.js +16 -0
- package/dist/client/favicon-16x16.png +0 -0
- package/dist/client/favicon-180x180.png +0 -0
- package/dist/client/favicon-192x192.png +0 -0
- package/dist/client/favicon-32x32.png +0 -0
- package/dist/client/favicon-512x512.png +0 -0
- package/dist/client/favicon.ico +0 -0
- package/dist/client/favicon.png +0 -0
- package/dist/client/favicon.svg +11 -0
- package/dist/client/index.html +68 -0
- package/dist/client/manifest.webmanifest +36 -0
- package/dist/client-react/assets/index-BQ6zLLfz.js +51 -0
- package/dist/client-react/assets/index-Befs78HG.css +1 -0
- package/dist/client-react/index.html +16 -0
- package/dist/config.js +272 -0
- package/dist/config.js.map +1 -0
- package/dist/docker/ompWebDockerCommandPlan.js +211 -0
- package/dist/docker/ompWebDockerCommandPlan.js.map +1 -0
- package/dist/docker/piWebDockerCommandPlan.js +211 -0
- package/dist/docker/piWebDockerCommandPlan.js.map +1 -0
- package/dist/omp-web-plugins/info/omp-web-plugin.js +51 -0
- package/dist/omp-web-plugins/info/package.json +9 -0
- package/dist/omp-web-plugins/schedule-prompts/omp-web-plugin.js +43 -0
- package/dist/omp-web-plugins/schedule-prompts/package.json +9 -0
- package/dist/omp-web-plugins/schedule-prompts/schedulePromptsPanelElement.js +242 -0
- package/dist/omp-web-plugins/schedule-prompts/types.js +2 -0
- package/dist/omp-web-plugins/updates/omp-web-plugin.js +173 -0
- package/dist/omp-web-plugins/updates/package.json +9 -0
- package/dist/omp-web-plugins/updates/updatesLogic.js +97 -0
- package/dist/ompWebVersionReport.js +217 -0
- package/dist/ompWebVersionReport.js.map +1 -0
- package/dist/pi-web-plugins/info/package.json +9 -0
- package/dist/pi-web-plugins/info/pi-web-plugin.js +51 -0
- package/dist/pi-web-plugins/schedule-prompts/package.json +9 -0
- package/dist/pi-web-plugins/schedule-prompts/pi-web-plugin.js +43 -0
- package/dist/pi-web-plugins/schedule-prompts/schedulePromptsPanelElement.js +226 -0
- package/dist/pi-web-plugins/schedule-prompts/types.js +2 -0
- package/dist/pi-web-plugins/updates/package.json +9 -0
- package/dist/pi-web-plugins/updates/pi-web-plugin.js +173 -0
- package/dist/pi-web-plugins/updates/updatesLogic.js +97 -0
- package/dist/piWebVersionReport.js +225 -0
- package/dist/piWebVersionReport.js.map +1 -0
- package/dist/plugin-api/unstable.d.ts +22 -0
- package/dist/plugin-api.d.ts +197 -0
- package/dist/server/activity/workspaceActivityRoutes.js +4 -0
- package/dist/server/activity/workspaceActivityRoutes.js.map +1 -0
- package/dist/server/activity/workspaceActivityService.js +98 -0
- package/dist/server/activity/workspaceActivityService.js.map +1 -0
- package/dist/server/app.js +217 -0
- package/dist/server/app.js.map +1 -0
- package/dist/server/configRoutes.js +278 -0
- package/dist/server/configRoutes.js.map +1 -0
- package/dist/server/diagnostics/nodePtySpawnHelper.js +130 -0
- package/dist/server/diagnostics/nodePtySpawnHelper.js.map +1 -0
- package/dist/server/git/gitEnv.js +15 -0
- package/dist/server/git/gitEnv.js.map +1 -0
- package/dist/server/git/gitService.js +119 -0
- package/dist/server/git/gitService.js.map +1 -0
- package/dist/server/gitRoutes.js +29 -0
- package/dist/server/gitRoutes.js.map +1 -0
- package/dist/server/index.js +16 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/machines/machineClient.js +162 -0
- package/dist/server/machines/machineClient.js.map +1 -0
- package/dist/server/machines/machinePluginProxyRoutes.js +151 -0
- package/dist/server/machines/machinePluginProxyRoutes.js.map +1 -0
- package/dist/server/machines/machineProxyRoutes.js +152 -0
- package/dist/server/machines/machineProxyRoutes.js.map +1 -0
- package/dist/server/machines/machineRoutes.js +61 -0
- package/dist/server/machines/machineRoutes.js.map +1 -0
- package/dist/server/machines/machineService.js +230 -0
- package/dist/server/machines/machineService.js.map +1 -0
- package/dist/server/machines/machineStore.js +123 -0
- package/dist/server/machines/machineStore.js.map +1 -0
- package/dist/server/machines/proxyUtils.js +39 -0
- package/dist/server/machines/proxyUtils.js.map +1 -0
- package/dist/server/ompWebPluginService.js +298 -0
- package/dist/server/ompWebPluginService.js.map +1 -0
- package/dist/server/ompWebStatus.js +604 -0
- package/dist/server/ompWebStatus.js.map +1 -0
- package/dist/server/ompWebStatusCache.js +31 -0
- package/dist/server/ompWebStatusCache.js.map +1 -0
- package/dist/server/piPackageRoutes.js +85 -0
- package/dist/server/piPackageRoutes.js.map +1 -0
- package/dist/server/piPackageService.js +65 -0
- package/dist/server/piPackageService.js.map +1 -0
- package/dist/server/piWebPluginService.js +283 -0
- package/dist/server/piWebPluginService.js.map +1 -0
- package/dist/server/piWebStatus.js +602 -0
- package/dist/server/piWebStatus.js.map +1 -0
- package/dist/server/piWebStatusCache.js +32 -0
- package/dist/server/piWebStatusCache.js.map +1 -0
- package/dist/server/projects/directorySuggestions.js +37 -0
- package/dist/server/projects/directorySuggestions.js.map +1 -0
- package/dist/server/projects/projectService.js +31 -0
- package/dist/server/projects/projectService.js.map +1 -0
- package/dist/server/push/PushNotificationService.js +137 -0
- package/dist/server/push/PushNotificationService.js.map +1 -0
- package/dist/server/push/pushRoutes.js +50 -0
- package/dist/server/push/pushRoutes.js.map +1 -0
- package/dist/server/realtime/honoRealtimeSocket.js +32 -0
- package/dist/server/realtime/honoRealtimeSocket.js.map +1 -0
- package/dist/server/realtime/sessionEventHub.js +39 -0
- package/dist/server/realtime/sessionEventHub.js.map +1 -0
- package/dist/server/sessiond/sessionProxyRoutes.js +85 -0
- package/dist/server/sessiond/sessionProxyRoutes.js.map +1 -0
- package/dist/server/sessiond.js +104 -0
- package/dist/server/sessiond.js.map +1 -0
- package/dist/server/sessions/attachmentService.js +112 -0
- package/dist/server/sessions/attachmentService.js.map +1 -0
- package/dist/server/sessions/authProviderOptions.js +52 -0
- package/dist/server/sessions/authProviderOptions.js.map +1 -0
- package/dist/server/sessions/authRoutes.js +75 -0
- package/dist/server/sessions/authRoutes.js.map +1 -0
- package/dist/server/sessions/authService.js +105 -0
- package/dist/server/sessions/authService.js.map +1 -0
- package/dist/server/sessions/builtinCommands.js +31 -0
- package/dist/server/sessions/builtinCommands.js.map +1 -0
- package/dist/server/sessions/editPreview.js +196 -0
- package/dist/server/sessions/editPreview.js.map +1 -0
- package/dist/server/sessions/editTool.js +46 -0
- package/dist/server/sessions/editTool.js.map +1 -0
- package/dist/server/sessions/messagePaging.js +41 -0
- package/dist/server/sessions/messagePaging.js.map +1 -0
- package/dist/server/sessions/oauthLoginFlowService.js +136 -0
- package/dist/server/sessions/oauthLoginFlowService.js.map +1 -0
- package/dist/server/sessions/piAgentSession.js +472 -0
- package/dist/server/sessions/piAgentSession.js.map +1 -0
- package/dist/server/sessions/piSessionManagerGateway.js +133 -0
- package/dist/server/sessions/piSessionManagerGateway.js.map +1 -0
- package/dist/server/sessions/piSessionService.js +1737 -0
- package/dist/server/sessions/piSessionService.js.map +1 -0
- package/dist/server/sessions/schedulePrompt/schedulePromptService.js +46 -0
- package/dist/server/sessions/schedulePrompt/schedulePromptService.js.map +1 -0
- package/dist/server/sessions/schedulePrompt/scheduler.js +317 -0
- package/dist/server/sessions/schedulePrompt/scheduler.js.map +1 -0
- package/dist/server/sessions/schedulePrompt/storage.js +118 -0
- package/dist/server/sessions/schedulePrompt/storage.js.map +1 -0
- package/dist/server/sessions/schedulePrompt/tool.js +251 -0
- package/dist/server/sessions/schedulePrompt/tool.js.map +1 -0
- package/dist/server/sessions/schedulePrompt/types.js +2 -0
- package/dist/server/sessions/schedulePrompt/types.js.map +1 -0
- package/dist/server/sessions/sessionArchiveHelpers.js +186 -0
- package/dist/server/sessions/sessionArchiveHelpers.js.map +1 -0
- package/dist/server/sessions/sessionArchiveStore.js +254 -0
- package/dist/server/sessions/sessionArchiveStore.js.map +1 -0
- package/dist/server/sessions/sessionArchiveTree.js +35 -0
- package/dist/server/sessions/sessionArchiveTree.js.map +1 -0
- package/dist/server/sessions/sessionCleanup.js +157 -0
- package/dist/server/sessions/sessionCleanup.js.map +1 -0
- package/dist/server/sessions/sessionCommandService.js +349 -0
- package/dist/server/sessions/sessionCommandService.js.map +1 -0
- package/dist/server/sessions/sessionEventMapper.js +115 -0
- package/dist/server/sessions/sessionEventMapper.js.map +1 -0
- package/dist/server/sessions/sessionNameGenerator.js +61 -0
- package/dist/server/sessions/sessionNameGenerator.js.map +1 -0
- package/dist/server/sessions/sessionRoutes.js +419 -0
- package/dist/server/sessions/sessionRoutes.js.map +1 -0
- package/dist/server/sessions/sessionRuntimeStore.js +2 -0
- package/dist/server/sessions/sessionRuntimeStore.js.map +1 -0
- package/dist/server/sessions/spawnSessionTool.js +41 -0
- package/dist/server/sessions/spawnSessionTool.js.map +1 -0
- package/dist/server/sessions/spawnSubsessionTool.js +203 -0
- package/dist/server/sessions/spawnSubsessionTool.js.map +1 -0
- package/dist/server/sessions/spawnTargetResolver.js +36 -0
- package/dist/server/sessions/spawnTargetResolver.js.map +1 -0
- package/dist/server/sessions/subsessionLinks.js +171 -0
- package/dist/server/sessions/subsessionLinks.js.map +1 -0
- package/dist/server/sessions/subsessionTranscript.js +233 -0
- package/dist/server/sessions/subsessionTranscript.js.map +1 -0
- package/dist/server/storage/projectStore.js +83 -0
- package/dist/server/storage/projectStore.js.map +1 -0
- package/dist/server/terminalProxyRoutes.js +168 -0
- package/dist/server/terminalProxyRoutes.js.map +1 -0
- package/dist/server/terminals/terminalRoutes.js +177 -0
- package/dist/server/terminals/terminalRoutes.js.map +1 -0
- package/dist/server/terminals/terminalService.js +309 -0
- package/dist/server/terminals/terminalService.js.map +1 -0
- package/dist/server/terminals/terminalSize.js +17 -0
- package/dist/server/terminals/terminalSize.js.map +1 -0
- package/dist/server/testUtils.js +43 -0
- package/dist/server/testUtils.js.map +1 -0
- package/dist/server/types.js +2 -0
- package/dist/server/types.js.map +1 -0
- package/dist/server/utils.js +2 -0
- package/dist/server/utils.js.map +1 -0
- package/dist/server/webSocketBridge.js +55 -0
- package/dist/server/webSocketBridge.js.map +1 -0
- package/dist/server/workingDirectory.js +44 -0
- package/dist/server/workingDirectory.js.map +1 -0
- package/dist/server/workspaceExplorerRoutes.js +148 -0
- package/dist/server/workspaceExplorerRoutes.js.map +1 -0
- package/dist/server/workspaces/effectivePathAccess.js +27 -0
- package/dist/server/workspaces/effectivePathAccess.js.map +1 -0
- package/dist/server/workspaces/fileContentService.js +200 -0
- package/dist/server/workspaces/fileContentService.js.map +1 -0
- package/dist/server/workspaces/fileSuggestions.js +512 -0
- package/dist/server/workspaces/fileSuggestions.js.map +1 -0
- package/dist/server/workspaces/fileTreeService.js +27 -0
- package/dist/server/workspaces/fileTreeService.js.map +1 -0
- package/dist/server/workspaces/gitWorktreeDiscovery.js +34 -0
- package/dist/server/workspaces/gitWorktreeDiscovery.js.map +1 -0
- package/dist/server/workspaces/imagePreviewService.js +40 -0
- package/dist/server/workspaces/imagePreviewService.js.map +1 -0
- package/dist/server/workspaces/pathAccessPolicy.js +87 -0
- package/dist/server/workspaces/pathAccessPolicy.js.map +1 -0
- package/dist/server/workspaces/pathSafety.js +54 -0
- package/dist/server/workspaces/pathSafety.js.map +1 -0
- package/dist/server/workspaces/projectOmpWebConfig.js +56 -0
- package/dist/server/workspaces/projectOmpWebConfig.js.map +1 -0
- package/dist/server/workspaces/projectPiWebConfig.js +61 -0
- package/dist/server/workspaces/projectPiWebConfig.js.map +1 -0
- package/dist/server/workspaces/workspaceContext.js +8 -0
- package/dist/server/workspaces/workspaceContext.js.map +1 -0
- package/dist/server/workspaces/workspaceDeletionRoutes.js +113 -0
- package/dist/server/workspaces/workspaceDeletionRoutes.js.map +1 -0
- package/dist/server/workspaces/workspaceService.js +39 -0
- package/dist/server/workspaces/workspaceService.js.map +1 -0
- package/dist/sessiond/config.js +9 -0
- package/dist/sessiond/config.js.map +1 -0
- package/dist/sessiond/sessionDaemonClient.js +34 -0
- package/dist/sessiond/sessionDaemonClient.js.map +1 -0
- package/dist/shared/activity.js +26 -0
- package/dist/shared/activity.js.map +1 -0
- package/dist/shared/apiTypes.d.ts +769 -0
- package/dist/shared/apiTypes.js +11 -0
- package/dist/shared/apiTypes.js.map +1 -0
- package/dist/shared/capabilities.js +52 -0
- package/dist/shared/capabilities.js.map +1 -0
- package/dist/shared/federatedRoutes.js +81 -0
- package/dist/shared/federatedRoutes.js.map +1 -0
- package/dist/shared/machinePluginIds.js +41 -0
- package/dist/shared/machinePluginIds.js.map +1 -0
- package/dist/shared/ompWebStatusParsing.js +100 -0
- package/dist/shared/ompWebStatusParsing.js.map +1 -0
- package/dist/shared/piWebStatusParsing.js +102 -0
- package/dist/shared/piWebStatusParsing.js.map +1 -0
- package/dist/shared/pluginIds.js +5 -0
- package/dist/shared/pluginIds.js.map +1 -0
- package/dist/shared/promptAttachments.js +90 -0
- package/dist/shared/promptAttachments.js.map +1 -0
- package/dist/shared/thinkingLevels.d.ts +19 -0
- package/dist/shared/thinkingLevels.js +24 -0
- package/dist/shared/thinkingLevels.js.map +1 -0
- package/dist/shared/utils.js +10 -0
- package/dist/shared/utils.js.map +1 -0
- package/dist/shared/workspaceDeletion.js +12 -0
- package/dist/shared/workspaceDeletion.js.map +1 -0
- package/dist/shared/workspaceFiles.js +3 -0
- package/dist/shared/workspaceFiles.js.map +1 -0
- package/docs/assets/favicon.svg +11 -0
- package/docs/assets/omp-web-banner.png +0 -0
- package/docs/assets/omp-web-desktop.png +0 -0
- package/docs/assets/omp-web-mobile.png +0 -0
- package/docs/assets/omp-web-tablet.png +0 -0
- package/docs/config.md +208 -0
- package/docs/plugins.md +916 -0
- package/extensions/omp-web.ts +133 -0
- package/install.sh +5 -0
- package/package.json +134 -0
- package/plugin-api/unstable.d.ts +1 -0
- package/plugin-api.d.ts +1 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Ruan Lima da Silva
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
# OMP WEB
|
|
2
|
+
|
|
3
|
+
[](https://github.com/theruansilva/omp-web/actions/workflows/ci.yml)
|
|
4
|
+
[](https://www.npmjs.com/package/@theruansilva/omp-web)
|
|
5
|
+
[](package.json)
|
|
6
|
+
[](LICENSE)
|
|
7
|
+
|
|
8
|
+
**OMP WEB is a web UI for [Pi Coding Agent](https://github.com/earendil-works/pi/tree/main/packages/coding-agent) that keeps agent sessions running in real workspaces on your machine or server.**
|
|
9
|
+
|
|
10
|
+
Run agents where your code, tools, credentials, and build caches live. Supervise them from any browser.
|
|
11
|
+
|
|
12
|
+
Website and docs: <https://omp-web.dev/>
|
|
13
|
+
|
|
14
|
+

|
|
15
|
+
|
|
16
|
+

|
|
17
|
+
|
|
18
|
+
## Why OMP WEB?
|
|
19
|
+
|
|
20
|
+
Agentic development works better when the work environment is persistent.
|
|
21
|
+
|
|
22
|
+
OMP WEB lets you:
|
|
23
|
+
|
|
24
|
+
- keep Oh My Pi Coding Agent sessions alive after browser disconnects;
|
|
25
|
+
- run agents inside real repositories and git worktrees;
|
|
26
|
+
- supervise multiple sessions in parallel;
|
|
27
|
+
- switch between laptop, phone, tablet, and desktop;
|
|
28
|
+
- use a server, workstation, or remote dev box as your agent runtime;
|
|
29
|
+
- manage projects, workspaces, files, terminals, sessions, and remote machines from one web UI.
|
|
30
|
+
|
|
31
|
+
Your browser is the control surface. The work stays where it can keep running.
|
|
32
|
+
|
|
33
|
+
## Quick start
|
|
34
|
+
|
|
35
|
+
Requirements:
|
|
36
|
+
|
|
37
|
+
- Bun 1.1 or newer
|
|
38
|
+
- Oh My Pi Coding Agent configured for your user
|
|
39
|
+
- git and the development tools your agents need
|
|
40
|
+
|
|
41
|
+
Install and start OMP WEB as per-user services:
|
|
42
|
+
|
|
43
|
+
```bash
|
|
44
|
+
bun install -g @theruansilva/omp-web
|
|
45
|
+
omp-web install
|
|
46
|
+
omp-web doctor
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
Then open:
|
|
50
|
+
|
|
51
|
+
```text
|
|
52
|
+
http://127.0.0.1:8504
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
Useful commands:
|
|
56
|
+
|
|
57
|
+
```bash
|
|
58
|
+
omp-web status
|
|
59
|
+
omp-web logs
|
|
60
|
+
omp-web restart
|
|
61
|
+
omp-web doctor
|
|
62
|
+
omp-web version
|
|
63
|
+
omp-web uninstall
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
For more install options, including one-line install, Pi package install, WSL/manual usage, and remote access, see the [installation guide](https://omp-web.dev/install).
|
|
67
|
+
|
|
68
|
+
## Core model
|
|
69
|
+
|
|
70
|
+
OMP WEB organizes work like this:
|
|
71
|
+
|
|
72
|
+
```text
|
|
73
|
+
Machine a local or remote OMP WEB runtime endpoint
|
|
74
|
+
Project a folder on that machine
|
|
75
|
+
Workspace a git worktree, or the project folder for non-git projects
|
|
76
|
+
Session a Pi Coding Agent chat running inside a workspace
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
A typical flow:
|
|
80
|
+
|
|
81
|
+
1. Add a project.
|
|
82
|
+
2. Choose a workspace or git worktree.
|
|
83
|
+
3. Start a session.
|
|
84
|
+
4. Let the agent work.
|
|
85
|
+
5. Come back later from any browser.
|
|
86
|
+
|
|
87
|
+
## Remote-first development
|
|
88
|
+
|
|
89
|
+
OMP WEB is designed for remote AI-driven development.
|
|
90
|
+
|
|
91
|
+
Instead of tying agent work to your laptop session, run OMP WEB on a machine that stays available: a server, desktop, cloud VM, home lab machine, or remote dev box.
|
|
92
|
+
|
|
93
|
+
Use a private network, SSH tunnel, trusted reverse proxy, or federated OMP WEB machine setup when accessing it remotely.
|
|
94
|
+
|
|
95
|
+
Read more: [Remote-first development](https://omp-web.dev/remote-first)
|
|
96
|
+
|
|
97
|
+
## Machines and fleets
|
|
98
|
+
|
|
99
|
+
OMP WEB can register other OMP WEB runtimes as remote machines. One browser-facing OMP WEB instance can proxy projects, files, git state, sessions, terminals, activity, Pi package management, and selected-machine settings from trusted remote machines.
|
|
100
|
+
|
|
101
|
+
When a remote machine is selected, Settings tabs label their target. Pi packages, OMP WEB plugin enablement, session daemon toggles, external file access, and upload defaults target the selected machine. Gateway/server settings such as host, port, allowed hosts, registered machines/tokens, and keyboard shortcuts stay local to the gateway/browser.
|
|
102
|
+
|
|
103
|
+
Read more: [Fleet and machines guide](https://omp-web.dev/machines)
|
|
104
|
+
|
|
105
|
+
## Plugins
|
|
106
|
+
|
|
107
|
+
OMP WEB supports trusted browser-side OMP WEB plugins that can add actions, workspace panels, and workspace metadata.
|
|
108
|
+
|
|
109
|
+
Pi packages are managed separately through Pi's package manager or **Settings → Pi packages**. In a federated setup, the Pi packages panel targets the selected machine and labels where installs, updates, or removals will run. Use **Settings → OMP WEB plugins** to enable or disable discovered browser plugins on the selected machine.
|
|
110
|
+
|
|
111
|
+
After installing, updating, or removing a Pi package, type `/reload` in each idle OMP WEB session on that machine to refresh Pi runtime resources such as extensions, skills, prompt templates, themes, and context/system prompt files. Reload the browser page separately for newly discovered or changed OMP WEB plugins.
|
|
112
|
+
|
|
113
|
+
Read more: [Plugin API](https://omp-web.dev/plugins)
|
|
114
|
+
|
|
115
|
+
## Configuration
|
|
116
|
+
|
|
117
|
+
Global config lives at:
|
|
118
|
+
|
|
119
|
+
```text
|
|
120
|
+
$OMP_WEB_CONFIG
|
|
121
|
+
~/.config/omp-web/config.json
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
Project-local OMP WEB config lives at:
|
|
125
|
+
|
|
126
|
+
```text
|
|
127
|
+
<project>/.omp-web/config.json
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
Common configuration includes host/port, path access, uploads, OMP WEB plugin enablement, shortcuts, and session daemon options. In Settings, machine-affecting config targets the selected machine; gateway host/port/allowed-hosts, remote machine registration, tokens, and keyboard shortcuts stay local.
|
|
131
|
+
|
|
132
|
+
Read more: [Configuration reference](https://omp-web.dev/config)
|
|
133
|
+
|
|
134
|
+
## Development
|
|
135
|
+
|
|
136
|
+
Clone the repository and run:
|
|
137
|
+
|
|
138
|
+
```bash
|
|
139
|
+
bun install
|
|
140
|
+
bun run dev
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
Open the Vite URL, usually:
|
|
144
|
+
|
|
145
|
+
```text
|
|
146
|
+
http://localhost:8505
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
For the split development setup:
|
|
150
|
+
|
|
151
|
+
```bash
|
|
152
|
+
bun run dev:sessiond
|
|
153
|
+
bun run dev:web
|
|
154
|
+
bun run dev:client
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
Validate changes with:
|
|
158
|
+
|
|
159
|
+
```bash
|
|
160
|
+
bun run verify
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
## Security model
|
|
164
|
+
|
|
165
|
+
OMP WEB assumes trusted users, trusted repositories, and trusted server paths.
|
|
166
|
+
|
|
167
|
+
It is not a sandbox, permission system, or multi-tenant platform. Do not expose it directly to the public internet without a trusted network, firewall, VPN, SSH tunnel, or authenticated reverse proxy.
|
|
168
|
+
|
|
169
|
+
## Documentation
|
|
170
|
+
|
|
171
|
+
- [Website](https://omp-web.dev/)
|
|
172
|
+
- [Install](https://omp-web.dev/install)
|
|
173
|
+
- [Remote-first development](https://omp-web.dev/remote-first)
|
|
174
|
+
- [Machines / fleet](https://omp-web.dev/machines)
|
|
175
|
+
- [Configuration](https://omp-web.dev/config)
|
|
176
|
+
- [Plugins](https://omp-web.dev/plugins)
|
|
177
|
+
- [FAQ](https://omp-web.dev/faq)
|
|
178
|
+
|
|
179
|
+
## License
|
|
180
|
+
|
|
181
|
+
MIT © 2026 Federico Jaramillo Martinez. See [LICENSE](LICENSE).
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import { userInfo } from "node:os";
|
|
2
|
+
import { printOmpWebVersionReport } from "../ompWebVersionReport.js";
|
|
3
|
+
export function capture(command, args) {
|
|
4
|
+
const proc = Bun.spawnSync([command, ...args]);
|
|
5
|
+
return {
|
|
6
|
+
status: proc.exitCode,
|
|
7
|
+
stdout: proc.stdout.toString(),
|
|
8
|
+
stderr: proc.stderr.toString(),
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
export function runChecks(checks) {
|
|
12
|
+
let failed = false;
|
|
13
|
+
for (const [label, command] of checks) {
|
|
14
|
+
const [bin, ...args] = command;
|
|
15
|
+
if (bin === undefined)
|
|
16
|
+
continue;
|
|
17
|
+
const result = capture(bin, args);
|
|
18
|
+
const ok = result.status === 0;
|
|
19
|
+
failed ||= !ok;
|
|
20
|
+
console.log(`${ok ? "✓" : "✗"} ${label}`);
|
|
21
|
+
printCheckOutput(result.stdout || result.stderr);
|
|
22
|
+
}
|
|
23
|
+
return !failed;
|
|
24
|
+
}
|
|
25
|
+
export function printCheckOutput(output) {
|
|
26
|
+
const trimmed = output.trim();
|
|
27
|
+
if (trimmed === "")
|
|
28
|
+
return;
|
|
29
|
+
const lines = trimmed.split("\n");
|
|
30
|
+
for (const line of lines.slice(0, 3))
|
|
31
|
+
console.log(` ${line}`);
|
|
32
|
+
if (lines.length > 3)
|
|
33
|
+
console.log(" ...");
|
|
34
|
+
}
|
|
35
|
+
export function printPathSetupAdvice(shellName) {
|
|
36
|
+
console.log("\nPATH setup advice:");
|
|
37
|
+
if (shellName === "bash") {
|
|
38
|
+
console.log(" Detected bash. Put PATH setup for node/version managers/tools in ~/.bash_profile or ~/.profile.");
|
|
39
|
+
console.log(" If ~/.bash_profile exists, bash will not read ~/.profile unless you source it from ~/.bash_profile.");
|
|
40
|
+
console.log(" Do not rely only on ~/.bashrc or prompt hooks for tools needed by services or agents.");
|
|
41
|
+
}
|
|
42
|
+
else if (shellName === "zsh") {
|
|
43
|
+
console.log(" Detected zsh. Put PATH setup for node/version managers/tools in ~/.zprofile, not only ~/.zshrc.");
|
|
44
|
+
console.log(" Avoid relying on prompt hooks; PI WEB services run non-interactive login shells.");
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
console.log(" Detected fish. Prefer universal PATH setup such as `fish_add_path -U ...` for tools needed by services or agents.");
|
|
48
|
+
console.log(" Avoid relying on prompt hooks; PI WEB services run non-interactive login shells.");
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
export function printOptionalDoctorChecks(deps) {
|
|
52
|
+
const shell = deps.serviceShellLabel();
|
|
53
|
+
const backend = deps.currentServiceBackend();
|
|
54
|
+
const checks = [[`${shell} can find optional ripgrep (rg)`, deps.serviceShellCommand(deps.commandCheck("rg"))]];
|
|
55
|
+
if (backend?.kind === "systemd")
|
|
56
|
+
checks.push([`systemd user ${shell} can find optional ripgrep (rg)`, deps.systemdUserServiceShellCommand(deps.commandCheck("rg"))]);
|
|
57
|
+
let missingOptionalTool = false;
|
|
58
|
+
for (const [label, command] of checks) {
|
|
59
|
+
const [bin, ...args] = command;
|
|
60
|
+
if (bin === undefined)
|
|
61
|
+
continue;
|
|
62
|
+
const result = capture(bin, args);
|
|
63
|
+
const ok = result.status === 0;
|
|
64
|
+
missingOptionalTool ||= !ok;
|
|
65
|
+
console.log(`${ok ? "✓" : "!"} ${label}`);
|
|
66
|
+
printCheckOutput(result.stdout || result.stderr);
|
|
67
|
+
}
|
|
68
|
+
if (missingOptionalTool) {
|
|
69
|
+
console.log(" Install ripgrep, or make rg visible to the service shell, for faster all-file @ suggestions.");
|
|
70
|
+
console.log(" PI WEB falls back to a bounded filesystem scan when rg is unavailable.");
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
export async function runDoctor(deps) {
|
|
74
|
+
const backend = deps.currentServiceBackend();
|
|
75
|
+
console.log(`Platform: ${deps.platformLabel()}`);
|
|
76
|
+
console.log(`Service backend: ${backend?.label ?? "manual run only"}`);
|
|
77
|
+
console.log(`Service shell: ${deps.describeServiceShell()}`);
|
|
78
|
+
if (backend === undefined) {
|
|
79
|
+
console.log(`- Native user service checks skipped on ${deps.platformLabel()}`);
|
|
80
|
+
}
|
|
81
|
+
console.log("");
|
|
82
|
+
await printOmpWebVersionReport();
|
|
83
|
+
console.log("\nDoctor checks:");
|
|
84
|
+
const ok = runChecks(deps.doctorChecks());
|
|
85
|
+
printOptionalDoctorChecks(deps);
|
|
86
|
+
if (deps.supportsSystemdUserServices()) {
|
|
87
|
+
const linger = deps.isLingerEnabled();
|
|
88
|
+
if (linger === true) {
|
|
89
|
+
console.log("✓ systemd user lingering enabled");
|
|
90
|
+
}
|
|
91
|
+
else if (linger === false) {
|
|
92
|
+
console.log("✗ systemd user lingering disabled");
|
|
93
|
+
console.log(` Recommended on servers: sudo loginctl enable-linger ${userInfo().username}`);
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
console.log("? systemd user lingering unknown");
|
|
97
|
+
console.log(` Recommended on servers: sudo loginctl enable-linger ${userInfo().username}`);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
else if (backend?.kind === "launchd") {
|
|
101
|
+
console.log("- user services start at login with LaunchAgents");
|
|
102
|
+
}
|
|
103
|
+
else {
|
|
104
|
+
console.log(`- systemd user lingering skipped on ${deps.platformLabel()}`);
|
|
105
|
+
}
|
|
106
|
+
if (!ok) {
|
|
107
|
+
console.log("\nIf a command works in your terminal but fails here, make sure your service shell login files set PATH the same way.");
|
|
108
|
+
if (backend?.kind === "systemd")
|
|
109
|
+
console.log("If a bundled entrypoint is not accessible, reinstall or update the PI WEB package.");
|
|
110
|
+
printPathSetupAdvice(deps.detectServiceShell().name);
|
|
111
|
+
}
|
|
112
|
+
if (ok && backend === undefined) {
|
|
113
|
+
console.log(`\n${deps.manualRunAdvice()}`);
|
|
114
|
+
}
|
|
115
|
+
if (!ok)
|
|
116
|
+
process.exitCode = 1;
|
|
117
|
+
}
|
|
118
|
+
//# sourceMappingURL=doctor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/cli/doctor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { join } from "node:path";
|
|
2
|
+
export function dependencyLine(name, ids, serviceRefs) {
|
|
3
|
+
if (ids === undefined || ids.length === 0)
|
|
4
|
+
return "";
|
|
5
|
+
return `${name}=${ids.map((id) => serviceRefs[id].systemdName).join(" ")}\n`;
|
|
6
|
+
}
|
|
7
|
+
export function environmentLines(environment, systemdEscape) {
|
|
8
|
+
return Object.entries(environment)
|
|
9
|
+
.map(([key, value]) => `Environment="${key}=${systemdEscape(value)}"\n`)
|
|
10
|
+
.join("");
|
|
11
|
+
}
|
|
12
|
+
export function systemdUnit(service, serviceRefs, systemdEscape, systemdQuotedValue, serviceShellExecPrefix, systemdServiceShellQuote) {
|
|
13
|
+
const workingDirectory = service.workingDirectory === undefined ? "" : `WorkingDirectory=${systemdQuotedValue(service.workingDirectory)}\n`;
|
|
14
|
+
const restart = service.restart === "on-failure" ? "Restart=on-failure\nRestartSec=2\n" : "Restart=no\n";
|
|
15
|
+
return `[Unit]
|
|
16
|
+
Description=${service.description}
|
|
17
|
+
${dependencyLine("After", service.after, serviceRefs)}${dependencyLine("Wants", service.wants, serviceRefs)}
|
|
18
|
+
[Service]
|
|
19
|
+
Type=simple
|
|
20
|
+
${workingDirectory}${environmentLines(service.environment, systemdEscape)}ExecStart=${serviceShellExecPrefix()} ${systemdServiceShellQuote(service.shellCommand)}
|
|
21
|
+
${restart}
|
|
22
|
+
[Install]
|
|
23
|
+
WantedBy=default.target
|
|
24
|
+
`;
|
|
25
|
+
}
|
|
26
|
+
export function plistString(key, value, xmlEscape, indent = " ") {
|
|
27
|
+
return `${indent}<key>${xmlEscape(key)}</key>\n${indent}<string>${xmlEscape(value)}</string>\n`;
|
|
28
|
+
}
|
|
29
|
+
export function plistProgramArguments(service, detectServiceShell, xmlEscape) {
|
|
30
|
+
const args = ["/usr/bin/env", detectServiceShell().executable, "-lc", service.shellCommand];
|
|
31
|
+
return ` <key>ProgramArguments</key>\n <array>\n${args.map((arg) => ` <string>${xmlEscape(arg)}</string>`).join("\n")}\n </array>\n`;
|
|
32
|
+
}
|
|
33
|
+
export function plistEnvironment(environment, xmlEscape) {
|
|
34
|
+
const entries = Object.entries(environment);
|
|
35
|
+
if (entries.length === 0)
|
|
36
|
+
return "";
|
|
37
|
+
return ` <key>EnvironmentVariables</key>\n <dict>\n${entries.map(([key, value]) => plistString(key, value, xmlEscape, " ")).join("")} </dict>\n`;
|
|
38
|
+
}
|
|
39
|
+
export function launchdLogPath(logDir, ref) {
|
|
40
|
+
return join(logDir, ref.logName);
|
|
41
|
+
}
|
|
42
|
+
export function launchdPlist(service, logDir, detectServiceShell, xmlEscape) {
|
|
43
|
+
const workingDirectory = service.workingDirectory === undefined ? "" : plistString("WorkingDirectory", service.workingDirectory, xmlEscape);
|
|
44
|
+
const keepAlive = service.restart === "on-failure" ? " <key>KeepAlive</key>\n <dict>\n <key>SuccessfulExit</key>\n <false/>\n </dict>\n" : "";
|
|
45
|
+
return `<?xml version="1.0" encoding="UTF-8"?>
|
|
46
|
+
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
47
|
+
<plist version="1.0">
|
|
48
|
+
<dict>
|
|
49
|
+
${plistString("Label", service.launchdLabel, xmlEscape)}${plistProgramArguments(service, detectServiceShell, xmlEscape)}${workingDirectory}${plistEnvironment(service.environment, xmlEscape)} <key>RunAtLoad</key>
|
|
50
|
+
<true/>
|
|
51
|
+
${keepAlive}${plistString("StandardOutPath", launchdLogPath(logDir, service), xmlEscape)}${plistString("StandardErrorPath", launchdLogPath(logDir, service), xmlEscape)}</dict>
|
|
52
|
+
</plist>
|
|
53
|
+
`;
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=serviceTemplates.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serviceTemplates.js","sourceRoot":"","sources":["../../src/cli/serviceTemplates.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/cli/types.ts"],"names":[],"mappings":""}
|