@sirenodeck/sirenodeck 0.1.1-alpha.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 (485) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +69 -0
  3. package/bin/_wrapper-shared.js +42 -0
  4. package/bin/dev.js +95 -0
  5. package/bin/sirenodeck.js +42 -0
  6. package/config/default-config.yml +117 -0
  7. package/config/starter-config.yml +54 -0
  8. package/dist/main.mjs +64702 -0
  9. package/package.json +140 -0
  10. package/src/action/executor.ts +156 -0
  11. package/src/action/index.ts +7 -0
  12. package/src/addon/api-types.ts +15 -0
  13. package/src/addon/api.ts +461 -0
  14. package/src/addon/check-runner.ts +84 -0
  15. package/src/addon/index.ts +5 -0
  16. package/src/addon/loader.ts +441 -0
  17. package/src/addon/registry.ts +230 -0
  18. package/src/addon/spec.ts +69 -0
  19. package/src/api/addon.ts +33 -0
  20. package/src/api/asset-url.ts +24 -0
  21. package/src/api/index.ts +50 -0
  22. package/src/api/protocol-internal.ts +656 -0
  23. package/src/api/protocol.ts +2 -0
  24. package/src/api/react/index.ts +11 -0
  25. package/src/api/react/registry.ts +91 -0
  26. package/src/api/react/use-addon-channel.ts +26 -0
  27. package/src/api/react/use-button-state.tsx +23 -0
  28. package/src/api/react/use-deck.ts +24 -0
  29. package/src/assets/logo.png +0 -0
  30. package/src/assets/logo72x72.png +0 -0
  31. package/src/assets/logoFull.png +0 -0
  32. package/src/builtin-addons/brightness/README.md +51 -0
  33. package/src/builtin-addons/brightness/buttons/brightness/backend.ts +13 -0
  34. package/src/builtin-addons/brightness/buttons/brightness/config.ts +10 -0
  35. package/src/builtin-addons/brightness/buttons/brightness/frontend.tsx +50 -0
  36. package/src/builtin-addons/brightness/domain/macos.ts +46 -0
  37. package/src/builtin-addons/brightness/index.d.ts +5 -0
  38. package/src/builtin-addons/brightness/index.ts +20 -0
  39. package/src/builtin-addons/brightness/poller.ts +27 -0
  40. package/src/builtin-addons/brightness/providers/darwin.ts +107 -0
  41. package/src/builtin-addons/brightness/providers/index.ts +81 -0
  42. package/src/builtin-addons/brightness/providers/linux.ts +108 -0
  43. package/src/builtin-addons/brightness/providers/windows.ts +77 -0
  44. package/src/builtin-addons/brightness/sirenodeck.json +6 -0
  45. package/src/builtin-addons/coding-agents/assets/claude-code.svg +1 -0
  46. package/src/builtin-addons/coding-agents/assets/opencode-dark-square.svg +1 -0
  47. package/src/builtin-addons/coding-agents/buttons/agent/backend.ts +82 -0
  48. package/src/builtin-addons/coding-agents/buttons/agent/config.ts +13 -0
  49. package/src/builtin-addons/coding-agents/buttons/agent/frontend.tsx +130 -0
  50. package/src/builtin-addons/coding-agents/buttons/agent/pages.tsx +150 -0
  51. package/src/builtin-addons/coding-agents/buttons/summary/backend.ts +48 -0
  52. package/src/builtin-addons/coding-agents/buttons/summary/config.ts +11 -0
  53. package/src/builtin-addons/coding-agents/buttons/summary/frontend.tsx +254 -0
  54. package/src/builtin-addons/coding-agents/decks/agents.ts +69 -0
  55. package/src/builtin-addons/coding-agents/global/backend.ts +402 -0
  56. package/src/builtin-addons/coding-agents/global-entry.ts +7 -0
  57. package/src/builtin-addons/coding-agents/hook/script.ts +123 -0
  58. package/src/builtin-addons/coding-agents/index.ts +15 -0
  59. package/src/builtin-addons/coding-agents/manifest.ts +115 -0
  60. package/src/builtin-addons/coding-agents/providers/claude-code.ts +470 -0
  61. package/src/builtin-addons/coding-agents/providers/claude-instances.ts +184 -0
  62. package/src/builtin-addons/coding-agents/providers/opencode-instances.ts +108 -0
  63. package/src/builtin-addons/coding-agents/providers/opencode.ts +636 -0
  64. package/src/builtin-addons/coding-agents/providers/registry.ts +120 -0
  65. package/src/builtin-addons/coding-agents/providers/spawn.ts +112 -0
  66. package/src/builtin-addons/coding-agents/shared/claude-hook-events.ts +55 -0
  67. package/src/builtin-addons/coding-agents/shared/claude-status.ts +236 -0
  68. package/src/builtin-addons/coding-agents/shared/live-count.ts +39 -0
  69. package/src/builtin-addons/coding-agents/shared/notifier.ts +58 -0
  70. package/src/builtin-addons/coding-agents/shared/opencode-status.ts +82 -0
  71. package/src/builtin-addons/coding-agents/shared/snapshot.ts +66 -0
  72. package/src/builtin-addons/coding-agents/shared/state.ts +72 -0
  73. package/src/builtin-addons/coding-agents/sirenodeck.json +6 -0
  74. package/src/builtin-addons/coding-agents/types/types.ts +33 -0
  75. package/src/builtin-addons/core/README.md +89 -0
  76. package/src/builtin-addons/core/buttons/action/backend.ts +7 -0
  77. package/src/builtin-addons/core/buttons/action/config.ts +13 -0
  78. package/src/builtin-addons/core/buttons/action/frontend.tsx +16 -0
  79. package/src/builtin-addons/core/buttons/change-deck/backend.ts +18 -0
  80. package/src/builtin-addons/core/buttons/change-deck/config.ts +15 -0
  81. package/src/builtin-addons/core/buttons/change-deck/frontend.tsx +18 -0
  82. package/src/builtin-addons/core/buttons/media-sample/backend.ts +8 -0
  83. package/src/builtin-addons/core/buttons/media-sample/config.ts +7 -0
  84. package/src/builtin-addons/core/buttons/media-sample/frontend.tsx +2 -0
  85. package/src/builtin-addons/core/buttons/page-nav/backend.ts +28 -0
  86. package/src/builtin-addons/core/buttons/page-nav/config.ts +9 -0
  87. package/src/builtin-addons/core/buttons/page-nav/frontend.tsx +68 -0
  88. package/src/builtin-addons/core/buttons/toggle/backend.ts +119 -0
  89. package/src/builtin-addons/core/buttons/toggle/config.ts +57 -0
  90. package/src/builtin-addons/core/buttons/toggle/frontend.tsx +57 -0
  91. package/src/builtin-addons/core/buttons/toggle/global-service.ts +174 -0
  92. package/src/builtin-addons/core/index.ts +120 -0
  93. package/src/builtin-addons/core/sirenodeck.json +6 -0
  94. package/src/builtin-addons/date-time/README.md +73 -0
  95. package/src/builtin-addons/date-time/buttons/analog-clock/backend.ts +10 -0
  96. package/src/builtin-addons/date-time/buttons/analog-clock/config.ts +4 -0
  97. package/src/builtin-addons/date-time/buttons/analog-clock/frontend.tsx +88 -0
  98. package/src/builtin-addons/date-time/buttons/custom/backend.ts +10 -0
  99. package/src/builtin-addons/date-time/buttons/custom/config.ts +9 -0
  100. package/src/builtin-addons/date-time/buttons/custom/frontend.tsx +26 -0
  101. package/src/builtin-addons/date-time/buttons/date/backend.ts +10 -0
  102. package/src/builtin-addons/date-time/buttons/date/config.ts +10 -0
  103. package/src/builtin-addons/date-time/buttons/date/frontend.tsx +42 -0
  104. package/src/builtin-addons/date-time/buttons/time/backend.ts +10 -0
  105. package/src/builtin-addons/date-time/buttons/time/config.ts +9 -0
  106. package/src/builtin-addons/date-time/buttons/time/frontend.tsx +29 -0
  107. package/src/builtin-addons/date-time/index.d.ts +5 -0
  108. package/src/builtin-addons/date-time/index.ts +30 -0
  109. package/src/builtin-addons/date-time/poller.ts +11 -0
  110. package/src/builtin-addons/date-time/shared/format-date.ts +36 -0
  111. package/src/builtin-addons/date-time/shared/format.ts +105 -0
  112. package/src/builtin-addons/date-time/shared/use-now.ts +10 -0
  113. package/src/builtin-addons/date-time/sirenodeck.json +6 -0
  114. package/src/builtin-addons/emoji-selector/README.md +45 -0
  115. package/src/builtin-addons/emoji-selector/assets/launcher.svg +10 -0
  116. package/src/builtin-addons/emoji-selector/assets/smileys.svg +8 -0
  117. package/src/builtin-addons/emoji-selector/buttons/category/backend.ts +14 -0
  118. package/src/builtin-addons/emoji-selector/buttons/category/config.ts +8 -0
  119. package/src/builtin-addons/emoji-selector/buttons/category/frontend.tsx +19 -0
  120. package/src/builtin-addons/emoji-selector/buttons/emoji/backend.ts +7 -0
  121. package/src/builtin-addons/emoji-selector/buttons/emoji/config.ts +9 -0
  122. package/src/builtin-addons/emoji-selector/buttons/emoji/frontend.tsx +11 -0
  123. package/src/builtin-addons/emoji-selector/buttons/launcher/backend.ts +13 -0
  124. package/src/builtin-addons/emoji-selector/buttons/launcher/config.ts +6 -0
  125. package/src/builtin-addons/emoji-selector/buttons/launcher/frontend.tsx +31 -0
  126. package/src/builtin-addons/emoji-selector/data/categories.ts +1084 -0
  127. package/src/builtin-addons/emoji-selector/decks/index.ts +137 -0
  128. package/src/builtin-addons/emoji-selector/index.d.ts +5 -0
  129. package/src/builtin-addons/emoji-selector/index.ts +29 -0
  130. package/src/builtin-addons/emoji-selector/sirenodeck.json +6 -0
  131. package/src/builtin-addons/emoji-selector/support.ts +49 -0
  132. package/src/builtin-addons/index.ts +13 -0
  133. package/src/builtin-addons/internal-settings/README.md +26 -0
  134. package/src/builtin-addons/internal-settings/backend.ts +58 -0
  135. package/src/builtin-addons/internal-settings/buttons/app-info/backend.ts +7 -0
  136. package/src/builtin-addons/internal-settings/buttons/app-info/config.ts +13 -0
  137. package/src/builtin-addons/internal-settings/buttons/app-info/frontend.tsx +18 -0
  138. package/src/builtin-addons/internal-settings/buttons/brightness/common/frontend.tsx +50 -0
  139. package/src/builtin-addons/internal-settings/buttons/brightness-down/backend.ts +16 -0
  140. package/src/builtin-addons/internal-settings/buttons/brightness-down/config.ts +6 -0
  141. package/src/builtin-addons/internal-settings/buttons/brightness-down/frontend.tsx +8 -0
  142. package/src/builtin-addons/internal-settings/buttons/brightness-up/backend.ts +16 -0
  143. package/src/builtin-addons/internal-settings/buttons/brightness-up/config.ts +6 -0
  144. package/src/builtin-addons/internal-settings/buttons/brightness-up/frontend.tsx +8 -0
  145. package/src/builtin-addons/internal-settings/decks/settings.ts +25 -0
  146. package/src/builtin-addons/internal-settings/index.d.ts +4 -0
  147. package/src/builtin-addons/internal-settings/index.ts +53 -0
  148. package/src/builtin-addons/internal-settings/logo72x72.png +0 -0
  149. package/src/builtin-addons/internal-settings/sirenodeck.json +6 -0
  150. package/src/builtin-addons/media/README.md +45 -0
  151. package/src/builtin-addons/media/backend.ts +143 -0
  152. package/src/builtin-addons/media/buttons/media-player/backend.ts +19 -0
  153. package/src/builtin-addons/media/buttons/media-player/components/MediaStatus.tsx +25 -0
  154. package/src/builtin-addons/media/buttons/media-player/components/MediaSurface.tsx +52 -0
  155. package/src/builtin-addons/media/buttons/media-player/components/ProgressBar.tsx +21 -0
  156. package/src/builtin-addons/media/buttons/media-player/components/status-meta.ts +36 -0
  157. package/src/builtin-addons/media/buttons/media-player/config.ts +4 -0
  158. package/src/builtin-addons/media/buttons/media-player/frontend.tsx +29 -0
  159. package/src/builtin-addons/media/buttons/volume/common/frontend.tsx +52 -0
  160. package/src/builtin-addons/media/buttons/volume/mute/backend.ts +13 -0
  161. package/src/builtin-addons/media/buttons/volume/mute/config.ts +4 -0
  162. package/src/builtin-addons/media/buttons/volume/mute/frontend.tsx +26 -0
  163. package/src/builtin-addons/media/buttons/volume/volume-down/backend.ts +14 -0
  164. package/src/builtin-addons/media/buttons/volume/volume-down/config.ts +6 -0
  165. package/src/builtin-addons/media/buttons/volume/volume-down/frontend.tsx +10 -0
  166. package/src/builtin-addons/media/buttons/volume/volume-up/backend.ts +14 -0
  167. package/src/builtin-addons/media/buttons/volume/volume-up/config.ts +6 -0
  168. package/src/builtin-addons/media/buttons/volume/volume-up/frontend.tsx +8 -0
  169. package/src/builtin-addons/media/checks.ts +104 -0
  170. package/src/builtin-addons/media/executor.ts +36 -0
  171. package/src/builtin-addons/media/index.d.ts +5 -0
  172. package/src/builtin-addons/media/index.ts +53 -0
  173. package/src/builtin-addons/media/progress.ts +16 -0
  174. package/src/builtin-addons/media/providers/darwin.ts +391 -0
  175. package/src/builtin-addons/media/providers/index.ts +27 -0
  176. package/src/builtin-addons/media/providers/linux.ts +196 -0
  177. package/src/builtin-addons/media/providers/types.ts +48 -0
  178. package/src/builtin-addons/media/providers/windows.ts +121 -0
  179. package/src/builtin-addons/media/sirenodeck.json +6 -0
  180. package/src/builtin-addons/media/state.ts +19 -0
  181. package/src/builtin-addons/register-builtins.ts +65 -0
  182. package/src/builtin-addons/session/README.md +14 -0
  183. package/src/builtin-addons/session/buttons/session-info/backend.ts +8 -0
  184. package/src/builtin-addons/session/buttons/session-info/config.ts +4 -0
  185. package/src/builtin-addons/session/buttons/session-info/frontend.tsx +2 -0
  186. package/src/builtin-addons/session/buttons/time/backend.ts +7 -0
  187. package/src/builtin-addons/session/buttons/time/config.ts +6 -0
  188. package/src/builtin-addons/session/buttons/time/frontend.tsx +2 -0
  189. package/src/builtin-addons/session/index.d.ts +5 -0
  190. package/src/builtin-addons/session/index.ts +18 -0
  191. package/src/builtin-addons/session/sirenodeck.json +6 -0
  192. package/src/builtin-addons/system-status/README.md +169 -0
  193. package/src/builtin-addons/system-status/buttons/_shared.ts +131 -0
  194. package/src/builtin-addons/system-status/buttons/system-status/frontend.tsx +224 -0
  195. package/src/builtin-addons/system-status/buttons/system-status/schemas.ts +67 -0
  196. package/src/builtin-addons/system-status/domain/catalog.ts +53 -0
  197. package/src/builtin-addons/system-status/domain/chart-sampler.ts +58 -0
  198. package/src/builtin-addons/system-status/domain/display-metrics.ts +128 -0
  199. package/src/builtin-addons/system-status/domain/index.ts +10 -0
  200. package/src/builtin-addons/system-status/domain/live-metrics.ts +1021 -0
  201. package/src/builtin-addons/system-status/domain/metric-ids.ts +0 -0
  202. package/src/builtin-addons/system-status/index.ts +16 -0
  203. package/src/builtin-addons/system-status/manifest.ts +105 -0
  204. package/src/builtin-addons/system-status/shared/metrics-catalog.ts +316 -0
  205. package/src/builtin-addons/system-status/sirenodeck.json +6 -0
  206. package/src/builtin-addons/test-buildin/decks/action-buttons-test.ts +56 -0
  207. package/src/builtin-addons/test-buildin/index.d.ts +5 -0
  208. package/src/builtin-addons/test-buildin/index.ts +16 -0
  209. package/src/builtin-addons/value-display/README.md +59 -0
  210. package/src/builtin-addons/value-display/backend.ts +86 -0
  211. package/src/builtin-addons/value-display/buttons/value-display/backend.ts +17 -0
  212. package/src/builtin-addons/value-display/buttons/value-display/config.ts +36 -0
  213. package/src/builtin-addons/value-display/buttons/value-display/frontend.tsx +54 -0
  214. package/src/builtin-addons/value-display/index.d.ts +5 -0
  215. package/src/builtin-addons/value-display/index.ts +23 -0
  216. package/src/builtin-addons/value-display/sirenodeck.json +6 -0
  217. package/src/builtin-addons/weather/README.md +46 -0
  218. package/src/builtin-addons/weather/backend.ts +121 -0
  219. package/src/builtin-addons/weather/buttons/weather/backend.ts +27 -0
  220. package/src/builtin-addons/weather/buttons/weather/config.ts +29 -0
  221. package/src/builtin-addons/weather/buttons/weather/frontend.tsx +63 -0
  222. package/src/builtin-addons/weather/buttons/weather/icons.tsx +88 -0
  223. package/src/builtin-addons/weather/buttons/weather/pages.tsx +109 -0
  224. package/src/builtin-addons/weather/domain/codes.ts +35 -0
  225. package/src/builtin-addons/weather/domain/fetch.ts +47 -0
  226. package/src/builtin-addons/weather/index.d.ts +5 -0
  227. package/src/builtin-addons/weather/index.ts +23 -0
  228. package/src/builtin-addons/weather/poller.ts +70 -0
  229. package/src/builtin-addons/weather/provider/city-key.ts +9 -0
  230. package/src/builtin-addons/weather/provider/codes.ts +35 -0
  231. package/src/builtin-addons/weather/provider/fetch.ts +97 -0
  232. package/src/builtin-addons/weather/provider/geocode.ts +67 -0
  233. package/src/builtin-addons/weather/provider/types.ts +42 -0
  234. package/src/builtin-addons/weather/sirenodeck.json +6 -0
  235. package/src/cli/coding-agents-onboarding.ts +434 -0
  236. package/src/cli/commands/addon-decks.ts +441 -0
  237. package/src/cli/commands/addon-registry.ts +639 -0
  238. package/src/cli/commands/emulator-mode.ts +289 -0
  239. package/src/cli/commands/install.ts +128 -0
  240. package/src/cli/commands/logs.ts +74 -0
  241. package/src/cli/commands/network-bind.ts +111 -0
  242. package/src/cli/commands/pipeline/helpers.ts +75 -0
  243. package/src/cli/commands/pipeline/preflight.ts +20 -0
  244. package/src/cli/commands/port-identity.ts +152 -0
  245. package/src/cli/commands/reload.ts +37 -0
  246. package/src/cli/commands/restart.ts +139 -0
  247. package/src/cli/commands/run.ts +2270 -0
  248. package/src/cli/commands/service/install.ts +121 -0
  249. package/src/cli/commands/service/render-template.ts +158 -0
  250. package/src/cli/commands/service-manager.ts +184 -0
  251. package/src/cli/commands/spawn-daemon.ts +251 -0
  252. package/src/cli/commands/start.ts +1061 -0
  253. package/src/cli/commands/status.ts +110 -0
  254. package/src/cli/commands/stop.ts +121 -0
  255. package/src/cli/commands/subprocess-supervisor.ts +203 -0
  256. package/src/cli/commands/system-requirements.ts +699 -0
  257. package/src/cli/cwd.ts +28 -0
  258. package/src/cli/first-run.ts +149 -0
  259. package/src/cli/http-server.ts +244 -0
  260. package/src/cli/index.ts +355 -0
  261. package/src/cli/install-root.ts +26 -0
  262. package/src/cli/main.ts +194 -0
  263. package/src/cli/package-manager.ts +175 -0
  264. package/src/cli/probe-deps.ts +45 -0
  265. package/src/cli/prompt.ts +22 -0
  266. package/src/cli/startup-display.ts +452 -0
  267. package/src/config/builtin-icons.ts +57 -0
  268. package/src/config/config-diff.ts +54 -0
  269. package/src/config/discovery.ts +64 -0
  270. package/src/config/icon-resolver.ts +90 -0
  271. package/src/config/include-resolver.ts +202 -0
  272. package/src/config/index.ts +9 -0
  273. package/src/config/loader.ts +187 -0
  274. package/src/config/mutation.ts +514 -0
  275. package/src/config/reference-expander.ts +84 -0
  276. package/src/config/schemas.ts +223 -0
  277. package/src/config/validation.ts +254 -0
  278. package/src/core/asset-id.ts +21 -0
  279. package/src/core/gesture-state.ts +344 -0
  280. package/src/core/icon-asset-registry.ts +127 -0
  281. package/src/core/icon-source.ts +86 -0
  282. package/src/core/index.ts +30 -0
  283. package/src/core/mime.ts +16 -0
  284. package/src/core/pagination.ts +90 -0
  285. package/src/core/pub-sub.ts +126 -0
  286. package/src/core/settings.ts +153 -0
  287. package/src/core/store.ts +88 -0
  288. package/src/core/watcher.ts +73 -0
  289. package/src/deck/addon-handler-bridge.ts +516 -0
  290. package/src/deck/deck-config.ts +271 -0
  291. package/src/deck/editor-surfaces.ts +87 -0
  292. package/src/deck/host-context.ts +18 -0
  293. package/src/deck/index.ts +102 -0
  294. package/src/deck/macro-parse.ts +182 -0
  295. package/src/deck/methods.ts +348 -0
  296. package/src/deck/paginate-deck.ts +98 -0
  297. package/src/deck/position-buttons.ts +57 -0
  298. package/src/deck/runtime/index.ts +5 -0
  299. package/src/deck/runtime/runtime.ts +1060 -0
  300. package/src/deck/runtime-subscriptions.ts +45 -0
  301. package/src/deck/system-back-injection.ts +62 -0
  302. package/src/deck/system-buttons/registry.tsx +97 -0
  303. package/src/deck/system-buttons/types.ts +14 -0
  304. package/src/device/black-frame.ts +73 -0
  305. package/src/device/index.ts +13 -0
  306. package/src/device/linux-udev.ts +36 -0
  307. package/src/device/models.ts +89 -0
  308. package/src/device/reconnecting.ts +193 -0
  309. package/src/device/registry.ts +38 -0
  310. package/src/device/stream-deck.ts +155 -0
  311. package/src/index.ts +74 -0
  312. package/src/outputClient/emulator.ts +357 -0
  313. package/src/outputClient/index.ts +26 -0
  314. package/src/outputClient/open-browser.ts +26 -0
  315. package/src/outputClient/real.ts +393 -0
  316. package/src/outputClient/types.ts +83 -0
  317. package/src/render/browser-renderer.ts +240 -0
  318. package/src/render/buffer-hash.ts +20 -0
  319. package/src/render/editor-handler.ts +197 -0
  320. package/src/render/emulator-server.ts +128 -0
  321. package/src/render/icon-source-resolver.ts +69 -0
  322. package/src/render/index.ts +16 -0
  323. package/src/render/protocol.ts +61 -0
  324. package/src/render/push-raw-image.ts +100 -0
  325. package/src/render/screenshot-cadence.ts +87 -0
  326. package/src/render/state-publisher.ts +110 -0
  327. package/src/render/vite-server.ts +138 -0
  328. package/src/render/ws-bridge.ts +315 -0
  329. package/src/system/device-selection.ts +80 -0
  330. package/src/system/glob-match.ts +74 -0
  331. package/src/system/providers/active-app/darwin.ts +117 -0
  332. package/src/system/providers/active-app/linux.ts +245 -0
  333. package/src/system/providers/active-app/wayland-gnome.ts +303 -0
  334. package/src/system/providers/active-app/windows.ts +94 -0
  335. package/src/system/providers/active-app.ts +97 -0
  336. package/src/system/providers/clipboard/darwin.ts +65 -0
  337. package/src/system/providers/clipboard/linux.ts +163 -0
  338. package/src/system/providers/clipboard/windows.ts +94 -0
  339. package/src/system/providers/clipboard.ts +84 -0
  340. package/src/system/providers/error.ts +16 -0
  341. package/src/system/providers/key-macro/darwin.ts +221 -0
  342. package/src/system/providers/key-macro/linux.ts +651 -0
  343. package/src/system/providers/key-macro/parser.ts +215 -0
  344. package/src/system/providers/key-macro/windows.ts +476 -0
  345. package/src/system/providers/key-macro.ts +79 -0
  346. package/src/system/providers/notification/darwin.ts +36 -0
  347. package/src/system/providers/notification/linux.ts +115 -0
  348. package/src/system/providers/notification/windows.ts +72 -0
  349. package/src/system/providers/notification.ts +75 -0
  350. package/src/system/providers/session/darwin.ts +82 -0
  351. package/src/system/providers/session/linux.ts +175 -0
  352. package/src/system/providers/session/windows.ts +73 -0
  353. package/src/system/providers/session.ts +89 -0
  354. package/src/system/providers/shared.ts +65 -0
  355. package/src/system/requirements.ts +235 -0
  356. package/src/system/setup-wizard/config-seed.ts +30 -0
  357. package/src/system/setup-wizard/format.ts +275 -0
  358. package/src/system/setup-wizard/index.ts +45 -0
  359. package/src/system/setup-wizard/open-settings.ts +26 -0
  360. package/src/system/setup-wizard/plan.ts +230 -0
  361. package/src/system/setup-wizard/probe-cache.ts +34 -0
  362. package/src/system/setup-wizard/probe.ts +486 -0
  363. package/src/system/setup-wizard/runtime-features.ts +85 -0
  364. package/src/system/setup-wizard/sudo.ts +178 -0
  365. package/src/system/setup-wizard/types.ts +133 -0
  366. package/src/system/virtual-stream-deck.ts +67 -0
  367. package/src/themes/css.ts +210 -0
  368. package/src/themes/default/assets/IBMPlexSans-Italic-VariableFont_wdth,wght.ttf +0 -0
  369. package/src/themes/default/assets/IBMPlexSans-VariableFont_wdth,wght.ttf +0 -0
  370. package/src/themes/default/assets/IBM_Plex_Mono/IBMPlexMono-Bold.ttf +0 -0
  371. package/src/themes/default/assets/IBM_Plex_Mono/IBMPlexMono-BoldItalic.ttf +0 -0
  372. package/src/themes/default/assets/IBM_Plex_Mono/IBMPlexMono-ExtraLight.ttf +0 -0
  373. package/src/themes/default/assets/IBM_Plex_Mono/IBMPlexMono-ExtraLightItalic.ttf +0 -0
  374. package/src/themes/default/assets/IBM_Plex_Mono/IBMPlexMono-Italic.ttf +0 -0
  375. package/src/themes/default/assets/IBM_Plex_Mono/IBMPlexMono-Light.ttf +0 -0
  376. package/src/themes/default/assets/IBM_Plex_Mono/IBMPlexMono-LightItalic.ttf +0 -0
  377. package/src/themes/default/assets/IBM_Plex_Mono/IBMPlexMono-Medium.ttf +0 -0
  378. package/src/themes/default/assets/IBM_Plex_Mono/IBMPlexMono-MediumItalic.ttf +0 -0
  379. package/src/themes/default/assets/IBM_Plex_Mono/IBMPlexMono-Regular.ttf +0 -0
  380. package/src/themes/default/assets/IBM_Plex_Mono/IBMPlexMono-SemiBold.ttf +0 -0
  381. package/src/themes/default/assets/IBM_Plex_Mono/IBMPlexMono-SemiBoldItalic.ttf +0 -0
  382. package/src/themes/default/assets/IBM_Plex_Mono/IBMPlexMono-Thin.ttf +0 -0
  383. package/src/themes/default/assets/IBM_Plex_Mono/IBMPlexMono-ThinItalic.ttf +0 -0
  384. package/src/themes/default/assets/IBM_Plex_Mono/OFL.txt +93 -0
  385. package/src/themes/default/assets/OFL.txt +93 -0
  386. package/src/themes/default/assets/README.txt +106 -0
  387. package/src/themes/default/assets/static/IBMPlexSans-Bold.ttf +0 -0
  388. package/src/themes/default/assets/static/IBMPlexSans-BoldItalic.ttf +0 -0
  389. package/src/themes/default/assets/static/IBMPlexSans-ExtraLight.ttf +0 -0
  390. package/src/themes/default/assets/static/IBMPlexSans-ExtraLightItalic.ttf +0 -0
  391. package/src/themes/default/assets/static/IBMPlexSans-Italic.ttf +0 -0
  392. package/src/themes/default/assets/static/IBMPlexSans-Light.ttf +0 -0
  393. package/src/themes/default/assets/static/IBMPlexSans-LightItalic.ttf +0 -0
  394. package/src/themes/default/assets/static/IBMPlexSans-Medium.ttf +0 -0
  395. package/src/themes/default/assets/static/IBMPlexSans-MediumItalic.ttf +0 -0
  396. package/src/themes/default/assets/static/IBMPlexSans-Regular.ttf +0 -0
  397. package/src/themes/default/assets/static/IBMPlexSans-SemiBold.ttf +0 -0
  398. package/src/themes/default/assets/static/IBMPlexSans-SemiBoldItalic.ttf +0 -0
  399. package/src/themes/default/assets/static/IBMPlexSans-Thin.ttf +0 -0
  400. package/src/themes/default/assets/static/IBMPlexSans-ThinItalic.ttf +0 -0
  401. package/src/themes/default/assets/static/IBMPlexSans_Condensed-Bold.ttf +0 -0
  402. package/src/themes/default/assets/static/IBMPlexSans_Condensed-BoldItalic.ttf +0 -0
  403. package/src/themes/default/assets/static/IBMPlexSans_Condensed-ExtraLight.ttf +0 -0
  404. package/src/themes/default/assets/static/IBMPlexSans_Condensed-ExtraLightItalic.ttf +0 -0
  405. package/src/themes/default/assets/static/IBMPlexSans_Condensed-Italic.ttf +0 -0
  406. package/src/themes/default/assets/static/IBMPlexSans_Condensed-Light.ttf +0 -0
  407. package/src/themes/default/assets/static/IBMPlexSans_Condensed-LightItalic.ttf +0 -0
  408. package/src/themes/default/assets/static/IBMPlexSans_Condensed-Medium.ttf +0 -0
  409. package/src/themes/default/assets/static/IBMPlexSans_Condensed-MediumItalic.ttf +0 -0
  410. package/src/themes/default/assets/static/IBMPlexSans_Condensed-Regular.ttf +0 -0
  411. package/src/themes/default/assets/static/IBMPlexSans_Condensed-SemiBold.ttf +0 -0
  412. package/src/themes/default/assets/static/IBMPlexSans_Condensed-SemiBoldItalic.ttf +0 -0
  413. package/src/themes/default/assets/static/IBMPlexSans_Condensed-Thin.ttf +0 -0
  414. package/src/themes/default/assets/static/IBMPlexSans_Condensed-ThinItalic.ttf +0 -0
  415. package/src/themes/default/assets/static/IBMPlexSans_SemiCondensed-Bold.ttf +0 -0
  416. package/src/themes/default/assets/static/IBMPlexSans_SemiCondensed-BoldItalic.ttf +0 -0
  417. package/src/themes/default/assets/static/IBMPlexSans_SemiCondensed-ExtraLight.ttf +0 -0
  418. package/src/themes/default/assets/static/IBMPlexSans_SemiCondensed-ExtraLightItalic.ttf +0 -0
  419. package/src/themes/default/assets/static/IBMPlexSans_SemiCondensed-Italic.ttf +0 -0
  420. package/src/themes/default/assets/static/IBMPlexSans_SemiCondensed-Light.ttf +0 -0
  421. package/src/themes/default/assets/static/IBMPlexSans_SemiCondensed-LightItalic.ttf +0 -0
  422. package/src/themes/default/assets/static/IBMPlexSans_SemiCondensed-Medium.ttf +0 -0
  423. package/src/themes/default/assets/static/IBMPlexSans_SemiCondensed-MediumItalic.ttf +0 -0
  424. package/src/themes/default/assets/static/IBMPlexSans_SemiCondensed-Regular.ttf +0 -0
  425. package/src/themes/default/assets/static/IBMPlexSans_SemiCondensed-SemiBold.ttf +0 -0
  426. package/src/themes/default/assets/static/IBMPlexSans_SemiCondensed-SemiBoldItalic.ttf +0 -0
  427. package/src/themes/default/assets/static/IBMPlexSans_SemiCondensed-Thin.ttf +0 -0
  428. package/src/themes/default/assets/static/IBMPlexSans_SemiCondensed-ThinItalic.ttf +0 -0
  429. package/src/themes/default/components.css +81 -0
  430. package/src/themes/default/sirenodeck.json +170 -0
  431. package/src/themes/index.ts +14 -0
  432. package/src/themes/light/assets/IBMPlexSans-Italic-VariableFont_wdth,wght.ttf +0 -0
  433. package/src/themes/light/assets/IBMPlexSans-VariableFont_wdth,wght.ttf +0 -0
  434. package/src/themes/light/assets/IBM_Plex_Mono/IBMPlexMono-Bold.ttf +0 -0
  435. package/src/themes/light/assets/IBM_Plex_Mono/IBMPlexMono-Medium.ttf +0 -0
  436. package/src/themes/light/assets/IBM_Plex_Mono/IBMPlexMono-Regular.ttf +0 -0
  437. package/src/themes/light/assets/IBM_Plex_Mono/OFL.txt +93 -0
  438. package/src/themes/light/assets/OFL.txt +93 -0
  439. package/src/themes/light/assets/README.txt +106 -0
  440. package/src/themes/light/assets/static/IBMPlexSans-Light.ttf +0 -0
  441. package/src/themes/light/assets/static/IBMPlexSans-LightItalic.ttf +0 -0
  442. package/src/themes/light/assets/static/IBMPlexSans-Thin.ttf +0 -0
  443. package/src/themes/light/components.css +70 -0
  444. package/src/themes/light/sirenodeck.json +170 -0
  445. package/src/themes/loader.ts +343 -0
  446. package/src/themes/manifest.ts +164 -0
  447. package/src/themes/use-resolved-theme.tsx +32 -0
  448. package/src/ui/ButtonFrame.tsx +230 -0
  449. package/src/ui/contexts/AssetCacheContext.tsx +43 -0
  450. package/src/ui/index.ts +20 -0
  451. package/src/ui/primitives/Chip.tsx +53 -0
  452. package/src/ui/primitives/Icon.tsx +209 -0
  453. package/src/ui/primitives/Label.tsx +82 -0
  454. package/src/ui/primitives/ProgressBar.tsx +38 -0
  455. package/src/ui/primitives/TapIndicator.tsx +67 -0
  456. package/src/ui/primitives/Text.tsx +810 -0
  457. package/src/ui/primitives/index.ts +6 -0
  458. package/src/ui/surfaces/BarsSurface.tsx +211 -0
  459. package/src/ui/surfaces/IconLabelProgressSurface.tsx +133 -0
  460. package/src/ui/surfaces/IconLabelSurface.tsx +59 -0
  461. package/src/ui/surfaces/LabelValueListSurface.tsx +202 -0
  462. package/src/ui/surfaces/PaginatedSurface.tsx +164 -0
  463. package/src/ui/surfaces/SplitActionSurface.tsx +98 -0
  464. package/src/ui/surfaces/TemporaryErrorSurface.tsx +68 -0
  465. package/src/ui/surfaces/ValueChart.tsx +218 -0
  466. package/src/ui/surfaces/index.ts +32 -0
  467. package/src/ui/surfaces/paginated-schema.ts +22 -0
  468. package/src/ui/theme-presentation-builder.ts +184 -0
  469. package/src/ui/theme-presentation.tsx +146 -0
  470. package/src/ui/utils/cn.ts +12 -0
  471. package/src/util/cache-paths.ts +38 -0
  472. package/src/util/config-diff.ts +16 -0
  473. package/src/util/daemon-control.ts +85 -0
  474. package/src/util/daemon.ts +575 -0
  475. package/src/util/device-config.ts +56 -0
  476. package/src/util/errors.ts +13 -0
  477. package/src/util/log-reader.ts +114 -0
  478. package/src/util/log-tail.ts +103 -0
  479. package/src/util/logger.ts +417 -0
  480. package/src/util/process-title.ts +79 -0
  481. package/src/util/single-instance.ts +202 -0
  482. package/src/version.ts +10 -0
  483. package/src/vite/index.ts +6 -0
  484. package/src/vite/virtual-modules.ts +631 -0
  485. package/src/vite-env.d.ts +1 -0
@@ -0,0 +1,656 @@
1
+ import { z } from "zod"
2
+ import {
3
+ ButtonDefSchema,
4
+ DeckDefSchema,
5
+ UserDeckCreateSchema,
6
+ } from "@/config/schemas"
7
+
8
+ export const PROTOCOL_VERSION = 1
9
+
10
+ export const gestureKindSchema = z.enum(["tap", "dbl-tap", "hold"])
11
+
12
+ const baseClientMessage = z.object({})
13
+
14
+ const baseServerMessage = z.object({})
15
+
16
+ export const helloMessageSchema = baseClientMessage
17
+ .extend({
18
+ type: z.literal("hello"),
19
+ version: z.literal(PROTOCOL_VERSION),
20
+ token: z.string().min(1).optional(),
21
+ })
22
+ .strict()
23
+
24
+ export const helloMessageStrictSchema = baseClientMessage
25
+ .extend({
26
+ type: z.literal("hello"),
27
+ version: z.literal(PROTOCOL_VERSION),
28
+ token: z.string().min(1),
29
+ })
30
+ .strict()
31
+
32
+ export const deviceInfoSchema = z.object({
33
+ id: z.string(),
34
+ model: z.string(),
35
+ keyCount: z.number().int().positive(),
36
+ label: z.string(),
37
+ transport: z.enum(["real", "emulated"]),
38
+ })
39
+
40
+ export const helloAckMessageSchema = baseServerMessage
41
+ .extend({
42
+ type: z.literal("hello-ack"),
43
+ version: z.literal(PROTOCOL_VERSION),
44
+ device: deviceInfoSchema.optional(),
45
+ config: z.unknown(),
46
+ })
47
+ .strict()
48
+
49
+ export const deviceInfoMessageSchema = baseServerMessage
50
+ .extend({
51
+ type: z.literal("device-info"),
52
+ device: deviceInfoSchema,
53
+ })
54
+ .strict()
55
+
56
+ export const deckConfigSurfaceButtonSchema = z
57
+ .object({
58
+ id: z.string(),
59
+ type: z.string(),
60
+ position: z.number().optional(),
61
+ config: z
62
+ .object({
63
+ icon: z.string().optional(),
64
+ label: z.string().optional(),
65
+ })
66
+ .passthrough()
67
+ .optional(),
68
+ label: z.string().optional(),
69
+ icon: z.string().optional(),
70
+ full: z.boolean().optional(),
71
+ variant: z.string().optional(),
72
+ addonName: z.string().optional(),
73
+ frontendEntry: z.string().optional(),
74
+ buttonColor: z.string().optional(),
75
+ actions: z
76
+ .object({
77
+ tap: z.string().optional(),
78
+ dbltap: z.string().optional(),
79
+ hold: z.string().optional(),
80
+ })
81
+ .optional(),
82
+ })
83
+ .passthrough()
84
+
85
+ export const deckConfigSurfaceSchema = z.object({
86
+ id: z.string(),
87
+ name: z.string(),
88
+ buttons: z.array(deckConfigSurfaceButtonSchema),
89
+ buttonColor: z.string().optional(),
90
+ variant: z.string().optional(),
91
+ buttonErrors: z
92
+ .array(
93
+ z.object({
94
+ position: z.number(),
95
+ buttonId: z.string().optional(),
96
+ details: z.string(),
97
+ expiresAt: z.number().optional(),
98
+ }),
99
+ )
100
+ .optional(),
101
+ })
102
+
103
+ export const deckConfigMessageSchema = baseServerMessage
104
+ .extend({
105
+ type: z.literal("deck-config"),
106
+ deckId: z.string(),
107
+ surfaces: z.record(z.string(), deckConfigSurfaceSchema),
108
+ navMode: z.enum(["regular", "paginated", "overlay"]).default("regular"),
109
+ isCompact: z.boolean().default(false),
110
+ hasOverlayDeckAvailable: z.boolean().default(false),
111
+ overlayDeckIcon: z.string().nullable().default(null),
112
+ overlayDeckName: z.string().nullable().default(null),
113
+ })
114
+ .strict()
115
+
116
+ const editorSourceTargetSchema = z
117
+ .object({
118
+ sourcePath: z.string().min(1),
119
+ sourceDeckId: z.string().min(1),
120
+ sourceButtonIndex: z.number().int().nonnegative(),
121
+ sourceButtonPath: z.string().min(1),
122
+ fingerprint: z.string().min(1),
123
+ capability: z.enum(["update", "delete", "reorder"]),
124
+ })
125
+ .strict()
126
+
127
+ const editorSurfaceSchema = z
128
+ .object({
129
+ id: z.string().min(1),
130
+ sourceDeckId: z.string().min(1),
131
+ projectionId: z.string().min(1),
132
+ pageIndex: z.number().int().nonnegative(),
133
+ isOverlay: z.boolean(),
134
+ editable: z.boolean(),
135
+ addonOwner: z
136
+ .object({
137
+ addonIndex: z.number().int().nonnegative(),
138
+ addonName: z.string().min(1),
139
+ overrideKey: z.string().min(1),
140
+ capabilities: z.array(z.string()).readonly(),
141
+ })
142
+ .strict()
143
+ .nullable(),
144
+ reservedPositions: z.array(z.number().int().nonnegative()),
145
+ buttons: z.array(
146
+ z
147
+ .object({
148
+ id: z.string().min(1),
149
+ type: z.string().min(1),
150
+ position: z.number().int(),
151
+ sourceTarget: editorSourceTargetSchema.nullable(),
152
+ })
153
+ .strict(),
154
+ ),
155
+ })
156
+ .strict()
157
+
158
+ export const stateMessageSchema = baseServerMessage
159
+ .extend({
160
+ type: z.literal("state"),
161
+ channels: z.record(z.string(), z.unknown()),
162
+ cadence: z.record(z.string(), z.number().int().positive()).optional(),
163
+ })
164
+ .strict()
165
+
166
+ export const decksListMessageSchema = baseServerMessage
167
+ .extend({
168
+ type: z.literal("decks-list"),
169
+ decks: z.array(
170
+ z.object({
171
+ id: z.string(),
172
+ name: z.string(),
173
+ addonIndex: z.number().int().nonnegative(),
174
+ icon: z.string().optional(),
175
+ }),
176
+ ),
177
+ })
178
+ .strict()
179
+
180
+ export const showOverlayMessageSchema = baseServerMessage
181
+ .extend({
182
+ type: z.literal("show-overlay"),
183
+ deckId: z.string().nullable(),
184
+ })
185
+ .strict()
186
+
187
+ export const buttonErrorMessageSchema = baseServerMessage
188
+ .extend({
189
+ type: z.literal("button-error"),
190
+ deckId: z.string(),
191
+ position: z.number().int().nonnegative(),
192
+ durationMs: z.number().int().positive().default(5000),
193
+ buttonId: z.string().optional(),
194
+ details: z.string().optional(),
195
+ })
196
+ .strict()
197
+
198
+ export const serviceLogMessageSchema = baseServerMessage
199
+ .extend({
200
+ type: z.literal("service-log"),
201
+ level: z.enum(["trace", "debug", "info", "warn", "error", "fatal"]),
202
+ msg: z.string(),
203
+ ts: z.number().int().nonnegative(),
204
+ component: z.string().optional(),
205
+ deckId: z.string().optional(),
206
+ position: z.number().int().nonnegative().optional(),
207
+ addonName: z.string().optional(),
208
+ gesture: z.enum(["tap", "dbl-tap", "hold"]).optional(),
209
+ keyIndex: z.number().int().nonnegative().optional(),
210
+ })
211
+ .strict()
212
+
213
+ export const buttonActionMessageSchema = baseClientMessage
214
+ .extend({
215
+ type: z.literal("button-action"),
216
+ deckId: z.string(),
217
+ position: z.number().int().nonnegative(),
218
+ gesture: gestureKindSchema,
219
+ })
220
+ .strict()
221
+
222
+ export const methodCallMessageSchema = baseClientMessage
223
+ .extend({
224
+ type: z.literal("method-call"),
225
+ callId: z.string(),
226
+ name: z.string(),
227
+ args: z.array(z.unknown()).default([]),
228
+ })
229
+ .strict()
230
+
231
+ export const methodCallResultMessageSchema = baseServerMessage
232
+ .extend({
233
+ type: z.literal("method-call-result"),
234
+ callId: z.string(),
235
+ result: z.unknown().optional(),
236
+ error: z.string().optional(),
237
+ })
238
+ .strict()
239
+
240
+ export const selectDeckMessageSchema = baseClientMessage
241
+ .extend({
242
+ type: z.literal("select-deck"),
243
+ deckId: z.string(),
244
+ })
245
+ .strict()
246
+
247
+ export const setDeviceMessageSchema = baseClientMessage
248
+ .extend({
249
+ type: z.literal("set-device"),
250
+ deviceId: z.string().min(1),
251
+ })
252
+ .strict()
253
+
254
+ export const deckActiveMessageSchema = baseClientMessage
255
+ .extend({
256
+ type: z.literal("deck-active"),
257
+ deckId: z.string(),
258
+ mode: z.enum(["navigation", "overlay"]),
259
+ history: z.enum(["push", "replace"]).default("push"),
260
+ })
261
+ .strict()
262
+
263
+ export const dismissOverlayMessageSchema = baseClientMessage
264
+ .extend({
265
+ type: z.literal("dismiss-overlay"),
266
+ })
267
+ .strict()
268
+
269
+ export const assetsMessageSchema = baseServerMessage
270
+ .extend({
271
+ type: z.literal("assets"),
272
+ deckId: z.string(),
273
+ assets: z.array(
274
+ z.object({
275
+ id: z.string(),
276
+ filename: z.string(),
277
+ src: z.string(),
278
+ }),
279
+ ),
280
+ })
281
+ .strict()
282
+
283
+ export const subscribeChannelsMessageSchema = baseClientMessage
284
+ .extend({
285
+ type: z.literal("subscribe-channels"),
286
+ channels: z.array(z.string()).min(1),
287
+ })
288
+ .strict()
289
+
290
+ export const iframeReloadMessageSchema = baseServerMessage
291
+ .extend({
292
+ type: z.literal("iframe-reload"),
293
+ })
294
+ .strict()
295
+
296
+ const rootButtonMutationSchema = z.union([
297
+ z
298
+ .object({
299
+ kind: z.literal("add"),
300
+ deckId: z.string().min(1),
301
+ button: ButtonDefSchema,
302
+ index: z.number().int().nonnegative().optional(),
303
+ })
304
+ .strict(),
305
+ z
306
+ .object({
307
+ kind: z.literal("add-button"),
308
+ deckId: z.string().min(1),
309
+ button: ButtonDefSchema,
310
+ index: z.number().int().nonnegative().optional(),
311
+ replaceIndex: z.number().int().nonnegative().optional(),
312
+ newDeck: UserDeckCreateSchema.optional(),
313
+ })
314
+ .strict(),
315
+ z
316
+ .object({
317
+ kind: z.literal("update-deck"),
318
+ deckId: z.string().min(1),
319
+ patch: z.record(z.string(), z.unknown()),
320
+ })
321
+ .strict(),
322
+ z
323
+ .object({
324
+ kind: z.literal("create-deck"),
325
+ deck: UserDeckCreateSchema,
326
+ })
327
+ .strict(),
328
+ z
329
+ .object({
330
+ kind: z.literal("move-position"),
331
+ deckId: z.string().min(1),
332
+ from: z.number().int().nonnegative(),
333
+ to: z.number().int().nonnegative(),
334
+ })
335
+ .strict(),
336
+ z
337
+ .object({
338
+ kind: z.literal("update"),
339
+ deckId: z.string().min(1),
340
+ index: z.number().int().nonnegative(),
341
+ button: ButtonDefSchema,
342
+ })
343
+ .strict(),
344
+ z
345
+ .object({
346
+ kind: z.literal("delete"),
347
+ deckId: z.string().min(1),
348
+ index: z.number().int().nonnegative(),
349
+ })
350
+ .strict(),
351
+ z
352
+ .object({
353
+ kind: z.literal("reorder"),
354
+ deckId: z.string().min(1),
355
+ from: z.number().int().nonnegative(),
356
+ to: z.number().int().nonnegative(),
357
+ })
358
+ .strict(),
359
+ z
360
+ .object({
361
+ kind: z.literal("create-deck"),
362
+ deckId: z.string().min(1),
363
+ deck: DeckDefSchema,
364
+ })
365
+ .strict(),
366
+ z
367
+ .object({
368
+ kind: z.literal("update-deck"),
369
+ deckId: z.string().min(1),
370
+ deck: DeckDefSchema,
371
+ })
372
+ .strict(),
373
+ z.object({ kind: z.literal("set-theme"), theme: z.string().min(1) }).strict(),
374
+ z
375
+ .object({
376
+ kind: z.literal("set-addon-deck-override"),
377
+ addonIndex: z.number().int().nonnegative(),
378
+ deckId: z.string().min(1),
379
+ override: z.record(z.string(), z.unknown()).nullable(),
380
+ })
381
+ .strict(),
382
+ z
383
+ .object({
384
+ kind: z.literal("edit-source"),
385
+ path: z.string().min(1),
386
+ content: z.string(),
387
+ })
388
+ .strict(),
389
+ ])
390
+
391
+ export const editorStateRequestMessageSchema = baseClientMessage
392
+ .extend({
393
+ type: z.literal("editor-state-request"),
394
+ })
395
+ .strict()
396
+
397
+ export const editorStateMessageSchema = baseServerMessage
398
+ .extend({
399
+ type: z.literal("editor-state"),
400
+ revision: z.number().int().nonnegative(),
401
+ config: z.unknown(),
402
+ sources: z.array(z.string()),
403
+ sourceContents: z.record(z.string(), z.string()),
404
+ themes: z.array(
405
+ z.object({ name: z.string(), active: z.boolean().optional() }).strict(),
406
+ ),
407
+ buttonSchemas: z
408
+ .record(z.string(), z.record(z.string(), z.unknown()))
409
+ .default({}),
410
+ surfaces: z.array(editorSurfaceSchema).default([]),
411
+ canUndo: z.boolean(),
412
+ })
413
+ .strict()
414
+
415
+ export const editorValidationRequestMessageSchema = baseClientMessage
416
+ .extend({
417
+ type: z.literal("editor-validation-request"),
418
+ requestId: z.string().min(1),
419
+ revision: z.number().int().nonnegative(),
420
+ buttonType: z.string().min(1),
421
+ config: z.unknown(),
422
+ })
423
+ .strict()
424
+
425
+ export const editorValidationResultMessageSchema = baseServerMessage
426
+ .extend({
427
+ type: z.literal("editor-validation-result"),
428
+ requestId: z.string().min(1),
429
+ valid: z.boolean(),
430
+ errors: z.array(z.string()),
431
+ })
432
+ .strict()
433
+
434
+ export const editorSourceValidationRequestMessageSchema = baseClientMessage
435
+ .extend({
436
+ type: z.literal("editor-source-validation-request"),
437
+ requestId: z.string().min(1),
438
+ revision: z.number().int().nonnegative(),
439
+ path: z.string().min(1),
440
+ content: z.string(),
441
+ })
442
+ .strict()
443
+
444
+ export const editorSourceValidationResultMessageSchema = baseServerMessage
445
+ .extend({
446
+ type: z.literal("editor-source-validation-result"),
447
+ requestId: z.string().min(1),
448
+ valid: z.boolean(),
449
+ errors: z.array(z.string()),
450
+ })
451
+ .strict()
452
+
453
+ export const editorMutationMessageSchema = baseClientMessage
454
+ .extend({
455
+ type: z.literal("editor-mutate"),
456
+ requestId: z.string().min(1),
457
+ revision: z.number().int().nonnegative(),
458
+ mutation: rootButtonMutationSchema,
459
+ })
460
+ .strict()
461
+
462
+ export const editorAssetWriteMessageSchema = baseClientMessage
463
+ .extend({
464
+ type: z.literal("editor-asset-write"),
465
+ requestId: z.string().min(1),
466
+ revision: z.number().int().nonnegative(),
467
+ filename: z.string().min(1).max(255),
468
+ data: z.string().min(1),
469
+ })
470
+ .strict()
471
+
472
+ export const editorUndoMessageSchema = baseClientMessage
473
+ .extend({
474
+ type: z.literal("editor-undo"),
475
+ requestId: z.string().min(1),
476
+ revision: z.number().int().nonnegative(),
477
+ })
478
+ .strict()
479
+
480
+ export const editorMutationResultMessageSchema = baseServerMessage
481
+ .extend({
482
+ type: z.literal("editor-mutation-result"),
483
+ requestId: z.string().min(1),
484
+ ok: z.boolean(),
485
+ revision: z.number().int().nonnegative(),
486
+ error: z.string().optional(),
487
+ })
488
+ .strict()
489
+
490
+ // ponytail: ships the addon inventory the emulator's Addons tab renders.
491
+ // Replaces a separate HTTP `/api/addons` fetch on the start-mode daemon
492
+ // (port 3939) that isn't bound in `--emulator` mode — the emulator only
493
+ // exposes the WS bridge, so the inventory rides along on connect.
494
+ export const addonsInventoryMessageSchema = baseServerMessage
495
+ .extend({
496
+ type: z.literal("addons-inventory"),
497
+ addons: z.array(
498
+ z.object({
499
+ name: z.string(),
500
+ addonIndex: z.number().int().nonnegative(),
501
+ path: z.string().optional(),
502
+ internal: z.boolean().default(false),
503
+ source: z.string(),
504
+ buttonTypes: z.array(
505
+ z
506
+ .object({
507
+ type: z.string(),
508
+ internal: z.boolean().default(false),
509
+ generated: z.boolean().default(false),
510
+ defaultConfig: z.unknown().optional(),
511
+ })
512
+ .strict(),
513
+ ),
514
+ defaultButton: z.string().nullable().optional(),
515
+ defaultConfig: z.unknown().optional(),
516
+ decks: z.array(
517
+ z
518
+ .object({
519
+ id: z.string(),
520
+ sourceId: z.string().optional(),
521
+ generated: z.boolean().default(false),
522
+ pageIndex: z.number().int().nonnegative().default(0),
523
+ isOverlay: z.boolean(),
524
+ paginated: z.boolean(),
525
+ buttons: z.array(
526
+ z
527
+ .object({
528
+ type: z.string(),
529
+ generated: z.boolean().default(false),
530
+ position: z.number().int().nonnegative().optional(),
531
+ config: z.unknown().optional(),
532
+ })
533
+ .strict(),
534
+ ),
535
+ internal: z.boolean().default(false),
536
+ addonIndex: z.number().int().nonnegative().optional(),
537
+ overrideKey: z.string().optional(),
538
+ overrideFields: z
539
+ .array(
540
+ z.enum(["name", "icon", "autoShow", "trigger", "config"]),
541
+ )
542
+ .default([]),
543
+ })
544
+ .strict(),
545
+ ),
546
+ }),
547
+ ),
548
+ })
549
+ .strict()
550
+
551
+ export const deckTreeMessageSchema = baseServerMessage
552
+ .extend({
553
+ type: z.literal("deck-tree"),
554
+ rootId: z.string(),
555
+ decks: z.array(
556
+ z.object({
557
+ id: z.string(),
558
+ name: z.string(),
559
+ isOverlay: z.boolean().default(false),
560
+ links: z.array(
561
+ z.object({
562
+ target: z.string(),
563
+ label: z.string().optional(),
564
+ }),
565
+ ),
566
+ }),
567
+ ),
568
+ })
569
+ .strict()
570
+
571
+ export const wsMessageSchema = z.discriminatedUnion("type", [
572
+ helloMessageSchema,
573
+ helloAckMessageSchema,
574
+ deviceInfoMessageSchema,
575
+ deckConfigMessageSchema,
576
+ stateMessageSchema,
577
+ decksListMessageSchema,
578
+ showOverlayMessageSchema,
579
+ buttonErrorMessageSchema,
580
+ serviceLogMessageSchema,
581
+ buttonActionMessageSchema,
582
+ methodCallMessageSchema,
583
+ methodCallResultMessageSchema,
584
+ selectDeckMessageSchema,
585
+ setDeviceMessageSchema,
586
+ deckActiveMessageSchema,
587
+ dismissOverlayMessageSchema,
588
+ assetsMessageSchema,
589
+ subscribeChannelsMessageSchema,
590
+ iframeReloadMessageSchema,
591
+ editorStateRequestMessageSchema,
592
+ editorStateMessageSchema,
593
+ editorValidationRequestMessageSchema,
594
+ editorValidationResultMessageSchema,
595
+ editorSourceValidationRequestMessageSchema,
596
+ editorSourceValidationResultMessageSchema,
597
+ editorMutationMessageSchema,
598
+ editorAssetWriteMessageSchema,
599
+ editorUndoMessageSchema,
600
+ editorMutationResultMessageSchema,
601
+ addonsInventoryMessageSchema,
602
+ deckTreeMessageSchema,
603
+ ])
604
+
605
+ export type HelloMessage = z.infer<typeof helloMessageSchema>
606
+ export type HelloAckMessage = z.infer<typeof helloAckMessageSchema>
607
+ export type DeviceInfoMessage = z.infer<typeof deviceInfoMessageSchema>
608
+ export type DeviceInfo = z.infer<typeof deviceInfoSchema>
609
+ export type DeckConfigMessage = z.infer<typeof deckConfigMessageSchema>
610
+ export type StateMessage = z.infer<typeof stateMessageSchema>
611
+ export type DecksListMessage = z.infer<typeof decksListMessageSchema>
612
+ export type ShowOverlayMessage = z.infer<typeof showOverlayMessageSchema>
613
+ export type ButtonErrorMessage = z.infer<typeof buttonErrorMessageSchema>
614
+ export type ButtonActionMessage = z.infer<typeof buttonActionMessageSchema>
615
+ export type MethodCallMessage = z.infer<typeof methodCallMessageSchema>
616
+ export type MethodCallResultMessage = z.infer<
617
+ typeof methodCallResultMessageSchema
618
+ >
619
+ export type SelectDeckMessage = z.infer<typeof selectDeckMessageSchema>
620
+ export type SetDeviceMessage = z.infer<typeof setDeviceMessageSchema>
621
+ export type DeckActiveMessage = z.infer<typeof deckActiveMessageSchema>
622
+ export type DismissOverlayMessage = z.infer<typeof dismissOverlayMessageSchema>
623
+ export type AssetsMessage = z.infer<typeof assetsMessageSchema>
624
+ export type SubscribeChannelsMessage = z.infer<
625
+ typeof subscribeChannelsMessageSchema
626
+ >
627
+ export type IframeReloadMessage = z.infer<typeof iframeReloadMessageSchema>
628
+ export type RootButtonMutation = z.infer<typeof rootButtonMutationSchema>
629
+ export type EditorStateMessage = z.infer<typeof editorStateMessageSchema>
630
+ export type EditorSurfaceMessage = z.infer<typeof editorSurfaceSchema>
631
+ export type EditorValidationRequestMessage = z.infer<
632
+ typeof editorValidationRequestMessageSchema
633
+ >
634
+ export type EditorValidationResultMessage = z.infer<
635
+ typeof editorValidationResultMessageSchema
636
+ >
637
+ export type EditorSourceValidationRequestMessage = z.infer<
638
+ typeof editorSourceValidationRequestMessageSchema
639
+ >
640
+ export type EditorSourceValidationResultMessage = z.infer<
641
+ typeof editorSourceValidationResultMessageSchema
642
+ >
643
+ export type EditorMutationMessage = z.infer<typeof editorMutationMessageSchema>
644
+ export type EditorAssetWriteMessage = z.infer<
645
+ typeof editorAssetWriteMessageSchema
646
+ >
647
+ export type EditorUndoMessage = z.infer<typeof editorUndoMessageSchema>
648
+ export type EditorMutationResultMessage = z.infer<
649
+ typeof editorMutationResultMessageSchema
650
+ >
651
+ export type AddonsInventoryMessage = z.infer<
652
+ typeof addonsInventoryMessageSchema
653
+ >
654
+ export type AddonInventoryEntry = AddonsInventoryMessage["addons"][number]
655
+ export type DeckTreeMessage = z.infer<typeof deckTreeMessageSchema>
656
+ export type WsMessage = z.infer<typeof wsMessageSchema>
@@ -0,0 +1,2 @@
1
+ export * from "./protocol-internal"
2
+ export type * from "./addon"
@@ -0,0 +1,11 @@
1
+ export { ChannelRegistry } from "./registry"
2
+ export {
3
+ useAddonChannel,
4
+ type UseAddonChannelReturn,
5
+ } from "./use-addon-channel"
6
+ export {
7
+ useButtonState,
8
+ type UseButtonStateReturn,
9
+ NullButton,
10
+ } from "./use-button-state"
11
+ export { useDeck, type UseDeckReturn } from "./use-deck"