@velor/remote-mouse 6.4.8

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 (316) hide show
  1. package/.artifacts/screenshots/remote-mobile-config.png +0 -0
  2. package/.artifacts/screenshots/remote-mobile-home.png +0 -0
  3. package/.artifacts/screenshots/remote-mobile-preferences.png +0 -0
  4. package/.artifacts/screenshots/remote-mobile-server-info.png +0 -0
  5. package/.artifacts/screenshots/remote-mobile-vlc.png +0 -0
  6. package/.env.example +93 -0
  7. package/README.md +370 -0
  8. package/bin/remote-mouse.js +19 -0
  9. package/client/core/dom.js +148 -0
  10. package/client/core/init-socket-io.js +117 -0
  11. package/client/core/socket-emit.js +6 -0
  12. package/client/core/window-events.js +23 -0
  13. package/client/i18n/apply-page-translations.js +18 -0
  14. package/client/i18n/constants.js +3 -0
  15. package/client/i18n/core.js +40 -0
  16. package/client/i18n/locale-registry.js +77 -0
  17. package/client/i18n/locales/de.js +227 -0
  18. package/client/i18n/locales/en.js +389 -0
  19. package/client/i18n/locales/es.js +228 -0
  20. package/client/i18n/locales/fr.js +389 -0
  21. package/client/i18n/locales/it.js +227 -0
  22. package/client/i18n/locales/ja.js +227 -0
  23. package/client/i18n/locales/pt.js +227 -0
  24. package/client/i18n/locales/ru.js +240 -0
  25. package/client/i18n/locales/zh.js +227 -0
  26. package/client/preferences/constants.js +15 -0
  27. package/client/preferences/effects.js +24 -0
  28. package/client/preferences/load.js +19 -0
  29. package/client/preferences/render.js +26 -0
  30. package/client/preferences/rows.js +78 -0
  31. package/client/preferences/state.js +29 -0
  32. package/client/preview/create-preview-frame-receiver.js +13 -0
  33. package/client/preview/draw.js +77 -0
  34. package/client/preview/parse-preview-frame.js +39 -0
  35. package/client/preview/preview-stream.js +152 -0
  36. package/client/services/app-state/appStateKeys.js +30 -0
  37. package/client/services/app-state/createAppStateService.js +216 -0
  38. package/client/services/app-state/createPersistStoreService.js +122 -0
  39. package/client/services/app-state/createStateStoreService.js +64 -0
  40. package/client/services/app-state/localStorageBinding.js +26 -0
  41. package/client/services/app-state/normalizers.js +74 -0
  42. package/client/services/app-state/resolveEffectiveStateValue.js +58 -0
  43. package/client/services/app-state/stateDefinitions.js +107 -0
  44. package/client/services/backend/createBackendService.js +55 -0
  45. package/client/services/config/ConfigView.js +45 -0
  46. package/client/services/config/createClientConfigService.js +122 -0
  47. package/client/services/config/defaultClientConfig.js +22 -0
  48. package/client/services/createServicesContainer.js +48 -0
  49. package/client/services/createServicesRegistry.js +26 -0
  50. package/client/services/i18n/createI18nService.js +86 -0
  51. package/client/services/notifications/createNotificationService.js +56 -0
  52. package/client/services/pubsub/createPubSubService.js +20 -0
  53. package/client/services/remotes/createRemotesService.js +20 -0
  54. package/client/services/transport/createSocketIoTransportService.js +50 -0
  55. package/client/touch/bindTouchPassthrough.js +94 -0
  56. package/client/touch/createTouchList.js +18 -0
  57. package/client/touch/dispatchSyntheticTouch.js +20 -0
  58. package/client/touch/gesture-zone.js +28 -0
  59. package/client/touch/throttle.js +46 -0
  60. package/client/touch/touch-handlers.js +193 -0
  61. package/client/touch/touchpad.js +231 -0
  62. package/client/ui/config/page.js +840 -0
  63. package/client/ui/main/applyRemoteVisibilityState.js +60 -0
  64. package/client/ui/main/bind-client-notifications.js +3 -0
  65. package/client/ui/main/bindings/bindAccordion.js +121 -0
  66. package/client/ui/main/bindings/bindActionButtons.js +13 -0
  67. package/client/ui/main/bindings/bindAdminDrawer.js +137 -0
  68. package/client/ui/main/bindings/bindAdminRemoteButtons.js +77 -0
  69. package/client/ui/main/bindings/bindAdminVersion.js +27 -0
  70. package/client/ui/main/bindings/bindBrowserRemoteButtons.js +119 -0
  71. package/client/ui/main/bindings/bindRemoteAccordion.js +23 -0
  72. package/client/ui/main/bindings/bindSamsungRemoteButtons.js +320 -0
  73. package/client/ui/main/bindings/bindSystemRemoteButtons.js +41 -0
  74. package/client/ui/main/bindings/bindVlcRemoteButtons.js +64 -0
  75. package/client/ui/main/canvas-ui.js +33 -0
  76. package/client/ui/main/connection-overlay.js +57 -0
  77. package/client/ui/main/init-ui.js +54 -0
  78. package/client/ui/main/keyboard-panel.js +271 -0
  79. package/client/ui/main/mouse-buttons.js +94 -0
  80. package/client/ui/main/page.js +21 -0
  81. package/client/ui/notifications/show-toast.js +48 -0
  82. package/client/ui/preferences/bindPreferenceSwitchers.js +49 -0
  83. package/client/ui/preferences/page.js +61 -0
  84. package/client/ui/preferences/switchers.js +200 -0
  85. package/index.js +9 -0
  86. package/package.json +41 -0
  87. package/public/admin-config.css +447 -0
  88. package/public/admin-config.html +63 -0
  89. package/public/apple-touch-icon.png +0 -0
  90. package/public/brave-icon.svg +13 -0
  91. package/public/favicon.svg +30 -0
  92. package/public/icon-192.png +0 -0
  93. package/public/icon-512.png +0 -0
  94. package/public/index.html +246 -0
  95. package/public/manifest.webmanifest +45 -0
  96. package/public/preferences.html +55 -0
  97. package/public/server-info.html +574 -0
  98. package/public/styles.css +1042 -0
  99. package/public/sw.js +103 -0
  100. package/scripts/codex-commit.sh +112 -0
  101. package/scripts/generate-mobile-screenshots.mjs +244 -0
  102. package/scripts/install-linux.sh +633 -0
  103. package/scripts/install-windows.ps1 +369 -0
  104. package/server/application/createApplicationLifecycle.js +15 -0
  105. package/server/application/logger.js +216 -0
  106. package/server/application/shutdown.js +81 -0
  107. package/server/application/start.js +95 -0
  108. package/server/application/state.js +19 -0
  109. package/server/connection/api/admin-actions.router.js +65 -0
  110. package/server/connection/api/admin-configs.router.js +165 -0
  111. package/server/connection/api/admin-remotes.router.js +61 -0
  112. package/server/connection/api/admin-subs.router.js +49 -0
  113. package/server/connection/api/client.router.js +15 -0
  114. package/server/connection/api/configs.js +96 -0
  115. package/server/connection/api/qr-page.handler.js +17 -0
  116. package/server/connection/api/remotes.router.js +30 -0
  117. package/server/connection/api/server-info.router.js +149 -0
  118. package/server/connection/api/session.middleware.js +93 -0
  119. package/server/connection/api/unauthorized-response.js +73 -0
  120. package/server/connection/socket/createConnectionRegistrar.js +23 -0
  121. package/server/connection/socket/createSocketSessionAuthMiddleware.js +49 -0
  122. package/server/connection/socket/socket-action-responder.js +12 -0
  123. package/server/connection/socket/socket.timestamp-middleware.js +51 -0
  124. package/server/index.js +12 -0
  125. package/server/init/bootstrapApi.js +87 -0
  126. package/server/init/bootstrapSocket.js +79 -0
  127. package/server/init/createAdminApiRouter.js +22 -0
  128. package/server/init/createAdminUiRouter.js +21 -0
  129. package/server/init/createSocketActionRegistrars.js +52 -0
  130. package/server/init/observers/startConfigObserver.js +51 -0
  131. package/server/init/observers/startDisplaySizeObserver.js +55 -0
  132. package/server/init/observers/startNotificationObserver.js +49 -0
  133. package/server/init/observers/startQrOverlayHoverObserver.js +89 -0
  134. package/server/init/observers/startQrOverlayRefreshObserver.js +53 -0
  135. package/server/os/darwin/app.js +45 -0
  136. package/server/os/darwin/applescript.js +51 -0
  137. package/server/os/darwin/cliSocket.js +53 -0
  138. package/server/os/darwin/url.js +9 -0
  139. package/server/os/darwin/window.js +10 -0
  140. package/server/os/linux/app.js +120 -0
  141. package/server/os/linux/cliSocket.js +53 -0
  142. package/server/os/linux/process.js +69 -0
  143. package/server/os/linux/screen.js +58 -0
  144. package/server/os/linux/systemd.js +139 -0
  145. package/server/os/linux/url.js +17 -0
  146. package/server/os/linux/windows.js +144 -0
  147. package/server/os/win32/app.js +66 -0
  148. package/server/os/win32/cliSocket.js +15 -0
  149. package/server/os/win32/powershell.js +70 -0
  150. package/server/os/win32/process.js +20 -0
  151. package/server/os/win32/service.js +95 -0
  152. package/server/os/win32/url.js +9 -0
  153. package/server/os/win32/window.js +10 -0
  154. package/server/remotes/admin/createAdminEventGuardMiddleware.js +29 -0
  155. package/server/remotes/admin/createForceUpdateCheckAction.js +39 -0
  156. package/server/remotes/admin/createInstallUpdateAction.js +64 -0
  157. package/server/remotes/admin/createOpenQrBrowserAction.js +63 -0
  158. package/server/remotes/admin/createOpenServerInfoBrowserAction.js +58 -0
  159. package/server/remotes/admin/createRestartServiceAction.js +20 -0
  160. package/server/remotes/admin/createRotateEntryTokenAction.js +43 -0
  161. package/server/remotes/admin/createToggleQrOverlayAction.js +38 -0
  162. package/server/remotes/admin/index.js +32 -0
  163. package/server/remotes/admin/notifyIfRestarted.js +102 -0
  164. package/server/remotes/admin/registrar.js +94 -0
  165. package/server/remotes/browser/actions/createFocusOrLaunchBrowserAction.js +22 -0
  166. package/server/remotes/browser/actions/openUrlOnHost.js +3 -0
  167. package/server/remotes/browser/browserCatalog.js +70 -0
  168. package/server/remotes/browser/index.js +15 -0
  169. package/server/remotes/browser/listBrowsersOnHost.js +23 -0
  170. package/server/remotes/browser/registrar.js +29 -0
  171. package/server/remotes/browser/spec.js +18 -0
  172. package/server/remotes/browser/state.js +5 -0
  173. package/server/remotes/input/registrar.js +39 -0
  174. package/server/remotes/preview/bgraToRgbaBuffer.js +20 -0
  175. package/server/remotes/preview/captureAroundCursor.js +19 -0
  176. package/server/remotes/preview/createPreviewStreamer.js +85 -0
  177. package/server/remotes/preview/registrar.js +34 -0
  178. package/server/remotes/samsung/createSamsungCommandService.js +203 -0
  179. package/server/remotes/samsung/createSamsungRemote.js +26 -0
  180. package/server/remotes/samsung/createSamsungRemoteGetter.js +46 -0
  181. package/server/remotes/samsung/createSamsungTvGetter.js +102 -0
  182. package/server/remotes/samsung/device-config.js +122 -0
  183. package/server/remotes/samsung/registrar.js +59 -0
  184. package/server/remotes/samsung/utils.js +56 -0
  185. package/server/remotes/vlc/index.js +39 -0
  186. package/server/remotes/vlc/registrar.js +94 -0
  187. package/server/remotes/vlc/spec.js +15 -0
  188. package/server/remotes/vlc/state.js +5 -0
  189. package/server/remotes/window/index.js +6 -0
  190. package/server/remotes/window/registrar.js +28 -0
  191. package/server/services/application/createApplicationDaemonService.js +144 -0
  192. package/server/services/application/getDaemonServiceAdapter.js +56 -0
  193. package/server/services/application/utils.js +29 -0
  194. package/server/services/config/bootstrapConfig.js +38 -0
  195. package/server/services/config/configPaths.js +42 -0
  196. package/server/services/config/configSchema.js +297 -0
  197. package/server/services/config/configService.js +89 -0
  198. package/server/services/config/defaultConfig.js +137 -0
  199. package/server/services/config/envConfig.js +49 -0
  200. package/server/services/config/index.js +9 -0
  201. package/server/services/config/logConfig.js +54 -0
  202. package/server/services/config/system-config.js +44 -0
  203. package/server/services/createServicesContainer.js +94 -0
  204. package/server/services/createServicesRegistry.js +48 -0
  205. package/server/services/input/createInputController.js +17 -0
  206. package/server/services/input/createKeyboardController.js +146 -0
  207. package/server/services/input/createMouseController.js +182 -0
  208. package/server/services/notifier/createClientNotifier.js +23 -0
  209. package/server/services/notifier/createHostNotifier.js +41 -0
  210. package/server/services/notifier/createNotifier.js +13 -0
  211. package/server/services/notifier/createNotifierComposite.js +122 -0
  212. package/server/services/notifier/handleOpenQrBrowserEvent.js +40 -0
  213. package/server/services/notifier/handleOpenServerInfoBrowserEvent.js +40 -0
  214. package/server/services/notifier/handleRestartServiceEvent.js +37 -0
  215. package/server/services/notifier/handleRotateEntryTokenEvent.js +42 -0
  216. package/server/services/notifier/handleSessionEvent.js +24 -0
  217. package/server/services/notifier/handleToggleQrOverlayEvent.js +21 -0
  218. package/server/services/notifier/host-notifier/createLinuxHostNotifier.js +23 -0
  219. package/server/services/notifier/host-notifier/createNodeNotifierHostNotifier.js +24 -0
  220. package/server/services/notifier/host-notifier/index.js +11 -0
  221. package/server/services/notifier/mapper/handleForceUpdateCheckEvent.js +24 -0
  222. package/server/services/notifier/mapper/handleInstallUpdateEvent.js +53 -0
  223. package/server/services/notifier/mapper/handleSocketEvent.js +40 -0
  224. package/server/services/notifier/mapper/handleUpdateManagerEvent.js +24 -0
  225. package/server/services/notifier/mapper/notify.js +7 -0
  226. package/server/services/os/index.js +23 -0
  227. package/server/services/os/platforms/createFallbackAdapter.js +31 -0
  228. package/server/services/os/platforms/darwin/app.js +6 -0
  229. package/server/services/os/platforms/darwin/index.js +21 -0
  230. package/server/services/os/platforms/darwin/scripts.js +4 -0
  231. package/server/services/os/platforms/darwin/url.js +1 -0
  232. package/server/services/os/platforms/darwin/window.js +4 -0
  233. package/server/services/os/platforms/linux/app.js +6 -0
  234. package/server/services/os/platforms/linux/index.js +33 -0
  235. package/server/services/os/platforms/linux/url.js +1 -0
  236. package/server/services/os/platforms/linux/windows.js +11 -0
  237. package/server/services/os/platforms/win32/app.js +6 -0
  238. package/server/services/os/platforms/win32/index.js +21 -0
  239. package/server/services/os/platforms/win32/overlay.js +6 -0
  240. package/server/services/os/platforms/win32/powershell.js +4 -0
  241. package/server/services/os/platforms/win32/url.js +1 -0
  242. package/server/services/os/platforms/win32/window.js +4 -0
  243. package/server/services/os/shared.js +2 -0
  244. package/server/services/overlay/createNoopOverlay.js +13 -0
  245. package/server/services/overlay/createQrOverlay.js +27 -0
  246. package/server/services/overlay/createQrOverlayWin32.js +158 -0
  247. package/server/services/overlay/createQrOverlayYad.js +178 -0
  248. package/server/services/overlay/renderQrPage.js +82 -0
  249. package/server/services/persistence/createConfigDao.js +106 -0
  250. package/server/services/persistence/createDatabaseProvider.js +23 -0
  251. package/server/services/persistence/createEntryTokenDao.js +140 -0
  252. package/server/services/persistence/createRestartLogDao.js +210 -0
  253. package/server/services/persistence/index.js +19 -0
  254. package/server/services/pubsub/createEventStore.js +54 -0
  255. package/server/services/pubsub/createPubSub.js +89 -0
  256. package/server/services/pubsub/createServiceEvents.js +29 -0
  257. package/server/services/pubsub/serviceEventConstants.js +39 -0
  258. package/server/services/remotes/createRemotes.js +25 -0
  259. package/server/services/server/createHttpsServer.js +12 -0
  260. package/server/services/server/createServer.js +66 -0
  261. package/server/services/sse/createSseService.js +96 -0
  262. package/server/services/sse/utils.js +7 -0
  263. package/server/services/system/createSystemService.js +170 -0
  264. package/server/services/system/getNetworkInfo.js +18 -0
  265. package/server/services/system/getScreenInfo.js +32 -0
  266. package/server/services/system/listNetworkInterfaces.js +27 -0
  267. package/server/services/task-manager/createTaskManager.js +68 -0
  268. package/server/services/task-runner/createTaskRunner.js +114 -0
  269. package/server/services/token-manager/createTokenManager.js +244 -0
  270. package/server/services/token-manager/token-format.js +7 -0
  271. package/server/services/token-manager/token-store-utils.js +8 -0
  272. package/server/services/update-manager/CommandUpdateSource.js +70 -0
  273. package/server/services/update-manager/NpmUpdateSource.js +34 -0
  274. package/server/services/update-manager/buildNpmGlobalUpdateCommand.js +15 -0
  275. package/server/services/update-manager/chooseUpdateCheckSource.js +20 -0
  276. package/server/services/update-manager/chooseUpdateInstallSource.js +5 -0
  277. package/server/services/update-manager/createUpdateManager.js +109 -0
  278. package/server/services/update-manager/resolveInstallUpdateCommand.js +42 -0
  279. package/server/term/cli/executeLocalServiceCommand.js +42 -0
  280. package/server/term/cli/getCliSocketPath.js +5 -0
  281. package/server/term/cli/parseCliArgs.js +110 -0
  282. package/server/term/cli/printCliResult.js +18 -0
  283. package/server/term/cli/runCliCmd.js +50 -0
  284. package/server/term/cli/sendCliCommand.js +76 -0
  285. package/server/term/cliSocket.js +29 -0
  286. package/server/term/srv/commands/configCommand.js +84 -0
  287. package/server/term/srv/commands/helpCommand.js +6 -0
  288. package/server/term/srv/commands/infoCommand.js +7 -0
  289. package/server/term/srv/commands/openQrCommand.js +7 -0
  290. package/server/term/srv/commands/samsungDetectCommand.js +52 -0
  291. package/server/term/srv/commands/serviceCommand.js +25 -0
  292. package/server/term/srv/commands/systemConfigCommand.js +7 -0
  293. package/server/term/srv/commands/tasksCommand.js +24 -0
  294. package/server/term/srv/commands/tokensCommand.js +15 -0
  295. package/server/term/srv/executeCliCommand.js +44 -0
  296. package/server/term/srv/executeCliRequest.js +38 -0
  297. package/server/term/srv/startCliServer.js +140 -0
  298. package/server/utils/createRandomToken.js +11 -0
  299. package/server/utils/env.js +155 -0
  300. package/server/utils/git.js +13 -0
  301. package/server/utils/http.js +7 -0
  302. package/server/utils/network.js +45 -0
  303. package/server/utils/paths.js +10 -0
  304. package/server/utils/process.js +57 -0
  305. package/server/utils/robot.js +11 -0
  306. package/server/utils/semver.js +33 -0
  307. package/server/utils/truncateText.js +7 -0
  308. package/utils/createLazy.js +13 -0
  309. package/utils/functional.js +48 -0
  310. package/utils/math.js +26 -0
  311. package/utils/notificationSettings.js +61 -0
  312. package/utils/object.utils.js +79 -0
  313. package/utils/predicates.js +17 -0
  314. package/utils/remoteCommands.js +40 -0
  315. package/utils/sync.js +3 -0
  316. package/velor-remote-mouse-6.4.8.tgz +0 -0
package/public/sw.js ADDED
@@ -0,0 +1,103 @@
1
+ const CACHE_NAME = 'remote-mouse-shell-v4';
2
+ const SHELL_ASSETS = [
3
+ '/',
4
+ '/styles.css?v=20260404a',
5
+ '/favicon.svg',
6
+ '/icon-192.png',
7
+ '/icon-512.png',
8
+ '/apple-touch-icon.png',
9
+ '/manifest.webmanifest',
10
+ '/client/ui/main/page.js?v=20260404a',
11
+ ];
12
+
13
+ self.addEventListener('install', (event) => {
14
+ event.waitUntil(
15
+ (async () => {
16
+ try {
17
+ const cache = await caches.open(CACHE_NAME);
18
+ await cache.addAll(SHELL_ASSETS);
19
+ } catch (_error) {}
20
+ })(),
21
+ );
22
+ self.skipWaiting();
23
+ });
24
+
25
+ self.addEventListener('activate', (event) => {
26
+ event.waitUntil(
27
+ (async () => {
28
+ const keys = await caches.keys();
29
+ await Promise.all(
30
+ keys
31
+ .filter((key) => key !== CACHE_NAME)
32
+ .map((key) => caches.delete(key)),
33
+ );
34
+ })(),
35
+ );
36
+ self.clients.claim();
37
+ });
38
+
39
+ self.addEventListener('fetch', (event) => {
40
+ const request = event.request;
41
+ if (request.method !== 'GET') {
42
+ return;
43
+ }
44
+
45
+ const url = new URL(request.url);
46
+ if (url.origin !== self.location.origin) {
47
+ return;
48
+ }
49
+ if (url.pathname.startsWith('/socket.io/')) {
50
+ return;
51
+ }
52
+
53
+ if (request.mode === 'navigate') {
54
+ event.respondWith(
55
+ fetch(request).catch(() => caches.match('/')),
56
+ );
57
+ return;
58
+ }
59
+
60
+ if (
61
+ request.destination === 'script'
62
+ || request.destination === 'style'
63
+ || url.pathname.startsWith('/client/')
64
+ ) {
65
+ event.respondWith(
66
+ (async () => {
67
+ try {
68
+ const response = await fetch(request);
69
+ const responseClone = response.clone();
70
+ void (async () => {
71
+ try {
72
+ const cache = await caches.open(CACHE_NAME);
73
+ await cache.put(request, responseClone);
74
+ } catch (_error) {}
75
+ })();
76
+ return response;
77
+ } catch (_error) {
78
+ return caches.match(request);
79
+ }
80
+ })(),
81
+ );
82
+ return;
83
+ }
84
+
85
+ event.respondWith(
86
+ (async () => {
87
+ const cached = await caches.match(request);
88
+ if (cached) {
89
+ return cached;
90
+ }
91
+
92
+ const response = await fetch(request);
93
+ const responseClone = response.clone();
94
+ void (async () => {
95
+ try {
96
+ const cache = await caches.open(CACHE_NAME);
97
+ await cache.put(request, responseClone);
98
+ } catch (_error) {}
99
+ })();
100
+ return response;
101
+ })(),
102
+ );
103
+ });
@@ -0,0 +1,112 @@
1
+ #!/usr/bin/env bash
2
+
3
+ set -euo pipefail
4
+
5
+ ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
6
+ cd "$ROOT_DIR"
7
+
8
+ if ! command -v codex >/dev/null 2>&1; then
9
+ echo "codex introuvable dans le PATH." >&2
10
+ exit 1
11
+ fi
12
+
13
+ if ! command -v jq >/dev/null 2>&1; then
14
+ echo "jq est requis." >&2
15
+ exit 1
16
+ fi
17
+
18
+ if ! git rev-parse --is-inside-work-tree >/dev/null 2>&1; then
19
+ echo "Ce script doit etre lance dans un depot git." >&2
20
+ exit 1
21
+ fi
22
+
23
+ if [[ -n "$(git status --porcelain)" ]]; then
24
+ :
25
+ else
26
+ echo "Aucune modification detectee." >&2
27
+ exit 1
28
+ fi
29
+
30
+ SCHEMA_FILE="$(mktemp)"
31
+ OUTPUT_FILE="$(mktemp)"
32
+ trap 'rm -f "$SCHEMA_FILE" "$OUTPUT_FILE"' EXIT
33
+ SKILL_FILE="$ROOT_DIR/.codex/skills/codex-commit/SKILL.md"
34
+
35
+ cat > "$SCHEMA_FILE" <<'EOF'
36
+ {
37
+ "type": "object",
38
+ "additionalProperties": false,
39
+ "required": ["bump", "message"],
40
+ "properties": {
41
+ "bump": {
42
+ "type": "string",
43
+ "enum": ["patch", "minor", "major"]
44
+ },
45
+ "message": {
46
+ "type": "string",
47
+ "minLength": 1
48
+ }
49
+ }
50
+ }
51
+ EOF
52
+
53
+ if [[ -f "$SKILL_FILE" ]]; then
54
+ PROMPT="$(cat <<'EOF'
55
+ Utilise la skill `codex-commit` disponible dans le depot courant.
56
+
57
+ Analyse le depot git courant et determine:
58
+ - le niveau de version semver a appliquer dans package.json parmi patch, minor, major
59
+ - un message de commit git court, clair, en francais
60
+
61
+ Contraintes de sortie:
62
+ - reponds uniquement avec l'objet JSON conforme au schema
63
+ - le message doit etre en une seule ligne, sans backticks, sans prefixe de type obligatoire
64
+ EOF
65
+ )"
66
+ else
67
+ PROMPT="$(cat <<'EOF'
68
+ Analyse le depot git courant et determine:
69
+ - le niveau de version semver a appliquer dans package.json parmi patch, minor, major
70
+ - un message de commit git court, clair, en francais
71
+
72
+ Regles:
73
+ - major si breaking change observable
74
+ - minor si ajout de fonctionnalite utilisateur ou nouvelle capacite notable
75
+ - patch pour correctif, refactor, test, docs, chore ou petit ajustement
76
+ - reponds uniquement avec l'objet JSON conforme au schema
77
+ - le message doit etre en une seule ligne, sans backticks, sans prefixe de type obligatoire
78
+ EOF
79
+ )"
80
+ fi
81
+
82
+ codex exec \
83
+ --full-auto \
84
+ --skip-git-repo-check \
85
+ --output-schema "$SCHEMA_FILE" \
86
+ --output-last-message "$OUTPUT_FILE" \
87
+ --color never \
88
+ -C "$ROOT_DIR" \
89
+ "$PROMPT" >/dev/null
90
+
91
+ DECISION_JSON="$(cat "$OUTPUT_FILE")"
92
+ BUMP_TYPE="$(printf '%s' "$DECISION_JSON" | jq -r '.bump')"
93
+ COMMIT_MESSAGE="$(printf '%s' "$DECISION_JSON" | jq -r '.message')"
94
+
95
+ if [[ -z "$BUMP_TYPE" || "$BUMP_TYPE" == "null" ]]; then
96
+ echo "Codex n'a pas retourne de bump valide." >&2
97
+ exit 1
98
+ fi
99
+
100
+ if [[ -z "$COMMIT_MESSAGE" || "$COMMIT_MESSAGE" == "null" ]]; then
101
+ echo "Codex n'a pas retourne de message de commit valide." >&2
102
+ exit 1
103
+ fi
104
+
105
+ echo "Bump decide par Codex: $BUMP_TYPE"
106
+ echo "Message decide par Codex: $COMMIT_MESSAGE"
107
+
108
+ npm version "$BUMP_TYPE" --no-git-tag-version
109
+ git add -A
110
+ git commit -m "$COMMIT_MESSAGE"
111
+
112
+ echo "Commit cree avec succes."
@@ -0,0 +1,244 @@
1
+ #!/usr/bin/env node
2
+
3
+ import {spawn} from 'node:child_process';
4
+ import fs from 'node:fs/promises';
5
+ import os from 'node:os';
6
+ import path from 'node:path';
7
+ import {fileURLToPath} from 'node:url';
8
+ import {chromium, devices} from '@playwright/test';
9
+
10
+ const scriptDir = path.dirname(fileURLToPath(import.meta.url));
11
+ const projectRoot = path.resolve(scriptDir, '..');
12
+ const outputDir = path.resolve(projectRoot, '.artifacts', 'screenshots');
13
+ const port = Number(process.env.MOBILE_SCREENSHOT_PORT || process.env.PORT || 3211);
14
+ const baseUrl = String(process.env.MOBILE_SCREENSHOT_BASE_URL || `http://127.0.0.1:${port}`).replace(/\/$/, '');
15
+ const locale = String(process.env.MOBILE_SCREENSHOT_LOCALE || 'en');
16
+ const device = devices['iPhone 14 Pro'];
17
+ const stableScreenshotCss = [
18
+ '*,*::before,*::after{',
19
+ 'animation-duration:0s!important;',
20
+ 'animation-delay:0s!important;',
21
+ 'transition-duration:0s!important;',
22
+ 'scroll-behavior:auto!important;',
23
+ '}',
24
+ ].join('');
25
+
26
+ const screenshots = [
27
+ {
28
+ path: '/',
29
+ readySelector: '#touchpad',
30
+ fileName: 'remote-mobile-home.png',
31
+ },
32
+ {
33
+ path: '/',
34
+ readySelector: '#vlc-controls',
35
+ fileName: 'remote-mobile-vlc.png',
36
+ beforeCapture: async (page) => {
37
+ await page.evaluate(() => {
38
+ const remoteStack = document.querySelector('#remote-stack');
39
+ const vlcPanel = document.querySelector('#vlc-controls');
40
+ const vlcToggle = vlcPanel?.querySelector('.remote-panel-toggle');
41
+ vlcPanel.hidden = false;
42
+ vlcToggle?.click();
43
+
44
+ if (remoteStack && vlcPanel) {
45
+ remoteStack.prepend(vlcPanel);
46
+ }
47
+
48
+ document.querySelector('#vlc-controls')?.scrollIntoView({
49
+ block: 'start',
50
+ inline: 'nearest',
51
+ });
52
+ });
53
+ },
54
+ },
55
+ {
56
+ path: '/ui/admin/preferences',
57
+ readySelector: '[data-theme-switcher]',
58
+ fileName: 'remote-mobile-preferences.png',
59
+ },
60
+ {
61
+ path: '/ui/admin/config',
62
+ readySelector: '#config-form',
63
+ fileName: 'remote-mobile-config.png',
64
+ },
65
+ {
66
+ path: '/ui/admin/server-info',
67
+ readySelector: '#capabilities',
68
+ fileName: 'remote-mobile-server-info.png',
69
+ },
70
+ ];
71
+
72
+ function sleep(ms) {
73
+ return new Promise((resolve) => setTimeout(resolve, ms));
74
+ }
75
+
76
+ async function isServerHealthy() {
77
+ try {
78
+ const response = await fetch(`${baseUrl}/health`, {signal: AbortSignal.timeout(1000)});
79
+ return response.ok;
80
+ } catch {
81
+ return false;
82
+ }
83
+ }
84
+
85
+ async function waitForServer(serverProcess) {
86
+ const startedAt = Date.now();
87
+ while (Date.now() - startedAt < 30_000) {
88
+ if (await isServerHealthy()) {
89
+ return;
90
+ }
91
+ if (serverProcess.exitCode !== null) {
92
+ const details = serverProcess.stderrOutput ? `\n${serverProcess.stderrOutput.trim()}` : '';
93
+ throw new Error(`Server exited before becoming healthy with code ${serverProcess.exitCode}.${details}`);
94
+ }
95
+ await sleep(250);
96
+ }
97
+ const details = serverProcess.stderrOutput ? `\n${serverProcess.stderrOutput.trim()}` : '';
98
+ throw new Error(`Timed out waiting for ${baseUrl}/health.${details}`);
99
+ }
100
+
101
+ function startServer() {
102
+ const databasePath = path.join(os.tmpdir(), `remote-mouse-screenshots-${process.pid}.sqlite`);
103
+ const serverProcess = spawn(process.execPath, ['index.js'], {
104
+ cwd: projectRoot,
105
+ env: {
106
+ ...process.env,
107
+ PORT: String(port),
108
+ SERVER_HOST: '127.0.0.1',
109
+ PERSISTENCE_DB_PATH: databasePath,
110
+ LOG_LEVEL: process.env.LOG_LEVEL || 'fatal',
111
+ },
112
+ stdio: ['ignore', 'ignore', 'pipe'],
113
+ });
114
+ serverProcess.stderrOutput = '';
115
+ serverProcess.stderr.on('data', (chunk) => {
116
+ serverProcess.stderrOutput = `${serverProcess.stderrOutput}${chunk}`.slice(-4000);
117
+ });
118
+ return serverProcess;
119
+ }
120
+
121
+ async function stopServer(serverProcess) {
122
+ if (!serverProcess || serverProcess.exitCode !== null) {
123
+ return;
124
+ }
125
+
126
+ serverProcess.kill('SIGINT');
127
+ const stopped = await Promise.race([
128
+ new Promise((resolve) => serverProcess.once('exit', () => resolve(true))),
129
+ sleep(5000).then(() => false),
130
+ ]);
131
+
132
+ if (!stopped && serverProcess.exitCode === null) {
133
+ serverProcess.kill('SIGTERM');
134
+ }
135
+ }
136
+
137
+ async function captureScreenshots() {
138
+ await fs.mkdir(outputDir, {recursive: true});
139
+
140
+ const browser = await chromium.launch();
141
+ try {
142
+ const context = await browser.newContext({
143
+ ...device,
144
+ locale: locale === 'en' ? 'en-US' : locale,
145
+ });
146
+
147
+ await context.addInitScript(({selectedLocale, css}) => {
148
+ window.localStorage.setItem('remote-mouse.locale', selectedLocale);
149
+ window.addEventListener('DOMContentLoaded', () => {
150
+ const style = document.createElement('style');
151
+ style.textContent = css;
152
+ document.head.appendChild(style);
153
+ });
154
+ }, {
155
+ selectedLocale: locale,
156
+ css: stableScreenshotCss,
157
+ });
158
+
159
+ const page = await context.newPage();
160
+ page.setDefaultTimeout(15_000);
161
+ await page.route('**/api/admin/configs', async (route) => {
162
+ const response = await route.fetch();
163
+ const payload = await response.json();
164
+ const configs = Array.isArray(payload.configs) ? payload.configs.map((entry) => (
165
+ entry?.path === 'vlc.enabled' || entry?.id === 'vlc.enabled'
166
+ ? {...entry, value: true}
167
+ : entry
168
+ )) : payload.configs;
169
+
170
+ await route.fulfill({
171
+ response,
172
+ json: {
173
+ ...payload,
174
+ configs,
175
+ config: {
176
+ ...payload.config,
177
+ vlc: {
178
+ ...payload.config?.vlc,
179
+ enabled: true,
180
+ },
181
+ },
182
+ },
183
+ });
184
+ });
185
+ await page.route('**/api/admin/remotes', async (route) => {
186
+ const response = await route.fetch();
187
+ const payload = await response.json();
188
+ const remotes = Array.isArray(payload.remotes) ? [...payload.remotes] : [];
189
+ if (!remotes.some((remote) => remote?.id === 'vlc')) {
190
+ const insertAt = Math.max(0, remotes.findIndex((remote) => remote?.id === 'preview'));
191
+ remotes.splice(insertAt, 0, {
192
+ id: 'vlc',
193
+ labelKey: 'preferences.remote.vlc',
194
+ enabled: true,
195
+ });
196
+ }
197
+
198
+ await route.fulfill({
199
+ response,
200
+ json: {
201
+ ...payload,
202
+ remotes: remotes.map((remote) => (
203
+ remote?.id === 'vlc' ? {...remote, enabled: true} : remote
204
+ )),
205
+ },
206
+ });
207
+ });
208
+
209
+ for (const screenshot of screenshots) {
210
+ await page.goto(`${baseUrl}${screenshot.path}`, {
211
+ waitUntil: 'domcontentloaded',
212
+ timeout: 15_000,
213
+ });
214
+ await page.waitForSelector(screenshot.readySelector, {state: 'visible'});
215
+ await page.waitForFunction((expectedLocale) => (
216
+ document.documentElement.lang === expectedLocale
217
+ ), locale).catch(() => {});
218
+ await page.waitForTimeout(700);
219
+ if (screenshot.beforeCapture) {
220
+ await screenshot.beforeCapture(page);
221
+ await page.waitForTimeout(100);
222
+ }
223
+
224
+ const outputPath = path.join(outputDir, screenshot.fileName);
225
+ await page.screenshot({path: outputPath, fullPage: false});
226
+ console.log(`Generated ${path.relative(projectRoot, outputPath)}`);
227
+ }
228
+ } finally {
229
+ await browser.close();
230
+ }
231
+ }
232
+
233
+ let serverProcess = null;
234
+
235
+ try {
236
+ if (!(await isServerHealthy())) {
237
+ serverProcess = startServer();
238
+ await waitForServer(serverProcess);
239
+ }
240
+
241
+ await captureScreenshots();
242
+ } finally {
243
+ await stopServer(serverProcess);
244
+ }