@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,173 @@
1
+ // Generated from omp-web-plugins/updates/omp-web-plugin.ts. Do not edit directly.
2
+ import { additionalCommands, fallbackDockerStatus, formatVersion, installationLabel, messageCount, recommendedCommand, shouldShowUpdatesPanel, statusFor } from "./updatesLogic.js";
3
+ function runCommandInTerminal(terminal, label, command) {
4
+ void terminal.runCommand({
5
+ title: label,
6
+ command,
7
+ open: true,
8
+ metadata: { "pi.plugin": "updates" },
9
+ }).catch((error) => {
10
+ console.error(`Updates plugin failed to run "${label}"`, error);
11
+ });
12
+ }
13
+ function renderComponent(html, component) {
14
+ const status = !component.available
15
+ ? "unavailable"
16
+ : component.stale
17
+ ? "restart needed"
18
+ : "current";
19
+ return html `
20
+ <div class="updates-version-row">
21
+ <strong>${component.label}</strong>
22
+ <span>${status}</span>
23
+ <small>running ${formatVersion(component.runtimeVersion)} · installed ${formatVersion(component.installedVersion)}</small>
24
+ <small>${installationLabel(component.installation)}${component.installation?.path === undefined ? "" : ` · ${component.installation.path}`}</small>
25
+ </div>
26
+ `;
27
+ }
28
+ function renderCommandActions(html, terminal, label, command) {
29
+ return html `
30
+ <span class="updates-command-actions">
31
+ <button @click=${() => { void navigator.clipboard.writeText(command); }}>Copy</button>
32
+ ${terminal === undefined ? null : html `<button class="primary" @click=${() => { runCommandInTerminal(terminal, label, command); }}>Run</button>`}
33
+ </span>
34
+ `;
35
+ }
36
+ function renderCommand(html, terminal, label, command) {
37
+ return html `
38
+ <div class="updates-command">
39
+ <span>${label}</span>
40
+ <code>${command}</code>
41
+ ${renderCommandActions(html, terminal, label, command)}
42
+ </div>
43
+ `;
44
+ }
45
+ function updatesRuntimeHintFromModuleUrl(moduleUrl) {
46
+ try {
47
+ const dockerMode = new URL(moduleUrl).searchParams.get("ompWebDockerMode");
48
+ return dockerMode === "runtime" || dockerMode === "dev" ? { dockerMode } : {};
49
+ }
50
+ catch {
51
+ return {};
52
+ }
53
+ }
54
+ const runtimeHint = updatesRuntimeHintFromModuleUrl(import.meta.url);
55
+ function renderCommands(html, terminal, status) {
56
+ const recommended = recommendedCommand(status);
57
+ const additional = additionalCommands(status, recommended);
58
+ if (recommended === undefined && additional.length === 0)
59
+ return undefined;
60
+ return html `
61
+ ${recommended === undefined ? null : html `
62
+ <section class="updates-recommended">
63
+ <strong>Recommended</strong>
64
+ <p class="muted">Run this one command to bring this installation fully up to date. Nothing else is required.</p>
65
+ ${renderCommand(html, terminal, recommended.label, recommended.command)}
66
+ </section>
67
+ `}
68
+ ${additional.length === 0 ? null : html `
69
+ <section>
70
+ <strong>${recommended === undefined ? "Suggested commands" : "Additional commands (optional)"}</strong>
71
+ ${recommended === undefined ? null : html `<p class="muted">Only needed for finer control, such as restarting a single service.</p>`}
72
+ ${additional.map((entry) => renderCommand(html, terminal, entry.label, entry.command))}
73
+ </section>
74
+ `}
75
+ `;
76
+ }
77
+ function renderUpdatesPanel(html, terminal, state) {
78
+ const status = statusFor(state) ?? fallbackDockerStatus(runtimeHint);
79
+ if (status === undefined) {
80
+ return html `
81
+ <section class="toolbar"><strong>Updates</strong></section>
82
+ <section class="viewer"><p class="muted">Checking PI WEB update status…</p></section>
83
+ `;
84
+ }
85
+ const messages = status.messages;
86
+ return html `
87
+ <style>
88
+ .viewer.updates-status { flex: 1 1 auto; min-height: 0; box-sizing: border-box; display: flex; flex-direction: column; gap: 14px; padding: 12px; overflow-y: auto; overflow-x: hidden; }
89
+ .viewer.updates-status section { flex: 0 0 auto; min-width: 0; display: grid; gap: 8px; }
90
+ .updates-message { display: grid; gap: 5px; border: 1px solid var(--pi-border); border-radius: 8px; padding: 10px; background: var(--pi-surface); }
91
+ .updates-message.warning { border-color: var(--pi-warning-border); background: var(--pi-warning-surface); }
92
+ .updates-message.error { border-color: var(--pi-danger); }
93
+ .updates-message-title { display: flex; gap: 8px; align-items: baseline; }
94
+ .updates-message-title span { color: var(--pi-muted); font-size: 12px; text-transform: uppercase; }
95
+ .updates-version-row { display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: 3px 10px; border-bottom: 1px solid var(--pi-border-muted); padding: 6px 0; }
96
+ .updates-version-row small { grid-column: 1 / -1; color: var(--pi-muted); }
97
+ .updates-command { min-width: 0; display: grid; grid-template-columns: minmax(90px, auto) minmax(0, 1fr) auto; gap: 8px; align-items: center; }
98
+ .updates-command code { overflow: auto; border: 1px solid var(--pi-border-muted); border-radius: 6px; background: var(--pi-bg); padding: 5px 7px; white-space: nowrap; }
99
+ .updates-command-inline { grid-template-columns: minmax(0, 1fr) auto; }
100
+ .updates-command-actions { display: inline-flex; gap: 6px; }
101
+ .updates-command-actions button.primary { border-color: var(--pi-accent-border); color: var(--pi-text-bright); }
102
+ .updates-recommended { border: 1px solid var(--pi-accent-border); border-radius: 8px; padding: 10px; background: var(--pi-surface); }
103
+ .updates-recommended > strong { color: var(--pi-text-bright); }
104
+ .updates-meta { display: grid; gap: 2px; color: var(--pi-muted); font-size: 12px; }
105
+ @media (max-width: 520px) {
106
+ .updates-command { grid-template-columns: minmax(0, 1fr) auto; }
107
+ .updates-command > span { grid-column: 1 / -1; }
108
+ }
109
+ </style>
110
+ <section class="toolbar"><strong>Updates</strong>${messages.length > 0 ? html `<span class="stale">${String(messages.length)}</span>` : null}</section>
111
+ <section class="viewer updates-status">
112
+ <section>
113
+ ${messages.length === 0 ? html `<p class="muted">No PI WEB update or restart messages.</p>` : messages.map((message) => html `
114
+ <article class=${`updates-message ${message.severity}`}>
115
+ <div class="updates-message-title"><strong>${message.title}</strong><span>${message.severity}</span></div>
116
+ <p>${message.body}</p>
117
+ ${message.command === undefined ? null : html `
118
+ <div class="updates-command updates-command-inline">
119
+ <code>${message.command}</code>
120
+ ${renderCommandActions(html, terminal, message.title, message.command)}
121
+ </div>
122
+ `}
123
+ </article>
124
+ `)}
125
+ </section>
126
+
127
+ <section>
128
+ <strong>Installed services</strong>
129
+ ${renderComponent(html, status.components.web)}
130
+ ${renderComponent(html, status.components.sessiond)}
131
+ </section>
132
+
133
+ ${renderCommands(html, terminal, status)}
134
+
135
+ <section class="updates-meta">
136
+ <span>Generated ${status.generatedAt}</span>
137
+ ${status.release.latestVersion === undefined ? null : html `<span>Latest npm release ${status.release.latestVersion}</span>`}
138
+ ${status.release.skipped === true ? html `<span>Remote version check skipped.</span>` : null}
139
+ ${status.release.error === undefined ? null : html `<span>Remote version check failed: ${status.release.error}</span>`}
140
+ </section>
141
+ </section>
142
+ `;
143
+ }
144
+ const plugin = {
145
+ apiVersion: 1,
146
+ name: "Updates",
147
+ activate: ({ html, svg }) => ({
148
+ contributions: {
149
+ workspacePanels: [
150
+ {
151
+ id: "workspace.updates",
152
+ title: "Updates",
153
+ icon: svg `
154
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
155
+ <path d="M20 6v5h-5"></path>
156
+ <path d="M4 18v-5h5"></path>
157
+ <path d="M18.4 9A7 7 0 0 0 6.1 6.7L4 8.8"></path>
158
+ <path d="M5.6 15A7 7 0 0 0 17.9 17.3L20 15.2"></path>
159
+ </svg>
160
+ `,
161
+ order: 100,
162
+ visible: (context) => shouldShowUpdatesPanel(context.state, runtimeHint),
163
+ badge: (context) => {
164
+ const count = messageCount(context.state);
165
+ return count > 0 ? count : undefined;
166
+ },
167
+ render: (context) => renderUpdatesPanel(html, context.terminal, context.state),
168
+ },
169
+ ],
170
+ },
171
+ }),
172
+ };
173
+ export default plugin;
@@ -0,0 +1,9 @@
1
+ {
2
+ "name": "@omp-web/updates-plugin",
3
+ "private": true,
4
+ "ompWeb": {
5
+ "plugins": [
6
+ { "id": "updates", "module": "omp-web-plugin.js", "machineSpecific": true }
7
+ ]
8
+ }
9
+ }
@@ -0,0 +1,97 @@
1
+ // Generated from omp-web-plugins/updates/updatesLogic.ts. Do not edit directly.
2
+ // The single command users should run when they do not want to think: if an
3
+ // update is available, `commands.update` already chains the update and a full
4
+ // restart; otherwise, when anything is stale, a full restart is enough.
5
+ export function recommendedCommand(status) {
6
+ const { commands, release, components } = status;
7
+ if (release.updateAvailable && typeof commands.update === "string" && commands.update !== "") {
8
+ return { label: "Update & restart everything", command: commands.update };
9
+ }
10
+ const restartNeeded = components.web.stale || components.sessiond.stale || !components.sessiond.available;
11
+ if (restartNeeded && typeof commands.restart === "string" && commands.restart !== "") {
12
+ return { label: "Restart everything", command: commands.restart };
13
+ }
14
+ return undefined;
15
+ }
16
+ export function additionalCommands(status, recommended) {
17
+ return [
18
+ ["Update", status.commands.update],
19
+ ["Restart all", status.commands.restart],
20
+ ["Restart Web/UI", status.commands.restartWeb],
21
+ ["Restart session daemon", status.commands.restartSessiond],
22
+ ["Status", status.commands.status],
23
+ ]
24
+ .filter((entry) => typeof entry[1] === "string" && entry[1] !== "")
25
+ .filter(([, command]) => command !== recommended?.command)
26
+ .map(([label, command]) => ({ label, command }));
27
+ }
28
+ export function messagesFor(state) {
29
+ return state?.ompWebStatus?.messages ?? [];
30
+ }
31
+ export function statusFor(state) {
32
+ return state?.ompWebStatus;
33
+ }
34
+ export function messageCount(state) {
35
+ return messagesFor(state).length;
36
+ }
37
+ export function isSelfManagedInstallation(installation) {
38
+ return installation === undefined || installation.kind === "local" || installation.kind === "docker" || installation.kind === "unknown";
39
+ }
40
+ export function shouldShowUpdatesPanel(state, hint = {}) {
41
+ const status = statusFor(state);
42
+ if (hint.dockerMode !== undefined)
43
+ return true;
44
+ if (messageCount(state) > 0)
45
+ return true;
46
+ if (status === undefined)
47
+ return false;
48
+ return isSelfManagedInstallation(status.components.web.installation)
49
+ || isSelfManagedInstallation(status.components.sessiond.installation);
50
+ }
51
+ export function fallbackDockerStatus(hint, generatedAt = "federated status unavailable") {
52
+ if (hint.dockerMode === undefined)
53
+ return undefined;
54
+ const commandPrefix = hint.dockerMode === "dev" ? "omp-web-docker --dev" : "omp-web-docker";
55
+ const installation = { kind: "docker", dockerMode: hint.dockerMode };
56
+ return {
57
+ packageName: "@ProgmRuanSilva/omp-web",
58
+ generatedAt,
59
+ components: {
60
+ web: { component: "web", label: "Web/UI", stale: false, available: true, installation },
61
+ sessiond: { component: "sessiond", label: "Session daemon", stale: false, available: true, installation },
62
+ },
63
+ release: { packageName: "@ProgmRuanSilva/omp-web", updateAvailable: false, skipped: true },
64
+ commands: {
65
+ update: `${commandPrefix} update`,
66
+ restart: `${commandPrefix} restart`,
67
+ restartWeb: `${commandPrefix} restart-web`,
68
+ restartSessiond: `${commandPrefix} restart-sessiond`,
69
+ status: `${commandPrefix} status`,
70
+ },
71
+ messages: [{
72
+ id: "docker-status-compatibility",
73
+ severity: "info",
74
+ title: "Docker update commands available",
75
+ body: "This Updates plugin was loaded from a Docker PI WEB runtime, but the gateway has not provided Docker-aware status details yet. The Docker maintenance commands below are still available.",
76
+ }],
77
+ };
78
+ }
79
+ export function formatVersion(version) {
80
+ return version === undefined || version === "" ? "unknown" : version;
81
+ }
82
+ export function installationLabel(installation) {
83
+ if (installation === undefined)
84
+ return "installation unknown";
85
+ if (installation.kind === "pi-package") {
86
+ const scope = installation.scope === undefined ? "" : ` · ${installation.scope}`;
87
+ const source = installation.source ?? "Pi package";
88
+ return `${source}${scope}`;
89
+ }
90
+ if (installation.kind === "npm-global")
91
+ return "global npm package";
92
+ if (installation.kind === "local")
93
+ return "local checkout";
94
+ if (installation.kind === "docker")
95
+ return installation.dockerMode === "dev" ? "Docker development runtime" : "Docker runtime";
96
+ return "installation unknown";
97
+ }
@@ -0,0 +1,217 @@
1
+ import { readFileSync } from "node:fs";
2
+ import { dirname, join } from "node:path";
3
+ import { fileURLToPath } from "node:url";
4
+ import { effectiveOmpWebConfig } from "./config.js";
5
+ import { SessionDaemonClient } from "./sessiond/sessionDaemonClient.js";
6
+ import { parseOmpWebComponentStatus, parseOmpWebVersionResponse } from "./shared/ompWebStatusParsing.js";
7
+ import { errorMessage, isRecord } from "./server/utils.js";
8
+ const OMP_WEB_PACKAGE_NAME = "@theruansilva/omp-web";
9
+ const OMP_WEB_VERSION_TIMEOUT_MS = 2000;
10
+ const OMP_WEB_VERSION_ENDPOINT_PATH = "/api/omp-web/version";
11
+ const OMP_WEB_STATUS_ENDPOINT_PATH = "/api/omp-web/status";
12
+ const DEFAULT_PACKAGE_VERSION = "0.0.0-dev";
13
+ export function packageVersion() {
14
+ return readPackageInfo()?.version ?? DEFAULT_PACKAGE_VERSION;
15
+ }
16
+ export async function printOmpWebVersionReport() {
17
+ console.log("PI WEB version");
18
+ printInstalledPackageVersions();
19
+ printRunningVersionInfo(await collectRunningVersionInfo());
20
+ }
21
+ function packageRootPath() {
22
+ return dirname(dirname(fileURLToPath(import.meta.url)));
23
+ }
24
+ function packageJsonPath() {
25
+ return join(packageRootPath(), "package.json");
26
+ }
27
+ function readPackageInfo() {
28
+ const path = packageJsonPath();
29
+ try {
30
+ return parsePackageInfo(JSON.parse(readFileSync(path, "utf8")), path);
31
+ }
32
+ catch {
33
+ return undefined;
34
+ }
35
+ }
36
+ function parsePackageInfo(value, path) {
37
+ if (!isRecord(value))
38
+ return undefined;
39
+ const name = value["name"];
40
+ const version = value["version"];
41
+ if (typeof name !== "string" || name === "" || typeof version !== "string" || version === "")
42
+ return undefined;
43
+ return { name, version, path };
44
+ }
45
+ function webVersionEndpoint() {
46
+ try {
47
+ const { config } = effectiveOmpWebConfig();
48
+ const host = httpClientHost(config.host);
49
+ const port = config.port ?? 8504;
50
+ return { endpoint: `http://${urlHost(host)}:${String(port)}${OMP_WEB_VERSION_ENDPOINT_PATH}` };
51
+ }
52
+ catch (error) {
53
+ return { error: `could not read PI WEB config: ${errorMessage(error)}` };
54
+ }
55
+ }
56
+ function httpClientHost(configuredHost) {
57
+ const host = configuredHost === undefined || configuredHost === "" ? "127.0.0.1" : configuredHost;
58
+ if (host === "0.0.0.0" || host === "::" || host === "[::]")
59
+ return "127.0.0.1";
60
+ return host;
61
+ }
62
+ function urlHost(host) {
63
+ if (host.startsWith("[") || !host.includes(":"))
64
+ return host;
65
+ return `[${host}]`;
66
+ }
67
+ function statusEndpointFor(versionEndpoint) {
68
+ if (!versionEndpoint.endsWith(OMP_WEB_VERSION_ENDPOINT_PATH))
69
+ return versionEndpoint;
70
+ return `${versionEndpoint.slice(0, -OMP_WEB_VERSION_ENDPOINT_PATH.length)}${OMP_WEB_STATUS_ENDPOINT_PATH}`;
71
+ }
72
+ async function fetchOmpWebVersionResponse(endpoint) {
73
+ const response = await fetch(endpoint, {
74
+ headers: { accept: "application/json" },
75
+ signal: AbortSignal.timeout(OMP_WEB_VERSION_TIMEOUT_MS),
76
+ });
77
+ if (!response.ok)
78
+ throw new Error(`HTTP ${String(response.status)}`);
79
+ const parsed = await response.json();
80
+ const status = parseOmpWebVersionResponse(parsed);
81
+ if (status === undefined)
82
+ throw new Error("response did not include PI WEB version information");
83
+ return status;
84
+ }
85
+ async function collectRunningVersionInfo() {
86
+ const endpoint = webVersionEndpoint();
87
+ if (endpoint.endpoint !== undefined) {
88
+ try {
89
+ const status = await fetchOmpWebVersionResponse(endpoint.endpoint);
90
+ return { generatedAt: status.generatedAt, web: status.components.web, sessiond: status.components.sessiond };
91
+ }
92
+ catch (error) {
93
+ let webError = `${endpoint.endpoint}: ${errorMessage(error)}`;
94
+ const statusEndpoint = statusEndpointFor(endpoint.endpoint);
95
+ if (statusEndpoint !== endpoint.endpoint && error instanceof Error && error.message === "HTTP 404") {
96
+ try {
97
+ const status = await fetchOmpWebVersionResponse(statusEndpoint);
98
+ return { generatedAt: status.generatedAt, web: status.components.web, sessiond: status.components.sessiond };
99
+ }
100
+ catch (statusError) {
101
+ webError = `${webError}; ${statusEndpoint}: ${errorMessage(statusError)}`;
102
+ }
103
+ }
104
+ return runningVersionInfoWithSessiondFallback({ webError });
105
+ }
106
+ }
107
+ return runningVersionInfoWithSessiondFallback({ webError: endpoint.error ?? "web/API status endpoint unavailable" });
108
+ }
109
+ async function runningVersionInfoWithSessiondFallback(base) {
110
+ const sessiond = await collectRunningSessiondInfo();
111
+ return {
112
+ webError: base.webError,
113
+ ...(sessiond.component === undefined ? {} : { sessiond: sessiond.component }),
114
+ ...(sessiond.error === undefined ? {} : { sessiondError: sessiond.error }),
115
+ };
116
+ }
117
+ async function collectRunningSessiondInfo() {
118
+ try {
119
+ const response = await withTimeout(new SessionDaemonClient().request("GET", "/health"), OMP_WEB_VERSION_TIMEOUT_MS, "session daemon health check timed out");
120
+ if (response.statusCode < 200 || response.statusCode >= 300)
121
+ throw new Error(`HTTP ${String(response.statusCode)}`);
122
+ const parsed = response.body === "" ? undefined : JSON.parse(response.body);
123
+ const version = isRecord(parsed) ? parsed["version"] : undefined;
124
+ const component = parseOmpWebComponentStatus(version);
125
+ if (component === undefined)
126
+ throw new Error("health response did not include version information");
127
+ return { component };
128
+ }
129
+ catch (error) {
130
+ return { error: errorMessage(error) };
131
+ }
132
+ }
133
+ async function withTimeout(promise, timeoutMs, timeoutMessage) {
134
+ let timeout;
135
+ try {
136
+ return await Promise.race([
137
+ promise,
138
+ new Promise((_, reject) => {
139
+ timeout = setTimeout(() => {
140
+ reject(new Error(timeoutMessage));
141
+ }, timeoutMs);
142
+ }),
143
+ ]);
144
+ }
145
+ finally {
146
+ if (timeout !== undefined)
147
+ clearTimeout(timeout);
148
+ }
149
+ }
150
+ function printInstalledPackageVersions() {
151
+ const info = readPackageInfo();
152
+ console.log("Installed packages:");
153
+ if (info === undefined) {
154
+ console.log(`? ${OMP_WEB_PACKAGE_NAME}: unknown`);
155
+ console.log(` missing package metadata: ${packageJsonPath()}`);
156
+ return;
157
+ }
158
+ console.log(`✓ ${info.name}: ${info.version}`);
159
+ console.log(` ${info.path}`);
160
+ }
161
+ function printRunningVersionInfo(info) {
162
+ console.log("Running services:");
163
+ if (info.web === undefined)
164
+ printUnavailableComponent("Web/UI", info.webError);
165
+ else
166
+ printComponentVersion(info.web);
167
+ if (info.sessiond === undefined)
168
+ printUnavailableComponent("Session daemon", info.sessiondError);
169
+ else
170
+ printComponentVersion(info.sessiond);
171
+ if (info.generatedAt !== undefined)
172
+ console.log(` reported by web/API at ${info.generatedAt}`);
173
+ }
174
+ function printComponentVersion(component) {
175
+ const icon = component.available ? component.stale ? "!" : "✓" : "?";
176
+ const status = !component.available ? "unavailable" : component.stale ? "restart needed" : "current";
177
+ console.log(`${icon} ${component.label}: ${status}`);
178
+ if (component.available || component.runtimeVersion !== undefined || component.installedVersion !== undefined) {
179
+ console.log(` running: ${formatVersion(component.runtimeVersion)}; installed: ${formatVersion(component.installedVersion)}`);
180
+ }
181
+ const installation = installationLabel(component.installation);
182
+ if (installation !== undefined)
183
+ console.log(` installation: ${installation}`);
184
+ if (component.error !== undefined)
185
+ console.log(` ${component.error}`);
186
+ }
187
+ function printUnavailableComponent(label, error) {
188
+ console.log(`? ${label}: unavailable`);
189
+ if (error !== undefined && error !== "")
190
+ console.log(` ${error}`);
191
+ }
192
+ function installationLabel(installation) {
193
+ if (installation === undefined)
194
+ return undefined;
195
+ if (installation.kind === "pi-package") {
196
+ const source = installation.source ?? "Pi package";
197
+ const scope = installation.scope === undefined ? "" : ` · ${installation.scope}`;
198
+ const path = installation.path === undefined ? "" : ` · ${installation.path}`;
199
+ return `${source}${scope}${path}`;
200
+ }
201
+ if (installation.kind === "npm-global") {
202
+ const npmRoot = installation.npmRoot === undefined ? "" : ` · ${installation.npmRoot}`;
203
+ const path = installation.path === undefined ? "" : ` · ${installation.path}`;
204
+ return `global npm package${npmRoot}${path}`;
205
+ }
206
+ if (installation.kind === "local")
207
+ return installation.path === undefined ? "local checkout" : `local checkout · ${installation.path}`;
208
+ if (installation.kind === "docker") {
209
+ const mode = installation.dockerMode === "dev" ? "Docker development runtime" : "Docker runtime";
210
+ return installation.path === undefined ? mode : `${mode} · ${installation.path}`;
211
+ }
212
+ return installation.path === undefined ? "installation unknown" : `installation unknown · ${installation.path}`;
213
+ }
214
+ function formatVersion(version) {
215
+ return version === undefined || version === "" ? "unknown" : version;
216
+ }
217
+ //# sourceMappingURL=ompWebVersionReport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ompWebVersionReport.js","sourceRoot":"","sources":["../src/ompWebVersionReport.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ {
2
+ "name": "@pi-web/info-plugin",
3
+ "private": true,
4
+ "piWeb": {
5
+ "plugins": [
6
+ { "id": "info", "module": "pi-web-plugin.js" }
7
+ ]
8
+ }
9
+ }
@@ -0,0 +1,51 @@
1
+ // Generated from pi-web-plugins/info/pi-web-plugin.ts. Do not edit directly.
2
+ const plugin = {
3
+ apiVersion: 1,
4
+ name: "Info Plugin",
5
+ activate: ({ html, svg }) => ({
6
+ contributions: {
7
+ actions: [
8
+ {
9
+ id: "workspace.show-path",
10
+ title: "Show Current Workspace Path",
11
+ group: "Info",
12
+ enabled: (context) => context.state.selectedWorkspace !== undefined,
13
+ run: (context) => {
14
+ const path = context.state.selectedWorkspace?.path ?? "No workspace selected";
15
+ window.alert(path);
16
+ },
17
+ },
18
+ ],
19
+ workspaceLabels: [
20
+ {
21
+ id: "workspace.kind-label",
22
+ order: 100,
23
+ items: (context) => [{ type: "text", text: context.workspace.isGitRepo ? "git" : "folder", title: context.workspace.path }],
24
+ },
25
+ ],
26
+ workspacePanels: [
27
+ {
28
+ id: "workspace.info",
29
+ title: "Info",
30
+ icon: svg `
31
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
32
+ <circle cx="12" cy="12" r="9"></circle>
33
+ <path d="M12 11v5"></path>
34
+ <path d="M12 8h.01"></path>
35
+ </svg>
36
+ `,
37
+ order: 1000,
38
+ render: (context) => html `
39
+ <section class="toolbar"><strong>Info</strong></section>
40
+ <section class="viewer">
41
+ <p><strong>Workspace</strong></p>
42
+ <p class="muted">${context.workspace.label}</p>
43
+ <p class="muted">${context.workspace.path}</p>
44
+ </section>
45
+ `,
46
+ },
47
+ ],
48
+ },
49
+ }),
50
+ };
51
+ export default plugin;
@@ -0,0 +1,9 @@
1
+ {
2
+ "name": "@pi-web/schedule-prompts-plugin",
3
+ "private": true,
4
+ "piWeb": {
5
+ "plugins": [
6
+ { "id": "schedule-prompts", "module": "pi-web-plugin.js" }
7
+ ]
8
+ }
9
+ }
@@ -0,0 +1,43 @@
1
+ // Generated from pi-web-plugins/schedule-prompts/pi-web-plugin.ts. Do not edit directly.
2
+ import { defineSchedulePromptsPanelElement, schedulePromptsBadge } from "./schedulePromptsPanelElement.js";
3
+ const plugin = {
4
+ apiVersion: 1,
5
+ name: "Schedule Prompts",
6
+ activate: ({ pluginId, html, svg }) => {
7
+ defineSchedulePromptsPanelElement();
8
+ return {
9
+ contributions: {
10
+ actions: [
11
+ {
12
+ id: "workspace.open-schedule-prompts",
13
+ title: "Open Scheduled Prompts",
14
+ description: "Open the Scheduled Prompts panel.",
15
+ group: "Workspace",
16
+ enabled: (context) => context.state.selectedWorkspace !== undefined,
17
+ run: (context) => {
18
+ if (context.state.selectedWorkspace === undefined)
19
+ return;
20
+ context.selectWorkspaceTool(`${pluginId}:workspace.schedule-prompts`);
21
+ },
22
+ },
23
+ ],
24
+ workspacePanels: [
25
+ {
26
+ id: "workspace.schedule-prompts",
27
+ title: "Schedule",
28
+ icon: svg `
29
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
30
+ <circle cx="12" cy="12" r="9"></circle>
31
+ <path d="M12 7v5l3 3"></path>
32
+ </svg>
33
+ `,
34
+ order: 50,
35
+ badge: (context) => schedulePromptsBadge(context),
36
+ render: (context) => html `<pi-web-schedule-prompts-panel .context=${context}></pi-web-schedule-prompts-panel>`,
37
+ },
38
+ ],
39
+ },
40
+ };
41
+ },
42
+ };
43
+ export default plugin;