@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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ompWebDockerCommandPlan.js","sourceRoot":"","sources":["../../src/docker/ompWebDockerCommandPlan.ts"],"names":[],"mappings":"AA+BA,MAAM,CAAC,MAAM,4BAA4B,GAAG;IAC1C,SAAS;IACT,OAAO;IACP,MAAM;IACN,SAAS;IACT,aAAa;IACb,kBAAkB;IAClB,QAAQ;IACR,QAAQ;IACR,MAAM;IACN,OAAO;IACP,QAAQ;IACR,KAAK;CAC6D,CAAC;AAkBrE,MAAM,kBAAkB,GAAG,IAAI,GAAG,CAAsB;IACtD,OAAO;IACP,MAAM;IACN,SAAS;IACT,aAAa;IACb,kBAAkB;IAClB,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,MAAM;CACP,CAAC,CAAC;AAEH,MAAM,QAAQ,GAAwB,IAAI,GAAG,CAAC,CAAC,GAAG,4BAA4B,EAAE,MAAM,CAAC,CAAC,CAAC;AAEzF,MAAM,WAAW,GAAwB,IAAI,GAAG,CAAC,CAAC,KAAK,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC,CAAC;AACnF,MAAM,YAAY,GAAwB,IAAI,GAAG,CAAC,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC;AAEvE,MAAM,UAAU,yBAAyB,CAAC,IAAkC;IAC1E,OAAO,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,gBAAgB,CAAC;AACpE,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,IAAkC,EAAE,OAA6C;IACnH,OAAO,GAAG,yBAAyB,CAAC,IAAI,CAAC,IAAI,OAAO,EAAE,CAAC;AACzD,CAAC;AAED,MAAM,UAAU,kCAAkC,CAAC,IAA6B;IAC9E,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAE9C,QAAQ,IAAI,CAAC,OAAO,EAAE,CAAC;QACrB,KAAK,SAAS;YACZ,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,0BAA0B,EAAE,KAAK,EAAE,CAAC;QAC3G,KAAK,QAAQ;YACX,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,EAAE,0BAA0B,EAAE,IAAI,EAAE,CAAC;QAC7F,KAAK,OAAO;YACV,OAAO,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACrC,KAAK,MAAM;YACT,OAAO,eAAe,CAAC,MAAM,CAAC,CAAC;QACjC,KAAK,SAAS;YACZ,OAAO,eAAe,CAAC,SAAS,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC;QACvD,KAAK,aAAa;YAChB,OAAO,eAAe,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QAC3C,KAAK,kBAAkB;YACrB,OAAO,eAAe,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;QAChD,KAAK,QAAQ;YACX,OAAO,eAAe,CAAC,IAAI,CAAC,CAAC;QAC/B,KAAK,MAAM;YACT,OAAO,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,eAAe,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QAChH,KAAK,OAAO;YACV,OAAO,eAAe,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,KAAK,EAAE,MAAM,CAAC,CAAC;QAC/D,KAAK,KAAK;YACR,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC7E,KAAK,QAAQ;YACX,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC;QACjC,KAAK,MAAM;YACT,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;IAC7B,CAAC;AACH,CAAC;AAED,MAAM,UAAU,8BAA8B,CAAC,IAA6B;IAC1E,IAAI,IAAI,CAAC,IAAI,KAAK,KAAK;QAAE,OAAO,SAAS,CAAC;IAE1C,QAAQ,IAAI,CAAC,OAAO,EAAE,CAAC;QACrB,KAAK,SAAS;YACZ,OAAO,SAAS,CAAC;QACnB,KAAK,OAAO;YACV,OAAO,kBAAkB,CAAC,IAAI,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;QACnD,KAAK,MAAM;YACT,OAAO,kBAAkB,CAAC,MAAM,CAAC,CAAC;QACpC,KAAK,SAAS;YACZ,OAAO,kBAAkB,CAAC,SAAS,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC;QAC1D,KAAK,aAAa;YAChB,OAAO,kBAAkB,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QAC9C,KAAK,kBAAkB;YACrB,OAAO,kBAAkB,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;QACnD,KAAK,QAAQ;YACX,OAAO;gBACL,IAAI,EAAE,iBAAiB;gBACvB,gBAAgB,EAAE,IAAI;gBACtB,KAAK,EAAE;oBACL,EAAE,IAAI,EAAE,CAAC,OAAO,EAAE,QAAQ,CAAC,EAAE;oBAC7B,EAAE,IAAI,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,kBAAkB,EAAE,kBAAkB,CAAC,EAAE;iBAC/D;aACF,CAAC;QACJ,KAAK,QAAQ;YACX,OAAO,kBAAkB,CAAC,IAAI,CAAC,CAAC;QAClC,KAAK,MAAM;YACT,OAAO,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,kBAAkB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,kBAAkB,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QACtH,KAAK,OAAO;YACV,OAAO,kBAAkB,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,KAAK,EAAE,MAAM,CAAC,CAAC;QAClE,KAAK,KAAK;YACR,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,gBAAgB,EAAE,IAAI,EAAE,CAAC;QACrG,KAAK,QAAQ;YACX,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,gBAAgB,EAAE,IAAI,EAAE,CAAC;QACzD,KAAK,MAAM;YACT,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;IAC7B,CAAC;AACH,CAAC;AAED,MAAM,UAAU,iCAAiC,CAAC,IAA6B,EAAE,GAAW;IAC1F,IAAI,IAAI,CAAC,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,OAAO,KAAK,MAAM,IAAI,GAAG,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IACpG,OAAO,iGAAiG,CAAC;AAC3G,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,IAAuB;IAC3D,IAAI,IAAI,GAAqB,SAAS,CAAC;IACvC,IAAI,SAAS,GAAG,KAAK,CAAC;IACtB,IAAI,KAAK,GAAG,CAAC,CAAC;IAEd,OAAO,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QACvC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;QACxB,IAAI,GAAG,KAAK,SAAS;YAAE,MAAM;QAC7B,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;YACjB,KAAK,IAAI,CAAC,CAAC;YACX,MAAM;QACR,CAAC;QACD,IAAI,GAAG,KAAK,OAAO,EAAE,CAAC;YACpB,IAAI,GAAG,KAAK,CAAC;YACb,SAAS;QACX,CAAC;QACD,IAAI,GAAG,KAAK,cAAc,EAAE,CAAC;YAC3B,SAAS,GAAG,IAAI,CAAC;YACjB,SAAS;QACX,CAAC;QACD,IAAI,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;YACrC,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,CAAC;QAC5E,CAAC;QACD,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACxB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,0BAA0B,GAAG,EAAE,CAAC,EAAE,CAAC;QAClE,CAAC;QACD,MAAM;IACR,CAAC;IAED,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;IACjC,IAAI,YAAY,KAAK,SAAS;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,iBAAiB,CAAC,EAAE,CAAC;IAClF,IAAI,CAAC,qBAAqB,CAAC,YAAY,CAAC;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,oBAAoB,YAAY,EAAE,CAAC,EAAE,CAAC;IAE7G,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;IACnC,MAAM,IAAI,GAA4B,EAAE,IAAI,EAAE,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IACvF,OAAO,YAAY,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC;AAC/C,CAAC;AAED,SAAS,eAAe,CAAC,GAAG,IAAc;IACxC,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;AACnC,CAAC;AAED,SAAS,kBAAkB,CAAC,GAAG,IAAc;IAC3C,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,CAAC;AAC3D,CAAC;AAED,SAAS,iBAAiB,CAAC,IAA6B;IACtD,IAAI,IAAI,CAAC,OAAO,KAAK,OAAO,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;IACvH,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,YAAY,CAAC,IAA6B;IACjD,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS,IAAI,IAAI,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;QACtD,MAAM,CAAC,IAAI,CAAC,2CAA2C,CAAC,CAAC;IAC3D,CAAC;IAED,IAAI,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACjE,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,OAAO,uCAAuC,CAAC,CAAC;IACtE,CAAC;IAED,IAAI,IAAI,CAAC,OAAO,KAAK,MAAM,EAAE,CAAC;QAC5B,sBAAsB,CAAC,IAAI,CAAC,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QAChE,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,WAAW,IAAI,IAAI,CAAC,IAAI,KAAK,KAAK;YAAE,MAAM,CAAC,IAAI,CAAC,sDAAsD,CAAC,CAAC;IAC/H,CAAC;IAED,IAAI,IAAI,CAAC,OAAO,KAAK,OAAO,EAAE,CAAC;QAC7B,sBAAsB,CAAC,IAAI,CAAC,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IACpE,CAAC;IAED,IAAI,IAAI,CAAC,OAAO,KAAK,KAAK,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACrD,MAAM,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;IAChD,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IAEpD,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;IACnD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC;AAC/E,CAAC;AAED,SAAS,sBAAsB,CAAC,IAAuB,EAAE,SAAqC,EAAE,OAAe,EAAE,MAAgB;IAC/H,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpB,MAAM,CAAC,IAAI,CAAC,GAAG,OAAO,6BAA6B,CAAC,CAAC;QACrD,OAAO;IACT,CAAC;IACD,MAAM,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;IACtB,IAAI,MAAM,KAAK,SAAS,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;QAAE,MAAM,CAAC,IAAI,CAAC,WAAW,OAAO,YAAY,MAAM,EAAE,CAAC,CAAC;AACtG,CAAC;AAED,SAAS,UAAU,CAAC,OAA4B,EAAE,IAAuB;IACvE,MAAM,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;IACtB,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,OAAO,KAAK,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;IACzE,IAAI,OAAO,KAAK,MAAM,IAAI,YAAY,CAAC,MAAM,CAAC;QAAE,OAAO,MAAM,CAAC;IAC9D,IAAI,OAAO,KAAK,OAAO,IAAI,aAAa,CAAC,MAAM,CAAC;QAAE,OAAO,MAAM,CAAC;IAChE,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,qBAAqB,CAAC,KAAa;IAC1C,OAAO,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AAC7B,CAAC;AAED,SAAS,YAAY,CAAC,KAAa;IACjC,OAAO,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AAChC,CAAC;AAED,SAAS,aAAa,CAAC,KAAa;IAClC,OAAO,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AACjC,CAAC"}
@@ -0,0 +1,51 @@
1
+ // Generated from omp-web-plugins/info/omp-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": "@omp-web/info-plugin",
3
+ "private": true,
4
+ "ompWeb": {
5
+ "plugins": [
6
+ { "id": "info", "module": "omp-web-plugin.js" }
7
+ ]
8
+ }
9
+ }
@@ -0,0 +1,43 @@
1
+ // Generated from omp-web-plugins/schedule-prompts/omp-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 `<omp-web-schedule-prompts-panel .context=${context}></omp-web-schedule-prompts-panel>`,
37
+ },
38
+ ],
39
+ },
40
+ };
41
+ },
42
+ };
43
+ export default plugin;
@@ -0,0 +1,9 @@
1
+ {
2
+ "name": "@omp-web/schedule-prompts-plugin",
3
+ "private": true,
4
+ "ompWeb": {
5
+ "plugins": [
6
+ { "id": "schedule-prompts", "module": "omp-web-plugin.js" }
7
+ ]
8
+ }
9
+ }
@@ -0,0 +1,242 @@
1
+ // Generated from omp-web-plugins/schedule-prompts/schedulePromptsPanelElement.ts. Do not edit directly.
2
+ export const schedulePromptsPanelTagName = "omp-web-schedule-prompts-panel";
3
+ const SCHEDULE_PROMPTS_CONFIG_PATH = ".omp-web/schedule-prompts.json";
4
+ const configCache = new Map();
5
+ export function defineSchedulePromptsPanelElement() {
6
+ if (!customElements.get(schedulePromptsPanelTagName)) {
7
+ customElements.define(schedulePromptsPanelTagName, OmpWebSchedulePromptsPanel);
8
+ }
9
+ }
10
+ export function schedulePromptsBadge(context) {
11
+ const cached = configCache.get(cacheKeyForContext(context));
12
+ if (cached === undefined || "kind" in cached)
13
+ return undefined;
14
+ const enabled = cached.jobs.filter((j) => j.enabled).length;
15
+ return enabled > 0 ? String(enabled) : undefined;
16
+ }
17
+ class OmpWebSchedulePromptsPanel extends HTMLElement {
18
+ contextValue;
19
+ root;
20
+ pollTimer;
21
+ constructor() {
22
+ super();
23
+ this.root = this.attachShadow({ mode: "open" });
24
+ }
25
+ set context(value) {
26
+ this.contextValue = value;
27
+ if (value) {
28
+ void this.loadJobs(value);
29
+ }
30
+ this.render();
31
+ }
32
+ connectedCallback() {
33
+ this.render();
34
+ this.pollTimer = setInterval(() => {
35
+ if (this.contextValue)
36
+ void this.loadJobs(this.contextValue);
37
+ }, 30000);
38
+ }
39
+ disconnectedCallback() {
40
+ if (this.pollTimer !== undefined) {
41
+ clearInterval(this.pollTimer);
42
+ this.pollTimer = undefined;
43
+ }
44
+ }
45
+ render() {
46
+ const context = this.contextValue;
47
+ if (context === undefined) {
48
+ this.root.innerHTML = `${panelStyles()}<section class="empty">Select a workspace.</section>`;
49
+ return;
50
+ }
51
+ const key = cacheKeyForContext(context);
52
+ const cached = configCache.get(key);
53
+ const state = cached ?? { kind: "loading" };
54
+ const isLoading = "kind" in state && state.kind === "loading";
55
+ this.root.innerHTML = `
56
+ ${panelStyles()}
57
+ <section class="toolbar">
58
+ <strong>Scheduled Prompts</strong>
59
+ <button class="secondary" data-refresh ${isLoading ? "disabled" : ""}>Refresh</button>
60
+ </section>
61
+ <section class="viewer">
62
+ ${this.renderState(state)}
63
+ </section>
64
+ `;
65
+ this.root.querySelector("button[data-refresh]")?.addEventListener("click", () => {
66
+ void this.loadJobs(context);
67
+ });
68
+ this.root.querySelector("button[data-toggle]")?.addEventListener("click", (e) => {
69
+ const btn = e.currentTarget;
70
+ if (!(btn instanceof HTMLElement))
71
+ return;
72
+ const jobId = btn.getAttribute("data-job-id");
73
+ const enabled = btn.getAttribute("data-enabled") === "true";
74
+ if (jobId !== null && jobId !== "") {
75
+ context.prompt.insertText(enabled
76
+ ? `schedule_prompt action="disable" jobId="${jobId}"`
77
+ : `schedule_prompt action="enable" jobId="${jobId}"`);
78
+ }
79
+ });
80
+ this.root.querySelector("button[data-remove]")?.addEventListener("click", (e) => {
81
+ const btn = e.currentTarget;
82
+ if (!(btn instanceof HTMLElement))
83
+ return;
84
+ const jobId = btn.getAttribute("data-job-id");
85
+ if (jobId !== null && jobId !== "") {
86
+ context.prompt.insertText(`schedule_prompt action="remove" jobId="${jobId}"`);
87
+ }
88
+ });
89
+ }
90
+ renderState(state) {
91
+ if ("version" in state) {
92
+ if (state.jobs.length === 0) {
93
+ return `<p class="muted">No scheduled prompts. Use the <code>schedule_prompt</code> tool to add one.</p>`;
94
+ }
95
+ return `<div class="jobs">${state.jobs.map((job) => this.renderJobRow(job)).join("")}</div>`;
96
+ }
97
+ if (state.kind === "loading") {
98
+ return `<p class="muted">Loading ${SCHEDULE_PROMPTS_CONFIG_PATH}…</p>`;
99
+ }
100
+ return `<div class="status error">${escapeHtml(state.message)}</div>`;
101
+ }
102
+ renderJobRow(job) {
103
+ const statusIcon = statusIconFor(job.lastStatus, job.enabled);
104
+ const scheduleText = humanizeSchedule(job);
105
+ const truncatedPrompt = job.prompt.length > 60 ? job.prompt.slice(0, 60) + "…" : job.prompt;
106
+ const nextRun = job.nextRun !== undefined && job.nextRun !== "" ? formatDate(job.nextRun) : "—";
107
+ const lastRun = job.lastRun !== undefined && job.lastRun !== "" ? formatDate(job.lastRun) : "—";
108
+ const statusLabel = job.lastStatus ?? "pending";
109
+ return `
110
+ <article class="job-row">
111
+ <div class="job-info">
112
+ <span class="job-icon">${statusIcon}</span>
113
+ <div class="job-details">
114
+ <strong>${escapeHtml(job.name)}</strong>
115
+ <span class="schedule">${escapeHtml(scheduleText)}</span>
116
+ <span class="prompt-text">${escapeHtml(truncatedPrompt)}</span>
117
+ <span class="meta">Next: ${nextRun} | Last: ${lastRun} | Runs: ${String(job.runCount)} | ${statusLabel}</span>
118
+ </div>
119
+ </div>
120
+ <div class="job-actions">
121
+ <button data-job-id="${escapeAttr(job.id)}" data-enabled="${String(job.enabled)}" data-toggle class="secondary">${job.enabled ? "Disable" : "Enable"}</button>
122
+ <button data-job-id="${escapeAttr(job.id)}" data-remove class="danger">Remove</button>
123
+ </div>
124
+ </article>
125
+ `;
126
+ }
127
+ async loadJobs(context) {
128
+ const key = cacheKeyForContext(context);
129
+ try {
130
+ const response = await context.files.readFile(SCHEDULE_PROMPTS_CONFIG_PATH);
131
+ const content = typeof response.content === "string"
132
+ ? response.content
133
+ : new TextDecoder().decode(response.content);
134
+ const parsed = JSON.parse(content);
135
+ if (!isCronStore(parsed)) {
136
+ throw new Error("Invalid schedule-prompts payload");
137
+ }
138
+ configCache.set(key, parsed);
139
+ }
140
+ catch {
141
+ configCache.set(key, {
142
+ kind: "unavailable",
143
+ message: "No schedule-prompts file yet. Use the schedule_prompt tool to create your first job.",
144
+ });
145
+ }
146
+ this.render();
147
+ }
148
+ }
149
+ function cacheKeyForContext(context) {
150
+ return `${context.machine.id}:${context.workspace.projectId}:${context.workspace.id}`;
151
+ }
152
+ function statusIconFor(lastStatus, enabled) {
153
+ if (!enabled)
154
+ return "✗";
155
+ if (lastStatus === "running")
156
+ return "⟳";
157
+ if (lastStatus === "error")
158
+ return "!";
159
+ return "✓";
160
+ }
161
+ function humanizeSchedule(job) {
162
+ if (job.type === "interval")
163
+ return `every ${job.schedule}`;
164
+ if (job.type === "once") {
165
+ const d = new Date(job.schedule);
166
+ return Number.isNaN(d.getTime()) ? job.schedule : formatDate(job.schedule);
167
+ }
168
+ return humanizeCron(job.schedule);
169
+ }
170
+ function humanizeCron(expression) {
171
+ const known = {
172
+ "* * * * * *": "every second",
173
+ "0 * * * * *": "every minute",
174
+ "0 */5 * * * *": "every 5 min",
175
+ "0 */10 * * * *": "every 10 min",
176
+ "0 */15 * * * *": "every 15 min",
177
+ "0 */30 * * * *": "every 30 min",
178
+ "0 0 * * * *": "every hour",
179
+ "0 0 */2 * * *": "every 2 hours",
180
+ "0 0 */3 * * *": "every 3 hours",
181
+ "0 0 */6 * * *": "every 6 hours",
182
+ "0 0 0 * * *": "daily",
183
+ "0 0 0 * * 0": "weekly",
184
+ "0 0 0 1 * *": "monthly",
185
+ "0 0 9 * * 1-5": "9am weekdays",
186
+ "0 0 0 * * 1-5": "weekdays",
187
+ "0 0 0 * * 0,6": "weekends",
188
+ };
189
+ return known[expression] ?? expression;
190
+ }
191
+ function formatDate(input) {
192
+ const date = new Date(input);
193
+ if (Number.isNaN(date.getTime()))
194
+ return input;
195
+ const months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
196
+ const month = months[date.getMonth()] ?? "";
197
+ const day = String(date.getDate());
198
+ const hours = String(date.getHours()).padStart(2, "0");
199
+ const minutes = String(date.getMinutes()).padStart(2, "0");
200
+ return `${month} ${day} ${hours}:${minutes}`;
201
+ }
202
+ function isCronStore(value) {
203
+ return (typeof value === "object" &&
204
+ value !== null &&
205
+ "version" in value &&
206
+ value.version === 1 &&
207
+ "jobs" in value &&
208
+ Array.isArray(value.jobs));
209
+ }
210
+ function escapeHtml(value) {
211
+ return String(value).replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;");
212
+ }
213
+ function escapeAttr(value) {
214
+ return escapeHtml(value).replaceAll('"', "&quot;");
215
+ }
216
+ function panelStyles() {
217
+ return `
218
+ <style>
219
+ :host { display: contents; }
220
+ .toolbar { display: flex; align-items: center; justify-content: space-between; gap: 8px; padding: 10px 12px; border-bottom: 1px solid var(--pi-border-muted); }
221
+ .viewer { box-sizing: border-box; min-height: 0; overflow: auto; padding: 12px; }
222
+ .jobs { display: grid; gap: 10px; }
223
+ .job-row { display: grid; grid-template-columns: 1fr auto; gap: 12px; align-items: center; border: 1px solid var(--pi-border); border-radius: 10px; background: var(--pi-surface); padding: 12px; }
224
+ .job-info { display: grid; grid-template-columns: auto 1fr; gap: 8px; align-items: start; }
225
+ .job-icon { font-size: 16px; line-height: 1.4; }
226
+ .job-details { display: grid; gap: 3px; min-width: 0; }
227
+ .job-details .schedule { color: var(--pi-accent); font-size: 12px; }
228
+ .job-details .prompt-text { color: var(--pi-text-secondary); font-size: 12px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
229
+ .job-details .meta { color: var(--pi-muted); font-size: 11px; }
230
+ .job-actions { display: inline-flex; flex-wrap: wrap; gap: 6px; }
231
+ button { border: 1px solid var(--pi-accent-border); border-radius: 7px; background: var(--pi-accent); color: var(--pi-bg); cursor: pointer; padding: 6px 10px; font: inherit; font-size: 12px; }
232
+ button.secondary { border-color: var(--pi-border); background: var(--pi-surface); color: var(--pi-text); }
233
+ button.danger { border-color: var(--pi-danger); background: transparent; color: var(--pi-danger); }
234
+ button:disabled { cursor: wait; opacity: 0.65; }
235
+ .muted { color: var(--pi-muted); }
236
+ .status { border: 1px solid var(--pi-border); border-radius: 8px; padding: 10px; color: var(--pi-muted); }
237
+ .status.error { border-color: var(--pi-danger); color: var(--pi-danger); }
238
+ .empty { padding: 16px; color: var(--pi-muted); }
239
+ code { border: 1px solid var(--pi-border-muted); border-radius: 6px; background: var(--pi-bg); color: var(--pi-text-secondary); font: 12px ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; padding: 2px 5px; }
240
+ </style>
241
+ `;
242
+ }
@@ -0,0 +1,2 @@
1
+ // Generated from omp-web-plugins/schedule-prompts/types.ts. Do not edit directly.
2
+ export {};
@@ -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
+ }