@kromatv/sdk 0.1.40-canary.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 (987) hide show
  1. package/README.md +80 -0
  2. package/dist/cli.js +2523 -0
  3. package/package.json +78 -0
  4. package/rust/Cargo.toml +3 -0
  5. package/rust/kroma-db/Cargo.toml +27 -0
  6. package/rust/kroma-db/src/accounts/access_tokens.rs +197 -0
  7. package/rust/kroma-db/src/accounts/credentials.rs +97 -0
  8. package/rust/kroma-db/src/accounts/invites.rs +136 -0
  9. package/rust/kroma-db/src/accounts/preferences.rs +100 -0
  10. package/rust/kroma-db/src/accounts/resets.rs +202 -0
  11. package/rust/kroma-db/src/accounts/sessions.rs +182 -0
  12. package/rust/kroma-db/src/accounts/test_support.rs +14 -0
  13. package/rust/kroma-db/src/accounts/verifications.rs +185 -0
  14. package/rust/kroma-db/src/accounts.rs +244 -0
  15. package/rust/kroma-db/src/admin/metrics.rs +201 -0
  16. package/rust/kroma-db/src/admin/play_history.rs +361 -0
  17. package/rust/kroma-db/src/admin/play_sort.rs +113 -0
  18. package/rust/kroma-db/src/admin/stats.rs +108 -0
  19. package/rust/kroma-db/src/admin/test_support.rs +83 -0
  20. package/rust/kroma-db/src/admin/watch_stats.rs +458 -0
  21. package/rust/kroma-db/src/admin.rs +226 -0
  22. package/rust/kroma-db/src/audio_analysis.rs +253 -0
  23. package/rust/kroma-db/src/backup/module_stores.rs +204 -0
  24. package/rust/kroma-db/src/backup/rows.rs +155 -0
  25. package/rust/kroma-db/src/backup/test_support.rs +61 -0
  26. package/rust/kroma-db/src/backup.rs +306 -0
  27. package/rust/kroma-db/src/catalog_query/find_titles.rs +316 -0
  28. package/rust/kroma-db/src/catalog_query/test_support.rs +88 -0
  29. package/rust/kroma-db/src/catalog_query.rs +198 -0
  30. package/rust/kroma-db/src/chunked.rs +36 -0
  31. package/rust/kroma-db/src/core_tables.rs +99 -0
  32. package/rust/kroma-db/src/curated.rs +192 -0
  33. package/rust/kroma-db/src/downloaded_subs.rs +136 -0
  34. package/rust/kroma-db/src/downloads.rs +219 -0
  35. package/rust/kroma-db/src/grant/escapes/schema.rs +120 -0
  36. package/rust/kroma-db/src/grant/escapes/statements.rs +170 -0
  37. package/rust/kroma-db/src/grant/escapes.rs +141 -0
  38. package/rust/kroma-db/src/grant/tests.rs +255 -0
  39. package/rust/kroma-db/src/grant.rs +203 -0
  40. package/rust/kroma-db/src/home/genre_guard.rs +249 -0
  41. package/rust/kroma-db/src/home/hydration.rs +126 -0
  42. package/rust/kroma-db/src/home/test_support.rs +60 -0
  43. package/rust/kroma-db/src/home.rs +244 -0
  44. package/rust/kroma-db/src/hydrate.rs +296 -0
  45. package/rust/kroma-db/src/ingest/metadata.rs +648 -0
  46. package/rust/kroma-db/src/ingest/probe.rs +171 -0
  47. package/rust/kroma-db/src/ingest/probe_result.rs +178 -0
  48. package/rust/kroma-db/src/ingest/scanned_files.rs +235 -0
  49. package/rust/kroma-db/src/ingest/sync.rs +291 -0
  50. package/rust/kroma-db/src/ingest/test_support.rs +114 -0
  51. package/rust/kroma-db/src/ingest.rs +20 -0
  52. package/rust/kroma-db/src/jobs.rs +269 -0
  53. package/rust/kroma-db/src/lib.rs +97 -0
  54. package/rust/kroma-db/src/library.rs +66 -0
  55. package/rust/kroma-db/src/localize/items.rs +303 -0
  56. package/rust/kroma-db/src/localize/shows.rs +192 -0
  57. package/rust/kroma-db/src/localize/test_support.rs +91 -0
  58. package/rust/kroma-db/src/localize.rs +105 -0
  59. package/rust/kroma-db/src/markers.rs +203 -0
  60. package/rust/kroma-db/src/media/person.rs +213 -0
  61. package/rust/kroma-db/src/media/show_detail.rs +186 -0
  62. package/rust/kroma-db/src/media/shows.rs +202 -0
  63. package/rust/kroma-db/src/media/splash.rs +199 -0
  64. package/rust/kroma-db/src/media/test_support.rs +31 -0
  65. package/rust/kroma-db/src/media.rs +296 -0
  66. package/rust/kroma-db/src/metadata_core.rs +348 -0
  67. package/rust/kroma-db/src/notifications/digest.rs +143 -0
  68. package/rust/kroma-db/src/notifications/preferences.rs +138 -0
  69. package/rust/kroma-db/src/notifications/read_state.rs +167 -0
  70. package/rust/kroma-db/src/notifications/test_support.rs +50 -0
  71. package/rust/kroma-db/src/notifications.rs +232 -0
  72. package/rust/kroma-db/src/passkeys.rs +163 -0
  73. package/rust/kroma-db/src/pipeline/ops/drain.rs +266 -0
  74. package/rust/kroma-db/src/pipeline/ops/reconcile.rs +274 -0
  75. package/rust/kroma-db/src/pipeline/ops/test_support.rs +48 -0
  76. package/rust/kroma-db/src/pipeline/ops.rs +49 -0
  77. package/rust/kroma-db/src/pipeline/query/elements.rs +200 -0
  78. package/rust/kroma-db/src/pipeline/query/test_support.rs +23 -0
  79. package/rust/kroma-db/src/pipeline/query.rs +255 -0
  80. package/rust/kroma-db/src/pipeline/tests.rs +319 -0
  81. package/rust/kroma-db/src/pipeline.rs +26 -0
  82. package/rust/kroma-db/src/playback/continue_watching.rs +289 -0
  83. package/rust/kroma-db/src/playback/on_deck.rs +53 -0
  84. package/rust/kroma-db/src/playback/show_progress.rs +230 -0
  85. package/rust/kroma-db/src/playback/test_support.rs +55 -0
  86. package/rust/kroma-db/src/playback/up_next.rs +208 -0
  87. package/rust/kroma-db/src/playback/watch_state.rs +129 -0
  88. package/rust/kroma-db/src/playback.rs +196 -0
  89. package/rust/kroma-db/src/pool.rs +117 -0
  90. package/rust/kroma-db/src/push_subs.rs +323 -0
  91. package/rust/kroma-db/src/reports.rs +231 -0
  92. package/rust/kroma-db/src/requests/availability.rs +211 -0
  93. package/rust/kroma-db/src/requests/calendar.rs +221 -0
  94. package/rust/kroma-db/src/requests/gaps.rs +213 -0
  95. package/rust/kroma-db/src/requests/search_queue.rs +352 -0
  96. package/rust/kroma-db/src/requests/tests.rs +289 -0
  97. package/rust/kroma-db/src/requests/wanted.rs +351 -0
  98. package/rust/kroma-db/src/requests.rs +245 -0
  99. package/rust/kroma-db/src/rows.rs +190 -0
  100. package/rust/kroma-db/src/schema/ddl.rs +678 -0
  101. package/rust/kroma-db/src/schema/migrations.rs +261 -0
  102. package/rust/kroma-db/src/schema.rs +273 -0
  103. package/rust/kroma-db/src/suggest.rs +129 -0
  104. package/rust/kroma-db/src/taste.rs +77 -0
  105. package/rust/kroma-db/src/testing.rs +63 -0
  106. package/rust/kroma-db/src/tmdb_pin.rs +133 -0
  107. package/rust/kroma-db/src/translations.rs +569 -0
  108. package/rust/kroma-db/src/vectors/recommendations.rs +164 -0
  109. package/rust/kroma-db/src/vectors/search.rs +213 -0
  110. package/rust/kroma-db/src/vectors/test_support.rs +31 -0
  111. package/rust/kroma-db/src/vectors.rs +161 -0
  112. package/rust/kroma-domain/Cargo.toml +17 -0
  113. package/rust/kroma-domain/src/accounts.rs +181 -0
  114. package/rust/kroma-domain/src/admin.rs +197 -0
  115. package/rust/kroma-domain/src/cast.rs +178 -0
  116. package/rust/kroma-domain/src/crash.rs +48 -0
  117. package/rust/kroma-domain/src/jobs.rs +119 -0
  118. package/rust/kroma-domain/src/lib.rs +44 -0
  119. package/rust/kroma-domain/src/library.rs +21 -0
  120. package/rust/kroma-domain/src/matching/mod.rs +293 -0
  121. package/rust/kroma-domain/src/matching/normalize.rs +193 -0
  122. package/rust/kroma-domain/src/media.rs +297 -0
  123. package/rust/kroma-domain/src/metadata.rs +389 -0
  124. package/rust/kroma-domain/src/naming/marker.rs +215 -0
  125. package/rust/kroma-domain/src/naming/mod.rs +283 -0
  126. package/rust/kroma-domain/src/naming/title.rs +349 -0
  127. package/rust/kroma-domain/src/notifications/action.rs +50 -0
  128. package/rust/kroma-domain/src/notifications/event.rs +225 -0
  129. package/rust/kroma-domain/src/notifications/mod.rs +18 -0
  130. package/rust/kroma-domain/src/notifications/param.rs +90 -0
  131. package/rust/kroma-domain/src/notifications/spec.rs +178 -0
  132. package/rust/kroma-domain/src/notifications/view.rs +55 -0
  133. package/rust/kroma-domain/src/people.rs +286 -0
  134. package/rust/kroma-domain/src/pipeline.rs +114 -0
  135. package/rust/kroma-domain/src/playback.rs +39 -0
  136. package/rust/kroma-domain/src/push.rs +163 -0
  137. package/rust/kroma-domain/src/reports.rs +213 -0
  138. package/rust/kroma-domain/src/requests/discover.rs +102 -0
  139. package/rust/kroma-domain/src/requests/ledger.rs +129 -0
  140. package/rust/kroma-domain/src/requests/mod.rs +238 -0
  141. package/rust/kroma-domain/src/section.rs +44 -0
  142. package/rust/kroma-domain/src/slug.rs +165 -0
  143. package/rust/kroma-http/Cargo.toml +20 -0
  144. package/rust/kroma-http/examples/seam-bench.rs +73 -0
  145. package/rust/kroma-http/src/builder.rs +35 -0
  146. package/rust/kroma-http/src/config.rs +50 -0
  147. package/rust/kroma-http/src/curl.rs +131 -0
  148. package/rust/kroma-http/src/fetch.rs +226 -0
  149. package/rust/kroma-http/src/lib.rs +25 -0
  150. package/rust/kroma-http/src/loopback/mod.rs +220 -0
  151. package/rust/kroma-http/src/loopback/tcp.rs +182 -0
  152. package/rust/kroma-http/src/loopback/transport.rs +42 -0
  153. package/rust/kroma-http/src/response.rs +130 -0
  154. package/rust/kroma-module-host/Cargo.toml +36 -0
  155. package/rust/kroma-module-host/src/auth.rs +221 -0
  156. package/rust/kroma-module-host/src/host_ctx.rs +382 -0
  157. package/rust/kroma-module-host/src/host_token.rs +147 -0
  158. package/rust/kroma-module-host/src/lib.rs +141 -0
  159. package/rust/kroma-module-host/src/module.rs +115 -0
  160. package/rust/kroma-module-host/src/port.rs +163 -0
  161. package/rust/kroma-module-host/src/storage.rs +97 -0
  162. package/rust/kroma-module-host/src/test_serve.rs +33 -0
  163. package/rust/kroma-module-host/src/testing/log.rs +145 -0
  164. package/rust/kroma-module-host/src/testing/mod.rs +72 -0
  165. package/rust/kroma-module-host/src/testing/recording.rs +209 -0
  166. package/rust/kroma-module-host/src/testing/stub.rs +592 -0
  167. package/rust/kroma-module-macros/Cargo.toml +12 -0
  168. package/rust/kroma-module-macros/src/lib.rs +148 -0
  169. package/rust/kroma-module-manifest/Cargo.toml +15 -0
  170. package/rust/kroma-module-manifest/src/compat.rs +157 -0
  171. package/rust/kroma-module-manifest/src/embedded.rs +160 -0
  172. package/rust/kroma-module-manifest/src/event.rs +74 -0
  173. package/rust/kroma-module-manifest/src/lib.rs +57 -0
  174. package/rust/kroma-module-manifest/src/manifest.rs +548 -0
  175. package/rust/kroma-module-manifest/src/registry.rs +626 -0
  176. package/rust/kroma-module-runtime/Cargo.toml +33 -0
  177. package/rust/kroma-module-runtime/src/lib.rs +743 -0
  178. package/rust/kroma-module-sdk/Cargo.toml +49 -0
  179. package/rust/kroma-module-sdk/src/lib.rs +70 -0
  180. package/rust/kroma-primitives/Cargo.toml +12 -0
  181. package/rust/kroma-primitives/src/lib.rs +101 -0
  182. package/rust/kroma-testing/Cargo.toml +10 -0
  183. package/rust/kroma-testing/src/lib.rs +72 -0
  184. package/templates/base/README.md +14 -0
  185. package/templates/base/_gitignore +4 -0
  186. package/templates/base/icon.svg +1 -0
  187. package/templates/base/locales/en.json +7 -0
  188. package/templates/base/locales/fr.json +7 -0
  189. package/templates/server/.cargo/config.toml +2 -0
  190. package/templates/server/rust-toolchain.toml +3 -0
  191. package/templates/server/server/Cargo.toml +37 -0
  192. package/templates/server/server/src/bin/module.rs +6 -0
  193. package/templates/server/server/src/lib.rs +43 -0
  194. package/templates/ui/ui/src/__PAGE__.tsx +22 -0
  195. package/templates/ui/ui/src/module.tsx +17 -0
  196. package/templates/ui/ui/src/schemas.ts +6 -0
  197. package/tsconfig.module.json +110 -0
  198. package/types/client/src/api/accounts/client.d.ts +291 -0
  199. package/types/client/src/api/accounts/ids.d.ts +13 -0
  200. package/types/client/src/api/accounts/index.d.ts +6 -0
  201. package/types/client/src/api/accounts/passkeys.d.ts +79 -0
  202. package/types/client/src/api/accounts/quick-connect.d.ts +23 -0
  203. package/types/client/src/api/accounts/remembered.d.ts +66 -0
  204. package/types/client/src/api/accounts/rules.d.ts +9 -0
  205. package/types/client/src/api/accounts/schemas.d.ts +214 -0
  206. package/types/client/src/api/admin/backup.d.ts +22 -0
  207. package/types/client/src/api/admin/client.d.ts +407 -0
  208. package/types/client/src/api/admin/index.d.ts +7 -0
  209. package/types/client/src/api/admin/logs.d.ts +24 -0
  210. package/types/client/src/api/admin/metrics.d.ts +231 -0
  211. package/types/client/src/api/admin/notifications.d.ts +47 -0
  212. package/types/client/src/api/admin/settings.d.ts +50 -0
  213. package/types/client/src/api/admin/stats.d.ts +257 -0
  214. package/types/client/src/api/admin/users.d.ts +98 -0
  215. package/types/client/src/api/cast/client.d.ts +209 -0
  216. package/types/client/src/api/cast/ids.d.ts +4 -0
  217. package/types/client/src/api/cast/index.d.ts +3 -0
  218. package/types/client/src/api/cast/schemas.d.ts +565 -0
  219. package/types/client/src/api/diagnostics/client.d.ts +13 -0
  220. package/types/client/src/api/diagnostics/index.d.ts +2 -0
  221. package/types/client/src/api/diagnostics/schemas.d.ts +29 -0
  222. package/types/client/src/api/discover.d.ts +5 -0
  223. package/types/client/src/api/discover.web.d.ts +5 -0
  224. package/types/client/src/api/discovery/client.d.ts +115 -0
  225. package/types/client/src/api/discovery/index.d.ts +2 -0
  226. package/types/client/src/api/discovery/schemas.d.ts +175 -0
  227. package/types/client/src/api/events/index.d.ts +2 -0
  228. package/types/client/src/api/events/schemas.d.ts +371 -0
  229. package/types/client/src/api/events/socket.d.ts +42 -0
  230. package/types/client/src/api/handoff/client.d.ts +68 -0
  231. package/types/client/src/api/handoff/ids.d.ts +4 -0
  232. package/types/client/src/api/handoff/index.d.ts +3 -0
  233. package/types/client/src/api/handoff/schemas.d.ts +93 -0
  234. package/types/client/src/api/jobs/client.d.ts +96 -0
  235. package/types/client/src/api/jobs/ids.d.ts +5 -0
  236. package/types/client/src/api/jobs/index.d.ts +3 -0
  237. package/types/client/src/api/jobs/schemas.d.ts +168 -0
  238. package/types/client/src/api/library/client.d.ts +45 -0
  239. package/types/client/src/api/library/index.d.ts +2 -0
  240. package/types/client/src/api/library/schemas.d.ts +28 -0
  241. package/types/client/src/api/llm/client.d.ts +37 -0
  242. package/types/client/src/api/llm/ids.d.ts +3 -0
  243. package/types/client/src/api/llm/index.d.ts +3 -0
  244. package/types/client/src/api/llm/schemas.d.ts +74 -0
  245. package/types/client/src/api/media/artwork-scale.d.ts +18 -0
  246. package/types/client/src/api/media/artwork.d.ts +31 -0
  247. package/types/client/src/api/media/client.d.ts +2160 -0
  248. package/types/client/src/api/media/credits.d.ts +46 -0
  249. package/types/client/src/api/media/ids.d.ts +12 -0
  250. package/types/client/src/api/media/index.d.ts +7 -0
  251. package/types/client/src/api/media/rematch.d.ts +31 -0
  252. package/types/client/src/api/media/schemas.d.ts +1607 -0
  253. package/types/client/src/api/media/search.d.ts +1044 -0
  254. package/types/client/src/api/media/tracks.d.ts +152 -0
  255. package/types/client/src/api/modules/client.d.ts +38 -0
  256. package/types/client/src/api/modules/ids.d.ts +3 -0
  257. package/types/client/src/api/modules/index.d.ts +5 -0
  258. package/types/client/src/api/modules/module-api.d.ts +23 -0
  259. package/types/client/src/api/modules/schemas.d.ts +74 -0
  260. package/types/client/src/api/modules/store.d.ts +226 -0
  261. package/types/client/src/api/notifications/capability.d.ts +36 -0
  262. package/types/client/src/api/notifications/client.d.ts +79 -0
  263. package/types/client/src/api/notifications/ids.d.ts +3 -0
  264. package/types/client/src/api/notifications/index.d.ts +4 -0
  265. package/types/client/src/api/notifications/push.d.ts +18 -0
  266. package/types/client/src/api/notifications/schemas.d.ts +235 -0
  267. package/types/client/src/api/pipeline/client.d.ts +126 -0
  268. package/types/client/src/api/pipeline/index.d.ts +2 -0
  269. package/types/client/src/api/pipeline/schemas.d.ts +139 -0
  270. package/types/client/src/api/playback/client.d.ts +681 -0
  271. package/types/client/src/api/playback/ids.d.ts +3 -0
  272. package/types/client/src/api/playback/index.d.ts +3 -0
  273. package/types/client/src/api/playback/schemas.d.ts +38 -0
  274. package/types/client/src/api/reports/client.d.ts +117 -0
  275. package/types/client/src/api/reports/ids.d.ts +3 -0
  276. package/types/client/src/api/reports/index.d.ts +3 -0
  277. package/types/client/src/api/reports/schemas.d.ts +144 -0
  278. package/types/client/src/api/requests/acquisition.d.ts +240 -0
  279. package/types/client/src/api/requests/client.d.ts +301 -0
  280. package/types/client/src/api/requests/ids.d.ts +7 -0
  281. package/types/client/src/api/requests/index.d.ts +4 -0
  282. package/types/client/src/api/requests/schemas.d.ts +162 -0
  283. package/types/client/src/api/subtitles/client.d.ts +48 -0
  284. package/types/client/src/api/subtitles/ids.d.ts +5 -0
  285. package/types/client/src/api/subtitles/index.d.ts +3 -0
  286. package/types/client/src/api/subtitles/schemas.d.ts +78 -0
  287. package/types/client/src/core/client.d.ts +17 -0
  288. package/types/client/src/core/http/api-error.d.ts +36 -0
  289. package/types/client/src/core/http/body.d.ts +1 -0
  290. package/types/client/src/core/http/concurrency.d.ts +8 -0
  291. package/types/client/src/core/http/index.d.ts +6 -0
  292. package/types/client/src/core/http/path.d.ts +10 -0
  293. package/types/client/src/core/http/preconnect.d.ts +2 -0
  294. package/types/client/src/core/http/query.d.ts +9 -0
  295. package/types/client/src/core/http/request-context.d.ts +94 -0
  296. package/types/client/src/core/http/user-agent.d.ts +7 -0
  297. package/types/client/src/core/ids/ids.d.ts +13 -0
  298. package/types/client/src/core/ids/index.d.ts +1 -0
  299. package/types/client/src/core/index.d.ts +4 -0
  300. package/types/client/src/core/session/index.d.ts +3 -0
  301. package/types/client/src/core/session/locale.d.ts +6 -0
  302. package/types/client/src/core/session/storage.d.ts +32 -0
  303. package/types/client/src/core/session/token.d.ts +19 -0
  304. package/types/client/src/index.d.ts +3 -0
  305. package/types/client/src/kroma-client.d.ts +49 -0
  306. package/types/client/src/query/index.d.ts +35 -0
  307. package/types/core/src/airdate.d.ts +21 -0
  308. package/types/core/src/browse.d.ts +45 -0
  309. package/types/core/src/compat.d.ts +9 -0
  310. package/types/core/src/discover.d.ts +31 -0
  311. package/types/core/src/format.d.ts +63 -0
  312. package/types/core/src/genre-art.d.ts +21 -0
  313. package/types/core/src/genre-table.d.ts +117 -0
  314. package/types/core/src/genre.d.ts +42 -0
  315. package/types/core/src/handoff/beacon.d.ts +39 -0
  316. package/types/core/src/handoff/grant.d.ts +20 -0
  317. package/types/core/src/handoff/index.d.ts +8 -0
  318. package/types/core/src/handoff/nearby.d.ts +17 -0
  319. package/types/core/src/handoff/sources.d.ts +110 -0
  320. package/types/core/src/health-probe.d.ts +19 -0
  321. package/types/core/src/hevc/audio-support.d.ts +47 -0
  322. package/types/core/src/hevc/capabilities.d.ts +63 -0
  323. package/types/core/src/hevc/directplay.d.ts +70 -0
  324. package/types/core/src/hevc/engine.d.ts +29 -0
  325. package/types/core/src/hevc.d.ts +4 -0
  326. package/types/core/src/i18n.d.ts +2381 -0
  327. package/types/core/src/index.d.ts +25 -0
  328. package/types/core/src/intl.d.ts +28 -0
  329. package/types/core/src/lang-table.d.ts +11 -0
  330. package/types/core/src/lang.d.ts +59 -0
  331. package/types/core/src/local-ip.d.ts +2 -0
  332. package/types/core/src/locales/catalogs.d.ts +2 -0
  333. package/types/core/src/locales/catalogs.web.d.ts +3 -0
  334. package/types/core/src/locales/default-locale.d.ts +3 -0
  335. package/types/core/src/match.d.ts +14 -0
  336. package/types/core/src/notification-labels.d.ts +47 -0
  337. package/types/core/src/people.d.ts +33 -0
  338. package/types/core/src/permissions.d.ts +10 -0
  339. package/types/core/src/person-facts.d.ts +23 -0
  340. package/types/core/src/platform.d.ts +7 -0
  341. package/types/core/src/playback-buffer.d.ts +64 -0
  342. package/types/core/src/playback-stall.d.ts +86 -0
  343. package/types/core/src/player.d.ts +22 -0
  344. package/types/core/src/push-labels.d.ts +6 -0
  345. package/types/core/src/react/handoff-picker.d.ts +52 -0
  346. package/types/core/src/react/index.d.ts +6 -0
  347. package/types/core/src/react/lang-prefs.d.ts +35 -0
  348. package/types/core/src/react/nearby-tvs.d.ts +31 -0
  349. package/types/core/src/remote.d.ts +26 -0
  350. package/types/core/src/server-origin.d.ts +12 -0
  351. package/types/core/src/slug.d.ts +4 -0
  352. package/types/core/src/subtitles.d.ts +20 -0
  353. package/types/i18n/src/announce.d.ts +15 -0
  354. package/types/i18n/src/catalog-types.d.ts +7 -0
  355. package/types/i18n/src/chain.d.ts +22 -0
  356. package/types/i18n/src/define.d.ts +39 -0
  357. package/types/i18n/src/dev-overrides.d.ts +39 -0
  358. package/types/i18n/src/i18n.d.ts +61 -0
  359. package/types/i18n/src/index.d.ts +11 -0
  360. package/types/i18n/src/interpolate.d.ts +14 -0
  361. package/types/i18n/src/layout.d.ts +18 -0
  362. package/types/i18n/src/locales.d.ts +12 -0
  363. package/types/i18n/src/namespaces.d.ts +37 -0
  364. package/types/i18n/src/nest.d.ts +17 -0
  365. package/types/i18n/src/plural.d.ts +20 -0
  366. package/types/i18n/src/react/context.d.ts +37 -0
  367. package/types/i18n/src/react/index.d.ts +2 -0
  368. package/types/i18n/src/react/provider.d.ts +14 -0
  369. package/types/i18n/src/registry.d.ts +36 -0
  370. package/types/i18n/src/store.d.ts +46 -0
  371. package/types/i18n/src/types.d.ts +30 -0
  372. package/types/module-sdk/src/admin/context.d.ts +20 -0
  373. package/types/module-sdk/src/admin/denied.d.ts +1 -0
  374. package/types/module-sdk/src/admin/engines.d.ts +35 -0
  375. package/types/module-sdk/src/admin/hooks.d.ts +39 -0
  376. package/types/module-sdk/src/admin/page-states.d.ts +27 -0
  377. package/types/module-sdk/src/admin/settings.d.ts +9 -0
  378. package/types/module-sdk/src/bus.d.ts +8 -0
  379. package/types/module-sdk/src/contracts.d.ts +6 -0
  380. package/types/module-sdk/src/define.d.ts +38 -0
  381. package/types/module-sdk/src/events.d.ts +11 -0
  382. package/types/module-sdk/src/host.d.ts +32 -0
  383. package/types/module-sdk/src/icon.d.ts +1 -0
  384. package/types/module-sdk/src/index.d.ts +35 -0
  385. package/types/module-sdk/src/module.d.ts +83 -0
  386. package/types/module-sdk/src/registry.d.ts +63 -0
  387. package/types/module-sdk/src/scope.d.ts +23 -0
  388. package/types/module-sdk/src/shared.d.ts +21 -0
  389. package/types/module-sdk/src/slot.d.ts +34 -0
  390. package/types/module-sdk/src/types.d.ts +39 -0
  391. package/types/module-sdk/src/ui/table.d.ts +88 -0
  392. package/types/module-sdk/src/use-sorted-table.d.ts +56 -0
  393. package/types/registry/src/build.d.ts +16 -0
  394. package/types/registry/src/client.d.ts +23 -0
  395. package/types/registry/src/documents/index.d.ts +6 -0
  396. package/types/registry/src/documents/v1.d.ts +197 -0
  397. package/types/registry/src/index.d.ts +7 -0
  398. package/types/registry/src/manifest/index.d.ts +9 -0
  399. package/types/registry/src/manifest/v2.d.ts +182 -0
  400. package/types/registry/src/semver.d.ts +24 -0
  401. package/types/registry/src/sort.d.ts +2 -0
  402. package/types/registry/src/spec.d.ts +19 -0
  403. package/types/registry/src/text.d.ts +6 -0
  404. package/types/spatial-nav/src/descent.d.ts +9 -0
  405. package/types/spatial-nav/src/directions.d.ts +16 -0
  406. package/types/spatial-nav/src/fallback-focus.d.ts +5 -0
  407. package/types/spatial-nav/src/focus-owner.d.ts +16 -0
  408. package/types/spatial-nav/src/focus-tree.d.ts +63 -0
  409. package/types/spatial-nav/src/index.d.ts +4 -0
  410. package/types/spatial-nav/src/navigator.bench.d.ts +1 -0
  411. package/types/spatial-nav/src/react/configure-remote.d.ts +16 -0
  412. package/types/spatial-nav/src/react/default-focus.d.ts +15 -0
  413. package/types/spatial-nav/src/react/focus-queue.d.ts +16 -0
  414. package/types/spatial-nav/src/react/navigator-context.d.ts +19 -0
  415. package/types/spatial-nav/src/react/navigator-item.d.ts +28 -0
  416. package/types/spatial-nav/src/react/navigator-node.d.ts +27 -0
  417. package/types/spatial-nav/src/react/navigator-root.d.ts +19 -0
  418. package/types/spatial-nav/src/react/navigator-view.d.ts +18 -0
  419. package/types/spatial-nav/src/react/pointer-device.d.ts +14 -0
  420. package/types/spatial-nav/src/react/spatial-node.d.ts +27 -0
  421. package/types/spatial-nav/src/react/use-lock-navigator.d.ts +11 -0
  422. package/types/spatial-nav/src/react.d.ts +17 -0
  423. package/types/spatial-nav/src/resolve-move.d.ts +6 -0
  424. package/types/spatial-nav/src/spatial-navigator.d.ts +23 -0
  425. package/types/ui/src/assets/fonts.d.ts +4 -0
  426. package/types/ui/src/components/atoms/art-scrim/art-scrim.d.ts +21 -0
  427. package/types/ui/src/components/atoms/art-scrim/index.d.ts +1 -0
  428. package/types/ui/src/components/atoms/avatar/avatar.d.ts +43 -0
  429. package/types/ui/src/components/atoms/avatar/index.d.ts +1 -0
  430. package/types/ui/src/components/atoms/badge/badge.d.ts +116 -0
  431. package/types/ui/src/components/atoms/badge/index.d.ts +1 -0
  432. package/types/ui/src/components/atoms/box/box.d.ts +29 -0
  433. package/types/ui/src/components/atoms/box/index.d.ts +1 -0
  434. package/types/ui/src/components/atoms/button/button-variants.d.ts +216 -0
  435. package/types/ui/src/components/atoms/button/button.d.ts +37 -0
  436. package/types/ui/src/components/atoms/button/index.d.ts +1 -0
  437. package/types/ui/src/components/atoms/checkbox/checkbox.d.ts +62 -0
  438. package/types/ui/src/components/atoms/checkbox/index.d.ts +1 -0
  439. package/types/ui/src/components/atoms/chip/chip.d.ts +172 -0
  440. package/types/ui/src/components/atoms/chip/index.d.ts +1 -0
  441. package/types/ui/src/components/atoms/divider/divider.d.ts +13 -0
  442. package/types/ui/src/components/atoms/divider/index.d.ts +1 -0
  443. package/types/ui/src/components/atoms/expandable-text/expandable-text.d.ts +20 -0
  444. package/types/ui/src/components/atoms/expandable-text/index.d.ts +1 -0
  445. package/types/ui/src/components/atoms/focusable/focusable-a11y.d.ts +12 -0
  446. package/types/ui/src/components/atoms/focusable/focusable-delegate.d.ts +21 -0
  447. package/types/ui/src/components/atoms/focusable/focusable-forms.d.ts +62 -0
  448. package/types/ui/src/components/atoms/focusable/focusable-link.d.ts +7 -0
  449. package/types/ui/src/components/atoms/focusable/focusable-paint.d.ts +47 -0
  450. package/types/ui/src/components/atoms/focusable/focusable-types.d.ts +167 -0
  451. package/types/ui/src/components/atoms/focusable/focusable.d.ts +7 -0
  452. package/types/ui/src/components/atoms/focusable/index.d.ts +1 -0
  453. package/types/ui/src/components/atoms/focusable/touch-pressable.d.ts +35 -0
  454. package/types/ui/src/components/atoms/focusable/use-entry-focus.d.ts +9 -0
  455. package/types/ui/src/components/atoms/focusable/use-web-keys.d.ts +7 -0
  456. package/types/ui/src/components/atoms/frost/frost.d.ts +62 -0
  457. package/types/ui/src/components/atoms/frost/index.d.ts +1 -0
  458. package/types/ui/src/components/atoms/grid/grid.d.ts +28 -0
  459. package/types/ui/src/components/atoms/grid/index.d.ts +1 -0
  460. package/types/ui/src/components/atoms/ground/ground.d.ts +19 -0
  461. package/types/ui/src/components/atoms/ground/index.d.ts +1 -0
  462. package/types/ui/src/components/atoms/icon/icon.d.ts +4 -0
  463. package/types/ui/src/components/atoms/icon/index.d.ts +1 -0
  464. package/types/ui/src/components/atoms/icon-button/icon-button.d.ts +165 -0
  465. package/types/ui/src/components/atoms/icon-button/index.d.ts +1 -0
  466. package/types/ui/src/components/atoms/icon-well/icon-well.d.ts +46 -0
  467. package/types/ui/src/components/atoms/icon-well/index.d.ts +1 -0
  468. package/types/ui/src/components/atoms/img/img.d.ts +45 -0
  469. package/types/ui/src/components/atoms/img/index.d.ts +1 -0
  470. package/types/ui/src/components/atoms/img/native-layers.d.ts +28 -0
  471. package/types/ui/src/components/atoms/img/use-cross-fade.d.ts +9 -0
  472. package/types/ui/src/components/atoms/img/web-layers.d.ts +19 -0
  473. package/types/ui/src/components/atoms/index.d.ts +64 -0
  474. package/types/ui/src/components/atoms/kbd/index.d.ts +2 -0
  475. package/types/ui/src/components/atoms/kbd/kbd.d.ts +18 -0
  476. package/types/ui/src/components/atoms/logo/index.d.ts +1 -0
  477. package/types/ui/src/components/atoms/logo/logo.d.ts +11 -0
  478. package/types/ui/src/components/atoms/number-field/index.d.ts +1 -0
  479. package/types/ui/src/components/atoms/number-field/number-field.d.ts +11 -0
  480. package/types/ui/src/components/atoms/progress/index.d.ts +1 -0
  481. package/types/ui/src/components/atoms/progress/progress.d.ts +28 -0
  482. package/types/ui/src/components/atoms/progress-ring/index.d.ts +1 -0
  483. package/types/ui/src/components/atoms/progress-ring/progress-ring.d.ts +7 -0
  484. package/types/ui/src/components/atoms/radio/index.d.ts +1 -0
  485. package/types/ui/src/components/atoms/radio/radio.d.ts +76 -0
  486. package/types/ui/src/components/atoms/skeleton/card-skeleton.d.ts +6 -0
  487. package/types/ui/src/components/atoms/skeleton/index.d.ts +4 -0
  488. package/types/ui/src/components/atoms/skeleton/poster-skeleton.d.ts +7 -0
  489. package/types/ui/src/components/atoms/skeleton/skeleton.d.ts +20 -0
  490. package/types/ui/src/components/atoms/skeleton/table-skeleton.d.ts +6 -0
  491. package/types/ui/src/components/atoms/spinner/index.d.ts +1 -0
  492. package/types/ui/src/components/atoms/spinner/spinner.d.ts +14 -0
  493. package/types/ui/src/components/atoms/status-dot/index.d.ts +1 -0
  494. package/types/ui/src/components/atoms/status-dot/status-dot.d.ts +9 -0
  495. package/types/ui/src/components/atoms/surface/index.d.ts +1 -0
  496. package/types/ui/src/components/atoms/surface/surface.d.ts +56 -0
  497. package/types/ui/src/components/atoms/switch/index.d.ts +1 -0
  498. package/types/ui/src/components/atoms/switch/switch.d.ts +64 -0
  499. package/types/ui/src/components/atoms/text/index.d.ts +1 -0
  500. package/types/ui/src/components/atoms/text/text.d.ts +21 -0
  501. package/types/ui/src/components/atoms/text-area/index.d.ts +1 -0
  502. package/types/ui/src/components/atoms/text-area/text-area.d.ts +31 -0
  503. package/types/ui/src/components/atoms/text-field/index.d.ts +1 -0
  504. package/types/ui/src/components/atoms/text-field/text-field.d.ts +50 -0
  505. package/types/ui/src/components/atoms/watched-badge/index.d.ts +1 -0
  506. package/types/ui/src/components/atoms/watched-badge/watched-badge.d.ts +19 -0
  507. package/types/ui/src/components/atoms/wheel/index.d.ts +1 -0
  508. package/types/ui/src/components/atoms/wheel/wheel.d.ts +9 -0
  509. package/types/ui/src/components/common/if/if.d.ts +9 -0
  510. package/types/ui/src/components/common/if/index.d.ts +1 -0
  511. package/types/ui/src/components/common/index.d.ts +2 -0
  512. package/types/ui/src/components/molecules/add-tile/add-tile.d.ts +65 -0
  513. package/types/ui/src/components/molecules/add-tile/index.d.ts +2 -0
  514. package/types/ui/src/components/molecules/alphabet-rail/alphabet-rail-context.d.ts +20 -0
  515. package/types/ui/src/components/molecules/alphabet-rail/alphabet-rail-item.d.ts +13 -0
  516. package/types/ui/src/components/molecules/alphabet-rail/alphabet-rail-lens.d.ts +17 -0
  517. package/types/ui/src/components/molecules/alphabet-rail/alphabet-rail.d.ts +46 -0
  518. package/types/ui/src/components/molecules/alphabet-rail/index.d.ts +2 -0
  519. package/types/ui/src/components/molecules/alphabet-rail/use-letter-scrub.d.ts +17 -0
  520. package/types/ui/src/components/molecules/back-button/back-button.d.ts +10 -0
  521. package/types/ui/src/components/molecules/back-button/index.d.ts +1 -0
  522. package/types/ui/src/components/molecules/button-group/button-group.d.ts +37 -0
  523. package/types/ui/src/components/molecules/button-group/index.d.ts +3 -0
  524. package/types/ui/src/components/molecules/callout/callout.d.ts +63 -0
  525. package/types/ui/src/components/molecules/callout/index.d.ts +1 -0
  526. package/types/ui/src/components/molecules/category-tile/category-tile.d.ts +65 -0
  527. package/types/ui/src/components/molecules/category-tile/index.d.ts +1 -0
  528. package/types/ui/src/components/molecules/choice-list/choice-list.d.ts +53 -0
  529. package/types/ui/src/components/molecules/choice-list/index.d.ts +1 -0
  530. package/types/ui/src/components/molecules/copy-button/copy-button.d.ts +19 -0
  531. package/types/ui/src/components/molecules/copy-button/index.d.ts +1 -0
  532. package/types/ui/src/components/molecules/data-field/data-field.d.ts +44 -0
  533. package/types/ui/src/components/molecules/data-field/index.d.ts +1 -0
  534. package/types/ui/src/components/molecules/disclosure/disclosure.d.ts +55 -0
  535. package/types/ui/src/components/molecules/disclosure/index.d.ts +1 -0
  536. package/types/ui/src/components/molecules/dropzone/dropzone-parts.d.ts +46 -0
  537. package/types/ui/src/components/molecules/dropzone/dropzone-sift.d.ts +6 -0
  538. package/types/ui/src/components/molecules/dropzone/dropzone.d.ts +21 -0
  539. package/types/ui/src/components/molecules/dropzone/dropzone.web.d.ts +11 -0
  540. package/types/ui/src/components/molecules/dropzone/index.d.ts +1 -0
  541. package/types/ui/src/components/molecules/empty-state/empty-state.d.ts +60 -0
  542. package/types/ui/src/components/molecules/empty-state/index.d.ts +1 -0
  543. package/types/ui/src/components/molecules/field/field.d.ts +56 -0
  544. package/types/ui/src/components/molecules/field/index.d.ts +1 -0
  545. package/types/ui/src/components/molecules/hint/hint.d.ts +23 -0
  546. package/types/ui/src/components/molecules/hint/index.d.ts +1 -0
  547. package/types/ui/src/components/molecules/index.d.ts +70 -0
  548. package/types/ui/src/components/molecules/input-group/index.d.ts +3 -0
  549. package/types/ui/src/components/molecules/input-group/input-group-context.d.ts +34 -0
  550. package/types/ui/src/components/molecules/input-group/input-group-parts.d.ts +31 -0
  551. package/types/ui/src/components/molecules/input-group/input-group.d.ts +38 -0
  552. package/types/ui/src/components/molecules/keypad/index.d.ts +1 -0
  553. package/types/ui/src/components/molecules/keypad/keypad.d.ts +44 -0
  554. package/types/ui/src/components/molecules/legend/index.d.ts +1 -0
  555. package/types/ui/src/components/molecules/legend/legend.d.ts +32 -0
  556. package/types/ui/src/components/molecules/list/index.d.ts +1 -0
  557. package/types/ui/src/components/molecules/list/list.d.ts +41 -0
  558. package/types/ui/src/components/molecules/list-row/index.d.ts +3 -0
  559. package/types/ui/src/components/molecules/list-row/list-group.d.ts +23 -0
  560. package/types/ui/src/components/molecules/list-row/list-row-context.d.ts +10 -0
  561. package/types/ui/src/components/molecules/list-row/list-row-parts.d.ts +28 -0
  562. package/types/ui/src/components/molecules/list-row/list-row-variants.d.ts +90 -0
  563. package/types/ui/src/components/molecules/list-row/list-row.d.ts +51 -0
  564. package/types/ui/src/components/molecules/media-card/index.d.ts +1 -0
  565. package/types/ui/src/components/molecules/media-card/media-card.d.ts +22 -0
  566. package/types/ui/src/components/molecules/nav-pill/index.d.ts +1 -0
  567. package/types/ui/src/components/molecules/nav-pill/nav-pill-context.d.ts +28 -0
  568. package/types/ui/src/components/molecules/nav-pill/nav-pill-item.d.ts +101 -0
  569. package/types/ui/src/components/molecules/nav-pill/nav-pill-lens.d.ts +8 -0
  570. package/types/ui/src/components/molecules/nav-pill/nav-pill.d.ts +55 -0
  571. package/types/ui/src/components/molecules/otp-field/index.d.ts +1 -0
  572. package/types/ui/src/components/molecules/otp-field/otp-field-context.d.ts +32 -0
  573. package/types/ui/src/components/molecules/otp-field/otp-field-parts.d.ts +18 -0
  574. package/types/ui/src/components/molecules/otp-field/otp-field-variants.d.ts +68 -0
  575. package/types/ui/src/components/molecules/otp-field/otp-field.d.ts +57 -0
  576. package/types/ui/src/components/molecules/page-header/index.d.ts +1 -0
  577. package/types/ui/src/components/molecules/page-header/page-header.d.ts +69 -0
  578. package/types/ui/src/components/molecules/pagination/index.d.ts +3 -0
  579. package/types/ui/src/components/molecules/pagination/pagination.d.ts +102 -0
  580. package/types/ui/src/components/molecules/pagination/paging.d.ts +24 -0
  581. package/types/ui/src/components/molecules/person-card/index.d.ts +1 -0
  582. package/types/ui/src/components/molecules/person-card/person-card.d.ts +58 -0
  583. package/types/ui/src/components/molecules/pin-field/index.d.ts +1 -0
  584. package/types/ui/src/components/molecules/pin-field/pin-field.d.ts +26 -0
  585. package/types/ui/src/components/molecules/poster-card/index.d.ts +1 -0
  586. package/types/ui/src/components/molecules/poster-card/poster-card.d.ts +22 -0
  587. package/types/ui/src/components/molecules/section/index.d.ts +1 -0
  588. package/types/ui/src/components/molecules/section/section.d.ts +54 -0
  589. package/types/ui/src/components/molecules/segment-group/index.d.ts +2 -0
  590. package/types/ui/src/components/molecules/segment-group/segment-group-context.d.ts +17 -0
  591. package/types/ui/src/components/molecules/segment-group/segment-group-item.d.ts +58 -0
  592. package/types/ui/src/components/molecules/segment-group/segment-group.d.ts +29 -0
  593. package/types/ui/src/components/molecules/select/index.d.ts +1 -0
  594. package/types/ui/src/components/molecules/select/select-context.d.ts +54 -0
  595. package/types/ui/src/components/molecules/select/select-item.d.ts +39 -0
  596. package/types/ui/src/components/molecules/select/select-options-dialog.d.ts +3 -0
  597. package/types/ui/src/components/molecules/select/select-options.d.ts +3 -0
  598. package/types/ui/src/components/molecules/select/select-selection.d.ts +24 -0
  599. package/types/ui/src/components/molecules/select/select-surface.d.ts +17 -0
  600. package/types/ui/src/components/molecules/select/select.d.ts +112 -0
  601. package/types/ui/src/components/molecules/stat-card/index.d.ts +1 -0
  602. package/types/ui/src/components/molecules/stat-card/stat-card.d.ts +46 -0
  603. package/types/ui/src/components/molecules/stepper/index.d.ts +1 -0
  604. package/types/ui/src/components/molecules/stepper/stepper-context.d.ts +44 -0
  605. package/types/ui/src/components/molecules/stepper/stepper-item.d.ts +110 -0
  606. package/types/ui/src/components/molecules/stepper/stepper-list.d.ts +12 -0
  607. package/types/ui/src/components/molecules/stepper/stepper.d.ts +97 -0
  608. package/types/ui/src/components/molecules/stepper/use-steps.d.ts +40 -0
  609. package/types/ui/src/components/molecules/theme-switch/index.d.ts +1 -0
  610. package/types/ui/src/components/molecules/theme-switch/theme-switch.d.ts +19 -0
  611. package/types/ui/src/components/molecules/timeline/index.d.ts +1 -0
  612. package/types/ui/src/components/molecules/timeline/timeline.d.ts +55 -0
  613. package/types/ui/src/components/molecules/tooltip/index.d.ts +1 -0
  614. package/types/ui/src/components/molecules/tooltip/tooltip.d.ts +9 -0
  615. package/types/ui/src/components/molecules/tooltip/tooltip.web.d.ts +4 -0
  616. package/types/ui/src/components/organisms/chart/chart-context.d.ts +38 -0
  617. package/types/ui/src/components/organisms/chart/chart-marks.d.ts +32 -0
  618. package/types/ui/src/components/organisms/chart/chart-parts.d.ts +41 -0
  619. package/types/ui/src/components/organisms/chart/chart-path.d.ts +28 -0
  620. package/types/ui/src/components/organisms/chart/chart-scale.d.ts +82 -0
  621. package/types/ui/src/components/organisms/chart/chart.d.ts +63 -0
  622. package/types/ui/src/components/organisms/chart/index.d.ts +5 -0
  623. package/types/ui/src/components/organisms/code-block/code-block.d.ts +23 -0
  624. package/types/ui/src/components/organisms/code-block/code-tokens.d.ts +15 -0
  625. package/types/ui/src/components/organisms/code-block/index.d.ts +1 -0
  626. package/types/ui/src/components/organisms/command/command-context.d.ts +31 -0
  627. package/types/ui/src/components/organisms/command/command-keys-types.d.ts +11 -0
  628. package/types/ui/src/components/organisms/command/command-keys.d.ts +3 -0
  629. package/types/ui/src/components/organisms/command/command-keys.web.d.ts +3 -0
  630. package/types/ui/src/components/organisms/command/command-list.d.ts +46 -0
  631. package/types/ui/src/components/organisms/command/command-parts.d.ts +24 -0
  632. package/types/ui/src/components/organisms/command/command-row.d.ts +15 -0
  633. package/types/ui/src/components/organisms/command/command.d.ts +45 -0
  634. package/types/ui/src/components/organisms/command/index.d.ts +7 -0
  635. package/types/ui/src/components/organisms/dialog/confirm-dialog/confirm-dialog.d.ts +12 -0
  636. package/types/ui/src/components/organisms/dialog/confirm-dialog/confirm.d.ts +16 -0
  637. package/types/ui/src/components/organisms/dialog/confirm-dialog/index.d.ts +2 -0
  638. package/types/ui/src/components/organisms/dialog/dialog-actions.d.ts +29 -0
  639. package/types/ui/src/components/organisms/dialog/dialog-parts.d.ts +20 -0
  640. package/types/ui/src/components/organisms/dialog/dialog.d.ts +55 -0
  641. package/types/ui/src/components/organisms/dialog/index.d.ts +3 -0
  642. package/types/ui/src/components/organisms/drawer/drawer-parts.d.ts +29 -0
  643. package/types/ui/src/components/organisms/drawer/drawer-slide.d.ts +20 -0
  644. package/types/ui/src/components/organisms/drawer/drawer.d.ts +64 -0
  645. package/types/ui/src/components/organisms/drawer/index.d.ts +2 -0
  646. package/types/ui/src/components/organisms/index.d.ts +31 -0
  647. package/types/ui/src/components/organisms/keyboard/index.d.ts +8 -0
  648. package/types/ui/src/components/organisms/keyboard/key.d.ts +57 -0
  649. package/types/ui/src/components/organisms/keyboard/keyboard-layouts.d.ts +27 -0
  650. package/types/ui/src/components/organisms/keyboard/search-keyboard/index.d.ts +1 -0
  651. package/types/ui/src/components/organisms/keyboard/search-keyboard/search-keyboard.d.ts +19 -0
  652. package/types/ui/src/components/organisms/keyboard/url-keyboard/index.d.ts +1 -0
  653. package/types/ui/src/components/organisms/keyboard/url-keyboard/url-keyboard.d.ts +20 -0
  654. package/types/ui/src/components/organisms/keyboard/use-physical-typing.d.ts +2 -0
  655. package/types/ui/src/components/organisms/kroma-intro/animations.d.ts +2 -0
  656. package/types/ui/src/components/organisms/kroma-intro/constants.d.ts +14 -0
  657. package/types/ui/src/components/organisms/kroma-intro/css-intro.d.ts +12 -0
  658. package/types/ui/src/components/organisms/kroma-intro/index.d.ts +3 -0
  659. package/types/ui/src/components/organisms/kroma-intro/intro-scene.d.ts +21 -0
  660. package/types/ui/src/components/organisms/kroma-intro/intro-shell.d.ts +10 -0
  661. package/types/ui/src/components/organisms/kroma-intro/kroma-intro.d.ts +3 -0
  662. package/types/ui/src/components/organisms/kroma-intro/kroma-intro.web.d.ts +33 -0
  663. package/types/ui/src/components/organisms/kroma-intro/use-intro-exit.d.ts +21 -0
  664. package/types/ui/src/components/organisms/kroma-intro/use-intro-keys.d.ts +19 -0
  665. package/types/ui/src/components/organisms/menu/index.d.ts +1 -0
  666. package/types/ui/src/components/organisms/menu/menu-context.d.ts +32 -0
  667. package/types/ui/src/components/organisms/menu/menu-item.d.ts +57 -0
  668. package/types/ui/src/components/organisms/menu/menu-surface-dialog.d.ts +25 -0
  669. package/types/ui/src/components/organisms/menu/menu-surface.d.ts +3 -0
  670. package/types/ui/src/components/organisms/menu/menu.d.ts +49 -0
  671. package/types/ui/src/components/organisms/nearby-tv-list/index.d.ts +2 -0
  672. package/types/ui/src/components/organisms/nearby-tv-list/nearby-tv-list.d.ts +12 -0
  673. package/types/ui/src/components/organisms/perf-hud/index.d.ts +1 -0
  674. package/types/ui/src/components/organisms/perf-hud/perf-chart.d.ts +5 -0
  675. package/types/ui/src/components/organisms/perf-hud/perf-hud.d.ts +4 -0
  676. package/types/ui/src/components/organisms/player/hooks/use-drag-track.d.ts +22 -0
  677. package/types/ui/src/components/organisms/player/hooks/use-grid-focus.d.ts +19 -0
  678. package/types/ui/src/components/organisms/player/hooks/use-idle-cursor.d.ts +7 -0
  679. package/types/ui/src/components/organisms/player/hooks/use-list-focus.d.ts +40 -0
  680. package/types/ui/src/components/organisms/player/hooks/use-player-credits.d.ts +22 -0
  681. package/types/ui/src/components/organisms/player/hooks/use-player-ending.d.ts +37 -0
  682. package/types/ui/src/components/organisms/player/hooks/use-player-keys.d.ts +8 -0
  683. package/types/ui/src/components/organisms/player/hooks/use-player-keys.web.d.ts +5 -0
  684. package/types/ui/src/components/organisms/player/hooks/use-player-nav.d.ts +58 -0
  685. package/types/ui/src/components/organisms/player/hooks/use-player-outro.d.ts +14 -0
  686. package/types/ui/src/components/organisms/player/hooks/use-seek-nudge.d.ts +8 -0
  687. package/types/ui/src/components/organisms/player/index.d.ts +22 -0
  688. package/types/ui/src/components/organisms/player/lib/audio-filter.d.ts +15 -0
  689. package/types/ui/src/components/organisms/player/lib/chapters.d.ts +16 -0
  690. package/types/ui/src/components/organisms/player/lib/chart-geometry.d.ts +46 -0
  691. package/types/ui/src/components/organisms/player/lib/fmt.d.ts +19 -0
  692. package/types/ui/src/components/organisms/player/lib/lean-stats.d.ts +34 -0
  693. package/types/ui/src/components/organisms/player/lib/metrics.d.ts +40 -0
  694. package/types/ui/src/components/organisms/player/lib/nav-keys.d.ts +19 -0
  695. package/types/ui/src/components/organisms/player/lib/nav.d.ts +38 -0
  696. package/types/ui/src/components/organisms/player/lib/panel-header.d.ts +12 -0
  697. package/types/ui/src/components/organisms/player/lib/panel-slide.d.ts +16 -0
  698. package/types/ui/src/components/organisms/player/lib/player-keys.d.ts +44 -0
  699. package/types/ui/src/components/organisms/player/lib/seek-track.d.ts +19 -0
  700. package/types/ui/src/components/organisms/player/lib/stage-card.d.ts +31 -0
  701. package/types/ui/src/components/organisms/player/lib/stage-ratio.d.ts +4 -0
  702. package/types/ui/src/components/organisms/player/lib/stage-ratio.web.d.ts +2 -0
  703. package/types/ui/src/components/organisms/player/lib/style.d.ts +40 -0
  704. package/types/ui/src/components/organisms/player/lib/styles.d.ts +3 -0
  705. package/types/ui/src/components/organisms/player/lib/subtitle-appearance.d.ts +53 -0
  706. package/types/ui/src/components/organisms/player/lib/subtitle-edge.d.ts +3 -0
  707. package/types/ui/src/components/organisms/player/lib/subtitle-edge.web.d.ts +3 -0
  708. package/types/ui/src/components/organisms/player/lib/surface-shrink.d.ts +17 -0
  709. package/types/ui/src/components/organisms/player/lib/virtual-focus.d.ts +2 -0
  710. package/types/ui/src/components/organisms/player/lib/virtual-focus.web.d.ts +3 -0
  711. package/types/ui/src/components/organisms/player/parts/control-cluster/control-cluster.d.ts +32 -0
  712. package/types/ui/src/components/organisms/player/parts/control-cluster/index.d.ts +1 -0
  713. package/types/ui/src/components/organisms/player/parts/credits-card/credits-card.d.ts +25 -0
  714. package/types/ui/src/components/organisms/player/parts/credits-card/index.d.ts +1 -0
  715. package/types/ui/src/components/organisms/player/parts/icons.d.ts +39 -0
  716. package/types/ui/src/components/organisms/player/parts/post-play/index.d.ts +1 -0
  717. package/types/ui/src/components/organisms/player/parts/post-play/post-play.d.ts +41 -0
  718. package/types/ui/src/components/organisms/player/parts/post-play/rise.d.ts +12 -0
  719. package/types/ui/src/components/organisms/player/parts/post-play/rise.web.d.ts +10 -0
  720. package/types/ui/src/components/organisms/player/parts/seek-bar/index.d.ts +1 -0
  721. package/types/ui/src/components/organisms/player/parts/seek-bar/seek-bar.d.ts +22 -0
  722. package/types/ui/src/components/organisms/player/parts/settings-panel/index.d.ts +1 -0
  723. package/types/ui/src/components/organisms/player/parts/settings-panel/settings/audio-filter-panel.d.ts +11 -0
  724. package/types/ui/src/components/organisms/player/parts/settings-panel/settings/audio-panel.d.ts +11 -0
  725. package/types/ui/src/components/organisms/player/parts/settings-panel/settings/entries.d.ts +35 -0
  726. package/types/ui/src/components/organisms/player/parts/settings-panel/settings/gen.d.ts +24 -0
  727. package/types/ui/src/components/organisms/player/parts/settings-panel/settings/generate-wizard.d.ts +18 -0
  728. package/types/ui/src/components/organisms/player/parts/settings-panel/settings/menu-list.d.ts +9 -0
  729. package/types/ui/src/components/organisms/player/parts/settings-panel/settings/menu-row.d.ts +15 -0
  730. package/types/ui/src/components/organisms/player/parts/settings-panel/settings/panel-style.d.ts +99 -0
  731. package/types/ui/src/components/organisms/player/parts/settings-panel/settings/quality-panel.d.ts +16 -0
  732. package/types/ui/src/components/organisms/player/parts/settings-panel/settings/report-panel.d.ts +8 -0
  733. package/types/ui/src/components/organisms/player/parts/settings-panel/settings/select-row.d.ts +21 -0
  734. package/types/ui/src/components/organisms/player/parts/settings-panel/settings/speed-panel.d.ts +10 -0
  735. package/types/ui/src/components/organisms/player/parts/settings-panel/settings/sub-view.d.ts +16 -0
  736. package/types/ui/src/components/organisms/player/parts/settings-panel/settings/subtitle-appearance-panel.d.ts +14 -0
  737. package/types/ui/src/components/organisms/player/parts/settings-panel/settings/subtitle-appearance-parts.d.ts +27 -0
  738. package/types/ui/src/components/organisms/player/parts/settings-panel/settings/subtitles-panel.d.ts +18 -0
  739. package/types/ui/src/components/organisms/player/parts/settings-panel/settings/title-bar.d.ts +9 -0
  740. package/types/ui/src/components/organisms/player/parts/settings-panel/settings/wizard-parts.d.ts +8 -0
  741. package/types/ui/src/components/organisms/player/parts/settings-panel/settings-panel.d.ts +40 -0
  742. package/types/ui/src/components/organisms/player/parts/skip-intro-button/index.d.ts +1 -0
  743. package/types/ui/src/components/organisms/player/parts/skip-intro-button/skip-intro-button.d.ts +22 -0
  744. package/types/ui/src/components/organisms/player/parts/stage/index.d.ts +1 -0
  745. package/types/ui/src/components/organisms/player/parts/stage/stage-overlay.d.ts +13 -0
  746. package/types/ui/src/components/organisms/player/parts/stage/stage.d.ts +30 -0
  747. package/types/ui/src/components/organisms/player/parts/stats-panel/index.d.ts +1 -0
  748. package/types/ui/src/components/organisms/player/parts/stats-panel/stats-chart.d.ts +16 -0
  749. package/types/ui/src/components/organisms/player/parts/stats-panel/stats-panel.d.ts +14 -0
  750. package/types/ui/src/components/organisms/player/parts/storyboard-thumb/index.d.ts +1 -0
  751. package/types/ui/src/components/organisms/player/parts/storyboard-thumb/storyboard-thumb.d.ts +4 -0
  752. package/types/ui/src/components/organisms/player/parts/subtitle-renderer/index.d.ts +1 -0
  753. package/types/ui/src/components/organisms/player/parts/subtitle-renderer/subtitle-renderer.d.ts +32 -0
  754. package/types/ui/src/components/organisms/player/parts/surface-radius.d.ts +9 -0
  755. package/types/ui/src/components/organisms/player/parts/top-bar/index.d.ts +1 -0
  756. package/types/ui/src/components/organisms/player/parts/top-bar/top-bar.d.ts +24 -0
  757. package/types/ui/src/components/organisms/player/parts/transport/index.d.ts +1 -0
  758. package/types/ui/src/components/organisms/player/parts/transport/transport.d.ts +19 -0
  759. package/types/ui/src/components/organisms/player/parts/up-next-card/index.d.ts +1 -0
  760. package/types/ui/src/components/organisms/player/parts/up-next-card/up-next-card.d.ts +37 -0
  761. package/types/ui/src/components/organisms/player/parts/up-next-sheet/index.d.ts +1 -0
  762. package/types/ui/src/components/organisms/player/parts/up-next-sheet/slide.d.ts +5 -0
  763. package/types/ui/src/components/organisms/player/parts/up-next-sheet/slide.web.d.ts +5 -0
  764. package/types/ui/src/components/organisms/player/parts/up-next-sheet/up-next-sheet.d.ts +17 -0
  765. package/types/ui/src/components/organisms/player/player-chrome-state.d.ts +11 -0
  766. package/types/ui/src/components/organisms/player/player-input.d.ts +16 -0
  767. package/types/ui/src/components/organisms/player/player-parts.d.ts +34 -0
  768. package/types/ui/src/components/organisms/player/player.d.ts +63 -0
  769. package/types/ui/src/components/organisms/player/types.d.ts +226 -0
  770. package/types/ui/src/components/organisms/rail/index.d.ts +1 -0
  771. package/types/ui/src/components/organisms/rail/rail-context.d.ts +7 -0
  772. package/types/ui/src/components/organisms/rail/rail-row.d.ts +22 -0
  773. package/types/ui/src/components/organisms/rail/rail.d.ts +63 -0
  774. package/types/ui/src/components/organisms/resizable/index.d.ts +8 -0
  775. package/types/ui/src/components/organisms/resizable/resizable-context.d.ts +39 -0
  776. package/types/ui/src/components/organisms/resizable/resizable-cursor.d.ts +3 -0
  777. package/types/ui/src/components/organisms/resizable/resizable-cursor.web.d.ts +4 -0
  778. package/types/ui/src/components/organisms/resizable/resizable-handle.d.ts +30 -0
  779. package/types/ui/src/components/organisms/resizable/resizable-keys-types.d.ts +11 -0
  780. package/types/ui/src/components/organisms/resizable/resizable-keys.d.ts +3 -0
  781. package/types/ui/src/components/organisms/resizable/resizable-keys.web.d.ts +3 -0
  782. package/types/ui/src/components/organisms/resizable/resizable-layout.d.ts +55 -0
  783. package/types/ui/src/components/organisms/resizable/resizable-panel.d.ts +55 -0
  784. package/types/ui/src/components/organisms/resizable/resizable-store.d.ts +18 -0
  785. package/types/ui/src/components/organisms/resizable/resizable.d.ts +59 -0
  786. package/types/ui/src/components/organisms/splash-backdrop/index.d.ts +2 -0
  787. package/types/ui/src/components/organisms/splash-backdrop/splash-backdrop.d.ts +22 -0
  788. package/types/ui/src/components/organisms/table/index.d.ts +1 -0
  789. package/types/ui/src/components/organisms/table/table-cell.d.ts +9 -0
  790. package/types/ui/src/components/organisms/table/table-columns.d.ts +32 -0
  791. package/types/ui/src/components/organisms/table/table-context.d.ts +17 -0
  792. package/types/ui/src/components/organisms/table/table-frame.d.ts +9 -0
  793. package/types/ui/src/components/organisms/table/table-place.d.ts +8 -0
  794. package/types/ui/src/components/organisms/table/table-row.d.ts +12 -0
  795. package/types/ui/src/components/organisms/table/table-sort-cell.d.ts +14 -0
  796. package/types/ui/src/components/organisms/table/table-sort.d.ts +38 -0
  797. package/types/ui/src/components/organisms/table/table.d.ts +65 -0
  798. package/types/ui/src/components/organisms/toast/index.d.ts +1 -0
  799. package/types/ui/src/components/organisms/toast/toast-card.d.ts +8 -0
  800. package/types/ui/src/components/organisms/toast/toast.d.ts +54 -0
  801. package/types/ui/src/components/organisms/virtual/clip.d.ts +25 -0
  802. package/types/ui/src/components/organisms/virtual/index.d.ts +2 -0
  803. package/types/ui/src/components/organisms/virtual/moving-strip.d.ts +16 -0
  804. package/types/ui/src/components/organisms/virtual/strip-motion.d.ts +4 -0
  805. package/types/ui/src/components/organisms/virtual/virtual-grid/grid-row.d.ts +25 -0
  806. package/types/ui/src/components/organisms/virtual/virtual-grid/grid-rows.d.ts +57 -0
  807. package/types/ui/src/components/organisms/virtual/virtual-grid/index.d.ts +1 -0
  808. package/types/ui/src/components/organisms/virtual/virtual-grid/use-wheel-rows.d.ts +8 -0
  809. package/types/ui/src/components/organisms/virtual/virtual-grid/virtual-grid.d.ts +54 -0
  810. package/types/ui/src/components/organisms/virtual/virtual-rail/edge-scroll.d.ts +38 -0
  811. package/types/ui/src/components/organisms/virtual/virtual-rail/index.d.ts +1 -0
  812. package/types/ui/src/components/organisms/virtual/virtual-rail/rail-edge.d.ts +11 -0
  813. package/types/ui/src/components/organisms/virtual/virtual-rail/use-key-grace.d.ts +6 -0
  814. package/types/ui/src/components/organisms/virtual/virtual-rail/virtual-rail.d.ts +19 -0
  815. package/types/ui/src/components/templates/index.d.ts +2 -0
  816. package/types/ui/src/components/templates/tv-stage/index.d.ts +1 -0
  817. package/types/ui/src/components/templates/tv-stage/tv-stage.d.ts +7 -0
  818. package/types/ui/src/core/atomic/index.d.ts +5 -0
  819. package/types/ui/src/core/atomic/inject.d.ts +3 -0
  820. package/types/ui/src/core/atomic/register.d.ts +13 -0
  821. package/types/ui/src/core/atomic/static-style.d.ts +8 -0
  822. package/types/ui/src/core/breakpoint-cascade.d.ts +45 -0
  823. package/types/ui/src/core/breakpoint.d.ts +21 -0
  824. package/types/ui/src/core/color.d.ts +21 -0
  825. package/types/ui/src/core/index.d.ts +20 -0
  826. package/types/ui/src/core/normalize.d.ts +21 -0
  827. package/types/ui/src/core/recipe.d.ts +21 -0
  828. package/types/ui/src/core/shorthand-resolve.d.ts +54 -0
  829. package/types/ui/src/core/shorthands.d.ts +187 -0
  830. package/types/ui/src/core/stabilise.d.ts +14 -0
  831. package/types/ui/src/core/states.d.ts +16 -0
  832. package/types/ui/src/core/styles.d.ts +59 -0
  833. package/types/ui/src/core/theme-create.d.ts +64 -0
  834. package/types/ui/src/core/theme-mode.d.ts +15 -0
  835. package/types/ui/src/core/theme.d.ts +72 -0
  836. package/types/ui/src/core/tokens/colors.d.ts +109 -0
  837. package/types/ui/src/core/tokens/css-palette.d.ts +19 -0
  838. package/types/ui/src/core/tokens/css-var.d.ts +8 -0
  839. package/types/ui/src/core/tokens/effects.d.ts +103 -0
  840. package/types/ui/src/core/tokens/index.d.ts +10 -0
  841. package/types/ui/src/core/tokens/layout.d.ts +94 -0
  842. package/types/ui/src/core/tokens/mobile.d.ts +91 -0
  843. package/types/ui/src/core/tokens/registry.d.ts +4 -0
  844. package/types/ui/src/core/tokens/typography.d.ts +232 -0
  845. package/types/ui/src/core/types.d.ts +122 -0
  846. package/types/ui/src/core/use-breakpoint.d.ts +16 -0
  847. package/types/ui/src/core/use-theme.d.ts +30 -0
  848. package/types/ui/src/core/web-style.d.ts +91 -0
  849. package/types/ui/src/index.d.ts +20 -0
  850. package/types/ui/src/kit.d.ts +74 -0
  851. package/types/ui/src/lib/a11y-props.d.ts +26 -0
  852. package/types/ui/src/lib/a11y.d.ts +8 -0
  853. package/types/ui/src/lib/anchor.d.ts +32 -0
  854. package/types/ui/src/lib/anchored-keys.d.ts +41 -0
  855. package/types/ui/src/lib/anchored-panel.d.ts +42 -0
  856. package/types/ui/src/lib/anchored-popup.d.ts +17 -0
  857. package/types/ui/src/lib/box-layers.d.ts +10 -0
  858. package/types/ui/src/lib/box-style.d.ts +16 -0
  859. package/types/ui/src/lib/caret.d.ts +8 -0
  860. package/types/ui/src/lib/classed.d.ts +3 -0
  861. package/types/ui/src/lib/cover-rect.d.ts +26 -0
  862. package/types/ui/src/lib/css.d.ts +19 -0
  863. package/types/ui/src/lib/css.web.d.ts +25 -0
  864. package/types/ui/src/lib/cursor.d.ts +17 -0
  865. package/types/ui/src/lib/dismiss-backdrop.d.ts +11 -0
  866. package/types/ui/src/lib/dom.d.ts +12 -0
  867. package/types/ui/src/lib/drag-select.d.ts +1 -0
  868. package/types/ui/src/lib/drag-select.web.d.ts +13 -0
  869. package/types/ui/src/lib/ease.d.ts +13 -0
  870. package/types/ui/src/lib/escape-guard.d.ts +1 -0
  871. package/types/ui/src/lib/expo-image-backend.d.ts +5 -0
  872. package/types/ui/src/lib/field-shell.d.ts +140 -0
  873. package/types/ui/src/lib/focus-entry.d.ts +20 -0
  874. package/types/ui/src/lib/focus-here.d.ts +11 -0
  875. package/types/ui/src/lib/focus-here.web.d.ts +7 -0
  876. package/types/ui/src/lib/focus-lift.d.ts +39 -0
  877. package/types/ui/src/lib/focus-nav.d.ts +3 -0
  878. package/types/ui/src/lib/focus-nav.web.d.ts +2 -0
  879. package/types/ui/src/lib/focus-platform.d.ts +30 -0
  880. package/types/ui/src/lib/focus-presence.d.ts +5 -0
  881. package/types/ui/src/lib/focus-remote.d.ts +39 -0
  882. package/types/ui/src/lib/focus-remote.web.d.ts +16 -0
  883. package/types/ui/src/lib/focus-report.d.ts +18 -0
  884. package/types/ui/src/lib/focus-root.d.ts +22 -0
  885. package/types/ui/src/lib/focus-root.web.d.ts +3 -0
  886. package/types/ui/src/lib/focus-scope.d.ts +59 -0
  887. package/types/ui/src/lib/focus-scroll.d.ts +69 -0
  888. package/types/ui/src/lib/focus-tab.d.ts +12 -0
  889. package/types/ui/src/lib/focus-transition.d.ts +11 -0
  890. package/types/ui/src/lib/focus-transition.web.d.ts +3 -0
  891. package/types/ui/src/lib/focus-types.d.ts +18 -0
  892. package/types/ui/src/lib/focus-visible.d.ts +21 -0
  893. package/types/ui/src/lib/form/index.d.ts +4 -0
  894. package/types/ui/src/lib/form/message.d.ts +10 -0
  895. package/types/ui/src/lib/form/standard-schema.d.ts +27 -0
  896. package/types/ui/src/lib/form/use-form.d.ts +59 -0
  897. package/types/ui/src/lib/fuzzy-search.d.ts +20 -0
  898. package/types/ui/src/lib/genre-icon.d.ts +4 -0
  899. package/types/ui/src/lib/glyph.d.ts +24 -0
  900. package/types/ui/src/lib/group-shape.d.ts +44 -0
  901. package/types/ui/src/lib/hover-passthrough.d.ts +9 -0
  902. package/types/ui/src/lib/icon-catalog.d.ts +19 -0
  903. package/types/ui/src/lib/icon-search.d.ts +18 -0
  904. package/types/ui/src/lib/icons/every-glyph.d.ts +4 -0
  905. package/types/ui/src/lib/icons/every-glyph.web.d.ts +4 -0
  906. package/types/ui/src/lib/icons/glyph-source.d.ts +3 -0
  907. package/types/ui/src/lib/icons/glyphs.d.ts +34 -0
  908. package/types/ui/src/lib/icons/library.d.ts +19 -0
  909. package/types/ui/src/lib/icons/stroke-prop.d.ts +2 -0
  910. package/types/ui/src/lib/icons/stroke-prop.web.d.ts +2 -0
  911. package/types/ui/src/lib/image-backend.d.ts +26 -0
  912. package/types/ui/src/lib/input-gate.d.ts +11 -0
  913. package/types/ui/src/lib/input-source.d.ts +3 -0
  914. package/types/ui/src/lib/landmark.d.ts +4 -0
  915. package/types/ui/src/lib/landmark.web.d.ts +4 -0
  916. package/types/ui/src/lib/lockup-paths.d.ts +10 -0
  917. package/types/ui/src/lib/loop.d.ts +15 -0
  918. package/types/ui/src/lib/loop.web.d.ts +5 -0
  919. package/types/ui/src/lib/modal-portal.d.ts +3 -0
  920. package/types/ui/src/lib/modal-portal.web.d.ts +8 -0
  921. package/types/ui/src/lib/name-of.d.ts +9 -0
  922. package/types/ui/src/lib/nav-style.d.ts +5 -0
  923. package/types/ui/src/lib/overlay-host.d.ts +23 -0
  924. package/types/ui/src/lib/part-context.d.ts +8 -0
  925. package/types/ui/src/lib/perf-memory.d.ts +12 -0
  926. package/types/ui/src/lib/perf-memory.web.d.ts +4 -0
  927. package/types/ui/src/lib/perf.d.ts +35 -0
  928. package/types/ui/src/lib/platform.d.ts +3 -0
  929. package/types/ui/src/lib/platform.web.d.ts +2 -0
  930. package/types/ui/src/lib/portal.d.ts +10 -0
  931. package/types/ui/src/lib/portal.web.d.ts +17 -0
  932. package/types/ui/src/lib/press-dip.d.ts +26 -0
  933. package/types/ui/src/lib/press-guard.d.ts +8 -0
  934. package/types/ui/src/lib/progress-motion.d.ts +11 -0
  935. package/types/ui/src/lib/progress-motion.web.d.ts +11 -0
  936. package/types/ui/src/lib/reduced-motion.d.ts +7 -0
  937. package/types/ui/src/lib/report-categories.d.ts +10 -0
  938. package/types/ui/src/lib/ring-room.d.ts +27 -0
  939. package/types/ui/src/lib/ring-scope.d.ts +6 -0
  940. package/types/ui/src/lib/ring.d.ts +27 -0
  941. package/types/ui/src/lib/sample-art.d.ts +9 -0
  942. package/types/ui/src/lib/scroll-lock.d.ts +1 -0
  943. package/types/ui/src/lib/scroll-lock.web.d.ts +6 -0
  944. package/types/ui/src/lib/shake.d.ts +8 -0
  945. package/types/ui/src/lib/shake.web.d.ts +4 -0
  946. package/types/ui/src/lib/slot.d.ts +36 -0
  947. package/types/ui/src/lib/sort-icon.d.ts +5 -0
  948. package/types/ui/src/lib/splash-motion.d.ts +25 -0
  949. package/types/ui/src/lib/splash-motion.web.d.ts +15 -0
  950. package/types/ui/src/lib/stable-callback.d.ts +9 -0
  951. package/types/ui/src/lib/surface-bands.d.ts +26 -0
  952. package/types/ui/src/lib/surface-presentation.d.ts +17 -0
  953. package/types/ui/src/lib/surface-shell.d.ts +21 -0
  954. package/types/ui/src/lib/svg.d.ts +1 -0
  955. package/types/ui/src/lib/svg.web.d.ts +17 -0
  956. package/types/ui/src/lib/theme-audio.d.ts +7 -0
  957. package/types/ui/src/lib/tv-remote.d.ts +11 -0
  958. package/types/ui/src/lib/use-complete-once.d.ts +12 -0
  959. package/types/ui/src/lib/use-controllable.d.ts +1 -0
  960. package/types/ui/src/lib/use-copy.d.ts +20 -0
  961. package/types/ui/src/lib/use-growing-count.d.ts +12 -0
  962. package/types/ui/src/lib/use-settled-value.d.ts +5 -0
  963. package/types/ui/src/lib/wheel-pan.d.ts +7 -0
  964. package/types/ui/src/lib/wheel-pan.web.d.ts +11 -0
  965. package/types/ui/src/lib/wheel-paths.d.ts +5 -0
  966. package/types/ui/src/services/aiSuggest.d.ts +15 -0
  967. package/types/ui/src/services/auth.d.ts +41 -0
  968. package/types/ui/src/services/cast-context.d.ts +33 -0
  969. package/types/ui/src/services/cast-events.d.ts +23 -0
  970. package/types/ui/src/services/cast-lan.d.ts +21 -0
  971. package/types/ui/src/services/cast-position.d.ts +14 -0
  972. package/types/ui/src/services/cast.d.ts +20 -0
  973. package/types/ui/src/services/format.d.ts +25 -0
  974. package/types/ui/src/services/i18n.d.ts +18 -0
  975. package/types/ui/src/services/locale.d.ts +18 -0
  976. package/types/ui/src/services/playback.d.ts +49 -0
  977. package/types/ui/src/services/storyboard.d.ts +33 -0
  978. package/types/ui/src/services/subtitleGenerations.d.ts +13 -0
  979. package/types/ui/src/services/themeAudio.d.ts +19 -0
  980. package/types/ui/src/services/themeAudio.native.d.ts +8 -0
  981. package/types/ui/src/ssr.d.ts +20 -0
  982. package/types/ui/src/styles/motion.d.ts +2 -0
  983. package/types/ui/src/styles/page.d.ts +2 -0
  984. package/types/ui/src/styles/reset.d.ts +2 -0
  985. package/types/ui/src/styles/sheet.d.ts +18 -0
  986. package/types/ui/src/testing.d.ts +27 -0
  987. package/types/ui/src/workbench-config.d.ts +9 -0
@@ -0,0 +1,261 @@
1
+ //! Idempotent upgrades applied after the schema on every open.
2
+
3
+ // Idempotent column additions for databases created before a column existed.
4
+ // `ALTER TABLE … ADD COLUMN` errors with "duplicate column name" once the
5
+ // column is present, which we ignore.
6
+ pub(crate) const MIGRATIONS: &[&str] = &[
7
+ // The downloads ledger predates its move into this schema; a database
8
+ // that already carries it is missing the columns added since.
9
+ "ALTER TABLE downloads ADD COLUMN upgrade INTEGER NOT NULL DEFAULT 0",
10
+ "ALTER TABLE items ADD COLUMN metadata TEXT",
11
+ "ALTER TABLE shows ADD COLUMN metadata TEXT",
12
+ // Per-user permissions for accounts created before they existed.
13
+ "ALTER TABLE users ADD COLUMN permissions TEXT NOT NULL DEFAULT '[\"playback\"]'",
14
+ // Full per-file audio-track list (was a single representative track).
15
+ "ALTER TABLE files ADD COLUMN audio_tracks TEXT NOT NULL DEFAULT '[]'",
16
+ // Last-seen timestamp for the admin "Membres & partage" activity column.
17
+ "ALTER TABLE users ADD COLUMN last_seen TEXT",
18
+ // Per-account preferred UI locale ("fr" | "en"), synced across devices.
19
+ "ALTER TABLE users ADD COLUMN language TEXT",
20
+ // Optional profile-lock PIN (PBKDF2 hash, own salt). NULL = no PIN.
21
+ "ALTER TABLE users ADD COLUMN pin_hash TEXT",
22
+ // Per-account playback language preferences, synced across devices.
23
+ // audio_language: preferred audio ISO code (NULL = no preference).
24
+ // subtitle_language: preferred subtitle ISO code, or "off" (NULL = none).
25
+ "ALTER TABLE users ADD COLUMN audio_language TEXT",
26
+ "ALTER TABLE users ADD COLUMN subtitle_language TEXT",
27
+ // Backstop the app-level username-uniqueness check against a check-then-
28
+ // write race. Best-effort: on a legacy DB that already holds duplicate
29
+ // usernames the index creation errors and is ignored (the app check still
30
+ // covers the common case); fresh/clean DBs gain the hard guarantee.
31
+ "CREATE UNIQUE INDEX IF NOT EXISTS idx_users_username ON users(username)",
32
+ // `season_meta` shipped briefly with a `cast` column a reserved SQLite
33
+ // keyword that breaks unquoted SELECT/INSERT. Rename to `casts`. Errors
34
+ // ("no such column") once renamed / on fresh DBs, which we ignore.
35
+ "ALTER TABLE season_meta RENAME COLUMN \"cast\" TO casts",
36
+ // Keyframe-derived HLS segment tables (infra::hls). `CREATE TABLE IF NOT
37
+ // EXISTS` is idempotent for DBs created before the table existed.
38
+ "CREATE TABLE IF NOT EXISTS file_segments (\
39
+ file_id TEXT PRIMARY KEY REFERENCES files(id) ON DELETE CASCADE,\
40
+ mtime INTEGER, size INTEGER, version INTEGER NOT NULL,\
41
+ duration_us INTEGER NOT NULL, v_codec TEXT,\
42
+ segments TEXT NOT NULL, updated_at INTEGER NOT NULL)",
43
+ // One-time migration for DBs created before the language-agnostic cache.
44
+ // Each statement is idempotent, and must run in this order: the backfills
45
+ // (1, 2) need the old columns/indexes still present to read from.
46
+ //
47
+ // 1) Seed `metadata_core.tmdb_id` (+ the other invariant fields) from the
48
+ // existing single-language `metadata` blobs, so availability matching can
49
+ // move off the json_extract indexes without re-enriching the catalog.
50
+ "INSERT OR IGNORE INTO metadata_core \
51
+ (subject_kind,subject_id,tmdb_id,imdb_id,release_date,rating,poster_url,backdrop_url,logo_url,updated_at) \
52
+ SELECT 'item', id, json_extract(metadata,'$.tmdbId'), json_extract(metadata,'$.imdbId'), \
53
+ json_extract(metadata,'$.releaseDate'), json_extract(metadata,'$.rating'), \
54
+ json_extract(metadata,'$.posterUrl'), json_extract(metadata,'$.backdropUrl'), \
55
+ json_extract(metadata,'$.logoUrl'), CAST(strftime('%s','now') AS INTEGER)*1000 \
56
+ FROM items WHERE metadata IS NOT NULL AND kind IN ('movie','video')",
57
+ "INSERT OR IGNORE INTO metadata_core \
58
+ (subject_kind,subject_id,tmdb_id,imdb_id,release_date,rating,poster_url,backdrop_url,logo_url,updated_at) \
59
+ SELECT 'show', id, json_extract(metadata,'$.tmdbId'), json_extract(metadata,'$.imdbId'), \
60
+ json_extract(metadata,'$.releaseDate'), json_extract(metadata,'$.rating'), \
61
+ json_extract(metadata,'$.posterUrl'), json_extract(metadata,'$.backdropUrl'), \
62
+ json_extract(metadata,'$.logoUrl'), CAST(strftime('%s','now') AS INTEGER)*1000 \
63
+ FROM shows WHERE metadata IS NOT NULL",
64
+ // 2) Backfill the old per-language curated / suggestion columns into the
65
+ // generic translation cache BEFORE dropping those columns.
66
+ "INSERT OR IGNORE INTO translations (subject_kind,subject_id,lang,source,data,updated_at) \
67
+ SELECT 'curated', key, 'fr', 'llm', json_object('title',title_fr,'reason',reason_fr), \
68
+ CAST(strftime('%s','now') AS INTEGER)*1000 \
69
+ FROM curated_sections WHERE title_fr IS NOT NULL OR reason_fr IS NOT NULL",
70
+ "INSERT OR IGNORE INTO translations (subject_kind,subject_id,lang,source,data,updated_at) \
71
+ SELECT 'curated', key, 'en', 'llm', json_object('title',title_en,'reason',reason_en), \
72
+ CAST(strftime('%s','now') AS INTEGER)*1000 \
73
+ FROM curated_sections WHERE title_en IS NOT NULL OR reason_en IS NOT NULL",
74
+ "INSERT OR IGNORE INTO translations (subject_kind,subject_id,lang,source,data,updated_at) \
75
+ SELECT 'suggestion', item_id, 'fr', 'llm', json_object('reason',reason_fr), \
76
+ CAST(strftime('%s','now') AS INTEGER)*1000 \
77
+ FROM item_suggestions WHERE reason_fr IS NOT NULL",
78
+ "INSERT OR IGNORE INTO translations (subject_kind,subject_id,lang,source,data,updated_at) \
79
+ SELECT 'suggestion', item_id, 'en', 'llm', json_object('reason',reason_en), \
80
+ CAST(strftime('%s','now') AS INTEGER)*1000 \
81
+ FROM item_suggestions WHERE reason_en IS NOT NULL",
82
+ // 3) Retire the json_extract availability indexes (now on metadata_core).
83
+ "DROP INDEX IF EXISTS idx_items_tmdb",
84
+ "DROP INDEX IF EXISTS idx_shows_tmdb",
85
+ // 4) Drop the now-migrated per-language columns (SQLite >= 3.35).
86
+ "ALTER TABLE curated_sections DROP COLUMN title_fr",
87
+ "ALTER TABLE curated_sections DROP COLUMN title_en",
88
+ "ALTER TABLE curated_sections DROP COLUMN reason_fr",
89
+ "ALTER TABLE curated_sections DROP COLUMN reason_en",
90
+ "ALTER TABLE item_suggestions DROP COLUMN reason_fr",
91
+ "ALTER TABLE item_suggestions DROP COLUMN reason_en",
92
+ // The device's User-Agent captured when its access token is minted, so the
93
+ // account's session list can label each device.
94
+ "ALTER TABLE access_tokens ADD COLUMN user_agent TEXT",
95
+ // The parent access token a session was minted from, so the account can
96
+ // tell which listed device is the one making the current request.
97
+ "ALTER TABLE sessions ADD COLUMN access_token TEXT",
98
+ // One row per registered authenticator. `id` is the credential id
99
+ // (base64url); `credential` is the serialized webauthn-rs `Passkey` (JSON).
100
+ "CREATE TABLE IF NOT EXISTS passkeys (\
101
+ id TEXT PRIMARY KEY,\
102
+ user_id TEXT NOT NULL REFERENCES users(id) ON DELETE CASCADE,\
103
+ name TEXT NOT NULL,\
104
+ credential TEXT NOT NULL,\
105
+ created_at TEXT NOT NULL,\
106
+ last_used TEXT)",
107
+ "CREATE INDEX IF NOT EXISTS idx_passkeys_user ON passkeys(user_id)",
108
+ // Earliest auto-retry time for a failed pipeline task (exponential backoff
109
+ // between attempts, so a manually re-kicked stage doesn't hammer a flaky
110
+ // dependency).
111
+ "ALTER TABLE pipeline_tasks ADD COLUMN next_retry_at INTEGER",
112
+ // Individual-episode subset for a show request (JSON array of
113
+ // {season,episode}), unioned with the `seasons` full-season subset.
114
+ "ALTER TABLE requests ADD COLUMN episodes TEXT",
115
+ // Airing signals synced from TMDB by the acquisition.refresh job.
116
+ "ALTER TABLE requests ADD COLUMN air_status TEXT",
117
+ "ALTER TABLE requests ADD COLUMN next_air_date TEXT",
118
+ "ALTER TABLE requests ADD COLUMN last_refresh_at INTEGER",
119
+ // Per-row search backoff: how many fruitless passes this row has cost,
120
+ // and the epoch-ms before which the next one must not bother. NULL is
121
+ // "due now", so rows from before the column keep their turn.
122
+ "ALTER TABLE wanted ADD COLUMN search_attempts INTEGER NOT NULL DEFAULT 0",
123
+ "ALTER TABLE wanted ADD COLUMN next_search_at INTEGER",
124
+ // `wanted_searchable` selects on status + next_search_at and orders by
125
+ // air date; the old (status, last_search_at) index served neither. Both
126
+ // statements run here, after the column they name exists.
127
+ "DROP INDEX IF EXISTS idx_wanted_search",
128
+ "CREATE INDEX IF NOT EXISTS idx_wanted_due ON wanted(status, next_search_at, air_date)",
129
+ "CREATE TABLE IF NOT EXISTS audio_analysis (\
130
+ file_id TEXT NOT NULL REFERENCES files(id) ON DELETE CASCADE,\
131
+ track_index INTEGER NOT NULL,\
132
+ lufs_i REAL NOT NULL,\
133
+ lra REAL NOT NULL,\
134
+ true_peak REAL NOT NULL,\
135
+ dialog_lufs REAL,\
136
+ verdict TEXT NOT NULL,\
137
+ updated_at TEXT NOT NULL,\
138
+ PRIMARY KEY (file_id, track_index))",
139
+ // The old `acq_tmdb(logical_id)` keyed the import's known id by a
140
+ // recomputed logical id that orphaned on a title-parse mismatch; replaced
141
+ // by `acq_file_tmdb(abs_path)` (created in SCHEMA above).
142
+ "DROP TABLE IF EXISTS acq_tmdb",
143
+ // No backfill: the name -> id table lives in @kroma/core, not in SQL, so a
144
+ // row keeps resolving by name until its next enrichment writes the ids.
145
+ "ALTER TABLE metadata_core ADD COLUMN tmdb_genre_ids TEXT NOT NULL DEFAULT '[]'",
146
+ // Fold the old watch_later queue into my_list, then drop it: My list now
147
+ // covers not-yet-available titles too, so the separate queue is redundant.
148
+ "INSERT OR IGNORE INTO my_list (user_id, item_id, added_at) SELECT user_id, item_id, added_at FROM watch_later",
149
+ "DROP INDEX IF EXISTS idx_watch_later_user",
150
+ "DROP TABLE IF EXISTS watch_later",
151
+ // Per-download byte counters, so the queue can show a seeding ratio and an
152
+ // all-time up/down total that outlives the engine session (librqbit's own
153
+ // counters reset with the process).
154
+ "ALTER TABLE downloads ADD COLUMN downloaded_bytes INTEGER NOT NULL DEFAULT 0",
155
+ "ALTER TABLE downloads ADD COLUMN uploaded_bytes INTEGER NOT NULL DEFAULT 0",
156
+ // How `tmdb_id` was decided: 'auto' from the release name, 'pinned' from a
157
+ // grab that already named a title, 'none' once the automatic pass has looked
158
+ // and found nothing. NULL is a row it has not reached yet. A 'pinned' row is
159
+ // never re-matched.
160
+ "ALTER TABLE downloads ADD COLUMN match_source TEXT",
161
+ "UPDATE downloads SET match_source = 'pinned' WHERE match_source = 'manual'",
162
+ // Paging the queue orders by grabbed_at across every filter, and filtering
163
+ // by client is a full scan without this.
164
+ "CREATE INDEX IF NOT EXISTS idx_downloads_grabbed ON downloads(grabbed_at DESC)",
165
+ "CREATE INDEX IF NOT EXISTS idx_downloads_client ON downloads(client_id, grabbed_at DESC)",
166
+ // The play log kept who and what and threw away the how: the registry knew
167
+ // the device, the player, whether the stream was transcoded and which side
168
+ // of the router it left by, and none of it survived the session. An admin
169
+ // asking "who watched this, on what, and did the box have to re-encode it"
170
+ // had nothing to read.
171
+ "ALTER TABLE play_history ADD COLUMN device TEXT",
172
+ "ALTER TABLE play_history ADD COLUMN player TEXT",
173
+ "ALTER TABLE play_history ADD COLUMN mode TEXT",
174
+ "ALTER TABLE play_history ADD COLUMN network TEXT",
175
+ "ALTER TABLE play_history ADD COLUMN video_label TEXT",
176
+ "ALTER TABLE play_history ADD COLUMN audio_label TEXT",
177
+ "ALTER TABLE play_history ADD COLUMN show_title TEXT",
178
+ "ALTER TABLE play_history ADD COLUMN season INTEGER",
179
+ "ALTER TABLE play_history ADD COLUMN episode INTEGER",
180
+ // The plays query joins items and filters on the library; nothing covered
181
+ // either, so both were a scan on a log with years in it.
182
+ "CREATE INDEX IF NOT EXISTS idx_history_library ON play_history(library, ended_at DESC)",
183
+ "CREATE INDEX IF NOT EXISTS idx_history_item ON play_history(item_id)",
184
+ // Sixteen thousand rows on one live server were never viewings. A browser
185
+ // throttles a background tab to about one timer wake-up a minute, so the
186
+ // heartbeat landed after the 30s session TTL had already reaped and logged
187
+ // the session, and the next beat opened another the reaper logged a minute
188
+ // later, around the clock for two months.
189
+ //
190
+ // Their signature is exact and nothing else shares it: a run of at least
191
+ // three rows for one account, each starting exactly 60 seconds after the
192
+ // last, none lasting longer than the TTL plus one reap interval. Accounts
193
+ // that never ran a throttled tab match nothing. The server now refuses to
194
+ // log a session that never played, so no new ones can appear.
195
+ "DELETE FROM play_history WHERE id IN (
196
+ WITH gapped AS (
197
+ SELECT id, watched_ms, started_at,
198
+ COALESCE(user_id, username, '?') AS who,
199
+ started_at - LAG(started_at) OVER (
200
+ PARTITION BY COALESCE(user_id, username, '?') ORDER BY started_at
201
+ ) AS prev_gap
202
+ FROM play_history
203
+ ),
204
+ runs AS (
205
+ SELECT id, watched_ms, who,
206
+ SUM(CASE WHEN prev_gap = 60 THEN 0 ELSE 1 END) OVER (
207
+ PARTITION BY who ORDER BY started_at
208
+ ) AS run
209
+ FROM gapped
210
+ )
211
+ SELECT id FROM runs
212
+ WHERE (who, run) IN (
213
+ SELECT who, run FROM runs GROUP BY who, run
214
+ HAVING COUNT(*) >= 3 AND MAX(watched_ms) <= 45000
215
+ )
216
+ )",
217
+ // The series, the season, the episode number and the library only started
218
+ // being written with the columns above, so every row logged before them
219
+ // reads as a bare episode name.
220
+ "UPDATE play_history AS h \
221
+ SET show_title = COALESCE(h.show_title, s.title, i.show_title), \
222
+ season = COALESCE(h.season, i.season), \
223
+ episode = COALESCE(h.episode, i.episode) \
224
+ FROM items i LEFT JOIN shows s ON s.id = i.show_id \
225
+ WHERE i.id = h.item_id \
226
+ AND ((h.show_title IS NULL AND COALESCE(s.title, i.show_title) IS NOT NULL) \
227
+ OR (h.season IS NULL AND i.season IS NOT NULL) \
228
+ OR (h.episode IS NULL AND i.episode IS NOT NULL))",
229
+ "UPDATE play_history AS h SET library = i.library \
230
+ FROM items i WHERE i.id = h.item_id AND h.library IS NULL",
231
+ // One row per admin-minted credential reset. The code is stored as a hash
232
+ // (same PBKDF2 as passwords), never in clear.
233
+ "CREATE TABLE IF NOT EXISTS credential_resets (\
234
+ token TEXT PRIMARY KEY,\
235
+ user_id TEXT NOT NULL REFERENCES users(id) ON DELETE CASCADE,\
236
+ code_hash TEXT NOT NULL,\
237
+ attempts INTEGER NOT NULL DEFAULT 0,\
238
+ created_by TEXT REFERENCES users(id) ON DELETE SET NULL,\
239
+ created_at TEXT NOT NULL,\
240
+ expires_at INTEGER NOT NULL,\
241
+ used_at TEXT)",
242
+ // The address's proof of ownership: set when a verification link confirms,
243
+ // cleared whenever the address changes.
244
+ "ALTER TABLE users ADD COLUMN email_verified_at TEXT",
245
+ // One row per admin-minted email verification. No code: reaching the
246
+ // mailbox is itself the proof, so the link alone suffices.
247
+ "CREATE TABLE IF NOT EXISTS email_verifications (\
248
+ token TEXT PRIMARY KEY,\
249
+ user_id TEXT NOT NULL REFERENCES users(id) ON DELETE CASCADE,\
250
+ email TEXT NOT NULL,\
251
+ created_by TEXT REFERENCES users(id) ON DELETE SET NULL,\
252
+ created_at TEXT NOT NULL,\
253
+ expires_at INTEGER NOT NULL,\
254
+ used_at TEXT)",
255
+ // One open reset request per account, asked from the sign-in screen and
256
+ // cleared when the owner mints a reset.
257
+ "CREATE TABLE IF NOT EXISTS reset_requests (\
258
+ user_id TEXT PRIMARY KEY REFERENCES users(id) ON DELETE CASCADE,\
259
+ created_at TEXT NOT NULL)",
260
+ "ALTER TABLE metadata_core ADD COLUMN certification TEXT",
261
+ ];
@@ -0,0 +1,273 @@
1
+ //! Opening a database: the pool, the schema and the migrations that follow it.
2
+
3
+ use std::path::Path;
4
+ use std::sync::{Arc, Mutex};
5
+
6
+ use anyhow::{Context, Result};
7
+ use rusqlite::Connection;
8
+
9
+ use super::{Pool, PoolInner};
10
+
11
+ mod ddl;
12
+ mod migrations;
13
+
14
+ pub(crate) use ddl::{FILE_COLS, ITEM_COLS, PRAGMAS, SCHEMA};
15
+ pub(crate) use migrations::MIGRATIONS;
16
+
17
+ /// A pool over `path` with the pragmas applied and NO schema.
18
+ ///
19
+ /// For a database this crate does not own the shape of -- a module's own file,
20
+ /// whose tables come from that module's `migrations()`. [`init`] would stamp the
21
+ /// whole core schema into it, which is forty tables it will never read.
22
+ pub fn open(path: &Path) -> Result<Pool> {
23
+ pool_at(path, 4, None)
24
+ }
25
+
26
+ /// The one place a [`Pool`] is built. `scope` is `None` for a database its owner
27
+ /// is not scoped against, and the module grant otherwise.
28
+ ///
29
+ /// Opens one connection before returning, so a path that cannot be opened fails
30
+ /// here rather than at whatever query happens to run first.
31
+ pub(crate) fn pool_at(
32
+ path: &Path,
33
+ max_idle: usize,
34
+ scope: Option<crate::grant::Scope>,
35
+ ) -> Result<Pool> {
36
+ if let Some(dir) = path.parent() {
37
+ std::fs::create_dir_all(dir).ok();
38
+ }
39
+ let pool = Arc::new(PoolInner {
40
+ path: path.to_path_buf(),
41
+ idle: Mutex::new(Vec::new()),
42
+ max_idle,
43
+ scope,
44
+ });
45
+ let _ = pool.get()?;
46
+ Ok(pool)
47
+ }
48
+
49
+ pub fn init(path: &Path) -> Result<Pool> {
50
+ let pool = pool_at(path, 8, None)?;
51
+ let conn = pool.get()?;
52
+ conn.execute_batch(SCHEMA)
53
+ .context("failed to apply schema")?;
54
+ migrate(&conn);
55
+ Ok(pool)
56
+ }
57
+
58
+ fn migrate(conn: &Connection) {
59
+ for sql in MIGRATIONS {
60
+ let _ = conn.execute(sql, []);
61
+ }
62
+ }
63
+
64
+ /// Apply a module's own schema after the core schema at DB init (see
65
+ /// [`kroma_module_host::ServerModule::migrations`], run from the binary). The SQL
66
+ /// is `IF NOT EXISTS` DDL, so it is idempotent across every boot; it runs as one
67
+ /// batch, so a syntax error surfaces instead of being silently swallowed. Kept
68
+ /// here (rather than a raw `execute_batch` at the call site) so a module owns its
69
+ /// tables while the core stays the single place that touches the connection.
70
+ pub fn apply_migrations(conn: &Connection, sql: &str) -> Result<()> {
71
+ conn.execute_batch(sql)
72
+ .context("failed to apply module schema")
73
+ }
74
+
75
+ #[cfg(test)]
76
+ mod tests {
77
+ use super::*;
78
+
79
+ #[test]
80
+ fn a_modules_schema_applies_beside_the_core_one_and_a_broken_batch_names_itself() {
81
+ let pool = crate::testing::temp_pool("schema-module");
82
+ let conn = pool.get().unwrap();
83
+
84
+ apply_migrations(
85
+ &conn,
86
+ "CREATE TABLE IF NOT EXISTS notes (id TEXT PRIMARY KEY, body TEXT NOT NULL);\
87
+ CREATE INDEX IF NOT EXISTS idx_notes_body ON notes(body);",
88
+ )
89
+ .unwrap();
90
+ conn.execute("INSERT INTO notes (id, body) VALUES ('n1', 'hi')", [])
91
+ .unwrap();
92
+
93
+ apply_migrations(
94
+ &conn,
95
+ "CREATE TABLE IF NOT EXISTS notes (id TEXT PRIMARY KEY, body TEXT NOT NULL);",
96
+ )
97
+ .unwrap();
98
+ let rows: i64 = conn
99
+ .query_row("SELECT COUNT(*) FROM notes", [], |r| r.get(0))
100
+ .unwrap();
101
+ assert_eq!(
102
+ rows, 1,
103
+ "re-applying the schema must not drop the module's data"
104
+ );
105
+
106
+ let err = apply_migrations(&conn, "CREATE TABL oops (").unwrap_err();
107
+ assert!(
108
+ format!("{err:#}").contains("failed to apply module schema"),
109
+ "{err:#}"
110
+ );
111
+ }
112
+
113
+ #[test]
114
+ fn init_opens_a_database_whose_wanted_table_predates_the_backoff_columns() {
115
+ let dir = kroma_testing::temp_dir("schema-wanted-upgrade");
116
+ let path = dir.path().join("kroma.db");
117
+
118
+ let old = Connection::open(&path).unwrap();
119
+ old.execute_batch(
120
+ "CREATE TABLE wanted (\
121
+ id TEXT PRIMARY KEY,\
122
+ request_id TEXT NOT NULL,\
123
+ kind TEXT NOT NULL,\
124
+ tmdb_id INTEGER NOT NULL,\
125
+ title TEXT NOT NULL,\
126
+ season INTEGER,\
127
+ episode INTEGER,\
128
+ air_date TEXT,\
129
+ status TEXT NOT NULL DEFAULT 'wanted',\
130
+ last_search_at INTEGER,\
131
+ updated_at INTEGER NOT NULL);\
132
+ CREATE INDEX idx_wanted_search ON wanted(status, last_search_at);\
133
+ INSERT INTO wanted (id, request_id, kind, tmdb_id, title, updated_at)\
134
+ VALUES ('w1', 'r1', 'episode', 42, 'Show', 0);",
135
+ )
136
+ .unwrap();
137
+ drop(old);
138
+
139
+ let pool = init(&path).expect("an existing database must still open");
140
+ let conn = pool.get().unwrap();
141
+
142
+ let due: i64 = conn
143
+ .query_row(
144
+ "SELECT COUNT(*) FROM wanted WHERE next_search_at IS NULL",
145
+ [],
146
+ |r| r.get(0),
147
+ )
148
+ .unwrap();
149
+ assert_eq!(due, 1, "rows from before the column keep their turn");
150
+
151
+ let indexes: Vec<String> = conn
152
+ .prepare("SELECT name FROM sqlite_master WHERE type = 'index' AND tbl_name = 'wanted'")
153
+ .unwrap()
154
+ .query_map([], |r| r.get(0))
155
+ .unwrap()
156
+ .collect::<std::result::Result<_, _>>()
157
+ .unwrap();
158
+ assert!(indexes.iter().any(|n| n == "idx_wanted_due"), "{indexes:?}");
159
+ assert!(
160
+ !indexes.iter().any(|n| n == "idx_wanted_search"),
161
+ "{indexes:?}"
162
+ );
163
+ }
164
+
165
+ #[test]
166
+ fn init_names_the_series_a_play_was_logged_without() {
167
+ let dir = kroma_testing::temp_dir("schema-history-series");
168
+ let path = dir.path().join("kroma.db");
169
+ let old = init(&path).unwrap();
170
+ old.get()
171
+ .unwrap()
172
+ .execute_batch(
173
+ "INSERT INTO libraries (id,name,kind,path,added_at) \
174
+ VALUES ('lib-tv','Series','tv','/media','2026-01-01');\
175
+ INSERT INTO shows (id,library,title,added_at) \
176
+ VALUES ('hotd','lib-tv','House of the Dragon','2026-01-01');\
177
+ INSERT INTO items (id,kind,title,container,library,show_id,season,episode,added_at) \
178
+ VALUES ('ep','episode','Salt and Sea, Fire and Blood','mkv','lib-tv','hotd',3,1,'2026-01-01');\
179
+ INSERT INTO play_history (id,user_id,username,item_id,kind,title,started_at,ended_at,watched_ms) \
180
+ VALUES ('p1','u1','alice','ep','episode','Salt and Sea, Fire and Blood',0,100,1000);",
181
+ )
182
+ .unwrap();
183
+ drop(old);
184
+
185
+ let pool = init(&path).unwrap();
186
+
187
+ let row: (Option<String>, Option<i64>, Option<i64>, Option<String>) = pool
188
+ .get()
189
+ .unwrap()
190
+ .query_row(
191
+ "SELECT show_title, season, episode, library FROM play_history WHERE id = 'p1'",
192
+ [],
193
+ |r| Ok((r.get(0)?, r.get(1)?, r.get(2)?, r.get(3)?)),
194
+ )
195
+ .unwrap();
196
+ assert_eq!(
197
+ row,
198
+ (
199
+ Some("House of the Dragon".to_string()),
200
+ Some(3),
201
+ Some(1),
202
+ Some("lib-tv".to_string())
203
+ )
204
+ );
205
+ }
206
+
207
+ #[test]
208
+ fn init_leaves_a_play_whose_title_has_left_the_catalog_blank() {
209
+ let dir = kroma_testing::temp_dir("schema-history-gone");
210
+ let path = dir.path().join("kroma.db");
211
+ let old = init(&path).unwrap();
212
+ old.get()
213
+ .unwrap()
214
+ .execute(
215
+ "INSERT INTO play_history (id,user_id,username,item_id,kind,title,started_at,ended_at,watched_ms) \
216
+ VALUES ('p1','u1','alice','deleted','episode','The Dundies',0,100,1000)",
217
+ [],
218
+ )
219
+ .unwrap();
220
+ drop(old);
221
+
222
+ let pool = init(&path).unwrap();
223
+
224
+ let row: (Option<String>, Option<i64>, Option<String>) = pool
225
+ .get()
226
+ .unwrap()
227
+ .query_row(
228
+ "SELECT show_title, season, library FROM play_history WHERE id = 'p1'",
229
+ [],
230
+ |r| Ok((r.get(0)?, r.get(1)?, r.get(2)?)),
231
+ )
232
+ .unwrap();
233
+ assert_eq!(row, (None, None, None));
234
+ }
235
+
236
+ #[test]
237
+ fn init_repins_downloads_a_previous_release_marked_manual() {
238
+ let dir = kroma_testing::temp_dir("schema-match-source");
239
+ let path = dir.path().join("kroma.db");
240
+ let old = init(&path).unwrap();
241
+ old.get()
242
+ .unwrap()
243
+ .execute_batch(
244
+ "INSERT INTO downloads (id, client_id, client_ref, kind, tmdb_id, release_title, \
245
+ magnet_or_url, grabbed_at, match_source) \
246
+ VALUES ('d1', 'embedded', '', 'movie', 603, 'R', 'm', 0, 'manual'), \
247
+ ('d2', 'embedded', '', 'movie', 0, 'R', 'm', 0, 'none'), \
248
+ ('d3', 'embedded', '', 'movie', 42, 'R', 'm', 0, 'auto');",
249
+ )
250
+ .unwrap();
251
+ drop(old);
252
+
253
+ let pool = init(&path).unwrap();
254
+
255
+ let sources: Vec<Option<String>> = pool
256
+ .get()
257
+ .unwrap()
258
+ .prepare("SELECT match_source FROM downloads ORDER BY id")
259
+ .unwrap()
260
+ .query_map([], |r| r.get(0))
261
+ .unwrap()
262
+ .collect::<std::result::Result<_, _>>()
263
+ .unwrap();
264
+ assert_eq!(
265
+ sources,
266
+ [
267
+ Some("pinned".to_string()),
268
+ Some("none".to_string()),
269
+ Some("auto".to_string())
270
+ ]
271
+ );
272
+ }
273
+ }
@@ -0,0 +1,129 @@
1
+ //! Persistence for per-item **AI suggestions** ("Suggestions IA" on the detail
2
+ //! page): one cached row per seed item, generated lazily by the LLM connector
3
+ //! (`crate::services::llm::suggest_for`) and served as a plain hydrate. Empty
4
+ //! `item_ids` is a terminal "tried, nothing usable" marker (so the client stops
5
+ //! polling instead of re-triggering generation forever).
6
+
7
+ use std::collections::HashMap;
8
+
9
+ use super::translations::{self, TransData};
10
+ use super::*;
11
+
12
+ use rusqlite::OptionalExtension;
13
+
14
+ /// A cached AI-suggestion row: resolved member ids + a localized one-line reason
15
+ /// per language (`locale -> reason`, from the `translations` cache).
16
+ #[derive(Debug, Clone, Default)]
17
+ pub struct SuggestionRow {
18
+ pub item_ids: Vec<String>,
19
+ pub reasons: HashMap<String, String>,
20
+ }
21
+
22
+ /// The cached suggestion for one seed item, if generated. `Some` with empty
23
+ /// `item_ids` means generation ran but found nothing a terminal state.
24
+ pub fn get_suggestion(pool: &Pool, item_id: &str) -> Result<Option<SuggestionRow>> {
25
+ let conn = pool.get()?;
26
+ let base = conn
27
+ .query_row(
28
+ "SELECT item_ids FROM item_suggestions WHERE item_id = ?1",
29
+ params![item_id],
30
+ |r| r.get::<_, String>(0),
31
+ )
32
+ .optional()?;
33
+ let Some(ids_json) = base else {
34
+ return Ok(None);
35
+ };
36
+ let mut row = SuggestionRow {
37
+ item_ids: serde_json::from_str(&ids_json).unwrap_or_default(),
38
+ reasons: HashMap::new(),
39
+ };
40
+ for by_lang in translations::load_all(pool, "suggestion", &[item_id])?.into_values() {
41
+ for (lang, data) in by_lang {
42
+ if let Some(reason) = data.reason {
43
+ row.reasons.insert(lang, reason);
44
+ }
45
+ }
46
+ }
47
+ Ok(Some(row))
48
+ }
49
+
50
+ /// Upsert the cached suggestion for one seed item: the base row (ids) plus one
51
+ /// localized reason per language in the `translations` cache. `reasons` is
52
+ /// `locale -> reason` (empty for the terminal "nothing found" marker).
53
+ pub fn set_suggestion(
54
+ pool: &Pool,
55
+ item_id: &str,
56
+ ids: &[String],
57
+ reasons: &HashMap<String, String>,
58
+ ) -> Result<()> {
59
+ let mut conn = pool.get()?;
60
+ let tx = conn.transaction()?;
61
+ let ids_json = serde_json::to_string(ids).unwrap_or_else(|_| "[]".into());
62
+ tx.execute(
63
+ "INSERT INTO item_suggestions (item_id, item_ids, updated_at) VALUES (?1, ?2, ?3) \
64
+ ON CONFLICT(item_id) DO UPDATE SET item_ids=excluded.item_ids, updated_at=excluded.updated_at",
65
+ params![item_id, ids_json, kroma_primitives::now_ms()],
66
+ )?;
67
+ // Replace this seed's reasons wholesale (a fresh generation supersedes them).
68
+ tx.execute(
69
+ "DELETE FROM translations WHERE subject_kind='suggestion' AND subject_id=?1",
70
+ params![item_id],
71
+ )?;
72
+ for (lang, reason) in reasons {
73
+ if reason.trim().is_empty() {
74
+ continue;
75
+ }
76
+ let data = TransData {
77
+ reason: Some(reason.clone()),
78
+ ..Default::default()
79
+ };
80
+ translations::write(&tx, "suggestion", item_id, lang, translations::LLM, &data)?;
81
+ }
82
+ tx.commit()?;
83
+ Ok(())
84
+ }
85
+
86
+ #[cfg(test)]
87
+ mod tests {
88
+ use super::*;
89
+ use crate::testing::TempPool;
90
+ use std::collections::HashMap;
91
+
92
+ fn pool() -> TempPool {
93
+ crate::testing::temp_pool("sug")
94
+ }
95
+
96
+ #[test]
97
+ fn set_get_and_terminal_marker() {
98
+ let p = pool();
99
+ assert!(get_suggestion(&p, "m1").unwrap().is_none());
100
+
101
+ let mut reasons = HashMap::new();
102
+ reasons.insert("fr".to_string(), "parce que".to_string());
103
+ reasons.insert("en".to_string(), " ".to_string()); // blank: skipped
104
+ set_suggestion(&p, "m1", &["a".into(), "b".into()], &reasons).unwrap();
105
+
106
+ let row = get_suggestion(&p, "m1").unwrap().unwrap();
107
+ assert_eq!(row.item_ids, vec!["a".to_string(), "b".to_string()]);
108
+ assert_eq!(row.reasons.get("fr").map(String::as_str), Some("parce que"));
109
+ assert!(!row.reasons.contains_key("en"), "blank reason not stored");
110
+
111
+ // Regeneration replaces the reasons wholesale.
112
+ let mut reasons2 = HashMap::new();
113
+ reasons2.insert("en".to_string(), "now english".to_string());
114
+ set_suggestion(&p, "m1", &["c".into()], &reasons2).unwrap();
115
+ let row = get_suggestion(&p, "m1").unwrap().unwrap();
116
+ assert_eq!(row.item_ids, vec!["c".to_string()]);
117
+ assert!(!row.reasons.contains_key("fr"), "old fr reason superseded");
118
+ assert_eq!(
119
+ row.reasons.get("en").map(String::as_str),
120
+ Some("now english")
121
+ );
122
+
123
+ // Empty item_ids is a valid terminal "nothing found" marker (Some, not None).
124
+ set_suggestion(&p, "m1", &[], &HashMap::new()).unwrap();
125
+ let row = get_suggestion(&p, "m1").unwrap().unwrap();
126
+ assert!(row.item_ids.is_empty());
127
+ assert!(row.reasons.is_empty());
128
+ }
129
+ }