@tomorrowos/sdk 0.2.5 → 0.3.1

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 (339) hide show
  1. package/dist/index.d.ts +3 -1
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/index.js +1 -0
  4. package/dist/playlist-catalog.d.ts +35 -0
  5. package/dist/playlist-catalog.d.ts.map +1 -0
  6. package/dist/playlist-catalog.js +133 -0
  7. package/dist/store/memory-store.d.ts +9 -1
  8. package/dist/store/memory-store.d.ts.map +1 -1
  9. package/dist/store/memory-store.js +35 -0
  10. package/dist/store/types.d.ts +41 -0
  11. package/dist/store/types.d.ts.map +1 -1
  12. package/dist/tomorrowos.d.ts +14 -0
  13. package/dist/tomorrowos.d.ts.map +1 -1
  14. package/dist/tomorrowos.js +137 -1
  15. package/package.json +1 -1
  16. package/templates/cms-starter/node_modules/.bin/esbuild +16 -0
  17. package/templates/cms-starter/node_modules/.bin/esbuild.cmd +17 -0
  18. package/templates/cms-starter/node_modules/.bin/esbuild.ps1 +28 -0
  19. package/templates/cms-starter/node_modules/.bin/tomorrowos +16 -0
  20. package/templates/cms-starter/node_modules/.bin/tomorrowos.cmd +17 -0
  21. package/templates/cms-starter/node_modules/.bin/tomorrowos.ps1 +28 -0
  22. package/templates/cms-starter/node_modules/.bin/tsc +16 -0
  23. package/templates/cms-starter/node_modules/.bin/tsc.cmd +17 -0
  24. package/templates/cms-starter/node_modules/.bin/tsc.ps1 +28 -0
  25. package/templates/cms-starter/node_modules/.bin/tsserver +16 -0
  26. package/templates/cms-starter/node_modules/.bin/tsserver.cmd +17 -0
  27. package/templates/cms-starter/node_modules/.bin/tsserver.ps1 +28 -0
  28. package/templates/cms-starter/node_modules/.bin/tsx +16 -0
  29. package/templates/cms-starter/node_modules/.bin/tsx.cmd +17 -0
  30. package/templates/cms-starter/node_modules/.bin/tsx.ps1 +28 -0
  31. package/templates/cms-starter/node_modules/.package-lock.json +140 -0
  32. package/templates/cms-starter/node_modules/@esbuild/win32-x64/README.md +3 -0
  33. package/templates/cms-starter/node_modules/@esbuild/win32-x64/esbuild.exe +0 -0
  34. package/templates/cms-starter/node_modules/@esbuild/win32-x64/package.json +20 -0
  35. package/templates/cms-starter/node_modules/@types/node/LICENSE +21 -0
  36. package/templates/cms-starter/node_modules/@types/node/README.md +15 -0
  37. package/templates/cms-starter/node_modules/@types/node/assert/strict.d.ts +8 -0
  38. package/templates/cms-starter/node_modules/@types/node/assert.d.ts +1062 -0
  39. package/templates/cms-starter/node_modules/@types/node/async_hooks.d.ts +605 -0
  40. package/templates/cms-starter/node_modules/@types/node/buffer.buffer.d.ts +471 -0
  41. package/templates/cms-starter/node_modules/@types/node/buffer.d.ts +1936 -0
  42. package/templates/cms-starter/node_modules/@types/node/child_process.d.ts +1475 -0
  43. package/templates/cms-starter/node_modules/@types/node/cluster.d.ts +577 -0
  44. package/templates/cms-starter/node_modules/@types/node/compatibility/disposable.d.ts +16 -0
  45. package/templates/cms-starter/node_modules/@types/node/compatibility/index.d.ts +9 -0
  46. package/templates/cms-starter/node_modules/@types/node/compatibility/indexable.d.ts +20 -0
  47. package/templates/cms-starter/node_modules/@types/node/compatibility/iterators.d.ts +21 -0
  48. package/templates/cms-starter/node_modules/@types/node/console.d.ts +452 -0
  49. package/templates/cms-starter/node_modules/@types/node/constants.d.ts +21 -0
  50. package/templates/cms-starter/node_modules/@types/node/crypto.d.ts +4590 -0
  51. package/templates/cms-starter/node_modules/@types/node/dgram.d.ts +597 -0
  52. package/templates/cms-starter/node_modules/@types/node/diagnostics_channel.d.ts +578 -0
  53. package/templates/cms-starter/node_modules/@types/node/dns/promises.d.ts +479 -0
  54. package/templates/cms-starter/node_modules/@types/node/dns.d.ts +871 -0
  55. package/templates/cms-starter/node_modules/@types/node/domain.d.ts +170 -0
  56. package/templates/cms-starter/node_modules/@types/node/events.d.ts +977 -0
  57. package/templates/cms-starter/node_modules/@types/node/fs/promises.d.ts +1270 -0
  58. package/templates/cms-starter/node_modules/@types/node/fs.d.ts +4375 -0
  59. package/templates/cms-starter/node_modules/@types/node/globals.d.ts +172 -0
  60. package/templates/cms-starter/node_modules/@types/node/globals.typedarray.d.ts +38 -0
  61. package/templates/cms-starter/node_modules/@types/node/http.d.ts +2049 -0
  62. package/templates/cms-starter/node_modules/@types/node/http2.d.ts +2708 -0
  63. package/templates/cms-starter/node_modules/@types/node/https.d.ts +578 -0
  64. package/templates/cms-starter/node_modules/@types/node/index.d.ts +93 -0
  65. package/templates/cms-starter/node_modules/@types/node/inspector.generated.d.ts +3966 -0
  66. package/templates/cms-starter/node_modules/@types/node/module.d.ts +539 -0
  67. package/templates/cms-starter/node_modules/@types/node/net.d.ts +1031 -0
  68. package/templates/cms-starter/node_modules/@types/node/os.d.ts +506 -0
  69. package/templates/cms-starter/node_modules/@types/node/package.json +140 -0
  70. package/templates/cms-starter/node_modules/@types/node/path.d.ts +200 -0
  71. package/templates/cms-starter/node_modules/@types/node/perf_hooks.d.ts +961 -0
  72. package/templates/cms-starter/node_modules/@types/node/process.d.ts +1961 -0
  73. package/templates/cms-starter/node_modules/@types/node/punycode.d.ts +117 -0
  74. package/templates/cms-starter/node_modules/@types/node/querystring.d.ts +152 -0
  75. package/templates/cms-starter/node_modules/@types/node/readline/promises.d.ts +162 -0
  76. package/templates/cms-starter/node_modules/@types/node/readline.d.ts +589 -0
  77. package/templates/cms-starter/node_modules/@types/node/repl.d.ts +430 -0
  78. package/templates/cms-starter/node_modules/@types/node/sea.d.ts +153 -0
  79. package/templates/cms-starter/node_modules/@types/node/stream/consumers.d.ts +38 -0
  80. package/templates/cms-starter/node_modules/@types/node/stream/promises.d.ts +90 -0
  81. package/templates/cms-starter/node_modules/@types/node/stream/web.d.ts +533 -0
  82. package/templates/cms-starter/node_modules/@types/node/stream.d.ts +1698 -0
  83. package/templates/cms-starter/node_modules/@types/node/string_decoder.d.ts +67 -0
  84. package/templates/cms-starter/node_modules/@types/node/test.d.ts +1787 -0
  85. package/templates/cms-starter/node_modules/@types/node/timers/promises.d.ts +108 -0
  86. package/templates/cms-starter/node_modules/@types/node/timers.d.ts +286 -0
  87. package/templates/cms-starter/node_modules/@types/node/tls.d.ts +1259 -0
  88. package/templates/cms-starter/node_modules/@types/node/trace_events.d.ts +197 -0
  89. package/templates/cms-starter/node_modules/@types/node/ts5.6/buffer.buffer.d.ts +468 -0
  90. package/templates/cms-starter/node_modules/@types/node/ts5.6/globals.typedarray.d.ts +34 -0
  91. package/templates/cms-starter/node_modules/@types/node/ts5.6/index.d.ts +93 -0
  92. package/templates/cms-starter/node_modules/@types/node/tty.d.ts +208 -0
  93. package/templates/cms-starter/node_modules/@types/node/url.d.ts +964 -0
  94. package/templates/cms-starter/node_modules/@types/node/util.d.ts +2331 -0
  95. package/templates/cms-starter/node_modules/@types/node/v8.d.ts +809 -0
  96. package/templates/cms-starter/node_modules/@types/node/vm.d.ts +1001 -0
  97. package/templates/cms-starter/node_modules/@types/node/wasi.d.ts +181 -0
  98. package/templates/cms-starter/node_modules/@types/node/web-globals/abortcontroller.d.ts +34 -0
  99. package/templates/cms-starter/node_modules/@types/node/web-globals/domexception.d.ts +68 -0
  100. package/templates/cms-starter/node_modules/@types/node/web-globals/events.d.ts +97 -0
  101. package/templates/cms-starter/node_modules/@types/node/web-globals/fetch.d.ts +55 -0
  102. package/templates/cms-starter/node_modules/@types/node/worker_threads.d.ts +715 -0
  103. package/templates/cms-starter/node_modules/@types/node/zlib.d.ts +598 -0
  104. package/templates/cms-starter/node_modules/esbuild/LICENSE.md +21 -0
  105. package/templates/cms-starter/node_modules/esbuild/README.md +3 -0
  106. package/templates/cms-starter/node_modules/esbuild/bin/esbuild +223 -0
  107. package/templates/cms-starter/node_modules/esbuild/install.js +300 -0
  108. package/templates/cms-starter/node_modules/esbuild/lib/main.d.ts +716 -0
  109. package/templates/cms-starter/node_modules/esbuild/lib/main.js +2532 -0
  110. package/templates/cms-starter/node_modules/esbuild/package.json +74 -0
  111. package/templates/cms-starter/node_modules/tsx/LICENSE +21 -0
  112. package/templates/cms-starter/node_modules/tsx/README.md +32 -0
  113. package/templates/cms-starter/node_modules/tsx/dist/cjs/api/index.cjs +1 -0
  114. package/templates/cms-starter/node_modules/tsx/dist/cjs/api/index.d.cts +35 -0
  115. package/templates/cms-starter/node_modules/tsx/dist/cjs/api/index.d.mts +35 -0
  116. package/templates/cms-starter/node_modules/tsx/dist/cjs/api/index.mjs +1 -0
  117. package/templates/cms-starter/node_modules/tsx/dist/cjs/index.cjs +1 -0
  118. package/templates/cms-starter/node_modules/tsx/dist/cjs/index.mjs +1 -0
  119. package/templates/cms-starter/node_modules/tsx/dist/cli.cjs +54 -0
  120. package/templates/cms-starter/node_modules/tsx/dist/cli.mjs +55 -0
  121. package/templates/cms-starter/node_modules/tsx/dist/client-D3mGB526.cjs +1 -0
  122. package/templates/cms-starter/node_modules/tsx/dist/client-D_mPDF5S.mjs +1 -0
  123. package/templates/cms-starter/node_modules/tsx/dist/esm/api/index.cjs +1 -0
  124. package/templates/cms-starter/node_modules/tsx/dist/esm/api/index.d.cts +35 -0
  125. package/templates/cms-starter/node_modules/tsx/dist/esm/api/index.d.mts +35 -0
  126. package/templates/cms-starter/node_modules/tsx/dist/esm/api/index.mjs +1 -0
  127. package/templates/cms-starter/node_modules/tsx/dist/esm/index.cjs +1 -0
  128. package/templates/cms-starter/node_modules/tsx/dist/esm/index.mjs +1 -0
  129. package/templates/cms-starter/node_modules/tsx/dist/get-pipe-path-D4YM6rQt.cjs +1 -0
  130. package/templates/cms-starter/node_modules/tsx/dist/get-pipe-path-_tAJyU_v.mjs +1 -0
  131. package/templates/cms-starter/node_modules/tsx/dist/index-BWFBUo6r.cjs +1 -0
  132. package/templates/cms-starter/node_modules/tsx/dist/index-D9F1FXzN.cjs +14 -0
  133. package/templates/cms-starter/node_modules/tsx/dist/index-XurvG3JN.mjs +14 -0
  134. package/templates/cms-starter/node_modules/tsx/dist/index-gbaejti9.mjs +1 -0
  135. package/templates/cms-starter/node_modules/tsx/dist/lexer-DQCqS3nf.mjs +3 -0
  136. package/templates/cms-starter/node_modules/tsx/dist/lexer-DgIbo0BU.cjs +3 -0
  137. package/templates/cms-starter/node_modules/tsx/dist/loader.cjs +1 -0
  138. package/templates/cms-starter/node_modules/tsx/dist/loader.mjs +1 -0
  139. package/templates/cms-starter/node_modules/tsx/dist/node-features-B9BBLzwu.mjs +1 -0
  140. package/templates/cms-starter/node_modules/tsx/dist/node-features-CQLdkVE6.cjs +1 -0
  141. package/templates/cms-starter/node_modules/tsx/dist/package-CGdS2_oX.cjs +1 -0
  142. package/templates/cms-starter/node_modules/tsx/dist/package-DyJMwVU5.mjs +1 -0
  143. package/templates/cms-starter/node_modules/tsx/dist/patch-repl.cjs +1 -0
  144. package/templates/cms-starter/node_modules/tsx/dist/patch-repl.mjs +1 -0
  145. package/templates/cms-starter/node_modules/tsx/dist/preflight.cjs +1 -0
  146. package/templates/cms-starter/node_modules/tsx/dist/preflight.mjs +1 -0
  147. package/templates/cms-starter/node_modules/tsx/dist/register-BOkp8V6j.cjs +10 -0
  148. package/templates/cms-starter/node_modules/tsx/dist/register-BnTWPeIB.mjs +10 -0
  149. package/templates/cms-starter/node_modules/tsx/dist/register-CHVGxKtC.cjs +2 -0
  150. package/templates/cms-starter/node_modules/tsx/dist/register-D_B8UL5H.mjs +2 -0
  151. package/templates/cms-starter/node_modules/tsx/dist/repl.cjs +3 -0
  152. package/templates/cms-starter/node_modules/tsx/dist/repl.mjs +3 -0
  153. package/templates/cms-starter/node_modules/tsx/dist/require-CjvaJWEr.cjs +1 -0
  154. package/templates/cms-starter/node_modules/tsx/dist/require-DzmC1hVr.mjs +1 -0
  155. package/templates/cms-starter/node_modules/tsx/dist/suppress-warnings.cjs +1 -0
  156. package/templates/cms-starter/node_modules/tsx/dist/suppress-warnings.mjs +1 -0
  157. package/templates/cms-starter/node_modules/tsx/dist/temporary-directory-B83uKxJF.cjs +1 -0
  158. package/templates/cms-starter/node_modules/tsx/dist/temporary-directory-BDDVQOvU.mjs +1 -0
  159. package/templates/cms-starter/node_modules/tsx/dist/types-Cxp8y2TL.d.ts +5 -0
  160. package/templates/cms-starter/node_modules/tsx/package.json +67 -0
  161. package/templates/cms-starter/node_modules/typescript/LICENSE.txt +55 -0
  162. package/templates/cms-starter/node_modules/typescript/README.md +50 -0
  163. package/templates/cms-starter/node_modules/typescript/SECURITY.md +41 -0
  164. package/templates/cms-starter/node_modules/typescript/ThirdPartyNoticeText.txt +193 -0
  165. package/templates/cms-starter/node_modules/typescript/bin/tsc +2 -0
  166. package/templates/cms-starter/node_modules/typescript/bin/tsserver +2 -0
  167. package/templates/cms-starter/node_modules/typescript/lib/_tsc.js +133818 -0
  168. package/templates/cms-starter/node_modules/typescript/lib/_tsserver.js +659 -0
  169. package/templates/cms-starter/node_modules/typescript/lib/_typingsInstaller.js +222 -0
  170. package/templates/cms-starter/node_modules/typescript/lib/cs/diagnosticMessages.generated.json +2122 -0
  171. package/templates/cms-starter/node_modules/typescript/lib/de/diagnosticMessages.generated.json +2122 -0
  172. package/templates/cms-starter/node_modules/typescript/lib/es/diagnosticMessages.generated.json +2122 -0
  173. package/templates/cms-starter/node_modules/typescript/lib/fr/diagnosticMessages.generated.json +2122 -0
  174. package/templates/cms-starter/node_modules/typescript/lib/it/diagnosticMessages.generated.json +2122 -0
  175. package/templates/cms-starter/node_modules/typescript/lib/ja/diagnosticMessages.generated.json +2122 -0
  176. package/templates/cms-starter/node_modules/typescript/lib/ko/diagnosticMessages.generated.json +2122 -0
  177. package/templates/cms-starter/node_modules/typescript/lib/lib.d.ts +22 -0
  178. package/templates/cms-starter/node_modules/typescript/lib/lib.decorators.d.ts +384 -0
  179. package/templates/cms-starter/node_modules/typescript/lib/lib.decorators.legacy.d.ts +22 -0
  180. package/templates/cms-starter/node_modules/typescript/lib/lib.dom.asynciterable.d.ts +41 -0
  181. package/templates/cms-starter/node_modules/typescript/lib/lib.dom.d.ts +39429 -0
  182. package/templates/cms-starter/node_modules/typescript/lib/lib.dom.iterable.d.ts +571 -0
  183. package/templates/cms-starter/node_modules/typescript/lib/lib.es2015.collection.d.ts +147 -0
  184. package/templates/cms-starter/node_modules/typescript/lib/lib.es2015.core.d.ts +597 -0
  185. package/templates/cms-starter/node_modules/typescript/lib/lib.es2015.d.ts +28 -0
  186. package/templates/cms-starter/node_modules/typescript/lib/lib.es2015.generator.d.ts +77 -0
  187. package/templates/cms-starter/node_modules/typescript/lib/lib.es2015.iterable.d.ts +605 -0
  188. package/templates/cms-starter/node_modules/typescript/lib/lib.es2015.promise.d.ts +81 -0
  189. package/templates/cms-starter/node_modules/typescript/lib/lib.es2015.proxy.d.ts +128 -0
  190. package/templates/cms-starter/node_modules/typescript/lib/lib.es2015.reflect.d.ts +144 -0
  191. package/templates/cms-starter/node_modules/typescript/lib/lib.es2015.symbol.d.ts +46 -0
  192. package/templates/cms-starter/node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts +326 -0
  193. package/templates/cms-starter/node_modules/typescript/lib/lib.es2016.array.include.d.ts +116 -0
  194. package/templates/cms-starter/node_modules/typescript/lib/lib.es2016.d.ts +21 -0
  195. package/templates/cms-starter/node_modules/typescript/lib/lib.es2016.full.d.ts +23 -0
  196. package/templates/cms-starter/node_modules/typescript/lib/lib.es2016.intl.d.ts +31 -0
  197. package/templates/cms-starter/node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts +21 -0
  198. package/templates/cms-starter/node_modules/typescript/lib/lib.es2017.d.ts +26 -0
  199. package/templates/cms-starter/node_modules/typescript/lib/lib.es2017.date.d.ts +31 -0
  200. package/templates/cms-starter/node_modules/typescript/lib/lib.es2017.full.d.ts +23 -0
  201. package/templates/cms-starter/node_modules/typescript/lib/lib.es2017.intl.d.ts +44 -0
  202. package/templates/cms-starter/node_modules/typescript/lib/lib.es2017.object.d.ts +49 -0
  203. package/templates/cms-starter/node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts +135 -0
  204. package/templates/cms-starter/node_modules/typescript/lib/lib.es2017.string.d.ts +45 -0
  205. package/templates/cms-starter/node_modules/typescript/lib/lib.es2017.typedarrays.d.ts +53 -0
  206. package/templates/cms-starter/node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts +77 -0
  207. package/templates/cms-starter/node_modules/typescript/lib/lib.es2018.asynciterable.d.ts +53 -0
  208. package/templates/cms-starter/node_modules/typescript/lib/lib.es2018.d.ts +24 -0
  209. package/templates/cms-starter/node_modules/typescript/lib/lib.es2018.full.d.ts +24 -0
  210. package/templates/cms-starter/node_modules/typescript/lib/lib.es2018.intl.d.ts +83 -0
  211. package/templates/cms-starter/node_modules/typescript/lib/lib.es2018.promise.d.ts +30 -0
  212. package/templates/cms-starter/node_modules/typescript/lib/lib.es2018.regexp.d.ts +37 -0
  213. package/templates/cms-starter/node_modules/typescript/lib/lib.es2019.array.d.ts +79 -0
  214. package/templates/cms-starter/node_modules/typescript/lib/lib.es2019.d.ts +24 -0
  215. package/templates/cms-starter/node_modules/typescript/lib/lib.es2019.full.d.ts +24 -0
  216. package/templates/cms-starter/node_modules/typescript/lib/lib.es2019.intl.d.ts +23 -0
  217. package/templates/cms-starter/node_modules/typescript/lib/lib.es2019.object.d.ts +33 -0
  218. package/templates/cms-starter/node_modules/typescript/lib/lib.es2019.string.d.ts +37 -0
  219. package/templates/cms-starter/node_modules/typescript/lib/lib.es2019.symbol.d.ts +24 -0
  220. package/templates/cms-starter/node_modules/typescript/lib/lib.es2020.bigint.d.ts +765 -0
  221. package/templates/cms-starter/node_modules/typescript/lib/lib.es2020.d.ts +27 -0
  222. package/templates/cms-starter/node_modules/typescript/lib/lib.es2020.date.d.ts +42 -0
  223. package/templates/cms-starter/node_modules/typescript/lib/lib.es2020.full.d.ts +24 -0
  224. package/templates/cms-starter/node_modules/typescript/lib/lib.es2020.intl.d.ts +474 -0
  225. package/templates/cms-starter/node_modules/typescript/lib/lib.es2020.number.d.ts +28 -0
  226. package/templates/cms-starter/node_modules/typescript/lib/lib.es2020.promise.d.ts +47 -0
  227. package/templates/cms-starter/node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts +99 -0
  228. package/templates/cms-starter/node_modules/typescript/lib/lib.es2020.string.d.ts +44 -0
  229. package/templates/cms-starter/node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts +41 -0
  230. package/templates/cms-starter/node_modules/typescript/lib/lib.es2021.d.ts +23 -0
  231. package/templates/cms-starter/node_modules/typescript/lib/lib.es2021.full.d.ts +24 -0
  232. package/templates/cms-starter/node_modules/typescript/lib/lib.es2021.intl.d.ts +166 -0
  233. package/templates/cms-starter/node_modules/typescript/lib/lib.es2021.promise.d.ts +48 -0
  234. package/templates/cms-starter/node_modules/typescript/lib/lib.es2021.string.d.ts +33 -0
  235. package/templates/cms-starter/node_modules/typescript/lib/lib.es2021.weakref.d.ts +78 -0
  236. package/templates/cms-starter/node_modules/typescript/lib/lib.es2022.array.d.ts +121 -0
  237. package/templates/cms-starter/node_modules/typescript/lib/lib.es2022.d.ts +25 -0
  238. package/templates/cms-starter/node_modules/typescript/lib/lib.es2022.error.d.ts +75 -0
  239. package/templates/cms-starter/node_modules/typescript/lib/lib.es2022.full.d.ts +24 -0
  240. package/templates/cms-starter/node_modules/typescript/lib/lib.es2022.intl.d.ts +145 -0
  241. package/templates/cms-starter/node_modules/typescript/lib/lib.es2022.object.d.ts +26 -0
  242. package/templates/cms-starter/node_modules/typescript/lib/lib.es2022.regexp.d.ts +39 -0
  243. package/templates/cms-starter/node_modules/typescript/lib/lib.es2022.string.d.ts +25 -0
  244. package/templates/cms-starter/node_modules/typescript/lib/lib.es2023.array.d.ts +924 -0
  245. package/templates/cms-starter/node_modules/typescript/lib/lib.es2023.collection.d.ts +21 -0
  246. package/templates/cms-starter/node_modules/typescript/lib/lib.es2023.d.ts +22 -0
  247. package/templates/cms-starter/node_modules/typescript/lib/lib.es2023.full.d.ts +24 -0
  248. package/templates/cms-starter/node_modules/typescript/lib/lib.es2023.intl.d.ts +56 -0
  249. package/templates/cms-starter/node_modules/typescript/lib/lib.es2024.arraybuffer.d.ts +65 -0
  250. package/templates/cms-starter/node_modules/typescript/lib/lib.es2024.collection.d.ts +29 -0
  251. package/templates/cms-starter/node_modules/typescript/lib/lib.es2024.d.ts +26 -0
  252. package/templates/cms-starter/node_modules/typescript/lib/lib.es2024.full.d.ts +24 -0
  253. package/templates/cms-starter/node_modules/typescript/lib/lib.es2024.object.d.ts +29 -0
  254. package/templates/cms-starter/node_modules/typescript/lib/lib.es2024.promise.d.ts +35 -0
  255. package/templates/cms-starter/node_modules/typescript/lib/lib.es2024.regexp.d.ts +25 -0
  256. package/templates/cms-starter/node_modules/typescript/lib/lib.es2024.sharedmemory.d.ts +68 -0
  257. package/templates/cms-starter/node_modules/typescript/lib/lib.es2024.string.d.ts +29 -0
  258. package/templates/cms-starter/node_modules/typescript/lib/lib.es5.d.ts +4601 -0
  259. package/templates/cms-starter/node_modules/typescript/lib/lib.es6.d.ts +23 -0
  260. package/templates/cms-starter/node_modules/typescript/lib/lib.esnext.array.d.ts +35 -0
  261. package/templates/cms-starter/node_modules/typescript/lib/lib.esnext.collection.d.ts +96 -0
  262. package/templates/cms-starter/node_modules/typescript/lib/lib.esnext.d.ts +29 -0
  263. package/templates/cms-starter/node_modules/typescript/lib/lib.esnext.decorators.d.ts +28 -0
  264. package/templates/cms-starter/node_modules/typescript/lib/lib.esnext.disposable.d.ts +193 -0
  265. package/templates/cms-starter/node_modules/typescript/lib/lib.esnext.error.d.ts +24 -0
  266. package/templates/cms-starter/node_modules/typescript/lib/lib.esnext.float16.d.ts +445 -0
  267. package/templates/cms-starter/node_modules/typescript/lib/lib.esnext.full.d.ts +24 -0
  268. package/templates/cms-starter/node_modules/typescript/lib/lib.esnext.intl.d.ts +21 -0
  269. package/templates/cms-starter/node_modules/typescript/lib/lib.esnext.iterator.d.ts +148 -0
  270. package/templates/cms-starter/node_modules/typescript/lib/lib.esnext.promise.d.ts +34 -0
  271. package/templates/cms-starter/node_modules/typescript/lib/lib.esnext.sharedmemory.d.ts +25 -0
  272. package/templates/cms-starter/node_modules/typescript/lib/lib.scripthost.d.ts +322 -0
  273. package/templates/cms-starter/node_modules/typescript/lib/lib.webworker.asynciterable.d.ts +41 -0
  274. package/templates/cms-starter/node_modules/typescript/lib/lib.webworker.d.ts +13150 -0
  275. package/templates/cms-starter/node_modules/typescript/lib/lib.webworker.importscripts.d.ts +23 -0
  276. package/templates/cms-starter/node_modules/typescript/lib/lib.webworker.iterable.d.ts +340 -0
  277. package/templates/cms-starter/node_modules/typescript/lib/pl/diagnosticMessages.generated.json +2122 -0
  278. package/templates/cms-starter/node_modules/typescript/lib/pt-br/diagnosticMessages.generated.json +2122 -0
  279. package/templates/cms-starter/node_modules/typescript/lib/ru/diagnosticMessages.generated.json +2122 -0
  280. package/templates/cms-starter/node_modules/typescript/lib/tr/diagnosticMessages.generated.json +2122 -0
  281. package/templates/cms-starter/node_modules/typescript/lib/tsc.js +8 -0
  282. package/templates/cms-starter/node_modules/typescript/lib/tsserver.js +8 -0
  283. package/templates/cms-starter/node_modules/typescript/lib/tsserverlibrary.d.ts +17 -0
  284. package/templates/cms-starter/node_modules/typescript/lib/tsserverlibrary.js +21 -0
  285. package/templates/cms-starter/node_modules/typescript/lib/typesMap.json +497 -0
  286. package/templates/cms-starter/node_modules/typescript/lib/typescript.d.ts +11437 -0
  287. package/templates/cms-starter/node_modules/typescript/lib/typescript.js +200276 -0
  288. package/templates/cms-starter/node_modules/typescript/lib/typingsInstaller.js +8 -0
  289. package/templates/cms-starter/node_modules/typescript/lib/watchGuard.js +53 -0
  290. package/templates/cms-starter/node_modules/typescript/lib/zh-cn/diagnosticMessages.generated.json +2122 -0
  291. package/templates/cms-starter/node_modules/typescript/lib/zh-tw/diagnosticMessages.generated.json +2122 -0
  292. package/templates/cms-starter/node_modules/typescript/package.json +120 -0
  293. package/templates/cms-starter/node_modules/undici-types/LICENSE +21 -0
  294. package/templates/cms-starter/node_modules/undici-types/README.md +6 -0
  295. package/templates/cms-starter/node_modules/undici-types/agent.d.ts +31 -0
  296. package/templates/cms-starter/node_modules/undici-types/api.d.ts +43 -0
  297. package/templates/cms-starter/node_modules/undici-types/balanced-pool.d.ts +29 -0
  298. package/templates/cms-starter/node_modules/undici-types/cache.d.ts +36 -0
  299. package/templates/cms-starter/node_modules/undici-types/client.d.ts +108 -0
  300. package/templates/cms-starter/node_modules/undici-types/connector.d.ts +34 -0
  301. package/templates/cms-starter/node_modules/undici-types/content-type.d.ts +21 -0
  302. package/templates/cms-starter/node_modules/undici-types/cookies.d.ts +28 -0
  303. package/templates/cms-starter/node_modules/undici-types/diagnostics-channel.d.ts +66 -0
  304. package/templates/cms-starter/node_modules/undici-types/dispatcher.d.ts +256 -0
  305. package/templates/cms-starter/node_modules/undici-types/env-http-proxy-agent.d.ts +21 -0
  306. package/templates/cms-starter/node_modules/undici-types/errors.d.ts +149 -0
  307. package/templates/cms-starter/node_modules/undici-types/eventsource.d.ts +61 -0
  308. package/templates/cms-starter/node_modules/undici-types/fetch.d.ts +209 -0
  309. package/templates/cms-starter/node_modules/undici-types/file.d.ts +39 -0
  310. package/templates/cms-starter/node_modules/undici-types/filereader.d.ts +54 -0
  311. package/templates/cms-starter/node_modules/undici-types/formdata.d.ts +108 -0
  312. package/templates/cms-starter/node_modules/undici-types/global-dispatcher.d.ts +9 -0
  313. package/templates/cms-starter/node_modules/undici-types/global-origin.d.ts +7 -0
  314. package/templates/cms-starter/node_modules/undici-types/handlers.d.ts +15 -0
  315. package/templates/cms-starter/node_modules/undici-types/header.d.ts +4 -0
  316. package/templates/cms-starter/node_modules/undici-types/index.d.ts +71 -0
  317. package/templates/cms-starter/node_modules/undici-types/interceptors.d.ts +17 -0
  318. package/templates/cms-starter/node_modules/undici-types/mock-agent.d.ts +50 -0
  319. package/templates/cms-starter/node_modules/undici-types/mock-client.d.ts +25 -0
  320. package/templates/cms-starter/node_modules/undici-types/mock-errors.d.ts +12 -0
  321. package/templates/cms-starter/node_modules/undici-types/mock-interceptor.d.ts +93 -0
  322. package/templates/cms-starter/node_modules/undici-types/mock-pool.d.ts +25 -0
  323. package/templates/cms-starter/node_modules/undici-types/package.json +55 -0
  324. package/templates/cms-starter/node_modules/undici-types/patch.d.ts +33 -0
  325. package/templates/cms-starter/node_modules/undici-types/pool-stats.d.ts +19 -0
  326. package/templates/cms-starter/node_modules/undici-types/pool.d.ts +39 -0
  327. package/templates/cms-starter/node_modules/undici-types/proxy-agent.d.ts +28 -0
  328. package/templates/cms-starter/node_modules/undici-types/readable.d.ts +65 -0
  329. package/templates/cms-starter/node_modules/undici-types/retry-agent.d.ts +8 -0
  330. package/templates/cms-starter/node_modules/undici-types/retry-handler.d.ts +116 -0
  331. package/templates/cms-starter/node_modules/undici-types/util.d.ts +18 -0
  332. package/templates/cms-starter/node_modules/undici-types/webidl.d.ts +228 -0
  333. package/templates/cms-starter/node_modules/undici-types/websocket.d.ts +150 -0
  334. package/templates/cms-starter/package-lock.json +592 -0
  335. package/templates/cms-starter/package.json +2 -2
  336. package/templates/cms-starter/public/index.html +42 -14
  337. package/templates/cms-starter/public/methods.js +505 -371
  338. package/templates/cms-starter/public/panel.css +130 -1
  339. package/templates/cms-starter/server.ts +7 -0
package/dist/index.d.ts CHANGED
@@ -1,6 +1,8 @@
1
1
  export { TomorrowOS } from "./tomorrowos.js";
2
2
  export type { DeviceListItem, ListenOptions, TomorrowOSBrand, TomorrowOSOptions } from "./tomorrowos.js";
3
- export type { DeviceRegistryRecord, PairedDeviceRecord, PendingCodeRecord, TomorrowOSStore } from "./store/types.js";
3
+ export type { DevicePlaylistAssignment, DeviceRegistryRecord, PairedDeviceRecord, PendingCodeRecord, PlaylistItemRecord, PlaylistSchedule, PublishedPlaylistSnapshot, StoredPlaylist, TomorrowOSStore } from "./store/types.js";
4
+ export { PlaylistCatalog } from "./playlist-catalog.js";
5
+ export type { BuiltDevicePolicy, SavePlaylistInput } from "./playlist-catalog.js";
4
6
  export { generateRandomPairingCode, isValidPairingCodeFormat, normalizePairingCode, PAIRING_CODE_ALPHABET, PAIRING_CODE_LENGTH } from "./pairing-code.js";
5
7
  export { MemoryStore } from "./store/memory-store.js";
6
8
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,YAAY,EACV,cAAc,EACd,aAAa,EACb,eAAe,EACf,iBAAiB,EAClB,MAAM,iBAAiB,CAAC;AAEzB,YAAY,EACV,oBAAoB,EACpB,kBAAkB,EAClB,iBAAiB,EACjB,eAAe,EAChB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,yBAAyB,EACzB,wBAAwB,EACxB,oBAAoB,EACpB,qBAAqB,EACrB,mBAAmB,EACpB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,YAAY,EACV,cAAc,EACd,aAAa,EACb,eAAe,EACf,iBAAiB,EAClB,MAAM,iBAAiB,CAAC;AAEzB,YAAY,EACV,wBAAwB,EACxB,oBAAoB,EACpB,kBAAkB,EAClB,iBAAiB,EACjB,kBAAkB,EAClB,gBAAgB,EAChB,yBAAyB,EACzB,cAAc,EACd,eAAe,EAChB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,YAAY,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAClF,OAAO,EACL,yBAAyB,EACzB,wBAAwB,EACxB,oBAAoB,EACpB,qBAAqB,EACrB,mBAAmB,EACpB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC"}
package/dist/index.js CHANGED
@@ -1,3 +1,4 @@
1
1
  export { TomorrowOS } from "./tomorrowos.js";
2
+ export { PlaylistCatalog } from "./playlist-catalog.js";
2
3
  export { generateRandomPairingCode, isValidPairingCodeFormat, normalizePairingCode, PAIRING_CODE_ALPHABET, PAIRING_CODE_LENGTH } from "./pairing-code.js";
3
4
  export { MemoryStore } from "./store/memory-store.js";
@@ -0,0 +1,35 @@
1
+ import type { DevicePlaylistAssignment, PlaylistItemRecord, PlaylistSchedule, PublishedPlaylistSnapshot, StoredPlaylist, TomorrowOSStore } from "./store/types.js";
2
+ export interface SavePlaylistInput {
3
+ id?: string;
4
+ name: string;
5
+ schedule?: PlaylistSchedule;
6
+ items: PlaylistItemRecord[];
7
+ }
8
+ export interface BuiltDevicePolicy {
9
+ policy: {
10
+ playlists: PublishedPlaylistSnapshot[];
11
+ fallback: {
12
+ type: "brand";
13
+ };
14
+ revision?: number;
15
+ syncMode?: "latest" | "snapshot";
16
+ };
17
+ }
18
+ export declare class PlaylistCatalog {
19
+ private readonly store;
20
+ constructor(store: TomorrowOSStore);
21
+ listPlaylists(): Promise<StoredPlaylist[]>;
22
+ listPlaylistsIncludingRetired(): Promise<StoredPlaylist[]>;
23
+ getPlaylist(id: string): Promise<StoredPlaylist | undefined>;
24
+ savePlaylist(input: SavePlaylistInput): Promise<StoredPlaylist>;
25
+ retirePlaylist(id: string): Promise<StoredPlaylist>;
26
+ getDeviceAssignments(deviceId: string): Promise<DevicePlaylistAssignment[]>;
27
+ publishPlaylistsToDevice(deviceId: string, playlistIds: string[]): Promise<BuiltDevicePolicy>;
28
+ removePlaylistFromDevice(deviceId: string, playlistId: string): Promise<BuiltDevicePolicy>;
29
+ buildPolicyForDevice(deviceId: string, options?: {
30
+ useLatest?: boolean;
31
+ }): Promise<BuiltDevicePolicy>;
32
+ private buildPolicyFromAssignments;
33
+ canPublishPlaylistToNewDevice(playlistId: string): Promise<boolean>;
34
+ }
35
+ //# sourceMappingURL=playlist-catalog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"playlist-catalog.d.ts","sourceRoot":"","sources":["../src/playlist-catalog.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,wBAAwB,EACxB,kBAAkB,EAClB,gBAAgB,EAChB,yBAAyB,EACzB,cAAc,EACd,eAAe,EAChB,MAAM,kBAAkB,CAAC;AAE1B,MAAM,WAAW,iBAAiB;IAChC,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,gBAAgB,CAAC;IAC5B,KAAK,EAAE,kBAAkB,EAAE,CAAC;CAC7B;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE;QACN,SAAS,EAAE,yBAAyB,EAAE,CAAC;QACvC,QAAQ,EAAE;YAAE,IAAI,EAAE,OAAO,CAAA;SAAE,CAAC;QAC5B,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,QAAQ,CAAC,EAAE,QAAQ,GAAG,UAAU,CAAC;KAClC,CAAC;CACH;AAYD,qBAAa,eAAe;IACd,OAAO,CAAC,QAAQ,CAAC,KAAK;gBAAL,KAAK,EAAE,eAAe;IAE7C,aAAa,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;IAK1C,6BAA6B,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;IAI1D,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,SAAS,CAAC;IAI5D,YAAY,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,cAAc,CAAC;IAgC/D,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAcnD,oBAAoB,CACxB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,wBAAwB,EAAE,CAAC;IAIhC,wBAAwB,CAC5B,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,EAAE,GACpB,OAAO,CAAC,iBAAiB,CAAC;IA8BvB,wBAAwB,CAC5B,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,iBAAiB,CAAC;IAOvB,oBAAoB,CACxB,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE;QAAE,SAAS,CAAC,EAAE,OAAO,CAAA;KAAO,GACpC,OAAO,CAAC,iBAAiB,CAAC;YAKf,0BAA0B;IA+BxC,6BAA6B,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAGpE"}
@@ -0,0 +1,133 @@
1
+ import { randomUUID } from "crypto";
2
+ function cloneSnapshot(playlist) {
3
+ return {
4
+ id: playlist.id,
5
+ name: playlist.name,
6
+ version: playlist.version,
7
+ schedule: playlist.schedule ? { ...playlist.schedule } : undefined,
8
+ items: playlist.items.map((item) => ({ ...item }))
9
+ };
10
+ }
11
+ export class PlaylistCatalog {
12
+ store;
13
+ constructor(store) {
14
+ this.store = store;
15
+ }
16
+ async listPlaylists() {
17
+ const all = await this.store.listPlaylists();
18
+ return all.filter((p) => !p.retired);
19
+ }
20
+ async listPlaylistsIncludingRetired() {
21
+ return this.store.listPlaylists();
22
+ }
23
+ async getPlaylist(id) {
24
+ return this.store.getPlaylist(id);
25
+ }
26
+ async savePlaylist(input) {
27
+ const name = String(input.name || "").trim();
28
+ if (!name) {
29
+ throw Object.assign(new Error("Playlist name is required"), {
30
+ code: "PLAYLIST_INVALID"
31
+ });
32
+ }
33
+ const id = input.id?.trim() || randomUUID();
34
+ const taken = await this.store.isPlaylistNameTaken(name, id);
35
+ if (taken) {
36
+ throw Object.assign(new Error("Playlist name already exists"), {
37
+ code: "PLAYLIST_NAME_CONFLICT"
38
+ });
39
+ }
40
+ const existing = await this.store.getPlaylist(id);
41
+ const now = new Date().toISOString();
42
+ const record = {
43
+ id,
44
+ name,
45
+ schedule: input.schedule,
46
+ items: Array.isArray(input.items) ? input.items : [],
47
+ version: (existing?.version ?? 0) + 1,
48
+ updatedAt: now,
49
+ retired: false
50
+ };
51
+ await this.store.setPlaylist(record);
52
+ return record;
53
+ }
54
+ async retirePlaylist(id) {
55
+ const existing = await this.store.getPlaylist(id);
56
+ if (!existing) {
57
+ throw Object.assign(new Error("Playlist not found"), { code: "PLAYLIST_NOT_FOUND" });
58
+ }
59
+ const record = {
60
+ ...existing,
61
+ retired: true,
62
+ retiredAt: new Date().toISOString()
63
+ };
64
+ await this.store.setPlaylist(record);
65
+ return record;
66
+ }
67
+ async getDeviceAssignments(deviceId) {
68
+ return this.store.getDeviceAssignments(deviceId);
69
+ }
70
+ async publishPlaylistsToDevice(deviceId, playlistIds) {
71
+ const ids = [...new Set(playlistIds.map((x) => String(x).trim()).filter(Boolean))];
72
+ if (ids.length === 0) {
73
+ throw Object.assign(new Error("Select at least one playlist"), {
74
+ code: "PLAYLIST_INVALID"
75
+ });
76
+ }
77
+ const assignments = [];
78
+ for (const playlistId of ids) {
79
+ const playlist = await this.store.getPlaylist(playlistId);
80
+ if (!playlist || playlist.retired) {
81
+ throw Object.assign(new Error(`Playlist not available: ${playlistId}`), {
82
+ code: "PLAYLIST_NOT_FOUND"
83
+ });
84
+ }
85
+ assignments.push({
86
+ playlistId,
87
+ publishedVersion: playlist.version,
88
+ publishedAt: new Date().toISOString(),
89
+ snapshot: cloneSnapshot(playlist)
90
+ });
91
+ }
92
+ await this.store.setDeviceAssignments(deviceId, assignments);
93
+ return this.buildPolicyFromAssignments(assignments, { useLatest: false });
94
+ }
95
+ async removePlaylistFromDevice(deviceId, playlistId) {
96
+ const assignments = await this.store.getDeviceAssignments(deviceId);
97
+ const next = assignments.filter((a) => a.playlistId !== playlistId);
98
+ await this.store.setDeviceAssignments(deviceId, next);
99
+ return this.buildPolicyFromAssignments(next, { useLatest: false });
100
+ }
101
+ async buildPolicyForDevice(deviceId, options = {}) {
102
+ const assignments = await this.store.getDeviceAssignments(deviceId);
103
+ return this.buildPolicyFromAssignments(assignments, options);
104
+ }
105
+ async buildPolicyFromAssignments(assignments, options) {
106
+ const useLatest = options.useLatest === true;
107
+ const playlists = [];
108
+ for (const assignment of assignments) {
109
+ if (useLatest) {
110
+ const current = await this.store.getPlaylist(assignment.playlistId);
111
+ if (current && !current.retired) {
112
+ playlists.push(cloneSnapshot(current));
113
+ continue;
114
+ }
115
+ }
116
+ playlists.push({
117
+ ...assignment.snapshot,
118
+ items: assignment.snapshot.items.map((item) => ({ ...item }))
119
+ });
120
+ }
121
+ return {
122
+ policy: {
123
+ playlists,
124
+ fallback: { type: "brand" },
125
+ revision: Date.now(),
126
+ syncMode: useLatest ? "latest" : "snapshot"
127
+ }
128
+ };
129
+ }
130
+ canPublishPlaylistToNewDevice(playlistId) {
131
+ return this.store.getPlaylist(playlistId).then((p) => !!p && !p?.retired);
132
+ }
133
+ }
@@ -1,4 +1,4 @@
1
- import type { DeviceRegistryRecord, PairedDeviceEntry, PairedDeviceRecord, PendingCodeRecord, TomorrowOSStore } from "./types.js";
1
+ import type { DevicePlaylistAssignment, DeviceRegistryRecord, PairedDeviceEntry, PairedDeviceRecord, PendingCodeRecord, StoredPlaylist, TomorrowOSStore } from "./types.js";
2
2
  /**
3
3
  * Default store for development / single-node demos.
4
4
  * Data is lost on process restart — not for multi-instance production.
@@ -8,6 +8,8 @@ export declare class MemoryStore implements TomorrowOSStore {
8
8
  private readonly deviceRegistry;
9
9
  private readonly codeToDeviceId;
10
10
  private readonly pairedDevices;
11
+ private readonly playlists;
12
+ private readonly deviceAssignments;
11
13
  setPendingCode(code: string, record: PendingCodeRecord): Promise<void>;
12
14
  getPendingCode(code: string): Promise<PendingCodeRecord | undefined>;
13
15
  deletePendingCode(code: string): Promise<void>;
@@ -21,5 +23,11 @@ export declare class MemoryStore implements TomorrowOSStore {
21
23
  getPairedDevice(deviceId: string): Promise<PairedDeviceRecord | undefined>;
22
24
  deletePairedDevice(deviceId: string): Promise<void>;
23
25
  listPairedDevices(): Promise<PairedDeviceEntry[]>;
26
+ listPlaylists(): Promise<StoredPlaylist[]>;
27
+ getPlaylist(id: string): Promise<StoredPlaylist | undefined>;
28
+ setPlaylist(record: StoredPlaylist): Promise<void>;
29
+ isPlaylistNameTaken(name: string, excludeId?: string): Promise<boolean>;
30
+ getDeviceAssignments(deviceId: string): Promise<DevicePlaylistAssignment[]>;
31
+ setDeviceAssignments(deviceId: string, assignments: DevicePlaylistAssignment[]): Promise<void>;
24
32
  }
25
33
  //# sourceMappingURL=memory-store.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"memory-store.d.ts","sourceRoot":"","sources":["../../src/store/memory-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,oBAAoB,EACpB,iBAAiB,EACjB,kBAAkB,EAClB,iBAAiB,EACjB,eAAe,EAChB,MAAM,YAAY,CAAC;AAEpB;;;GAGG;AACH,qBAAa,WAAY,YAAW,eAAe;IACjD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAwC;IACrE,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA2C;IAC1E,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA6B;IAC5D,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAyC;IAEjE,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAItE,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,GAAG,SAAS,CAAC;IAIpE,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI9C,iBAAiB,CACrB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,oBAAoB,GAAG,SAAS,CAAC;IAItC,iBAAiB,CACrB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,oBAAoB,GAC3B,OAAO,CAAC,IAAI,CAAC;IASV,uBAAuB,CAC3B,IAAI,EAAE,MAAM,GACX,OAAO,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,oBAAoB,CAAA;KAAE,GAAG,SAAS,CAAC;IAQpE,eAAe,CACnB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,kBAAkB,GACzB,OAAO,CAAC,IAAI,CAAC;IAIV,eAAe,CACnB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,kBAAkB,GAAG,SAAS,CAAC;IAIpC,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAInD,iBAAiB,IAAI,OAAO,CAAC,iBAAiB,EAAE,CAAC;CAMxD"}
1
+ {"version":3,"file":"memory-store.d.ts","sourceRoot":"","sources":["../../src/store/memory-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,wBAAwB,EACxB,oBAAoB,EACpB,iBAAiB,EACjB,kBAAkB,EAClB,iBAAiB,EACjB,cAAc,EACd,eAAe,EAChB,MAAM,YAAY,CAAC;AAEpB;;;GAGG;AACH,qBAAa,WAAY,YAAW,eAAe;IACjD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAwC;IACrE,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA2C;IAC1E,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA6B;IAC5D,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAyC;IACvE,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAqC;IAC/D,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAiD;IAE7E,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAItE,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,GAAG,SAAS,CAAC;IAIpE,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI9C,iBAAiB,CACrB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,oBAAoB,GAAG,SAAS,CAAC;IAItC,iBAAiB,CACrB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,oBAAoB,GAC3B,OAAO,CAAC,IAAI,CAAC;IASV,uBAAuB,CAC3B,IAAI,EAAE,MAAM,GACX,OAAO,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,oBAAoB,CAAA;KAAE,GAAG,SAAS,CAAC;IAQpE,eAAe,CACnB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,kBAAkB,GACzB,OAAO,CAAC,IAAI,CAAC;IAIV,eAAe,CACnB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,kBAAkB,GAAG,SAAS,CAAC;IAIpC,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAInD,iBAAiB,IAAI,OAAO,CAAC,iBAAiB,EAAE,CAAC;IAOjD,aAAa,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;IAI1C,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,SAAS,CAAC;IAI5D,WAAW,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAIlD,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAUvE,oBAAoB,CACxB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,wBAAwB,EAAE,CAAC;IAIhC,oBAAoB,CACxB,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,wBAAwB,EAAE,GACtC,OAAO,CAAC,IAAI,CAAC;CASjB"}
@@ -7,6 +7,8 @@ export class MemoryStore {
7
7
  deviceRegistry = new Map();
8
8
  codeToDeviceId = new Map();
9
9
  pairedDevices = new Map();
10
+ playlists = new Map();
11
+ deviceAssignments = new Map();
10
12
  async setPendingCode(code, record) {
11
13
  this.pendingCodes.set(code, record);
12
14
  }
@@ -51,4 +53,37 @@ export class MemoryStore {
51
53
  record
52
54
  }));
53
55
  }
56
+ async listPlaylists() {
57
+ return [...this.playlists.values()];
58
+ }
59
+ async getPlaylist(id) {
60
+ return this.playlists.get(id);
61
+ }
62
+ async setPlaylist(record) {
63
+ this.playlists.set(record.id, record);
64
+ }
65
+ async isPlaylistNameTaken(name, excludeId) {
66
+ const target = name.trim().toLowerCase();
67
+ for (const playlist of this.playlists.values()) {
68
+ if (playlist.retired)
69
+ continue;
70
+ if (excludeId && playlist.id === excludeId)
71
+ continue;
72
+ if (playlist.name.trim().toLowerCase() === target)
73
+ return true;
74
+ }
75
+ return false;
76
+ }
77
+ async getDeviceAssignments(deviceId) {
78
+ return [...(this.deviceAssignments.get(deviceId) ?? [])];
79
+ }
80
+ async setDeviceAssignments(deviceId, assignments) {
81
+ this.deviceAssignments.set(deviceId, assignments.map((a) => ({
82
+ ...a,
83
+ snapshot: {
84
+ ...a.snapshot,
85
+ items: a.snapshot.items.map((item) => ({ ...item }))
86
+ }
87
+ })));
88
+ }
54
89
  }
@@ -29,6 +29,41 @@ export interface PairedDeviceEntry {
29
29
  deviceId: string;
30
30
  record: PairedDeviceRecord;
31
31
  }
32
+ export interface PlaylistItemRecord {
33
+ url: string;
34
+ type?: string;
35
+ durationMs?: number;
36
+ }
37
+ export interface PlaylistSchedule {
38
+ startDate?: string;
39
+ endDate?: string;
40
+ daysOfWeek?: number[];
41
+ start?: string;
42
+ end?: string;
43
+ }
44
+ export interface StoredPlaylist {
45
+ id: string;
46
+ name: string;
47
+ schedule?: PlaylistSchedule;
48
+ items: PlaylistItemRecord[];
49
+ version: number;
50
+ updatedAt: string;
51
+ retired?: boolean;
52
+ retiredAt?: string;
53
+ }
54
+ export interface PublishedPlaylistSnapshot {
55
+ id: string;
56
+ name: string;
57
+ version: number;
58
+ schedule?: PlaylistSchedule;
59
+ items: PlaylistItemRecord[];
60
+ }
61
+ export interface DevicePlaylistAssignment {
62
+ playlistId: string;
63
+ publishedVersion: number;
64
+ publishedAt: string;
65
+ snapshot: PublishedPlaylistSnapshot;
66
+ }
32
67
  /**
33
68
  * Implement with Postgres, Redis, etc. Defaults to MemoryStore (Map).
34
69
  * All methods async so DB backends do not need sync adapters.
@@ -47,5 +82,11 @@ export interface TomorrowOSStore {
47
82
  getPairedDevice(deviceId: string): Promise<PairedDeviceRecord | undefined>;
48
83
  deletePairedDevice(deviceId: string): Promise<void>;
49
84
  listPairedDevices(): Promise<PairedDeviceEntry[]>;
85
+ listPlaylists(): Promise<StoredPlaylist[]>;
86
+ getPlaylist(id: string): Promise<StoredPlaylist | undefined>;
87
+ setPlaylist(record: StoredPlaylist): Promise<void>;
88
+ isPlaylistNameTaken(name: string, excludeId?: string): Promise<boolean>;
89
+ getDeviceAssignments(deviceId: string): Promise<DevicePlaylistAssignment[]>;
90
+ setDeviceAssignments(deviceId: string, assignments: DevicePlaylistAssignment[]): Promise<void>;
50
91
  }
51
92
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/store/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wFAAwF;AACxF,MAAM,WAAW,oBAAoB;IACnC,oBAAoB,EAAE,MAAM,CAAC;IAC7B,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,kBAAkB;IACjC,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,kBAAkB,CAAC;CAC5B;AAED;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC9B,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvE,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,GAAG,SAAS,CAAC,CAAC;IACrE,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/C,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,GAAG,SAAS,CAAC,CAAC;IAC/E,iBAAiB,CACf,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,oBAAoB,GAC3B,OAAO,CAAC,IAAI,CAAC,CAAC;IACjB,uBAAuB,CACrB,IAAI,EAAE,MAAM,GACX,OAAO,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,oBAAoB,CAAA;KAAE,GAAG,SAAS,CAAC,CAAC;IAC3E,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7E,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,GAAG,SAAS,CAAC,CAAC;IAC3E,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACpD,iBAAiB,IAAI,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAAC;CACnD"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/store/types.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,6 @@
1
1
  import { EventEmitter } from "events";
2
2
  import http from "http";
3
+ import { PlaylistCatalog, type BuiltDevicePolicy } from "./playlist-catalog.js";
3
4
  import type { TomorrowOSStore } from "./store/types.js";
4
5
  export interface TomorrowOSBrand {
5
6
  name?: string;
@@ -45,10 +46,17 @@ export interface DeviceListItem {
45
46
  screenOnlineLabel: string;
46
47
  /** Same as lastBootAt while connected; used for uptime display. */
47
48
  screenOnlineSince: string | null;
49
+ publishedPlaylists: Array<{
50
+ playlistId: string;
51
+ name: string;
52
+ version: number;
53
+ publishedAt: string;
54
+ }>;
48
55
  }
49
56
  export declare class TomorrowOS extends EventEmitter {
50
57
  readonly brand: TomorrowOSBrand;
51
58
  private readonly store;
59
+ readonly playlists: PlaylistCatalog;
52
60
  private readonly devices;
53
61
  private readonly pendingDeviceMeta;
54
62
  private httpServer;
@@ -56,6 +64,12 @@ export declare class TomorrowOS extends EventEmitter {
56
64
  private staticRoot;
57
65
  private staticIndexFile;
58
66
  constructor(options: TomorrowOSOptions);
67
+ /** Push all device assignments using latest playlist definitions (e.g. after reboot). */
68
+ pushLatestPolicyToDevice(deviceId: string): Promise<{
69
+ pushed: boolean;
70
+ policy?: BuiltDevicePolicy["policy"];
71
+ }>;
72
+ private sendDeviceCommand;
59
73
  /** Verify a 6-character alphanumeric pairing code (POST /pairing/verify). */
60
74
  pairingVerify(code: string): Promise<{
61
75
  deviceId: string;
@@ -1 +1 @@
1
- {"version":3,"file":"tomorrowos.d.ts","sourceRoot":"","sources":["../src/tomorrowos.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tomorrowos.d.ts","sourceRoot":"","sources":["../src/tomorrowos.ts"],"names":[],"mappings":"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"}
@@ -5,6 +5,7 @@ import http from "http";
5
5
  import path from "path";
6
6
  import { WebSocket, WebSocketServer } from "ws";
7
7
  import { generateRandomPairingCode, isValidPairingCodeFormat, normalizePairingCode } from "./pairing-code.js";
8
+ import { PlaylistCatalog } from "./playlist-catalog.js";
8
9
  import { MemoryStore } from "./store/memory-store.js";
9
10
  function formatDurationMs(ms) {
10
11
  if (!Number.isFinite(ms) || ms < 0)
@@ -80,6 +81,7 @@ function parseDevicePath(pathname) {
80
81
  export class TomorrowOS extends EventEmitter {
81
82
  brand;
82
83
  store;
84
+ playlists;
83
85
  devices = new Map();
84
86
  pendingDeviceMeta = new Map();
85
87
  httpServer = null;
@@ -90,6 +92,31 @@ export class TomorrowOS extends EventEmitter {
90
92
  super();
91
93
  this.brand = options.brand;
92
94
  this.store = options.store ?? new MemoryStore();
95
+ this.playlists = new PlaylistCatalog(this.store);
96
+ }
97
+ /** Push all device assignments using latest playlist definitions (e.g. after reboot). */
98
+ async pushLatestPolicyToDevice(deviceId) {
99
+ const id = String(deviceId || "").trim();
100
+ const assignments = await this.store.getDeviceAssignments(id);
101
+ if (assignments.length === 0)
102
+ return { pushed: false };
103
+ const built = await this.playlists.buildPolicyForDevice(id, { useLatest: true });
104
+ const ws = this.devices.get(id);
105
+ if (!ws || ws.readyState !== WebSocket.OPEN) {
106
+ return { pushed: false, policy: built.policy };
107
+ }
108
+ await this.sendDeviceCommand(id, "device.content.setPolicy", {
109
+ policy: built.policy
110
+ });
111
+ await this.recordPolicyPush(id);
112
+ return { pushed: true, policy: built.policy };
113
+ }
114
+ async sendDeviceCommand(deviceId, method, params) {
115
+ const ws = this.devices.get(deviceId);
116
+ if (!ws || ws.readyState !== WebSocket.OPEN) {
117
+ throw Object.assign(new Error("Device not connected"), { code: "DEVICE_OFFLINE" });
118
+ }
119
+ return this.sendCommandToSocket(ws, deviceId, method, params);
93
120
  }
94
121
  /** Verify a 6-character alphanumeric pairing code (POST /pairing/verify). */
95
122
  async pairingVerify(code) {
@@ -175,6 +202,7 @@ export class TomorrowOS extends EventEmitter {
175
202
  return Promise.all(entries.map(async ({ deviceId, record }) => {
176
203
  const connected = this.isDeviceConnected(deviceId);
177
204
  const reg = await this.store.getDeviceRegistry(deviceId);
205
+ const assignments = await this.store.getDeviceAssignments(deviceId);
178
206
  let screenOnlineActive = false;
179
207
  let screenOnlineLabel = "Not active";
180
208
  if (connected && record.lastBootAt) {
@@ -188,6 +216,12 @@ export class TomorrowOS extends EventEmitter {
188
216
  return {
189
217
  deviceId,
190
218
  pairingCode: reg?.permanentPairingCode ?? null,
219
+ publishedPlaylists: assignments.map((a) => ({
220
+ playlistId: a.playlistId,
221
+ name: a.snapshot.name,
222
+ version: a.publishedVersion,
223
+ publishedAt: a.publishedAt
224
+ })),
191
225
  connected,
192
226
  deviceName: record.deviceName ?? null,
193
227
  platform: record.platform ?? null,
@@ -550,6 +584,105 @@ export class TomorrowOS extends EventEmitter {
550
584
  sendJson(res, 200, { status: "success", devices });
551
585
  return;
552
586
  }
587
+ if (req.method === "GET" && pathname === "/playlists") {
588
+ const playlists = await this.playlists.listPlaylists();
589
+ sendJson(res, 200, { status: "success", playlists });
590
+ return;
591
+ }
592
+ if (req.method === "POST" && pathname === "/playlists") {
593
+ const body = (await readJsonBody(req));
594
+ try {
595
+ const saved = await this.playlists.savePlaylist({
596
+ id: typeof body.id === "string" ? body.id : undefined,
597
+ name: String(body.name ?? ""),
598
+ schedule: body.schedule && typeof body.schedule === "object"
599
+ ? body.schedule
600
+ : undefined,
601
+ items: Array.isArray(body.items) ? body.items : []
602
+ });
603
+ sendJson(res, 200, { status: "success", playlist: saved });
604
+ }
605
+ catch (e) {
606
+ const msg = e instanceof Error ? e.message : "Save failed";
607
+ sendJson(res, 400, { status: "failed", error: msg });
608
+ }
609
+ return;
610
+ }
611
+ const playlistDelete = /^\/playlists\/([^/]+)$/.exec(pathname);
612
+ if (req.method === "DELETE" && playlistDelete) {
613
+ const playlistId = decodeURIComponent(playlistDelete[1]);
614
+ try {
615
+ const retired = await this.playlists.retirePlaylist(playlistId);
616
+ sendJson(res, 200, { status: "success", playlist: retired });
617
+ }
618
+ catch (e) {
619
+ const msg = e instanceof Error ? e.message : "Delete failed";
620
+ sendJson(res, 400, { status: "failed", error: msg });
621
+ }
622
+ return;
623
+ }
624
+ const deviceAssignmentsGet = /^\/device\/([^/]+)\/assignments$/.exec(pathname);
625
+ if (req.method === "GET" && deviceAssignmentsGet) {
626
+ const deviceId = decodeURIComponent(deviceAssignmentsGet[1]);
627
+ const assignments = await this.playlists.getDeviceAssignments(deviceId);
628
+ sendJson(res, 200, { status: "success", assignments });
629
+ return;
630
+ }
631
+ const deviceAssignmentsPost = /^\/device\/([^/]+)\/assignments$/.exec(pathname);
632
+ if (req.method === "POST" && deviceAssignmentsPost) {
633
+ const deviceId = decodeURIComponent(deviceAssignmentsPost[1]);
634
+ const body = (await readJsonBody(req));
635
+ const ws = this.devices.get(deviceId);
636
+ if (!ws || ws.readyState !== WebSocket.OPEN) {
637
+ sendJson(res, 404, { status: "failed", error: "Device not connected" });
638
+ return;
639
+ }
640
+ try {
641
+ let built;
642
+ if (body.useLatest === true) {
643
+ built = await this.playlists.buildPolicyForDevice(deviceId, {
644
+ useLatest: true
645
+ });
646
+ }
647
+ else {
648
+ const ids = Array.isArray(body.playlistIds) ? body.playlistIds : [];
649
+ built = await this.playlists.publishPlaylistsToDevice(deviceId, ids);
650
+ }
651
+ const result = await this.sendDeviceCommand(deviceId, "device.content.setPolicy", {
652
+ policy: built.policy
653
+ });
654
+ await this.recordPolicyPush(deviceId);
655
+ sendJson(res, 200, { status: "success", policy: built.policy, result });
656
+ }
657
+ catch (e) {
658
+ const msg = e instanceof Error ? e.message : "Publish failed";
659
+ sendJson(res, 400, { status: "failed", error: msg });
660
+ }
661
+ return;
662
+ }
663
+ const deviceAssignmentDelete = /^\/device\/([^/]+)\/assignments\/([^/]+)$/.exec(pathname);
664
+ if (req.method === "DELETE" && deviceAssignmentDelete) {
665
+ const deviceId = decodeURIComponent(deviceAssignmentDelete[1]);
666
+ const playlistId = decodeURIComponent(deviceAssignmentDelete[2]);
667
+ const ws = this.devices.get(deviceId);
668
+ if (!ws || ws.readyState !== WebSocket.OPEN) {
669
+ sendJson(res, 404, { status: "failed", error: "Device not connected" });
670
+ return;
671
+ }
672
+ try {
673
+ const built = await this.playlists.removePlaylistFromDevice(deviceId, playlistId);
674
+ const result = await this.sendDeviceCommand(deviceId, "device.content.setPolicy", {
675
+ policy: built.policy
676
+ });
677
+ await this.recordPolicyPush(deviceId);
678
+ sendJson(res, 200, { status: "success", policy: built.policy, result });
679
+ }
680
+ catch (e) {
681
+ const msg = e instanceof Error ? e.message : "Remove failed";
682
+ sendJson(res, 400, { status: "failed", error: msg });
683
+ }
684
+ return;
685
+ }
553
686
  if (req.method === "POST") {
554
687
  const parsed = parseDevicePath(pathname);
555
688
  if (parsed) {
@@ -661,6 +794,7 @@ export class TomorrowOS extends EventEmitter {
661
794
  createdAt: Date.now()
662
795
  });
663
796
  ws.deviceId = deviceId;
797
+ this.sendBrandSnapshot(ws);
664
798
  ws.send(JSON.stringify({
665
799
  type: "pairing.code",
666
800
  method: "tomorrowos.pairing.createCode",
@@ -668,7 +802,6 @@ export class TomorrowOS extends EventEmitter {
668
802
  deviceId,
669
803
  serialNumber
670
804
  }));
671
- this.sendBrandSnapshot(ws);
672
805
  this.emit("device.online", { deviceId });
673
806
  }
674
807
  catch (err) {
@@ -701,6 +834,9 @@ export class TomorrowOS extends EventEmitter {
701
834
  this.sendBrandSnapshot(ws);
702
835
  void this.refreshPairedDeviceInfo(deviceId);
703
836
  this.emit("device.online", { deviceId });
837
+ void this.pushLatestPolicyToDevice(deviceId).catch((err) => {
838
+ console.error("[TomorrowOS] pushLatestPolicy on resume failed:", err);
839
+ });
704
840
  })();
705
841
  }
706
842
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tomorrowos/sdk",
3
- "version": "0.2.5",
3
+ "version": "0.3.1",
4
4
  "description": "TomorrowOS CMS server SDK — WebSocket transport, pairing, device commands, optional static CMS UI. Includes CLI (tomorrowos init / build) and starter templates.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -0,0 +1,16 @@
1
+ #!/bin/sh
2
+ basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
3
+
4
+ case `uname` in
5
+ *CYGWIN*|*MINGW*|*MSYS*)
6
+ if command -v cygpath > /dev/null 2>&1; then
7
+ basedir=`cygpath -w "$basedir"`
8
+ fi
9
+ ;;
10
+ esac
11
+
12
+ if [ -x "$basedir/node" ]; then
13
+ exec "$basedir/node" "$basedir/../esbuild/bin/esbuild" "$@"
14
+ else
15
+ exec node "$basedir/../esbuild/bin/esbuild" "$@"
16
+ fi
@@ -0,0 +1,17 @@
1
+ @ECHO off
2
+ GOTO start
3
+ :find_dp0
4
+ SET dp0=%~dp0
5
+ EXIT /b
6
+ :start
7
+ SETLOCAL
8
+ CALL :find_dp0
9
+
10
+ IF EXIST "%dp0%\node.exe" (
11
+ SET "_prog=%dp0%\node.exe"
12
+ ) ELSE (
13
+ SET "_prog=node"
14
+ SET PATHEXT=%PATHEXT:;.JS;=;%
15
+ )
16
+
17
+ endLocal & goto #_undefined_# 2>NUL || title %COMSPEC% & "%_prog%" "%dp0%\..\esbuild\bin\esbuild" %*