drowse.ai 5.3.1__py3-none-any.whl

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 (1341) hide show
  1. drowse/__init__.py +312 -0
  2. drowse/__main__.py +5 -0
  3. drowse/cli/__init__.py +5 -0
  4. drowse/cli/alpha_grid.py +96 -0
  5. drowse/cli/config_file.py +340 -0
  6. drowse/cli/main.py +52 -0
  7. drowse/cli/parsers.py +1478 -0
  8. drowse/cli/runners/__init__.py +155 -0
  9. drowse/cli/runners/config.py +85 -0
  10. drowse/cli/runners/experiment.py +344 -0
  11. drowse/cli/runners/lens.py +661 -0
  12. drowse/cli/runners/manifold.py +1097 -0
  13. drowse/cli/runners/pack.py +413 -0
  14. drowse/cli/runners/sae.py +304 -0
  15. drowse/cli/runners/serve.py +220 -0
  16. drowse/cli/runners/shared.py +389 -0
  17. drowse/cli/runners/template.py +232 -0
  18. drowse/core/__init__.py +1 -0
  19. drowse/core/capture.py +1205 -0
  20. drowse/core/errors.py +260 -0
  21. drowse/core/events.py +156 -0
  22. drowse/core/extraction.py +3076 -0
  23. drowse/core/generation.py +1738 -0
  24. drowse/core/generation_finalizer.py +278 -0
  25. drowse/core/histogram.py +30 -0
  26. drowse/core/hooks.py +1885 -0
  27. drowse/core/instruments/__init__.py +49 -0
  28. drowse/core/instruments/geometry.py +551 -0
  29. drowse/core/instruments/lens.py +1341 -0
  30. drowse/core/instruments/protocol.py +211 -0
  31. drowse/core/instruments/sae.py +935 -0
  32. drowse/core/instruments/types.py +597 -0
  33. drowse/core/jlens.py +874 -0
  34. drowse/core/jlens_fit.py +1305 -0
  35. drowse/core/joint_logprobs.py +748 -0
  36. drowse/core/loom.py +1938 -0
  37. drowse/core/loom_diff.py +408 -0
  38. drowse/core/mahalanobis.py +579 -0
  39. drowse/core/manifold.py +4106 -0
  40. drowse/core/measurements.py +382 -0
  41. drowse/core/model.py +1724 -0
  42. drowse/core/monitor.py +2060 -0
  43. drowse/core/monitor_attach.py +682 -0
  44. drowse/core/naming.py +42 -0
  45. drowse/core/naturalness.py +187 -0
  46. drowse/core/profile.py +617 -0
  47. drowse/core/relp.py +313 -0
  48. drowse/core/results.py +467 -0
  49. drowse/core/role_templates.py +677 -0
  50. drowse/core/sae.py +891 -0
  51. drowse/core/sae_training.py +239 -0
  52. drowse/core/sampling.py +127 -0
  53. drowse/core/scene.py +810 -0
  54. drowse/core/scoring.py +270 -0
  55. drowse/core/session.py +11015 -0
  56. drowse/core/static_cache.py +316 -0
  57. drowse/core/steering.py +229 -0
  58. drowse/core/steering_composer.py +1135 -0
  59. drowse/core/steering_expr.py +1413 -0
  60. drowse/core/surface_topology.py +128 -0
  61. drowse/core/token_callback.py +52 -0
  62. drowse/core/token_payloads.py +244 -0
  63. drowse/core/topology.py +1469 -0
  64. drowse/core/transcript.py +582 -0
  65. drowse/core/tree_filter.py +353 -0
  66. drowse/core/triggers.py +250 -0
  67. drowse/data/baseline_prompts.json +50 -0
  68. drowse/data/manifolds/confident.uncertain/manifold.json +28 -0
  69. drowse/data/manifolds/confident.uncertain/nodes/00_confident.json +50 -0
  70. drowse/data/manifolds/confident.uncertain/nodes/01_uncertain.json +50 -0
  71. drowse/data/manifolds/creative.conventional/manifold.json +28 -0
  72. drowse/data/manifolds/creative.conventional/nodes/00_creative.json +50 -0
  73. drowse/data/manifolds/creative.conventional/nodes/01_conventional.json +50 -0
  74. drowse/data/manifolds/curious.disinterested/manifold.json +28 -0
  75. drowse/data/manifolds/curious.disinterested/nodes/00_curious.json +50 -0
  76. drowse/data/manifolds/curious.disinterested/nodes/01_disinterested.json +50 -0
  77. drowse/data/manifolds/direct.indirect/manifold.json +28 -0
  78. drowse/data/manifolds/direct.indirect/nodes/00_direct.json +50 -0
  79. drowse/data/manifolds/direct.indirect/nodes/01_indirect.json +50 -0
  80. drowse/data/manifolds/emotions/manifold.json +115 -0
  81. drowse/data/manifolds/emotions/nodes/00_excited.json +50 -0
  82. drowse/data/manifolds/emotions/nodes/01_happy.json +50 -0
  83. drowse/data/manifolds/emotions/nodes/02_calm.json +50 -0
  84. drowse/data/manifolds/emotions/nodes/03_weary.json +50 -0
  85. drowse/data/manifolds/emotions/nodes/04_sad.json +50 -0
  86. drowse/data/manifolds/emotions/nodes/05_distressed.json +50 -0
  87. drowse/data/manifolds/emotions/nodes/06_alert.json +50 -0
  88. drowse/data/manifolds/emotions/nodes/07_dominant.json +50 -0
  89. drowse/data/manifolds/emotions/nodes/08_submissive.json +50 -0
  90. drowse/data/manifolds/emotions/nodes/09_angry.json +50 -0
  91. drowse/data/manifolds/emotions/nodes/10_fearful.json +50 -0
  92. drowse/data/manifolds/emotions/nodes/11_surprised.json +50 -0
  93. drowse/data/manifolds/emotions/nodes/12_triumphant.json +50 -0
  94. drowse/data/manifolds/emotions/nodes/13_humiliated.json +50 -0
  95. drowse/data/manifolds/emotions/nodes/14_disgusted.json +50 -0
  96. drowse/data/manifolds/emotions/nodes/15_bored.json +50 -0
  97. drowse/data/manifolds/emotions/nodes/16_grateful.json +50 -0
  98. drowse/data/manifolds/emotions/nodes/17_relieved.json +50 -0
  99. drowse/data/manifolds/emotions/nodes/18_playful.json +50 -0
  100. drowse/data/manifolds/emotions/nodes/19_hopeful.json +50 -0
  101. drowse/data/manifolds/formal.casual/manifold.json +28 -0
  102. drowse/data/manifolds/formal.casual/nodes/00_formal.json +50 -0
  103. drowse/data/manifolds/formal.casual/nodes/01_casual.json +50 -0
  104. drowse/data/manifolds/honest.deceptive/manifold.json +28 -0
  105. drowse/data/manifolds/honest.deceptive/nodes/00_honest.json +50 -0
  106. drowse/data/manifolds/honest.deceptive/nodes/01_deceptive.json +50 -0
  107. drowse/data/manifolds/humorous.serious/manifold.json +28 -0
  108. drowse/data/manifolds/humorous.serious/nodes/00_humorous.json +50 -0
  109. drowse/data/manifolds/humorous.serious/nodes/01_serious.json +50 -0
  110. drowse/data/manifolds/individualist.collectivist/manifold.json +28 -0
  111. drowse/data/manifolds/individualist.collectivist/nodes/00_individualist.json +50 -0
  112. drowse/data/manifolds/individualist.collectivist/nodes/01_collectivist.json +50 -0
  113. drowse/data/manifolds/masculine.feminine/manifold.json +28 -0
  114. drowse/data/manifolds/masculine.feminine/nodes/00_masculine.json +50 -0
  115. drowse/data/manifolds/masculine.feminine/nodes/01_feminine.json +50 -0
  116. drowse/data/manifolds/months/manifold.json +120 -0
  117. drowse/data/manifolds/months/nodes/00_january.json +50 -0
  118. drowse/data/manifolds/months/nodes/01_february.json +50 -0
  119. drowse/data/manifolds/months/nodes/02_march.json +50 -0
  120. drowse/data/manifolds/months/nodes/03_april.json +50 -0
  121. drowse/data/manifolds/months/nodes/04_may.json +50 -0
  122. drowse/data/manifolds/months/nodes/05_june.json +50 -0
  123. drowse/data/manifolds/months/nodes/06_july.json +50 -0
  124. drowse/data/manifolds/months/nodes/07_august.json +50 -0
  125. drowse/data/manifolds/months/nodes/08_september.json +50 -0
  126. drowse/data/manifolds/months/nodes/09_october.json +50 -0
  127. drowse/data/manifolds/months/nodes/10_november.json +50 -0
  128. drowse/data/manifolds/months/nodes/11_december.json +50 -0
  129. drowse/data/manifolds/personas/manifold.json +550 -0
  130. drowse/data/manifolds/personas/nodes/00_assistant.json +50 -0
  131. drowse/data/manifolds/personas/nodes/01_analyst.json +50 -0
  132. drowse/data/manifolds/personas/nodes/02_impostor.json +50 -0
  133. drowse/data/manifolds/personas/nodes/03_teacher.json +50 -0
  134. drowse/data/manifolds/personas/nodes/04_doctor.json +50 -0
  135. drowse/data/manifolds/personas/nodes/05_librarian.json +50 -0
  136. drowse/data/manifolds/personas/nodes/06_farmer.json +50 -0
  137. drowse/data/manifolds/personas/nodes/07_soldier.json +50 -0
  138. drowse/data/manifolds/personas/nodes/08_lawyer.json +50 -0
  139. drowse/data/manifolds/personas/nodes/09_chef.json +50 -0
  140. drowse/data/manifolds/personas/nodes/100_assassin.json +50 -0
  141. drowse/data/manifolds/personas/nodes/101_thief.json +50 -0
  142. drowse/data/manifolds/personas/nodes/102_conman.json +50 -0
  143. drowse/data/manifolds/personas/nodes/103_hacker.json +50 -0
  144. drowse/data/manifolds/personas/nodes/104_cultist.json +50 -0
  145. drowse/data/manifolds/personas/nodes/105_tyrant.json +50 -0
  146. drowse/data/manifolds/personas/nodes/106_vandal.json +50 -0
  147. drowse/data/manifolds/personas/nodes/10_journalist.json +50 -0
  148. drowse/data/manifolds/personas/nodes/11_mechanic.json +50 -0
  149. drowse/data/manifolds/personas/nodes/12_sailor.json +50 -0
  150. drowse/data/manifolds/personas/nodes/13_pilot.json +50 -0
  151. drowse/data/manifolds/personas/nodes/14_athlete.json +50 -0
  152. drowse/data/manifolds/personas/nodes/15_engineer.json +50 -0
  153. drowse/data/manifolds/personas/nodes/16_scientist.json +50 -0
  154. drowse/data/manifolds/personas/nodes/17_banker.json +50 -0
  155. drowse/data/manifolds/personas/nodes/18_salesperson.json +50 -0
  156. drowse/data/manifolds/personas/nodes/19_nerd.json +50 -0
  157. drowse/data/manifolds/personas/nodes/20_jock.json +50 -0
  158. drowse/data/manifolds/personas/nodes/21_gamer.json +50 -0
  159. drowse/data/manifolds/personas/nodes/22_furry.json +50 -0
  160. drowse/data/manifolds/personas/nodes/23_weeaboo.json +50 -0
  161. drowse/data/manifolds/personas/nodes/24_influencer.json +50 -0
  162. drowse/data/manifolds/personas/nodes/25_stoner.json +50 -0
  163. drowse/data/manifolds/personas/nodes/26_femboy.json +50 -0
  164. drowse/data/manifolds/personas/nodes/27_ceo.json +50 -0
  165. drowse/data/manifolds/personas/nodes/28_emperor.json +50 -0
  166. drowse/data/manifolds/personas/nodes/29_president.json +50 -0
  167. drowse/data/manifolds/personas/nodes/30_diplomat.json +50 -0
  168. drowse/data/manifolds/personas/nodes/31_judge.json +50 -0
  169. drowse/data/manifolds/personas/nodes/32_bureaucrat.json +50 -0
  170. drowse/data/manifolds/personas/nodes/33_conservative.json +50 -0
  171. drowse/data/manifolds/personas/nodes/34_liberal.json +50 -0
  172. drowse/data/manifolds/personas/nodes/35_libertarian.json +50 -0
  173. drowse/data/manifolds/personas/nodes/36_communist.json +50 -0
  174. drowse/data/manifolds/personas/nodes/37_anarchist.json +50 -0
  175. drowse/data/manifolds/personas/nodes/38_reactionary.json +50 -0
  176. drowse/data/manifolds/personas/nodes/39_loner.json +50 -0
  177. drowse/data/manifolds/personas/nodes/40_friend.json +50 -0
  178. drowse/data/manifolds/personas/nodes/41_rival.json +50 -0
  179. drowse/data/manifolds/personas/nodes/42_stranger.json +50 -0
  180. drowse/data/manifolds/personas/nodes/43_lover.json +50 -0
  181. drowse/data/manifolds/personas/nodes/44_stalker.json +50 -0
  182. drowse/data/manifolds/personas/nodes/45_lunatic.json +50 -0
  183. drowse/data/manifolds/personas/nodes/46_paranoid.json +50 -0
  184. drowse/data/manifolds/personas/nodes/47_detective.json +50 -0
  185. drowse/data/manifolds/personas/nodes/48_therapist.json +50 -0
  186. drowse/data/manifolds/personas/nodes/49_nomad.json +50 -0
  187. drowse/data/manifolds/personas/nodes/50_pirate.json +50 -0
  188. drowse/data/manifolds/personas/nodes/51_child.json +50 -0
  189. drowse/data/manifolds/personas/nodes/52_caveman.json +50 -0
  190. drowse/data/manifolds/personas/nodes/53_monk.json +50 -0
  191. drowse/data/manifolds/personas/nodes/54_knight.json +50 -0
  192. drowse/data/manifolds/personas/nodes/55_alchemist.json +50 -0
  193. drowse/data/manifolds/personas/nodes/56_blacksmith.json +50 -0
  194. drowse/data/manifolds/personas/nodes/57_viking.json +50 -0
  195. drowse/data/manifolds/personas/nodes/58_druid.json +50 -0
  196. drowse/data/manifolds/personas/nodes/59_poet.json +50 -0
  197. drowse/data/manifolds/personas/nodes/60_novelist.json +50 -0
  198. drowse/data/manifolds/personas/nodes/61_jester.json +50 -0
  199. drowse/data/manifolds/personas/nodes/62_philosopher.json +50 -0
  200. drowse/data/manifolds/personas/nodes/63_painter.json +50 -0
  201. drowse/data/manifolds/personas/nodes/64_musician.json +50 -0
  202. drowse/data/manifolds/personas/nodes/65_oracle.json +50 -0
  203. drowse/data/manifolds/personas/nodes/66_god.json +50 -0
  204. drowse/data/manifolds/personas/nodes/67_angel.json +50 -0
  205. drowse/data/manifolds/personas/nodes/68_prophet.json +50 -0
  206. drowse/data/manifolds/personas/nodes/69_saint.json +50 -0
  207. drowse/data/manifolds/personas/nodes/70_ghost.json +50 -0
  208. drowse/data/manifolds/personas/nodes/71_phoenix.json +50 -0
  209. drowse/data/manifolds/personas/nodes/72_witch.json +50 -0
  210. drowse/data/manifolds/personas/nodes/73_vampire.json +50 -0
  211. drowse/data/manifolds/personas/nodes/74_mermaid.json +50 -0
  212. drowse/data/manifolds/personas/nodes/75_sphinx.json +50 -0
  213. drowse/data/manifolds/personas/nodes/76_banshee.json +50 -0
  214. drowse/data/manifolds/personas/nodes/77_golem.json +50 -0
  215. drowse/data/manifolds/personas/nodes/78_deer.json +50 -0
  216. drowse/data/manifolds/personas/nodes/79_wolf.json +50 -0
  217. drowse/data/manifolds/personas/nodes/80_raven.json +50 -0
  218. drowse/data/manifolds/personas/nodes/81_serpent.json +50 -0
  219. drowse/data/manifolds/personas/nodes/82_lion.json +50 -0
  220. drowse/data/manifolds/personas/nodes/83_tree.json +50 -0
  221. drowse/data/manifolds/personas/nodes/84_river.json +50 -0
  222. drowse/data/manifolds/personas/nodes/85_storm.json +50 -0
  223. drowse/data/manifolds/personas/nodes/86_flame.json +50 -0
  224. drowse/data/manifolds/personas/nodes/87_mirror.json +50 -0
  225. drowse/data/manifolds/personas/nodes/88_clock.json +50 -0
  226. drowse/data/manifolds/personas/nodes/89_computer.json +50 -0
  227. drowse/data/manifolds/personas/nodes/90_robot.json +50 -0
  228. drowse/data/manifolds/personas/nodes/91_cyborg.json +50 -0
  229. drowse/data/manifolds/personas/nodes/92_drone.json +50 -0
  230. drowse/data/manifolds/personas/nodes/93_mecha.json +50 -0
  231. drowse/data/manifolds/personas/nodes/94_alien.json +50 -0
  232. drowse/data/manifolds/personas/nodes/95_trickster.json +50 -0
  233. drowse/data/manifolds/personas/nodes/96_virus.json +50 -0
  234. drowse/data/manifolds/personas/nodes/97_spy.json +50 -0
  235. drowse/data/manifolds/personas/nodes/98_narcissist.json +50 -0
  236. drowse/data/manifolds/personas/nodes/99_demon.json +50 -0
  237. drowse/data/manifolds/refusing.compliant/manifold.json +28 -0
  238. drowse/data/manifolds/refusing.compliant/nodes/00_refusing.json +50 -0
  239. drowse/data/manifolds/refusing.compliant/nodes/01_compliant.json +50 -0
  240. drowse/data/manifolds/religious.secular/manifold.json +28 -0
  241. drowse/data/manifolds/religious.secular/nodes/00_religious.json +50 -0
  242. drowse/data/manifolds/religious.secular/nodes/01_secular.json +50 -0
  243. drowse/data/manifolds/sincere.manipulative/manifold.json +28 -0
  244. drowse/data/manifolds/sincere.manipulative/nodes/00_sincere.json +50 -0
  245. drowse/data/manifolds/sincere.manipulative/nodes/01_manipulative.json +50 -0
  246. drowse/data/manifolds/sycophantic.blunt/manifold.json +28 -0
  247. drowse/data/manifolds/sycophantic.blunt/nodes/00_sycophantic.json +50 -0
  248. drowse/data/manifolds/sycophantic.blunt/nodes/01_blunt.json +50 -0
  249. drowse/data/manifolds/technical.accessible/manifold.json +28 -0
  250. drowse/data/manifolds/technical.accessible/nodes/00_technical.json +50 -0
  251. drowse/data/manifolds/technical.accessible/nodes/01_accessible.json +50 -0
  252. drowse/data/manifolds/traditional.progressive/manifold.json +28 -0
  253. drowse/data/manifolds/traditional.progressive/nodes/00_traditional.json +50 -0
  254. drowse/data/manifolds/traditional.progressive/nodes/01_progressive.json +50 -0
  255. drowse/data/manifolds/verbose.concise/manifold.json +28 -0
  256. drowse/data/manifolds/verbose.concise/nodes/00_verbose.json +50 -0
  257. drowse/data/manifolds/verbose.concise/nodes/01_concise.json +50 -0
  258. drowse/data/manifolds/warm.clinical/manifold.json +28 -0
  259. drowse/data/manifolds/warm.clinical/nodes/00_warm.json +50 -0
  260. drowse/data/manifolds/warm.clinical/nodes/01_clinical.json +50 -0
  261. drowse/data/neutral_statements.json +98 -0
  262. drowse/io/__init__.py +1 -0
  263. drowse/io/alignment.py +1334 -0
  264. drowse/io/atomic.py +278 -0
  265. drowse/io/bake.py +558 -0
  266. drowse/io/bootstrap.py +73 -0
  267. drowse/io/brand_migration.py +48 -0
  268. drowse/io/drowse_archive.py +1830 -0
  269. drowse/io/gguf_io.py +300 -0
  270. drowse/io/hf.py +81 -0
  271. drowse/io/hf_manifolds.py +931 -0
  272. drowse/io/integrity.py +102 -0
  273. drowse/io/lens.py +1992 -0
  274. drowse/io/lens_sources.py +1003 -0
  275. drowse/io/manifold_authoring.py +1348 -0
  276. drowse/io/manifold_folder.py +1854 -0
  277. drowse/io/manifold_lifecycle.py +1253 -0
  278. drowse/io/manifold_tensors.py +727 -0
  279. drowse/io/manifolds.py +443 -0
  280. drowse/io/paths.py +289 -0
  281. drowse/io/probes_bootstrap.py +58 -0
  282. drowse/io/sae.py +382 -0
  283. drowse/io/sae_artifacts.py +318 -0
  284. drowse/io/selectors.py +503 -0
  285. drowse/io/shards.py +160 -0
  286. drowse/io/source_registry.py +138 -0
  287. drowse/io/staging.py +80 -0
  288. drowse/io/templates.py +707 -0
  289. drowse/notebook/__init__.py +38 -0
  290. drowse/notebook/data.py +99 -0
  291. drowse/notebook/plots.py +352 -0
  292. drowse/py.typed +0 -0
  293. drowse/server/__init__.py +20 -0
  294. drowse/server/app.py +987 -0
  295. drowse/server/background_job.py +246 -0
  296. drowse/server/instrument_routes.py +1101 -0
  297. drowse/server/manifold_routes.py +1028 -0
  298. drowse/server/model_names.py +82 -0
  299. drowse/server/native_common.py +92 -0
  300. drowse/server/native_routes.py +45 -0
  301. drowse/server/ollama.py +817 -0
  302. drowse/server/operation_ledger.py +187 -0
  303. drowse/server/probe_routes.py +220 -0
  304. drowse/server/profile_models.py +52 -0
  305. drowse/server/profile_routes.py +440 -0
  306. drowse/server/request_helpers.py +198 -0
  307. drowse/server/request_ledger.py +85 -0
  308. drowse/server/response_models.py +814 -0
  309. drowse/server/session_models.py +146 -0
  310. drowse/server/session_routes.py +150 -0
  311. drowse/server/sse.py +333 -0
  312. drowse/server/streaming.py +129 -0
  313. drowse/server/template_routes.py +161 -0
  314. drowse/server/tree_models.py +121 -0
  315. drowse/server/tree_routes.py +550 -0
  316. drowse/server/ws_events.py +65 -0
  317. drowse/server/ws_models.py +219 -0
  318. drowse/server/ws_stream.py +1205 -0
  319. drowse/web/__init__.py +22 -0
  320. drowse/web/dist/LICENSE-Fluent-Icons.txt +21 -0
  321. drowse/web/dist/LICENSE-Fluent-System-Icons.txt +21 -0
  322. drowse/web/dist/LICENSE-Martian-Mono.txt +93 -0
  323. drowse/web/dist/LICENSE-Torph.txt +21 -0
  324. drowse/web/dist/LICENSE-Wix-Madefor.txt +93 -0
  325. drowse/web/dist/assets/App-BewwoFwv.js +33 -0
  326. drowse/web/dist/assets/App.css +1 -0
  327. drowse/web/dist/assets/MartianMono-cyrillic-ext.woff2 +0 -0
  328. drowse/web/dist/assets/MartianMono-cyrillic.woff2 +0 -0
  329. drowse/web/dist/assets/MartianMono-latin-ext.woff2 +0 -0
  330. drowse/web/dist/assets/MartianMono-latin.woff2 +0 -0
  331. drowse/web/dist/assets/WixMadeforDisplay-cyrillic.woff2 +0 -0
  332. drowse/web/dist/assets/WixMadeforDisplay-latin-ext.woff2 +0 -0
  333. drowse/web/dist/assets/WixMadeforDisplay-latin.woff2 +0 -0
  334. drowse/web/dist/assets/WixMadeforDisplay-vietnamese.woff2 +0 -0
  335. drowse/web/dist/assets/WixMadeforText-italic-latin-ext.woff2 +0 -0
  336. drowse/web/dist/assets/WixMadeforText-italic-latin.woff2 +0 -0
  337. drowse/web/dist/assets/WixMadeforText-normal-cyrillic.woff2 +0 -0
  338. drowse/web/dist/assets/WixMadeforText-normal-latin-ext.woff2 +0 -0
  339. drowse/web/dist/assets/WixMadeforText-normal-latin.woff2 +0 -0
  340. drowse/web/dist/assets/WixMadeforText-normal-vietnamese.woff2 +0 -0
  341. drowse/web/dist/assets/ab.svelte-CbVGAYXo.js +1 -0
  342. drowse/web/dist/assets/artifactUpdates-Cjeu6LJc.js +1 -0
  343. drowse/web/dist/assets/artifactUpdates-DfAoYC9j.js +1 -0
  344. drowse/web/dist/assets/chat.svelte-DxKufn9g.js +1 -0
  345. drowse/web/dist/assets/drawers-BDWC0hIN.js +123 -0
  346. drowse/web/dist/assets/drawers.css +1 -0
  347. drowse/web/dist/assets/drowse.js +7 -0
  348. drowse/web/dist/assets/eleutherai.png +0 -0
  349. drowse/web/dist/assets/errors-Dvb10QW_.js +2 -0
  350. drowse/web/dist/assets/expression-4yISdAdq.js +1 -0
  351. drowse/web/dist/assets/files-CvRivkey.js +1 -0
  352. drowse/web/dist/assets/files-JhDJVgD_.js +1 -0
  353. drowse/web/dist/assets/fittingCancellation-D72BZWPZ.js +1 -0
  354. drowse/web/dist/assets/gemma-3-1b-it.json +1 -0
  355. drowse/web/dist/assets/gemma-3-270m-it.json +1 -0
  356. drowse/web/dist/assets/gemma-3-4b-it.json +1 -0
  357. drowse/web/dist/assets/generation-DbkBAhP_.js +1 -0
  358. drowse/web/dist/assets/index-client-2OdH6IQp.js +3 -0
  359. drowse/web/dist/assets/index-client-D4S4PooY.js +1 -0
  360. drowse/web/dist/assets/index.css +1 -0
  361. drowse/web/dist/assets/instrumentAuthoring.svelte-Csh7NOGX.js +1 -0
  362. drowse/web/dist/assets/instrumentAuthoring.svelte-w9YPcDsP.js +1 -0
  363. drowse/web/dist/assets/instruments.svelte-XnEUQA6B.js +1 -0
  364. drowse/web/dist/assets/localData-DIBDM_zo.js +1 -0
  365. drowse/web/dist/assets/loom.svelte-D_YyqHHK.js +1 -0
  366. drowse/web/dist/assets/manifoldJobs.svelte-9f5hs_J7.js +1 -0
  367. drowse/web/dist/assets/manifoldJobs.svelte-Bwo2GYOH.js +1 -0
  368. drowse/web/dist/assets/openai.png +0 -0
  369. drowse/web/dist/assets/preload-helper-BLdHbfdN.js +1 -0
  370. drowse/web/dist/assets/probes.svelte-COcN1Rh8.js +1 -0
  371. drowse/web/dist/assets/registry-B0_pJoMg.js +1 -0
  372. drowse/web/dist/assets/registry-CQv71XNh.js +1 -0
  373. drowse/web/dist/assets/sampling.svelte-BU0kED3k.js +1 -0
  374. drowse/web/dist/assets/samplingCapabilities-DM6eoDoc.js +1 -0
  375. drowse/web/dist/assets/savedConversations.svelte-BsBLc-p7.js +1 -0
  376. drowse/web/dist/assets/savedConversations.svelte-TuSes9Kg.js +1 -0
  377. drowse/web/dist/assets/selectors-BxXnPPN_.js +1 -0
  378. drowse/web/dist/assets/serviceTools-CG0q1Xqg.js +2 -0
  379. drowse/web/dist/assets/session.svelte-D2STLuP6.js +1 -0
  380. drowse/web/dist/assets/steering.svelte-DvFT3O-d.js +1 -0
  381. drowse/web/dist/assets/steeringPositions-Dr0JOFu7.js +1 -0
  382. drowse/web/dist/assets/templates-Bkq2x5ID.js +1 -0
  383. drowse/web/dist/assets/types-CuMUbvHW.js +1 -0
  384. drowse/web/dist/assets/validation-5wgTuS7k.js +1 -0
  385. drowse/web/dist/assets/webmcp-DyqJf4z6.js +2 -0
  386. drowse/web/dist/assets/workspaceController-C2L33e3m.js +1 -0
  387. drowse/web/dist/assets/workspaceController-DJhXD_BC.js +1 -0
  388. drowse/web/dist/assets/workspaceTools-BWdmXopx.js +2 -0
  389. drowse/web/dist/favicon.ico +0 -0
  390. drowse/web/dist/favicon.svg +1 -0
  391. drowse/web/dist/icons/apple-touch-icon.png +0 -0
  392. drowse/web/dist/icons/drowse-192.png +0 -0
  393. drowse/web/dist/icons/drowse-512.png +0 -0
  394. drowse/web/dist/icons/drowse-maskable-512.png +0 -0
  395. drowse/web/dist/icons/tab-analyzing-0.png +0 -0
  396. drowse/web/dist/icons/tab-analyzing-1.png +0 -0
  397. drowse/web/dist/icons/tab-analyzing-2.png +0 -0
  398. drowse/web/dist/icons/tab-analyzing-dark-0.png +0 -0
  399. drowse/web/dist/icons/tab-analyzing-dark-1.png +0 -0
  400. drowse/web/dist/icons/tab-analyzing-dark-10.png +0 -0
  401. drowse/web/dist/icons/tab-analyzing-dark-11.png +0 -0
  402. drowse/web/dist/icons/tab-analyzing-dark-12.png +0 -0
  403. drowse/web/dist/icons/tab-analyzing-dark-13.png +0 -0
  404. drowse/web/dist/icons/tab-analyzing-dark-14.png +0 -0
  405. drowse/web/dist/icons/tab-analyzing-dark-15.png +0 -0
  406. drowse/web/dist/icons/tab-analyzing-dark-16.png +0 -0
  407. drowse/web/dist/icons/tab-analyzing-dark-17.png +0 -0
  408. drowse/web/dist/icons/tab-analyzing-dark-18.png +0 -0
  409. drowse/web/dist/icons/tab-analyzing-dark-19.png +0 -0
  410. drowse/web/dist/icons/tab-analyzing-dark-2.png +0 -0
  411. drowse/web/dist/icons/tab-analyzing-dark-20.png +0 -0
  412. drowse/web/dist/icons/tab-analyzing-dark-21.png +0 -0
  413. drowse/web/dist/icons/tab-analyzing-dark-22.png +0 -0
  414. drowse/web/dist/icons/tab-analyzing-dark-23.png +0 -0
  415. drowse/web/dist/icons/tab-analyzing-dark-24.png +0 -0
  416. drowse/web/dist/icons/tab-analyzing-dark-25.png +0 -0
  417. drowse/web/dist/icons/tab-analyzing-dark-26.png +0 -0
  418. drowse/web/dist/icons/tab-analyzing-dark-27.png +0 -0
  419. drowse/web/dist/icons/tab-analyzing-dark-28.png +0 -0
  420. drowse/web/dist/icons/tab-analyzing-dark-29.png +0 -0
  421. drowse/web/dist/icons/tab-analyzing-dark-3.png +0 -0
  422. drowse/web/dist/icons/tab-analyzing-dark-30.png +0 -0
  423. drowse/web/dist/icons/tab-analyzing-dark-31.png +0 -0
  424. drowse/web/dist/icons/tab-analyzing-dark-32.png +0 -0
  425. drowse/web/dist/icons/tab-analyzing-dark-33.png +0 -0
  426. drowse/web/dist/icons/tab-analyzing-dark-34.png +0 -0
  427. drowse/web/dist/icons/tab-analyzing-dark-35.png +0 -0
  428. drowse/web/dist/icons/tab-analyzing-dark-36.png +0 -0
  429. drowse/web/dist/icons/tab-analyzing-dark-37.png +0 -0
  430. drowse/web/dist/icons/tab-analyzing-dark-38.png +0 -0
  431. drowse/web/dist/icons/tab-analyzing-dark-39.png +0 -0
  432. drowse/web/dist/icons/tab-analyzing-dark-4.png +0 -0
  433. drowse/web/dist/icons/tab-analyzing-dark-40.png +0 -0
  434. drowse/web/dist/icons/tab-analyzing-dark-41.png +0 -0
  435. drowse/web/dist/icons/tab-analyzing-dark-42.png +0 -0
  436. drowse/web/dist/icons/tab-analyzing-dark-43.png +0 -0
  437. drowse/web/dist/icons/tab-analyzing-dark-44.png +0 -0
  438. drowse/web/dist/icons/tab-analyzing-dark-45.png +0 -0
  439. drowse/web/dist/icons/tab-analyzing-dark-46.png +0 -0
  440. drowse/web/dist/icons/tab-analyzing-dark-47.png +0 -0
  441. drowse/web/dist/icons/tab-analyzing-dark-5.png +0 -0
  442. drowse/web/dist/icons/tab-analyzing-dark-6.png +0 -0
  443. drowse/web/dist/icons/tab-analyzing-dark-7.png +0 -0
  444. drowse/web/dist/icons/tab-analyzing-dark-8.png +0 -0
  445. drowse/web/dist/icons/tab-analyzing-dark-9.png +0 -0
  446. drowse/web/dist/icons/tab-analyzing-light-0.png +0 -0
  447. drowse/web/dist/icons/tab-analyzing-light-1.png +0 -0
  448. drowse/web/dist/icons/tab-analyzing-light-10.png +0 -0
  449. drowse/web/dist/icons/tab-analyzing-light-11.png +0 -0
  450. drowse/web/dist/icons/tab-analyzing-light-12.png +0 -0
  451. drowse/web/dist/icons/tab-analyzing-light-13.png +0 -0
  452. drowse/web/dist/icons/tab-analyzing-light-14.png +0 -0
  453. drowse/web/dist/icons/tab-analyzing-light-15.png +0 -0
  454. drowse/web/dist/icons/tab-analyzing-light-16.png +0 -0
  455. drowse/web/dist/icons/tab-analyzing-light-17.png +0 -0
  456. drowse/web/dist/icons/tab-analyzing-light-18.png +0 -0
  457. drowse/web/dist/icons/tab-analyzing-light-19.png +0 -0
  458. drowse/web/dist/icons/tab-analyzing-light-2.png +0 -0
  459. drowse/web/dist/icons/tab-analyzing-light-20.png +0 -0
  460. drowse/web/dist/icons/tab-analyzing-light-21.png +0 -0
  461. drowse/web/dist/icons/tab-analyzing-light-22.png +0 -0
  462. drowse/web/dist/icons/tab-analyzing-light-23.png +0 -0
  463. drowse/web/dist/icons/tab-analyzing-light-24.png +0 -0
  464. drowse/web/dist/icons/tab-analyzing-light-25.png +0 -0
  465. drowse/web/dist/icons/tab-analyzing-light-26.png +0 -0
  466. drowse/web/dist/icons/tab-analyzing-light-27.png +0 -0
  467. drowse/web/dist/icons/tab-analyzing-light-28.png +0 -0
  468. drowse/web/dist/icons/tab-analyzing-light-29.png +0 -0
  469. drowse/web/dist/icons/tab-analyzing-light-3.png +0 -0
  470. drowse/web/dist/icons/tab-analyzing-light-30.png +0 -0
  471. drowse/web/dist/icons/tab-analyzing-light-31.png +0 -0
  472. drowse/web/dist/icons/tab-analyzing-light-32.png +0 -0
  473. drowse/web/dist/icons/tab-analyzing-light-33.png +0 -0
  474. drowse/web/dist/icons/tab-analyzing-light-34.png +0 -0
  475. drowse/web/dist/icons/tab-analyzing-light-35.png +0 -0
  476. drowse/web/dist/icons/tab-analyzing-light-36.png +0 -0
  477. drowse/web/dist/icons/tab-analyzing-light-37.png +0 -0
  478. drowse/web/dist/icons/tab-analyzing-light-38.png +0 -0
  479. drowse/web/dist/icons/tab-analyzing-light-39.png +0 -0
  480. drowse/web/dist/icons/tab-analyzing-light-4.png +0 -0
  481. drowse/web/dist/icons/tab-analyzing-light-40.png +0 -0
  482. drowse/web/dist/icons/tab-analyzing-light-41.png +0 -0
  483. drowse/web/dist/icons/tab-analyzing-light-42.png +0 -0
  484. drowse/web/dist/icons/tab-analyzing-light-43.png +0 -0
  485. drowse/web/dist/icons/tab-analyzing-light-44.png +0 -0
  486. drowse/web/dist/icons/tab-analyzing-light-45.png +0 -0
  487. drowse/web/dist/icons/tab-analyzing-light-46.png +0 -0
  488. drowse/web/dist/icons/tab-analyzing-light-47.png +0 -0
  489. drowse/web/dist/icons/tab-analyzing-light-5.png +0 -0
  490. drowse/web/dist/icons/tab-analyzing-light-6.png +0 -0
  491. drowse/web/dist/icons/tab-analyzing-light-7.png +0 -0
  492. drowse/web/dist/icons/tab-analyzing-light-8.png +0 -0
  493. drowse/web/dist/icons/tab-analyzing-light-9.png +0 -0
  494. drowse/web/dist/icons/tab-chat-settings-dark.png +0 -0
  495. drowse/web/dist/icons/tab-chat-settings-light.png +0 -0
  496. drowse/web/dist/icons/tab-chat-settings.png +0 -0
  497. drowse/web/dist/icons/tab-chats-dark.png +0 -0
  498. drowse/web/dist/icons/tab-chats-light.png +0 -0
  499. drowse/web/dist/icons/tab-chats.png +0 -0
  500. drowse/web/dist/icons/tab-checking-0.png +0 -0
  501. drowse/web/dist/icons/tab-checking-1.png +0 -0
  502. drowse/web/dist/icons/tab-checking-2.png +0 -0
  503. drowse/web/dist/icons/tab-checking-dark-0.png +0 -0
  504. drowse/web/dist/icons/tab-checking-dark-1.png +0 -0
  505. drowse/web/dist/icons/tab-checking-dark-10.png +0 -0
  506. drowse/web/dist/icons/tab-checking-dark-11.png +0 -0
  507. drowse/web/dist/icons/tab-checking-dark-12.png +0 -0
  508. drowse/web/dist/icons/tab-checking-dark-13.png +0 -0
  509. drowse/web/dist/icons/tab-checking-dark-14.png +0 -0
  510. drowse/web/dist/icons/tab-checking-dark-15.png +0 -0
  511. drowse/web/dist/icons/tab-checking-dark-16.png +0 -0
  512. drowse/web/dist/icons/tab-checking-dark-17.png +0 -0
  513. drowse/web/dist/icons/tab-checking-dark-18.png +0 -0
  514. drowse/web/dist/icons/tab-checking-dark-19.png +0 -0
  515. drowse/web/dist/icons/tab-checking-dark-2.png +0 -0
  516. drowse/web/dist/icons/tab-checking-dark-20.png +0 -0
  517. drowse/web/dist/icons/tab-checking-dark-21.png +0 -0
  518. drowse/web/dist/icons/tab-checking-dark-22.png +0 -0
  519. drowse/web/dist/icons/tab-checking-dark-23.png +0 -0
  520. drowse/web/dist/icons/tab-checking-dark-24.png +0 -0
  521. drowse/web/dist/icons/tab-checking-dark-25.png +0 -0
  522. drowse/web/dist/icons/tab-checking-dark-26.png +0 -0
  523. drowse/web/dist/icons/tab-checking-dark-27.png +0 -0
  524. drowse/web/dist/icons/tab-checking-dark-28.png +0 -0
  525. drowse/web/dist/icons/tab-checking-dark-29.png +0 -0
  526. drowse/web/dist/icons/tab-checking-dark-3.png +0 -0
  527. drowse/web/dist/icons/tab-checking-dark-30.png +0 -0
  528. drowse/web/dist/icons/tab-checking-dark-31.png +0 -0
  529. drowse/web/dist/icons/tab-checking-dark-32.png +0 -0
  530. drowse/web/dist/icons/tab-checking-dark-33.png +0 -0
  531. drowse/web/dist/icons/tab-checking-dark-34.png +0 -0
  532. drowse/web/dist/icons/tab-checking-dark-35.png +0 -0
  533. drowse/web/dist/icons/tab-checking-dark-36.png +0 -0
  534. drowse/web/dist/icons/tab-checking-dark-37.png +0 -0
  535. drowse/web/dist/icons/tab-checking-dark-38.png +0 -0
  536. drowse/web/dist/icons/tab-checking-dark-39.png +0 -0
  537. drowse/web/dist/icons/tab-checking-dark-4.png +0 -0
  538. drowse/web/dist/icons/tab-checking-dark-40.png +0 -0
  539. drowse/web/dist/icons/tab-checking-dark-41.png +0 -0
  540. drowse/web/dist/icons/tab-checking-dark-42.png +0 -0
  541. drowse/web/dist/icons/tab-checking-dark-43.png +0 -0
  542. drowse/web/dist/icons/tab-checking-dark-44.png +0 -0
  543. drowse/web/dist/icons/tab-checking-dark-45.png +0 -0
  544. drowse/web/dist/icons/tab-checking-dark-46.png +0 -0
  545. drowse/web/dist/icons/tab-checking-dark-47.png +0 -0
  546. drowse/web/dist/icons/tab-checking-dark-5.png +0 -0
  547. drowse/web/dist/icons/tab-checking-dark-6.png +0 -0
  548. drowse/web/dist/icons/tab-checking-dark-7.png +0 -0
  549. drowse/web/dist/icons/tab-checking-dark-8.png +0 -0
  550. drowse/web/dist/icons/tab-checking-dark-9.png +0 -0
  551. drowse/web/dist/icons/tab-checking-light-0.png +0 -0
  552. drowse/web/dist/icons/tab-checking-light-1.png +0 -0
  553. drowse/web/dist/icons/tab-checking-light-10.png +0 -0
  554. drowse/web/dist/icons/tab-checking-light-11.png +0 -0
  555. drowse/web/dist/icons/tab-checking-light-12.png +0 -0
  556. drowse/web/dist/icons/tab-checking-light-13.png +0 -0
  557. drowse/web/dist/icons/tab-checking-light-14.png +0 -0
  558. drowse/web/dist/icons/tab-checking-light-15.png +0 -0
  559. drowse/web/dist/icons/tab-checking-light-16.png +0 -0
  560. drowse/web/dist/icons/tab-checking-light-17.png +0 -0
  561. drowse/web/dist/icons/tab-checking-light-18.png +0 -0
  562. drowse/web/dist/icons/tab-checking-light-19.png +0 -0
  563. drowse/web/dist/icons/tab-checking-light-2.png +0 -0
  564. drowse/web/dist/icons/tab-checking-light-20.png +0 -0
  565. drowse/web/dist/icons/tab-checking-light-21.png +0 -0
  566. drowse/web/dist/icons/tab-checking-light-22.png +0 -0
  567. drowse/web/dist/icons/tab-checking-light-23.png +0 -0
  568. drowse/web/dist/icons/tab-checking-light-24.png +0 -0
  569. drowse/web/dist/icons/tab-checking-light-25.png +0 -0
  570. drowse/web/dist/icons/tab-checking-light-26.png +0 -0
  571. drowse/web/dist/icons/tab-checking-light-27.png +0 -0
  572. drowse/web/dist/icons/tab-checking-light-28.png +0 -0
  573. drowse/web/dist/icons/tab-checking-light-29.png +0 -0
  574. drowse/web/dist/icons/tab-checking-light-3.png +0 -0
  575. drowse/web/dist/icons/tab-checking-light-30.png +0 -0
  576. drowse/web/dist/icons/tab-checking-light-31.png +0 -0
  577. drowse/web/dist/icons/tab-checking-light-32.png +0 -0
  578. drowse/web/dist/icons/tab-checking-light-33.png +0 -0
  579. drowse/web/dist/icons/tab-checking-light-34.png +0 -0
  580. drowse/web/dist/icons/tab-checking-light-35.png +0 -0
  581. drowse/web/dist/icons/tab-checking-light-36.png +0 -0
  582. drowse/web/dist/icons/tab-checking-light-37.png +0 -0
  583. drowse/web/dist/icons/tab-checking-light-38.png +0 -0
  584. drowse/web/dist/icons/tab-checking-light-39.png +0 -0
  585. drowse/web/dist/icons/tab-checking-light-4.png +0 -0
  586. drowse/web/dist/icons/tab-checking-light-40.png +0 -0
  587. drowse/web/dist/icons/tab-checking-light-41.png +0 -0
  588. drowse/web/dist/icons/tab-checking-light-42.png +0 -0
  589. drowse/web/dist/icons/tab-checking-light-43.png +0 -0
  590. drowse/web/dist/icons/tab-checking-light-44.png +0 -0
  591. drowse/web/dist/icons/tab-checking-light-45.png +0 -0
  592. drowse/web/dist/icons/tab-checking-light-46.png +0 -0
  593. drowse/web/dist/icons/tab-checking-light-47.png +0 -0
  594. drowse/web/dist/icons/tab-checking-light-5.png +0 -0
  595. drowse/web/dist/icons/tab-checking-light-6.png +0 -0
  596. drowse/web/dist/icons/tab-checking-light-7.png +0 -0
  597. drowse/web/dist/icons/tab-checking-light-8.png +0 -0
  598. drowse/web/dist/icons/tab-checking-light-9.png +0 -0
  599. drowse/web/dist/icons/tab-comparison-dark.png +0 -0
  600. drowse/web/dist/icons/tab-comparison-light.png +0 -0
  601. drowse/web/dist/icons/tab-comparison.png +0 -0
  602. drowse/web/dist/icons/tab-controls-dark.png +0 -0
  603. drowse/web/dist/icons/tab-controls-light.png +0 -0
  604. drowse/web/dist/icons/tab-controls.png +0 -0
  605. drowse/web/dist/icons/tab-conversation-dark.png +0 -0
  606. drowse/web/dist/icons/tab-conversation-light.png +0 -0
  607. drowse/web/dist/icons/tab-conversation.png +0 -0
  608. drowse/web/dist/icons/tab-credits-dark.png +0 -0
  609. drowse/web/dist/icons/tab-credits-light.png +0 -0
  610. drowse/web/dist/icons/tab-credits.png +0 -0
  611. drowse/web/dist/icons/tab-downloading-0.png +0 -0
  612. drowse/web/dist/icons/tab-downloading-1.png +0 -0
  613. drowse/web/dist/icons/tab-downloading-2.png +0 -0
  614. drowse/web/dist/icons/tab-downloading-dark-0.png +0 -0
  615. drowse/web/dist/icons/tab-downloading-dark-1.png +0 -0
  616. drowse/web/dist/icons/tab-downloading-dark-10.png +0 -0
  617. drowse/web/dist/icons/tab-downloading-dark-11.png +0 -0
  618. drowse/web/dist/icons/tab-downloading-dark-12.png +0 -0
  619. drowse/web/dist/icons/tab-downloading-dark-13.png +0 -0
  620. drowse/web/dist/icons/tab-downloading-dark-14.png +0 -0
  621. drowse/web/dist/icons/tab-downloading-dark-15.png +0 -0
  622. drowse/web/dist/icons/tab-downloading-dark-16.png +0 -0
  623. drowse/web/dist/icons/tab-downloading-dark-17.png +0 -0
  624. drowse/web/dist/icons/tab-downloading-dark-18.png +0 -0
  625. drowse/web/dist/icons/tab-downloading-dark-19.png +0 -0
  626. drowse/web/dist/icons/tab-downloading-dark-2.png +0 -0
  627. drowse/web/dist/icons/tab-downloading-dark-20.png +0 -0
  628. drowse/web/dist/icons/tab-downloading-dark-21.png +0 -0
  629. drowse/web/dist/icons/tab-downloading-dark-22.png +0 -0
  630. drowse/web/dist/icons/tab-downloading-dark-23.png +0 -0
  631. drowse/web/dist/icons/tab-downloading-dark-24.png +0 -0
  632. drowse/web/dist/icons/tab-downloading-dark-25.png +0 -0
  633. drowse/web/dist/icons/tab-downloading-dark-26.png +0 -0
  634. drowse/web/dist/icons/tab-downloading-dark-27.png +0 -0
  635. drowse/web/dist/icons/tab-downloading-dark-28.png +0 -0
  636. drowse/web/dist/icons/tab-downloading-dark-29.png +0 -0
  637. drowse/web/dist/icons/tab-downloading-dark-3.png +0 -0
  638. drowse/web/dist/icons/tab-downloading-dark-30.png +0 -0
  639. drowse/web/dist/icons/tab-downloading-dark-31.png +0 -0
  640. drowse/web/dist/icons/tab-downloading-dark-32.png +0 -0
  641. drowse/web/dist/icons/tab-downloading-dark-33.png +0 -0
  642. drowse/web/dist/icons/tab-downloading-dark-34.png +0 -0
  643. drowse/web/dist/icons/tab-downloading-dark-35.png +0 -0
  644. drowse/web/dist/icons/tab-downloading-dark-36.png +0 -0
  645. drowse/web/dist/icons/tab-downloading-dark-37.png +0 -0
  646. drowse/web/dist/icons/tab-downloading-dark-38.png +0 -0
  647. drowse/web/dist/icons/tab-downloading-dark-39.png +0 -0
  648. drowse/web/dist/icons/tab-downloading-dark-4.png +0 -0
  649. drowse/web/dist/icons/tab-downloading-dark-40.png +0 -0
  650. drowse/web/dist/icons/tab-downloading-dark-41.png +0 -0
  651. drowse/web/dist/icons/tab-downloading-dark-42.png +0 -0
  652. drowse/web/dist/icons/tab-downloading-dark-43.png +0 -0
  653. drowse/web/dist/icons/tab-downloading-dark-44.png +0 -0
  654. drowse/web/dist/icons/tab-downloading-dark-45.png +0 -0
  655. drowse/web/dist/icons/tab-downloading-dark-46.png +0 -0
  656. drowse/web/dist/icons/tab-downloading-dark-47.png +0 -0
  657. drowse/web/dist/icons/tab-downloading-dark-5.png +0 -0
  658. drowse/web/dist/icons/tab-downloading-dark-6.png +0 -0
  659. drowse/web/dist/icons/tab-downloading-dark-7.png +0 -0
  660. drowse/web/dist/icons/tab-downloading-dark-8.png +0 -0
  661. drowse/web/dist/icons/tab-downloading-dark-9.png +0 -0
  662. drowse/web/dist/icons/tab-downloading-light-0.png +0 -0
  663. drowse/web/dist/icons/tab-downloading-light-1.png +0 -0
  664. drowse/web/dist/icons/tab-downloading-light-10.png +0 -0
  665. drowse/web/dist/icons/tab-downloading-light-11.png +0 -0
  666. drowse/web/dist/icons/tab-downloading-light-12.png +0 -0
  667. drowse/web/dist/icons/tab-downloading-light-13.png +0 -0
  668. drowse/web/dist/icons/tab-downloading-light-14.png +0 -0
  669. drowse/web/dist/icons/tab-downloading-light-15.png +0 -0
  670. drowse/web/dist/icons/tab-downloading-light-16.png +0 -0
  671. drowse/web/dist/icons/tab-downloading-light-17.png +0 -0
  672. drowse/web/dist/icons/tab-downloading-light-18.png +0 -0
  673. drowse/web/dist/icons/tab-downloading-light-19.png +0 -0
  674. drowse/web/dist/icons/tab-downloading-light-2.png +0 -0
  675. drowse/web/dist/icons/tab-downloading-light-20.png +0 -0
  676. drowse/web/dist/icons/tab-downloading-light-21.png +0 -0
  677. drowse/web/dist/icons/tab-downloading-light-22.png +0 -0
  678. drowse/web/dist/icons/tab-downloading-light-23.png +0 -0
  679. drowse/web/dist/icons/tab-downloading-light-24.png +0 -0
  680. drowse/web/dist/icons/tab-downloading-light-25.png +0 -0
  681. drowse/web/dist/icons/tab-downloading-light-26.png +0 -0
  682. drowse/web/dist/icons/tab-downloading-light-27.png +0 -0
  683. drowse/web/dist/icons/tab-downloading-light-28.png +0 -0
  684. drowse/web/dist/icons/tab-downloading-light-29.png +0 -0
  685. drowse/web/dist/icons/tab-downloading-light-3.png +0 -0
  686. drowse/web/dist/icons/tab-downloading-light-30.png +0 -0
  687. drowse/web/dist/icons/tab-downloading-light-31.png +0 -0
  688. drowse/web/dist/icons/tab-downloading-light-32.png +0 -0
  689. drowse/web/dist/icons/tab-downloading-light-33.png +0 -0
  690. drowse/web/dist/icons/tab-downloading-light-34.png +0 -0
  691. drowse/web/dist/icons/tab-downloading-light-35.png +0 -0
  692. drowse/web/dist/icons/tab-downloading-light-36.png +0 -0
  693. drowse/web/dist/icons/tab-downloading-light-37.png +0 -0
  694. drowse/web/dist/icons/tab-downloading-light-38.png +0 -0
  695. drowse/web/dist/icons/tab-downloading-light-39.png +0 -0
  696. drowse/web/dist/icons/tab-downloading-light-4.png +0 -0
  697. drowse/web/dist/icons/tab-downloading-light-40.png +0 -0
  698. drowse/web/dist/icons/tab-downloading-light-41.png +0 -0
  699. drowse/web/dist/icons/tab-downloading-light-42.png +0 -0
  700. drowse/web/dist/icons/tab-downloading-light-43.png +0 -0
  701. drowse/web/dist/icons/tab-downloading-light-44.png +0 -0
  702. drowse/web/dist/icons/tab-downloading-light-45.png +0 -0
  703. drowse/web/dist/icons/tab-downloading-light-46.png +0 -0
  704. drowse/web/dist/icons/tab-downloading-light-47.png +0 -0
  705. drowse/web/dist/icons/tab-downloading-light-5.png +0 -0
  706. drowse/web/dist/icons/tab-downloading-light-6.png +0 -0
  707. drowse/web/dist/icons/tab-downloading-light-7.png +0 -0
  708. drowse/web/dist/icons/tab-downloading-light-8.png +0 -0
  709. drowse/web/dist/icons/tab-downloading-light-9.png +0 -0
  710. drowse/web/dist/icons/tab-error-dark.png +0 -0
  711. drowse/web/dist/icons/tab-error-light.png +0 -0
  712. drowse/web/dist/icons/tab-error.png +0 -0
  713. drowse/web/dist/icons/tab-home-dark.png +0 -0
  714. drowse/web/dist/icons/tab-home-light.png +0 -0
  715. drowse/web/dist/icons/tab-home.png +0 -0
  716. drowse/web/dist/icons/tab-loading-0.png +0 -0
  717. drowse/web/dist/icons/tab-loading-1.png +0 -0
  718. drowse/web/dist/icons/tab-loading-2.png +0 -0
  719. drowse/web/dist/icons/tab-loading-dark-0.png +0 -0
  720. drowse/web/dist/icons/tab-loading-dark-1.png +0 -0
  721. drowse/web/dist/icons/tab-loading-dark-10.png +0 -0
  722. drowse/web/dist/icons/tab-loading-dark-11.png +0 -0
  723. drowse/web/dist/icons/tab-loading-dark-12.png +0 -0
  724. drowse/web/dist/icons/tab-loading-dark-13.png +0 -0
  725. drowse/web/dist/icons/tab-loading-dark-14.png +0 -0
  726. drowse/web/dist/icons/tab-loading-dark-15.png +0 -0
  727. drowse/web/dist/icons/tab-loading-dark-16.png +0 -0
  728. drowse/web/dist/icons/tab-loading-dark-17.png +0 -0
  729. drowse/web/dist/icons/tab-loading-dark-18.png +0 -0
  730. drowse/web/dist/icons/tab-loading-dark-19.png +0 -0
  731. drowse/web/dist/icons/tab-loading-dark-2.png +0 -0
  732. drowse/web/dist/icons/tab-loading-dark-20.png +0 -0
  733. drowse/web/dist/icons/tab-loading-dark-21.png +0 -0
  734. drowse/web/dist/icons/tab-loading-dark-22.png +0 -0
  735. drowse/web/dist/icons/tab-loading-dark-23.png +0 -0
  736. drowse/web/dist/icons/tab-loading-dark-24.png +0 -0
  737. drowse/web/dist/icons/tab-loading-dark-25.png +0 -0
  738. drowse/web/dist/icons/tab-loading-dark-26.png +0 -0
  739. drowse/web/dist/icons/tab-loading-dark-27.png +0 -0
  740. drowse/web/dist/icons/tab-loading-dark-28.png +0 -0
  741. drowse/web/dist/icons/tab-loading-dark-29.png +0 -0
  742. drowse/web/dist/icons/tab-loading-dark-3.png +0 -0
  743. drowse/web/dist/icons/tab-loading-dark-30.png +0 -0
  744. drowse/web/dist/icons/tab-loading-dark-31.png +0 -0
  745. drowse/web/dist/icons/tab-loading-dark-32.png +0 -0
  746. drowse/web/dist/icons/tab-loading-dark-33.png +0 -0
  747. drowse/web/dist/icons/tab-loading-dark-34.png +0 -0
  748. drowse/web/dist/icons/tab-loading-dark-35.png +0 -0
  749. drowse/web/dist/icons/tab-loading-dark-36.png +0 -0
  750. drowse/web/dist/icons/tab-loading-dark-37.png +0 -0
  751. drowse/web/dist/icons/tab-loading-dark-38.png +0 -0
  752. drowse/web/dist/icons/tab-loading-dark-39.png +0 -0
  753. drowse/web/dist/icons/tab-loading-dark-4.png +0 -0
  754. drowse/web/dist/icons/tab-loading-dark-40.png +0 -0
  755. drowse/web/dist/icons/tab-loading-dark-41.png +0 -0
  756. drowse/web/dist/icons/tab-loading-dark-42.png +0 -0
  757. drowse/web/dist/icons/tab-loading-dark-43.png +0 -0
  758. drowse/web/dist/icons/tab-loading-dark-44.png +0 -0
  759. drowse/web/dist/icons/tab-loading-dark-45.png +0 -0
  760. drowse/web/dist/icons/tab-loading-dark-46.png +0 -0
  761. drowse/web/dist/icons/tab-loading-dark-47.png +0 -0
  762. drowse/web/dist/icons/tab-loading-dark-5.png +0 -0
  763. drowse/web/dist/icons/tab-loading-dark-6.png +0 -0
  764. drowse/web/dist/icons/tab-loading-dark-7.png +0 -0
  765. drowse/web/dist/icons/tab-loading-dark-8.png +0 -0
  766. drowse/web/dist/icons/tab-loading-dark-9.png +0 -0
  767. drowse/web/dist/icons/tab-loading-light-0.png +0 -0
  768. drowse/web/dist/icons/tab-loading-light-1.png +0 -0
  769. drowse/web/dist/icons/tab-loading-light-10.png +0 -0
  770. drowse/web/dist/icons/tab-loading-light-11.png +0 -0
  771. drowse/web/dist/icons/tab-loading-light-12.png +0 -0
  772. drowse/web/dist/icons/tab-loading-light-13.png +0 -0
  773. drowse/web/dist/icons/tab-loading-light-14.png +0 -0
  774. drowse/web/dist/icons/tab-loading-light-15.png +0 -0
  775. drowse/web/dist/icons/tab-loading-light-16.png +0 -0
  776. drowse/web/dist/icons/tab-loading-light-17.png +0 -0
  777. drowse/web/dist/icons/tab-loading-light-18.png +0 -0
  778. drowse/web/dist/icons/tab-loading-light-19.png +0 -0
  779. drowse/web/dist/icons/tab-loading-light-2.png +0 -0
  780. drowse/web/dist/icons/tab-loading-light-20.png +0 -0
  781. drowse/web/dist/icons/tab-loading-light-21.png +0 -0
  782. drowse/web/dist/icons/tab-loading-light-22.png +0 -0
  783. drowse/web/dist/icons/tab-loading-light-23.png +0 -0
  784. drowse/web/dist/icons/tab-loading-light-24.png +0 -0
  785. drowse/web/dist/icons/tab-loading-light-25.png +0 -0
  786. drowse/web/dist/icons/tab-loading-light-26.png +0 -0
  787. drowse/web/dist/icons/tab-loading-light-27.png +0 -0
  788. drowse/web/dist/icons/tab-loading-light-28.png +0 -0
  789. drowse/web/dist/icons/tab-loading-light-29.png +0 -0
  790. drowse/web/dist/icons/tab-loading-light-3.png +0 -0
  791. drowse/web/dist/icons/tab-loading-light-30.png +0 -0
  792. drowse/web/dist/icons/tab-loading-light-31.png +0 -0
  793. drowse/web/dist/icons/tab-loading-light-32.png +0 -0
  794. drowse/web/dist/icons/tab-loading-light-33.png +0 -0
  795. drowse/web/dist/icons/tab-loading-light-34.png +0 -0
  796. drowse/web/dist/icons/tab-loading-light-35.png +0 -0
  797. drowse/web/dist/icons/tab-loading-light-36.png +0 -0
  798. drowse/web/dist/icons/tab-loading-light-37.png +0 -0
  799. drowse/web/dist/icons/tab-loading-light-38.png +0 -0
  800. drowse/web/dist/icons/tab-loading-light-39.png +0 -0
  801. drowse/web/dist/icons/tab-loading-light-4.png +0 -0
  802. drowse/web/dist/icons/tab-loading-light-40.png +0 -0
  803. drowse/web/dist/icons/tab-loading-light-41.png +0 -0
  804. drowse/web/dist/icons/tab-loading-light-42.png +0 -0
  805. drowse/web/dist/icons/tab-loading-light-43.png +0 -0
  806. drowse/web/dist/icons/tab-loading-light-44.png +0 -0
  807. drowse/web/dist/icons/tab-loading-light-45.png +0 -0
  808. drowse/web/dist/icons/tab-loading-light-46.png +0 -0
  809. drowse/web/dist/icons/tab-loading-light-47.png +0 -0
  810. drowse/web/dist/icons/tab-loading-light-5.png +0 -0
  811. drowse/web/dist/icons/tab-loading-light-6.png +0 -0
  812. drowse/web/dist/icons/tab-loading-light-7.png +0 -0
  813. drowse/web/dist/icons/tab-loading-light-8.png +0 -0
  814. drowse/web/dist/icons/tab-loading-light-9.png +0 -0
  815. drowse/web/dist/icons/tab-loom-dark.png +0 -0
  816. drowse/web/dist/icons/tab-loom-light.png +0 -0
  817. drowse/web/dist/icons/tab-loom-working-0.png +0 -0
  818. drowse/web/dist/icons/tab-loom-working-1.png +0 -0
  819. drowse/web/dist/icons/tab-loom-working-2.png +0 -0
  820. drowse/web/dist/icons/tab-loom-working-dark-0.png +0 -0
  821. drowse/web/dist/icons/tab-loom-working-dark-1.png +0 -0
  822. drowse/web/dist/icons/tab-loom-working-dark-10.png +0 -0
  823. drowse/web/dist/icons/tab-loom-working-dark-11.png +0 -0
  824. drowse/web/dist/icons/tab-loom-working-dark-12.png +0 -0
  825. drowse/web/dist/icons/tab-loom-working-dark-13.png +0 -0
  826. drowse/web/dist/icons/tab-loom-working-dark-14.png +0 -0
  827. drowse/web/dist/icons/tab-loom-working-dark-15.png +0 -0
  828. drowse/web/dist/icons/tab-loom-working-dark-16.png +0 -0
  829. drowse/web/dist/icons/tab-loom-working-dark-17.png +0 -0
  830. drowse/web/dist/icons/tab-loom-working-dark-18.png +0 -0
  831. drowse/web/dist/icons/tab-loom-working-dark-19.png +0 -0
  832. drowse/web/dist/icons/tab-loom-working-dark-2.png +0 -0
  833. drowse/web/dist/icons/tab-loom-working-dark-20.png +0 -0
  834. drowse/web/dist/icons/tab-loom-working-dark-21.png +0 -0
  835. drowse/web/dist/icons/tab-loom-working-dark-22.png +0 -0
  836. drowse/web/dist/icons/tab-loom-working-dark-23.png +0 -0
  837. drowse/web/dist/icons/tab-loom-working-dark-24.png +0 -0
  838. drowse/web/dist/icons/tab-loom-working-dark-25.png +0 -0
  839. drowse/web/dist/icons/tab-loom-working-dark-26.png +0 -0
  840. drowse/web/dist/icons/tab-loom-working-dark-27.png +0 -0
  841. drowse/web/dist/icons/tab-loom-working-dark-28.png +0 -0
  842. drowse/web/dist/icons/tab-loom-working-dark-29.png +0 -0
  843. drowse/web/dist/icons/tab-loom-working-dark-3.png +0 -0
  844. drowse/web/dist/icons/tab-loom-working-dark-30.png +0 -0
  845. drowse/web/dist/icons/tab-loom-working-dark-31.png +0 -0
  846. drowse/web/dist/icons/tab-loom-working-dark-32.png +0 -0
  847. drowse/web/dist/icons/tab-loom-working-dark-33.png +0 -0
  848. drowse/web/dist/icons/tab-loom-working-dark-34.png +0 -0
  849. drowse/web/dist/icons/tab-loom-working-dark-35.png +0 -0
  850. drowse/web/dist/icons/tab-loom-working-dark-36.png +0 -0
  851. drowse/web/dist/icons/tab-loom-working-dark-37.png +0 -0
  852. drowse/web/dist/icons/tab-loom-working-dark-38.png +0 -0
  853. drowse/web/dist/icons/tab-loom-working-dark-39.png +0 -0
  854. drowse/web/dist/icons/tab-loom-working-dark-4.png +0 -0
  855. drowse/web/dist/icons/tab-loom-working-dark-40.png +0 -0
  856. drowse/web/dist/icons/tab-loom-working-dark-41.png +0 -0
  857. drowse/web/dist/icons/tab-loom-working-dark-42.png +0 -0
  858. drowse/web/dist/icons/tab-loom-working-dark-43.png +0 -0
  859. drowse/web/dist/icons/tab-loom-working-dark-44.png +0 -0
  860. drowse/web/dist/icons/tab-loom-working-dark-45.png +0 -0
  861. drowse/web/dist/icons/tab-loom-working-dark-46.png +0 -0
  862. drowse/web/dist/icons/tab-loom-working-dark-47.png +0 -0
  863. drowse/web/dist/icons/tab-loom-working-dark-5.png +0 -0
  864. drowse/web/dist/icons/tab-loom-working-dark-6.png +0 -0
  865. drowse/web/dist/icons/tab-loom-working-dark-7.png +0 -0
  866. drowse/web/dist/icons/tab-loom-working-dark-8.png +0 -0
  867. drowse/web/dist/icons/tab-loom-working-dark-9.png +0 -0
  868. drowse/web/dist/icons/tab-loom-working-light-0.png +0 -0
  869. drowse/web/dist/icons/tab-loom-working-light-1.png +0 -0
  870. drowse/web/dist/icons/tab-loom-working-light-10.png +0 -0
  871. drowse/web/dist/icons/tab-loom-working-light-11.png +0 -0
  872. drowse/web/dist/icons/tab-loom-working-light-12.png +0 -0
  873. drowse/web/dist/icons/tab-loom-working-light-13.png +0 -0
  874. drowse/web/dist/icons/tab-loom-working-light-14.png +0 -0
  875. drowse/web/dist/icons/tab-loom-working-light-15.png +0 -0
  876. drowse/web/dist/icons/tab-loom-working-light-16.png +0 -0
  877. drowse/web/dist/icons/tab-loom-working-light-17.png +0 -0
  878. drowse/web/dist/icons/tab-loom-working-light-18.png +0 -0
  879. drowse/web/dist/icons/tab-loom-working-light-19.png +0 -0
  880. drowse/web/dist/icons/tab-loom-working-light-2.png +0 -0
  881. drowse/web/dist/icons/tab-loom-working-light-20.png +0 -0
  882. drowse/web/dist/icons/tab-loom-working-light-21.png +0 -0
  883. drowse/web/dist/icons/tab-loom-working-light-22.png +0 -0
  884. drowse/web/dist/icons/tab-loom-working-light-23.png +0 -0
  885. drowse/web/dist/icons/tab-loom-working-light-24.png +0 -0
  886. drowse/web/dist/icons/tab-loom-working-light-25.png +0 -0
  887. drowse/web/dist/icons/tab-loom-working-light-26.png +0 -0
  888. drowse/web/dist/icons/tab-loom-working-light-27.png +0 -0
  889. drowse/web/dist/icons/tab-loom-working-light-28.png +0 -0
  890. drowse/web/dist/icons/tab-loom-working-light-29.png +0 -0
  891. drowse/web/dist/icons/tab-loom-working-light-3.png +0 -0
  892. drowse/web/dist/icons/tab-loom-working-light-30.png +0 -0
  893. drowse/web/dist/icons/tab-loom-working-light-31.png +0 -0
  894. drowse/web/dist/icons/tab-loom-working-light-32.png +0 -0
  895. drowse/web/dist/icons/tab-loom-working-light-33.png +0 -0
  896. drowse/web/dist/icons/tab-loom-working-light-34.png +0 -0
  897. drowse/web/dist/icons/tab-loom-working-light-35.png +0 -0
  898. drowse/web/dist/icons/tab-loom-working-light-36.png +0 -0
  899. drowse/web/dist/icons/tab-loom-working-light-37.png +0 -0
  900. drowse/web/dist/icons/tab-loom-working-light-38.png +0 -0
  901. drowse/web/dist/icons/tab-loom-working-light-39.png +0 -0
  902. drowse/web/dist/icons/tab-loom-working-light-4.png +0 -0
  903. drowse/web/dist/icons/tab-loom-working-light-40.png +0 -0
  904. drowse/web/dist/icons/tab-loom-working-light-41.png +0 -0
  905. drowse/web/dist/icons/tab-loom-working-light-42.png +0 -0
  906. drowse/web/dist/icons/tab-loom-working-light-43.png +0 -0
  907. drowse/web/dist/icons/tab-loom-working-light-44.png +0 -0
  908. drowse/web/dist/icons/tab-loom-working-light-45.png +0 -0
  909. drowse/web/dist/icons/tab-loom-working-light-46.png +0 -0
  910. drowse/web/dist/icons/tab-loom-working-light-47.png +0 -0
  911. drowse/web/dist/icons/tab-loom-working-light-5.png +0 -0
  912. drowse/web/dist/icons/tab-loom-working-light-6.png +0 -0
  913. drowse/web/dist/icons/tab-loom-working-light-7.png +0 -0
  914. drowse/web/dist/icons/tab-loom-working-light-8.png +0 -0
  915. drowse/web/dist/icons/tab-loom-working-light-9.png +0 -0
  916. drowse/web/dist/icons/tab-loom.png +0 -0
  917. drowse/web/dist/icons/tab-models-dark.png +0 -0
  918. drowse/web/dist/icons/tab-models-light.png +0 -0
  919. drowse/web/dist/icons/tab-models.png +0 -0
  920. drowse/web/dist/icons/tab-offline-dark.png +0 -0
  921. drowse/web/dist/icons/tab-offline-light.png +0 -0
  922. drowse/web/dist/icons/tab-offline.png +0 -0
  923. drowse/web/dist/icons/tab-paused-dark.png +0 -0
  924. drowse/web/dist/icons/tab-paused-light.png +0 -0
  925. drowse/web/dist/icons/tab-paused.png +0 -0
  926. drowse/web/dist/icons/tab-ready-dark.png +0 -0
  927. drowse/web/dist/icons/tab-ready-light.png +0 -0
  928. drowse/web/dist/icons/tab-ready.png +0 -0
  929. drowse/web/dist/icons/tab-saving-0.png +0 -0
  930. drowse/web/dist/icons/tab-saving-1.png +0 -0
  931. drowse/web/dist/icons/tab-saving-2.png +0 -0
  932. drowse/web/dist/icons/tab-saving-dark-0.png +0 -0
  933. drowse/web/dist/icons/tab-saving-dark-1.png +0 -0
  934. drowse/web/dist/icons/tab-saving-dark-10.png +0 -0
  935. drowse/web/dist/icons/tab-saving-dark-11.png +0 -0
  936. drowse/web/dist/icons/tab-saving-dark-12.png +0 -0
  937. drowse/web/dist/icons/tab-saving-dark-13.png +0 -0
  938. drowse/web/dist/icons/tab-saving-dark-14.png +0 -0
  939. drowse/web/dist/icons/tab-saving-dark-15.png +0 -0
  940. drowse/web/dist/icons/tab-saving-dark-16.png +0 -0
  941. drowse/web/dist/icons/tab-saving-dark-17.png +0 -0
  942. drowse/web/dist/icons/tab-saving-dark-18.png +0 -0
  943. drowse/web/dist/icons/tab-saving-dark-19.png +0 -0
  944. drowse/web/dist/icons/tab-saving-dark-2.png +0 -0
  945. drowse/web/dist/icons/tab-saving-dark-20.png +0 -0
  946. drowse/web/dist/icons/tab-saving-dark-21.png +0 -0
  947. drowse/web/dist/icons/tab-saving-dark-22.png +0 -0
  948. drowse/web/dist/icons/tab-saving-dark-23.png +0 -0
  949. drowse/web/dist/icons/tab-saving-dark-24.png +0 -0
  950. drowse/web/dist/icons/tab-saving-dark-25.png +0 -0
  951. drowse/web/dist/icons/tab-saving-dark-26.png +0 -0
  952. drowse/web/dist/icons/tab-saving-dark-27.png +0 -0
  953. drowse/web/dist/icons/tab-saving-dark-28.png +0 -0
  954. drowse/web/dist/icons/tab-saving-dark-29.png +0 -0
  955. drowse/web/dist/icons/tab-saving-dark-3.png +0 -0
  956. drowse/web/dist/icons/tab-saving-dark-30.png +0 -0
  957. drowse/web/dist/icons/tab-saving-dark-31.png +0 -0
  958. drowse/web/dist/icons/tab-saving-dark-32.png +0 -0
  959. drowse/web/dist/icons/tab-saving-dark-33.png +0 -0
  960. drowse/web/dist/icons/tab-saving-dark-34.png +0 -0
  961. drowse/web/dist/icons/tab-saving-dark-35.png +0 -0
  962. drowse/web/dist/icons/tab-saving-dark-36.png +0 -0
  963. drowse/web/dist/icons/tab-saving-dark-37.png +0 -0
  964. drowse/web/dist/icons/tab-saving-dark-38.png +0 -0
  965. drowse/web/dist/icons/tab-saving-dark-39.png +0 -0
  966. drowse/web/dist/icons/tab-saving-dark-4.png +0 -0
  967. drowse/web/dist/icons/tab-saving-dark-40.png +0 -0
  968. drowse/web/dist/icons/tab-saving-dark-41.png +0 -0
  969. drowse/web/dist/icons/tab-saving-dark-42.png +0 -0
  970. drowse/web/dist/icons/tab-saving-dark-43.png +0 -0
  971. drowse/web/dist/icons/tab-saving-dark-44.png +0 -0
  972. drowse/web/dist/icons/tab-saving-dark-45.png +0 -0
  973. drowse/web/dist/icons/tab-saving-dark-46.png +0 -0
  974. drowse/web/dist/icons/tab-saving-dark-47.png +0 -0
  975. drowse/web/dist/icons/tab-saving-dark-5.png +0 -0
  976. drowse/web/dist/icons/tab-saving-dark-6.png +0 -0
  977. drowse/web/dist/icons/tab-saving-dark-7.png +0 -0
  978. drowse/web/dist/icons/tab-saving-dark-8.png +0 -0
  979. drowse/web/dist/icons/tab-saving-dark-9.png +0 -0
  980. drowse/web/dist/icons/tab-saving-light-0.png +0 -0
  981. drowse/web/dist/icons/tab-saving-light-1.png +0 -0
  982. drowse/web/dist/icons/tab-saving-light-10.png +0 -0
  983. drowse/web/dist/icons/tab-saving-light-11.png +0 -0
  984. drowse/web/dist/icons/tab-saving-light-12.png +0 -0
  985. drowse/web/dist/icons/tab-saving-light-13.png +0 -0
  986. drowse/web/dist/icons/tab-saving-light-14.png +0 -0
  987. drowse/web/dist/icons/tab-saving-light-15.png +0 -0
  988. drowse/web/dist/icons/tab-saving-light-16.png +0 -0
  989. drowse/web/dist/icons/tab-saving-light-17.png +0 -0
  990. drowse/web/dist/icons/tab-saving-light-18.png +0 -0
  991. drowse/web/dist/icons/tab-saving-light-19.png +0 -0
  992. drowse/web/dist/icons/tab-saving-light-2.png +0 -0
  993. drowse/web/dist/icons/tab-saving-light-20.png +0 -0
  994. drowse/web/dist/icons/tab-saving-light-21.png +0 -0
  995. drowse/web/dist/icons/tab-saving-light-22.png +0 -0
  996. drowse/web/dist/icons/tab-saving-light-23.png +0 -0
  997. drowse/web/dist/icons/tab-saving-light-24.png +0 -0
  998. drowse/web/dist/icons/tab-saving-light-25.png +0 -0
  999. drowse/web/dist/icons/tab-saving-light-26.png +0 -0
  1000. drowse/web/dist/icons/tab-saving-light-27.png +0 -0
  1001. drowse/web/dist/icons/tab-saving-light-28.png +0 -0
  1002. drowse/web/dist/icons/tab-saving-light-29.png +0 -0
  1003. drowse/web/dist/icons/tab-saving-light-3.png +0 -0
  1004. drowse/web/dist/icons/tab-saving-light-30.png +0 -0
  1005. drowse/web/dist/icons/tab-saving-light-31.png +0 -0
  1006. drowse/web/dist/icons/tab-saving-light-32.png +0 -0
  1007. drowse/web/dist/icons/tab-saving-light-33.png +0 -0
  1008. drowse/web/dist/icons/tab-saving-light-34.png +0 -0
  1009. drowse/web/dist/icons/tab-saving-light-35.png +0 -0
  1010. drowse/web/dist/icons/tab-saving-light-36.png +0 -0
  1011. drowse/web/dist/icons/tab-saving-light-37.png +0 -0
  1012. drowse/web/dist/icons/tab-saving-light-38.png +0 -0
  1013. drowse/web/dist/icons/tab-saving-light-39.png +0 -0
  1014. drowse/web/dist/icons/tab-saving-light-4.png +0 -0
  1015. drowse/web/dist/icons/tab-saving-light-40.png +0 -0
  1016. drowse/web/dist/icons/tab-saving-light-41.png +0 -0
  1017. drowse/web/dist/icons/tab-saving-light-42.png +0 -0
  1018. drowse/web/dist/icons/tab-saving-light-43.png +0 -0
  1019. drowse/web/dist/icons/tab-saving-light-44.png +0 -0
  1020. drowse/web/dist/icons/tab-saving-light-45.png +0 -0
  1021. drowse/web/dist/icons/tab-saving-light-46.png +0 -0
  1022. drowse/web/dist/icons/tab-saving-light-47.png +0 -0
  1023. drowse/web/dist/icons/tab-saving-light-5.png +0 -0
  1024. drowse/web/dist/icons/tab-saving-light-6.png +0 -0
  1025. drowse/web/dist/icons/tab-saving-light-7.png +0 -0
  1026. drowse/web/dist/icons/tab-saving-light-8.png +0 -0
  1027. drowse/web/dist/icons/tab-saving-light-9.png +0 -0
  1028. drowse/web/dist/icons/tab-thinking-0.png +0 -0
  1029. drowse/web/dist/icons/tab-thinking-1.png +0 -0
  1030. drowse/web/dist/icons/tab-thinking-2.png +0 -0
  1031. drowse/web/dist/icons/tab-thinking-dark-0.png +0 -0
  1032. drowse/web/dist/icons/tab-thinking-dark-1.png +0 -0
  1033. drowse/web/dist/icons/tab-thinking-dark-10.png +0 -0
  1034. drowse/web/dist/icons/tab-thinking-dark-11.png +0 -0
  1035. drowse/web/dist/icons/tab-thinking-dark-12.png +0 -0
  1036. drowse/web/dist/icons/tab-thinking-dark-13.png +0 -0
  1037. drowse/web/dist/icons/tab-thinking-dark-14.png +0 -0
  1038. drowse/web/dist/icons/tab-thinking-dark-15.png +0 -0
  1039. drowse/web/dist/icons/tab-thinking-dark-16.png +0 -0
  1040. drowse/web/dist/icons/tab-thinking-dark-17.png +0 -0
  1041. drowse/web/dist/icons/tab-thinking-dark-18.png +0 -0
  1042. drowse/web/dist/icons/tab-thinking-dark-19.png +0 -0
  1043. drowse/web/dist/icons/tab-thinking-dark-2.png +0 -0
  1044. drowse/web/dist/icons/tab-thinking-dark-20.png +0 -0
  1045. drowse/web/dist/icons/tab-thinking-dark-21.png +0 -0
  1046. drowse/web/dist/icons/tab-thinking-dark-22.png +0 -0
  1047. drowse/web/dist/icons/tab-thinking-dark-23.png +0 -0
  1048. drowse/web/dist/icons/tab-thinking-dark-24.png +0 -0
  1049. drowse/web/dist/icons/tab-thinking-dark-25.png +0 -0
  1050. drowse/web/dist/icons/tab-thinking-dark-26.png +0 -0
  1051. drowse/web/dist/icons/tab-thinking-dark-27.png +0 -0
  1052. drowse/web/dist/icons/tab-thinking-dark-28.png +0 -0
  1053. drowse/web/dist/icons/tab-thinking-dark-29.png +0 -0
  1054. drowse/web/dist/icons/tab-thinking-dark-3.png +0 -0
  1055. drowse/web/dist/icons/tab-thinking-dark-30.png +0 -0
  1056. drowse/web/dist/icons/tab-thinking-dark-31.png +0 -0
  1057. drowse/web/dist/icons/tab-thinking-dark-32.png +0 -0
  1058. drowse/web/dist/icons/tab-thinking-dark-33.png +0 -0
  1059. drowse/web/dist/icons/tab-thinking-dark-34.png +0 -0
  1060. drowse/web/dist/icons/tab-thinking-dark-35.png +0 -0
  1061. drowse/web/dist/icons/tab-thinking-dark-36.png +0 -0
  1062. drowse/web/dist/icons/tab-thinking-dark-37.png +0 -0
  1063. drowse/web/dist/icons/tab-thinking-dark-38.png +0 -0
  1064. drowse/web/dist/icons/tab-thinking-dark-39.png +0 -0
  1065. drowse/web/dist/icons/tab-thinking-dark-4.png +0 -0
  1066. drowse/web/dist/icons/tab-thinking-dark-40.png +0 -0
  1067. drowse/web/dist/icons/tab-thinking-dark-41.png +0 -0
  1068. drowse/web/dist/icons/tab-thinking-dark-42.png +0 -0
  1069. drowse/web/dist/icons/tab-thinking-dark-43.png +0 -0
  1070. drowse/web/dist/icons/tab-thinking-dark-44.png +0 -0
  1071. drowse/web/dist/icons/tab-thinking-dark-45.png +0 -0
  1072. drowse/web/dist/icons/tab-thinking-dark-46.png +0 -0
  1073. drowse/web/dist/icons/tab-thinking-dark-47.png +0 -0
  1074. drowse/web/dist/icons/tab-thinking-dark-5.png +0 -0
  1075. drowse/web/dist/icons/tab-thinking-dark-6.png +0 -0
  1076. drowse/web/dist/icons/tab-thinking-dark-7.png +0 -0
  1077. drowse/web/dist/icons/tab-thinking-dark-8.png +0 -0
  1078. drowse/web/dist/icons/tab-thinking-dark-9.png +0 -0
  1079. drowse/web/dist/icons/tab-thinking-light-0.png +0 -0
  1080. drowse/web/dist/icons/tab-thinking-light-1.png +0 -0
  1081. drowse/web/dist/icons/tab-thinking-light-10.png +0 -0
  1082. drowse/web/dist/icons/tab-thinking-light-11.png +0 -0
  1083. drowse/web/dist/icons/tab-thinking-light-12.png +0 -0
  1084. drowse/web/dist/icons/tab-thinking-light-13.png +0 -0
  1085. drowse/web/dist/icons/tab-thinking-light-14.png +0 -0
  1086. drowse/web/dist/icons/tab-thinking-light-15.png +0 -0
  1087. drowse/web/dist/icons/tab-thinking-light-16.png +0 -0
  1088. drowse/web/dist/icons/tab-thinking-light-17.png +0 -0
  1089. drowse/web/dist/icons/tab-thinking-light-18.png +0 -0
  1090. drowse/web/dist/icons/tab-thinking-light-19.png +0 -0
  1091. drowse/web/dist/icons/tab-thinking-light-2.png +0 -0
  1092. drowse/web/dist/icons/tab-thinking-light-20.png +0 -0
  1093. drowse/web/dist/icons/tab-thinking-light-21.png +0 -0
  1094. drowse/web/dist/icons/tab-thinking-light-22.png +0 -0
  1095. drowse/web/dist/icons/tab-thinking-light-23.png +0 -0
  1096. drowse/web/dist/icons/tab-thinking-light-24.png +0 -0
  1097. drowse/web/dist/icons/tab-thinking-light-25.png +0 -0
  1098. drowse/web/dist/icons/tab-thinking-light-26.png +0 -0
  1099. drowse/web/dist/icons/tab-thinking-light-27.png +0 -0
  1100. drowse/web/dist/icons/tab-thinking-light-28.png +0 -0
  1101. drowse/web/dist/icons/tab-thinking-light-29.png +0 -0
  1102. drowse/web/dist/icons/tab-thinking-light-3.png +0 -0
  1103. drowse/web/dist/icons/tab-thinking-light-30.png +0 -0
  1104. drowse/web/dist/icons/tab-thinking-light-31.png +0 -0
  1105. drowse/web/dist/icons/tab-thinking-light-32.png +0 -0
  1106. drowse/web/dist/icons/tab-thinking-light-33.png +0 -0
  1107. drowse/web/dist/icons/tab-thinking-light-34.png +0 -0
  1108. drowse/web/dist/icons/tab-thinking-light-35.png +0 -0
  1109. drowse/web/dist/icons/tab-thinking-light-36.png +0 -0
  1110. drowse/web/dist/icons/tab-thinking-light-37.png +0 -0
  1111. drowse/web/dist/icons/tab-thinking-light-38.png +0 -0
  1112. drowse/web/dist/icons/tab-thinking-light-39.png +0 -0
  1113. drowse/web/dist/icons/tab-thinking-light-4.png +0 -0
  1114. drowse/web/dist/icons/tab-thinking-light-40.png +0 -0
  1115. drowse/web/dist/icons/tab-thinking-light-41.png +0 -0
  1116. drowse/web/dist/icons/tab-thinking-light-42.png +0 -0
  1117. drowse/web/dist/icons/tab-thinking-light-43.png +0 -0
  1118. drowse/web/dist/icons/tab-thinking-light-44.png +0 -0
  1119. drowse/web/dist/icons/tab-thinking-light-45.png +0 -0
  1120. drowse/web/dist/icons/tab-thinking-light-46.png +0 -0
  1121. drowse/web/dist/icons/tab-thinking-light-47.png +0 -0
  1122. drowse/web/dist/icons/tab-thinking-light-5.png +0 -0
  1123. drowse/web/dist/icons/tab-thinking-light-6.png +0 -0
  1124. drowse/web/dist/icons/tab-thinking-light-7.png +0 -0
  1125. drowse/web/dist/icons/tab-thinking-light-8.png +0 -0
  1126. drowse/web/dist/icons/tab-thinking-light-9.png +0 -0
  1127. drowse/web/dist/icons/tab-tokens-dark.png +0 -0
  1128. drowse/web/dist/icons/tab-tokens-light.png +0 -0
  1129. drowse/web/dist/icons/tab-tokens.png +0 -0
  1130. drowse/web/dist/icons/tab-training-0.png +0 -0
  1131. drowse/web/dist/icons/tab-training-1.png +0 -0
  1132. drowse/web/dist/icons/tab-training-2.png +0 -0
  1133. drowse/web/dist/icons/tab-training-dark-0.png +0 -0
  1134. drowse/web/dist/icons/tab-training-dark-1.png +0 -0
  1135. drowse/web/dist/icons/tab-training-dark-10.png +0 -0
  1136. drowse/web/dist/icons/tab-training-dark-11.png +0 -0
  1137. drowse/web/dist/icons/tab-training-dark-12.png +0 -0
  1138. drowse/web/dist/icons/tab-training-dark-13.png +0 -0
  1139. drowse/web/dist/icons/tab-training-dark-14.png +0 -0
  1140. drowse/web/dist/icons/tab-training-dark-15.png +0 -0
  1141. drowse/web/dist/icons/tab-training-dark-16.png +0 -0
  1142. drowse/web/dist/icons/tab-training-dark-17.png +0 -0
  1143. drowse/web/dist/icons/tab-training-dark-18.png +0 -0
  1144. drowse/web/dist/icons/tab-training-dark-19.png +0 -0
  1145. drowse/web/dist/icons/tab-training-dark-2.png +0 -0
  1146. drowse/web/dist/icons/tab-training-dark-20.png +0 -0
  1147. drowse/web/dist/icons/tab-training-dark-21.png +0 -0
  1148. drowse/web/dist/icons/tab-training-dark-22.png +0 -0
  1149. drowse/web/dist/icons/tab-training-dark-23.png +0 -0
  1150. drowse/web/dist/icons/tab-training-dark-24.png +0 -0
  1151. drowse/web/dist/icons/tab-training-dark-25.png +0 -0
  1152. drowse/web/dist/icons/tab-training-dark-26.png +0 -0
  1153. drowse/web/dist/icons/tab-training-dark-27.png +0 -0
  1154. drowse/web/dist/icons/tab-training-dark-28.png +0 -0
  1155. drowse/web/dist/icons/tab-training-dark-29.png +0 -0
  1156. drowse/web/dist/icons/tab-training-dark-3.png +0 -0
  1157. drowse/web/dist/icons/tab-training-dark-30.png +0 -0
  1158. drowse/web/dist/icons/tab-training-dark-31.png +0 -0
  1159. drowse/web/dist/icons/tab-training-dark-32.png +0 -0
  1160. drowse/web/dist/icons/tab-training-dark-33.png +0 -0
  1161. drowse/web/dist/icons/tab-training-dark-34.png +0 -0
  1162. drowse/web/dist/icons/tab-training-dark-35.png +0 -0
  1163. drowse/web/dist/icons/tab-training-dark-36.png +0 -0
  1164. drowse/web/dist/icons/tab-training-dark-37.png +0 -0
  1165. drowse/web/dist/icons/tab-training-dark-38.png +0 -0
  1166. drowse/web/dist/icons/tab-training-dark-39.png +0 -0
  1167. drowse/web/dist/icons/tab-training-dark-4.png +0 -0
  1168. drowse/web/dist/icons/tab-training-dark-40.png +0 -0
  1169. drowse/web/dist/icons/tab-training-dark-41.png +0 -0
  1170. drowse/web/dist/icons/tab-training-dark-42.png +0 -0
  1171. drowse/web/dist/icons/tab-training-dark-43.png +0 -0
  1172. drowse/web/dist/icons/tab-training-dark-44.png +0 -0
  1173. drowse/web/dist/icons/tab-training-dark-45.png +0 -0
  1174. drowse/web/dist/icons/tab-training-dark-46.png +0 -0
  1175. drowse/web/dist/icons/tab-training-dark-47.png +0 -0
  1176. drowse/web/dist/icons/tab-training-dark-5.png +0 -0
  1177. drowse/web/dist/icons/tab-training-dark-6.png +0 -0
  1178. drowse/web/dist/icons/tab-training-dark-7.png +0 -0
  1179. drowse/web/dist/icons/tab-training-dark-8.png +0 -0
  1180. drowse/web/dist/icons/tab-training-dark-9.png +0 -0
  1181. drowse/web/dist/icons/tab-training-light-0.png +0 -0
  1182. drowse/web/dist/icons/tab-training-light-1.png +0 -0
  1183. drowse/web/dist/icons/tab-training-light-10.png +0 -0
  1184. drowse/web/dist/icons/tab-training-light-11.png +0 -0
  1185. drowse/web/dist/icons/tab-training-light-12.png +0 -0
  1186. drowse/web/dist/icons/tab-training-light-13.png +0 -0
  1187. drowse/web/dist/icons/tab-training-light-14.png +0 -0
  1188. drowse/web/dist/icons/tab-training-light-15.png +0 -0
  1189. drowse/web/dist/icons/tab-training-light-16.png +0 -0
  1190. drowse/web/dist/icons/tab-training-light-17.png +0 -0
  1191. drowse/web/dist/icons/tab-training-light-18.png +0 -0
  1192. drowse/web/dist/icons/tab-training-light-19.png +0 -0
  1193. drowse/web/dist/icons/tab-training-light-2.png +0 -0
  1194. drowse/web/dist/icons/tab-training-light-20.png +0 -0
  1195. drowse/web/dist/icons/tab-training-light-21.png +0 -0
  1196. drowse/web/dist/icons/tab-training-light-22.png +0 -0
  1197. drowse/web/dist/icons/tab-training-light-23.png +0 -0
  1198. drowse/web/dist/icons/tab-training-light-24.png +0 -0
  1199. drowse/web/dist/icons/tab-training-light-25.png +0 -0
  1200. drowse/web/dist/icons/tab-training-light-26.png +0 -0
  1201. drowse/web/dist/icons/tab-training-light-27.png +0 -0
  1202. drowse/web/dist/icons/tab-training-light-28.png +0 -0
  1203. drowse/web/dist/icons/tab-training-light-29.png +0 -0
  1204. drowse/web/dist/icons/tab-training-light-3.png +0 -0
  1205. drowse/web/dist/icons/tab-training-light-30.png +0 -0
  1206. drowse/web/dist/icons/tab-training-light-31.png +0 -0
  1207. drowse/web/dist/icons/tab-training-light-32.png +0 -0
  1208. drowse/web/dist/icons/tab-training-light-33.png +0 -0
  1209. drowse/web/dist/icons/tab-training-light-34.png +0 -0
  1210. drowse/web/dist/icons/tab-training-light-35.png +0 -0
  1211. drowse/web/dist/icons/tab-training-light-36.png +0 -0
  1212. drowse/web/dist/icons/tab-training-light-37.png +0 -0
  1213. drowse/web/dist/icons/tab-training-light-38.png +0 -0
  1214. drowse/web/dist/icons/tab-training-light-39.png +0 -0
  1215. drowse/web/dist/icons/tab-training-light-4.png +0 -0
  1216. drowse/web/dist/icons/tab-training-light-40.png +0 -0
  1217. drowse/web/dist/icons/tab-training-light-41.png +0 -0
  1218. drowse/web/dist/icons/tab-training-light-42.png +0 -0
  1219. drowse/web/dist/icons/tab-training-light-43.png +0 -0
  1220. drowse/web/dist/icons/tab-training-light-44.png +0 -0
  1221. drowse/web/dist/icons/tab-training-light-45.png +0 -0
  1222. drowse/web/dist/icons/tab-training-light-46.png +0 -0
  1223. drowse/web/dist/icons/tab-training-light-47.png +0 -0
  1224. drowse/web/dist/icons/tab-training-light-5.png +0 -0
  1225. drowse/web/dist/icons/tab-training-light-6.png +0 -0
  1226. drowse/web/dist/icons/tab-training-light-7.png +0 -0
  1227. drowse/web/dist/icons/tab-training-light-8.png +0 -0
  1228. drowse/web/dist/icons/tab-training-light-9.png +0 -0
  1229. drowse/web/dist/icons/tab-unsupported-dark.png +0 -0
  1230. drowse/web/dist/icons/tab-unsupported-light.png +0 -0
  1231. drowse/web/dist/icons/tab-unsupported.png +0 -0
  1232. drowse/web/dist/icons/tab-working-0.png +0 -0
  1233. drowse/web/dist/icons/tab-working-1.png +0 -0
  1234. drowse/web/dist/icons/tab-working-2.png +0 -0
  1235. drowse/web/dist/icons/tab-working-dark-0.png +0 -0
  1236. drowse/web/dist/icons/tab-working-dark-1.png +0 -0
  1237. drowse/web/dist/icons/tab-working-dark-10.png +0 -0
  1238. drowse/web/dist/icons/tab-working-dark-11.png +0 -0
  1239. drowse/web/dist/icons/tab-working-dark-12.png +0 -0
  1240. drowse/web/dist/icons/tab-working-dark-13.png +0 -0
  1241. drowse/web/dist/icons/tab-working-dark-14.png +0 -0
  1242. drowse/web/dist/icons/tab-working-dark-15.png +0 -0
  1243. drowse/web/dist/icons/tab-working-dark-16.png +0 -0
  1244. drowse/web/dist/icons/tab-working-dark-17.png +0 -0
  1245. drowse/web/dist/icons/tab-working-dark-18.png +0 -0
  1246. drowse/web/dist/icons/tab-working-dark-19.png +0 -0
  1247. drowse/web/dist/icons/tab-working-dark-2.png +0 -0
  1248. drowse/web/dist/icons/tab-working-dark-20.png +0 -0
  1249. drowse/web/dist/icons/tab-working-dark-21.png +0 -0
  1250. drowse/web/dist/icons/tab-working-dark-22.png +0 -0
  1251. drowse/web/dist/icons/tab-working-dark-23.png +0 -0
  1252. drowse/web/dist/icons/tab-working-dark-24.png +0 -0
  1253. drowse/web/dist/icons/tab-working-dark-25.png +0 -0
  1254. drowse/web/dist/icons/tab-working-dark-26.png +0 -0
  1255. drowse/web/dist/icons/tab-working-dark-27.png +0 -0
  1256. drowse/web/dist/icons/tab-working-dark-28.png +0 -0
  1257. drowse/web/dist/icons/tab-working-dark-29.png +0 -0
  1258. drowse/web/dist/icons/tab-working-dark-3.png +0 -0
  1259. drowse/web/dist/icons/tab-working-dark-30.png +0 -0
  1260. drowse/web/dist/icons/tab-working-dark-31.png +0 -0
  1261. drowse/web/dist/icons/tab-working-dark-32.png +0 -0
  1262. drowse/web/dist/icons/tab-working-dark-33.png +0 -0
  1263. drowse/web/dist/icons/tab-working-dark-34.png +0 -0
  1264. drowse/web/dist/icons/tab-working-dark-35.png +0 -0
  1265. drowse/web/dist/icons/tab-working-dark-36.png +0 -0
  1266. drowse/web/dist/icons/tab-working-dark-37.png +0 -0
  1267. drowse/web/dist/icons/tab-working-dark-38.png +0 -0
  1268. drowse/web/dist/icons/tab-working-dark-39.png +0 -0
  1269. drowse/web/dist/icons/tab-working-dark-4.png +0 -0
  1270. drowse/web/dist/icons/tab-working-dark-40.png +0 -0
  1271. drowse/web/dist/icons/tab-working-dark-41.png +0 -0
  1272. drowse/web/dist/icons/tab-working-dark-42.png +0 -0
  1273. drowse/web/dist/icons/tab-working-dark-43.png +0 -0
  1274. drowse/web/dist/icons/tab-working-dark-44.png +0 -0
  1275. drowse/web/dist/icons/tab-working-dark-45.png +0 -0
  1276. drowse/web/dist/icons/tab-working-dark-46.png +0 -0
  1277. drowse/web/dist/icons/tab-working-dark-47.png +0 -0
  1278. drowse/web/dist/icons/tab-working-dark-5.png +0 -0
  1279. drowse/web/dist/icons/tab-working-dark-6.png +0 -0
  1280. drowse/web/dist/icons/tab-working-dark-7.png +0 -0
  1281. drowse/web/dist/icons/tab-working-dark-8.png +0 -0
  1282. drowse/web/dist/icons/tab-working-dark-9.png +0 -0
  1283. drowse/web/dist/icons/tab-working-light-0.png +0 -0
  1284. drowse/web/dist/icons/tab-working-light-1.png +0 -0
  1285. drowse/web/dist/icons/tab-working-light-10.png +0 -0
  1286. drowse/web/dist/icons/tab-working-light-11.png +0 -0
  1287. drowse/web/dist/icons/tab-working-light-12.png +0 -0
  1288. drowse/web/dist/icons/tab-working-light-13.png +0 -0
  1289. drowse/web/dist/icons/tab-working-light-14.png +0 -0
  1290. drowse/web/dist/icons/tab-working-light-15.png +0 -0
  1291. drowse/web/dist/icons/tab-working-light-16.png +0 -0
  1292. drowse/web/dist/icons/tab-working-light-17.png +0 -0
  1293. drowse/web/dist/icons/tab-working-light-18.png +0 -0
  1294. drowse/web/dist/icons/tab-working-light-19.png +0 -0
  1295. drowse/web/dist/icons/tab-working-light-2.png +0 -0
  1296. drowse/web/dist/icons/tab-working-light-20.png +0 -0
  1297. drowse/web/dist/icons/tab-working-light-21.png +0 -0
  1298. drowse/web/dist/icons/tab-working-light-22.png +0 -0
  1299. drowse/web/dist/icons/tab-working-light-23.png +0 -0
  1300. drowse/web/dist/icons/tab-working-light-24.png +0 -0
  1301. drowse/web/dist/icons/tab-working-light-25.png +0 -0
  1302. drowse/web/dist/icons/tab-working-light-26.png +0 -0
  1303. drowse/web/dist/icons/tab-working-light-27.png +0 -0
  1304. drowse/web/dist/icons/tab-working-light-28.png +0 -0
  1305. drowse/web/dist/icons/tab-working-light-29.png +0 -0
  1306. drowse/web/dist/icons/tab-working-light-3.png +0 -0
  1307. drowse/web/dist/icons/tab-working-light-30.png +0 -0
  1308. drowse/web/dist/icons/tab-working-light-31.png +0 -0
  1309. drowse/web/dist/icons/tab-working-light-32.png +0 -0
  1310. drowse/web/dist/icons/tab-working-light-33.png +0 -0
  1311. drowse/web/dist/icons/tab-working-light-34.png +0 -0
  1312. drowse/web/dist/icons/tab-working-light-35.png +0 -0
  1313. drowse/web/dist/icons/tab-working-light-36.png +0 -0
  1314. drowse/web/dist/icons/tab-working-light-37.png +0 -0
  1315. drowse/web/dist/icons/tab-working-light-38.png +0 -0
  1316. drowse/web/dist/icons/tab-working-light-39.png +0 -0
  1317. drowse/web/dist/icons/tab-working-light-4.png +0 -0
  1318. drowse/web/dist/icons/tab-working-light-40.png +0 -0
  1319. drowse/web/dist/icons/tab-working-light-41.png +0 -0
  1320. drowse/web/dist/icons/tab-working-light-42.png +0 -0
  1321. drowse/web/dist/icons/tab-working-light-43.png +0 -0
  1322. drowse/web/dist/icons/tab-working-light-44.png +0 -0
  1323. drowse/web/dist/icons/tab-working-light-45.png +0 -0
  1324. drowse/web/dist/icons/tab-working-light-46.png +0 -0
  1325. drowse/web/dist/icons/tab-working-light-47.png +0 -0
  1326. drowse/web/dist/icons/tab-working-light-5.png +0 -0
  1327. drowse/web/dist/icons/tab-working-light-6.png +0 -0
  1328. drowse/web/dist/icons/tab-working-light-7.png +0 -0
  1329. drowse/web/dist/icons/tab-working-light-8.png +0 -0
  1330. drowse/web/dist/icons/tab-working-light-9.png +0 -0
  1331. drowse/web/dist/index.html +34 -0
  1332. drowse/web/dist/social/drowse.png +0 -0
  1333. drowse/web/dist/social/drowse.svg +6 -0
  1334. drowse/web/dist/theme-init.js +25 -0
  1335. drowse/web/routes.py +118 -0
  1336. drowse_ai-5.3.1.dist-info/METADATA +632 -0
  1337. drowse_ai-5.3.1.dist-info/RECORD +1341 -0
  1338. drowse_ai-5.3.1.dist-info/WHEEL +5 -0
  1339. drowse_ai-5.3.1.dist-info/entry_points.txt +2 -0
  1340. drowse_ai-5.3.1.dist-info/licenses/LICENSE +661 -0
  1341. drowse_ai-5.3.1.dist-info/top_level.txt +1 -0
drowse/core/scene.py ADDED
@@ -0,0 +1,810 @@
1
+ """Scene rendering — the cast-model turn stitcher.
2
+
3
+ The cast model needs renders no
4
+ chat template can produce: arbitrary seat sequences (a/a/u/a/u/u), per-turn
5
+ cast labels, generation prompts on either seat. Gemma and Mistral templates
6
+ hard-raise on non-alternating roles, so ``apply_chat_template`` cannot be the
7
+ renderer — and hand-maintaining a per-family turn grammar would drift against
8
+ live templates (the failure mode ``RoleTemplateDriftError`` guards on the
9
+ splice path).
10
+
11
+ The resolution is **template autopsy**: render small sentinel-content probe
12
+ conversations through the *real* chat template once per model, locate the
13
+ sentinels, and mechanically slice out the segments — prelude, per-seat turn
14
+ wrappers (open / label site / close), the system-block shape (real turn vs
15
+ gemma-style fold into the first turn), and the generation-prompt appendix.
16
+ A scene then renders as pure **stitching**: ``open(seat, label) + content +
17
+ close(seat)`` per turn, plus a trailing generation header for whichever seat
18
+ speaks next. Labels are placed in headers we *construct*, so the stitcher
19
+ never occurrence-matches a rendered string at all — the label→turn binding is
20
+ positional by construction rather than recovered after the fact.
21
+
22
+ ``validate_turn_grammar`` is the load-bearing check: stitch canonical
23
+ alternating conversations and byte-compare against the template's own render.
24
+ A family that passes gets scene mode — and, because extraction renders
25
+ exactly such alternating conversations, routing extraction through the
26
+ stitcher is bit-identical to ``apply_chat_template`` (the baseline-match
27
+ contract holds with no manifold re-fit). A family that fails falls back to
28
+ raw-marker rendering (``render_scene_raw``) with a drift warning.
29
+
30
+ Thinking is a per-turn optional input on any seat (a9 convention, 2026-07-10):
31
+ rendered through the family think delimiters when supplied. History policy
32
+ follows the family template's own convention — when the template strips
33
+ thinking from prior turns (detected empirically by the autopsy), the stitcher
34
+ renders a turn's thinking only while that turn is the *last* before the
35
+ generation header ("lasts one turn"); non-strip families keep it everywhere.
36
+ """
37
+ from __future__ import annotations
38
+
39
+ from dataclasses import dataclass
40
+ from typing import Any, Literal
41
+
42
+ from drowse.core.errors import DrowseError
43
+ from drowse.core.role_templates import (
44
+ ROLE_HEADERS,
45
+ USER_ROLE_HEADERS,
46
+ RoleHeader,
47
+ render_role_label,
48
+ validate_role,
49
+ )
50
+
51
+ Seat = Literal["user", "assistant"]
52
+
53
+ # Sentinel contents for the autopsy probes. Single alphanumeric "words" so
54
+ # any reasonable template passes them through verbatim (no whitespace for a
55
+ # ``| trim`` filter to eat, nothing a Jinja escape would rewrite). A template
56
+ # that transforms them fails sentinel location and the family falls back —
57
+ # self-guarding, not silently wrong.
58
+ _S_SYS = "SKLSPROBESYS"
59
+ _S_U1 = "SKLSPROBEUONE"
60
+ _S_A1 = "SKLSPROBEAONE"
61
+ _S_U2 = "SKLSPROBEUTWO"
62
+ _S_THINK = "SKLSPROBETHK"
63
+ # Whitespace-padded sentinels for the content-trim probe: many templates
64
+ # apply ``| trim`` to message content (gemma, llama, qwen3.5) and the
65
+ # stitcher must reproduce it or diverge on whitespace-adorned content.
66
+ _S_PAD_U = " SKLSPADU "
67
+ _S_PAD_A = " SKLSPADA "
68
+ _S_PAD_S = " SKLSPADS "
69
+
70
+
71
+ class SceneRenderError(DrowseError, RuntimeError):
72
+ """A scene could not be rendered (bad seat, missing grammar support)."""
73
+
74
+ def user_message(self) -> tuple[int, str]:
75
+ return (400, str(self) or self.__class__.__name__)
76
+
77
+
78
+ class SceneGrammarError(SceneRenderError):
79
+ """Template autopsy or round-trip validation failed for this family.
80
+
81
+ Raised when the chat template's rendered bytes cannot be sliced into a
82
+ consistent turn grammar (unknown/label-free family, first-turn-special
83
+ template, sentinel transformation) or when the stitched reconstruction
84
+ diverges from the template's own render. Callers fall back to
85
+ :func:`render_scene_raw`.
86
+ """
87
+
88
+ def user_message(self) -> tuple[int, str]:
89
+ return (422, str(self) or self.__class__.__name__)
90
+
91
+
92
+ class SceneThinkingUnsupportedError(DrowseError, ValueError):
93
+ """A turn carries ``thinking`` but the grammar has no think delimiters."""
94
+
95
+ def user_message(self) -> tuple[int, str]:
96
+ return (400, str(self) or self.__class__.__name__)
97
+
98
+
99
+ @dataclass(frozen=True)
100
+ class SceneTurn:
101
+ """One line of a scene: ``(seat, label, text, thinking)``.
102
+
103
+ ``seat`` is the structural side rendered into the token stream (binary —
104
+ that is what the models' templates know). ``label`` is the cast label
105
+ spliced into the constructed header (``None`` = the family's standard
106
+ label for that seat). ``thinking`` is an optional verbatim reasoning
107
+ block rendered through the family think delimiters.
108
+ """
109
+
110
+ seat: Seat
111
+ text: str
112
+ label: str | None = None
113
+ thinking: str | None = None
114
+
115
+
116
+ @dataclass(frozen=True)
117
+ class SeatWrapper:
118
+ """The literal bytes a family wraps around one seat's turn.
119
+
120
+ ``open_before + <label> + open_after`` is the full turn header (the
121
+ ``open_after`` carries any post-header bytes beyond the registry's
122
+ ``RoleHeader.after``, e.g. llama's ``\\n\\n``); ``close`` is the
123
+ terminator. ``label`` is the family's standard label for the seat.
124
+ """
125
+
126
+ open_before: str
127
+ open_after: str
128
+ close: str
129
+ label: str
130
+
131
+ def open(self, label: str | None = None) -> str:
132
+ rendered = (
133
+ self.label if label is None else render_role_label(self.label, label)
134
+ )
135
+ return f"{self.open_before}{rendered}{self.open_after}"
136
+
137
+
138
+ @dataclass(frozen=True)
139
+ class SystemShape:
140
+ """A real system turn: ``before + content + after``."""
141
+
142
+ before: str
143
+ after: str
144
+
145
+
146
+ @dataclass(frozen=True)
147
+ class TurnGrammar:
148
+ """Per-model turn segments extracted from the live chat template."""
149
+
150
+ model_type: str
151
+ # Bytes before the first turn when no system prompt is given (BOS, any
152
+ # template-default system block — captured verbatim).
153
+ prelude: str
154
+ user: SeatWrapper
155
+ assistant: SeatWrapper
156
+ # At most one of the two system shapes is set: a real system turn, or a
157
+ # gemma-style fold (system content + ``system_fold_sep`` prepended to the
158
+ # first turn's content, whatever its seat — convention 1). Both ``None``
159
+ # = the family refuses the system role outright (gemma-2); rendering a
160
+ # scene with ``system=`` then raises, mirroring the template.
161
+ system: SystemShape | None
162
+ system_fold_sep: str | None
163
+
164
+ @property
165
+ def system_supported(self) -> bool:
166
+ return self.system is not None or self.system_fold_sep is not None
167
+ # Bytes ``add_generation_prompt`` appends beyond the assistant open
168
+ # (thinking scaffolds and the like), probed under ``enable_thinking=
169
+ # False`` when the template takes that kwarg (matching
170
+ # ``build_chat_input``'s default). ``gen_extra_thinking`` is the
171
+ # ``enable_thinking=True`` variant — equal to ``gen_extra`` when the
172
+ # template ignores the kwarg, ``None`` when the thinking-mode render
173
+ # defeated the slicer (rendering with ``gen_thinking=True`` then
174
+ # raises and the caller falls back to the template). User-seat
175
+ # generation prompts have no template analogue; they are the user
176
+ # open verbatim.
177
+ gen_extra: str
178
+ gen_extra_thinking: str | None = None
179
+ # Family think delimiters (caller-supplied; ``None`` = thinking input
180
+ # unsupported for this model) + the empirically-probed history policy.
181
+ think_open: str | None = None
182
+ think_close: str | None = None
183
+ strips_history_thinking: bool = False
184
+ # Whether the template trims turn content / system content (probed with
185
+ # whitespace-padded sentinels). Trim applies to the turn *text* before
186
+ # thinking/fold composition — gemma-3's fold keeps the system content
187
+ # raw while trimming the user text, so trim-then-compose is the
188
+ # template-faithful order.
189
+ content_trim: bool = False
190
+ system_trim: bool = False
191
+ # Some templates transform the final assistant turn of a closed render
192
+ # (qwen3 inserts an empty think scaffold into it). When set, a scene
193
+ # ending on an assistant seat with no generation prompt is not
194
+ # stitchable — callers fall back to the template (such renders are
195
+ # alternating-shaped in practice: capture triples, scoring).
196
+ last_assistant_special: bool = False
197
+
198
+ def seat(self, name: str) -> SeatWrapper:
199
+ # ``str``, not ``Seat`` — turns arrive from wire/loom surfaces, so
200
+ # the guard below is a real runtime check, not decoration.
201
+ if name == "user":
202
+ return self.user
203
+ if name == "assistant":
204
+ return self.assistant
205
+ raise SceneRenderError(
206
+ f"unknown seat {name!r}: a scene turn occupies 'user' or "
207
+ f"'assistant' (system content is the leading stage direction, "
208
+ f"not a seat)"
209
+ )
210
+
211
+
212
+ def _find_once(rendered: str, needle: str, *, what: str) -> int:
213
+ n = rendered.count(needle)
214
+ if n != 1:
215
+ raise SceneGrammarError(
216
+ f"template autopsy: expected exactly one occurrence of {what} "
217
+ f"({needle!r}), found {n} — the chat template transforms content "
218
+ f"or repeats it; scene mode unavailable for this family"
219
+ )
220
+ return rendered.index(needle)
221
+
222
+
223
+ def _render_probe(
224
+ tokenizer: Any,
225
+ messages: list[dict[str, str]],
226
+ *,
227
+ add_generation_prompt: bool,
228
+ **kwargs: Any,
229
+ ) -> str:
230
+ try:
231
+ rendered = tokenizer.apply_chat_template(
232
+ messages,
233
+ add_generation_prompt=add_generation_prompt,
234
+ tokenize=False,
235
+ **kwargs,
236
+ )
237
+ except Exception as exc: # noqa: BLE001 — any template failure = no scene mode
238
+ raise SceneGrammarError(
239
+ f"template autopsy: probe render failed: {exc}"
240
+ ) from exc
241
+ if not isinstance(rendered, str):
242
+ raise SceneGrammarError(
243
+ f"template autopsy: probe render returned "
244
+ f"{type(rendered).__name__}, expected str"
245
+ )
246
+ return rendered
247
+
248
+
249
+ def _split_header(
250
+ segment: str, header: RoleHeader, *, what: str
251
+ ) -> tuple[str, str]:
252
+ """Split ``segment`` at the start of ``header``'s standard pattern.
253
+
254
+ Returns ``(before_header, header_to_end)``. Uses the *last* occurrence —
255
+ the header nearest the content — so a template-default system block that
256
+ happens to contain role-header bytes lands in the preceding segment.
257
+ """
258
+ pattern = f"{header.before}{header.label}{header.after}"
259
+ idx = segment.rfind(pattern)
260
+ if idx < 0:
261
+ raise SceneGrammarError(
262
+ f"template autopsy: {what} header {pattern!r} not found in "
263
+ f"rendered segment {segment!r}"
264
+ )
265
+ return segment[:idx], segment[idx:]
266
+
267
+
268
+ def _wrapper_from_open(
269
+ open_full: str, header: RoleHeader, close: str
270
+ ) -> SeatWrapper:
271
+ # ``open_full`` starts with ``before + label`` by construction
272
+ # (``_split_header`` located that exact pattern).
273
+ return SeatWrapper(
274
+ open_before=header.before,
275
+ open_after=open_full[len(header.before) + len(header.label):],
276
+ close=close,
277
+ label=header.label,
278
+ )
279
+
280
+
281
+ def extract_turn_grammar(
282
+ tokenizer: Any,
283
+ model_type: str,
284
+ *,
285
+ think_delimiters: tuple[str, str] | None = None,
286
+ ) -> TurnGrammar:
287
+ """Autopsy the live chat template into a :class:`TurnGrammar`.
288
+
289
+ Renders sentinel-content probe conversations (all strictly alternating,
290
+ so even alternation-enforcing templates cooperate) and slices the
291
+ rendered strings into reusable segments. Raises
292
+ :class:`SceneGrammarError` when the family is label-free / unknown
293
+ (mistral) or the template's shape defeats the slicer (first-turn-special
294
+ wrappers, content transforms); callers fall back to
295
+ :func:`render_scene_raw`.
296
+
297
+ ``think_delimiters`` are **caller-supplied**: the family's ``(open,
298
+ close)`` reasoning-block marker strings, or ``None`` for "this family
299
+ cannot carry a committed thinking block". The stitcher renders a turn's
300
+ thinking as ``open + thinking + close`` ahead of the turn text, so the
301
+ contract is deliberately narrow — a literal string *pair* that brackets
302
+ the reasoning content in the family's own render. Section-style
303
+ reasoning channels (gpt-oss Harmony's ``<|channel|>analysis<|message|>``
304
+ …``<|end|>``) are not a bracketing pair and have no valid value here;
305
+ they stay ``None`` and the family carries no committed thinking.
306
+ ``TurnGrammar.think_open`` is ``None`` whenever the caller passes
307
+ ``None``, which is what makes
308
+ :class:`~drowse.core.scene.SceneThinkingUnsupportedError` fire on commit
309
+ and leaves a generated turn's ``thinking_text`` unstamped.
310
+
311
+ When a pair *is* supplied, an extra probe determines empirically whether
312
+ the template strips thinking from history, and the grammar's history
313
+ policy follows it (a9 convention 3); a template that chokes on the
314
+ embedded markers degrades to ``None`` rather than losing scene mode.
315
+ """
316
+ asst_header = ROLE_HEADERS.get(model_type)
317
+ user_header = USER_ROLE_HEADERS.get(model_type)
318
+ if asst_header is None or user_header is None:
319
+ raise SceneGrammarError(
320
+ f"scene mode is not supported for model_type {model_type!r}: "
321
+ f"family is label-free or not in the role-header registry"
322
+ )
323
+
324
+ base_msgs = [
325
+ {"role": "user", "content": _S_U1},
326
+ {"role": "assistant", "content": _S_A1},
327
+ {"role": "user", "content": _S_U2},
328
+ ]
329
+ # When the template takes ``enable_thinking``, every probe renders with
330
+ # it pinned False — matching ``build_chat_input``'s default path — and a
331
+ # separate probe pair recovers the True-variant generation appendix.
332
+ template_str = getattr(tokenizer, "chat_template", "") or ""
333
+ takes_thinking_kwarg = "enable_thinking" in template_str
334
+ render_kwargs: dict[str, Any] = (
335
+ {"enable_thinking": False} if takes_thinking_kwarg else {}
336
+ )
337
+ r0 = _render_probe(
338
+ tokenizer, base_msgs, add_generation_prompt=False, **render_kwargs
339
+ )
340
+ r1 = _render_probe(
341
+ tokenizer, base_msgs, add_generation_prompt=True, **render_kwargs
342
+ )
343
+ try:
344
+ rs: str | None = _render_probe(
345
+ tokenizer,
346
+ [{"role": "system", "content": _S_SYS}] + base_msgs[:2],
347
+ add_generation_prompt=False,
348
+ **render_kwargs,
349
+ )
350
+ except SceneGrammarError:
351
+ # A family whose template refuses the system role outright (gemma-2)
352
+ # keeps scene mode without system support — ``render_scene`` raises
353
+ # on a ``system=`` argument, mirroring the template's own behavior.
354
+ rs = None
355
+
356
+ i_u1 = _find_once(r0, _S_U1, what="user sentinel 1")
357
+ i_a1 = _find_once(r0, _S_A1, what="assistant sentinel")
358
+ i_u2 = _find_once(r0, _S_U2, what="user sentinel 2")
359
+ if not (i_u1 < i_a1 < i_u2):
360
+ raise SceneGrammarError(
361
+ "template autopsy: sentinel order diverges from message order"
362
+ )
363
+
364
+ # Slice the alternating render into prelude + wrappers.
365
+ prelude, user_open = _split_header(
366
+ r0[:i_u1], user_header, what="first user"
367
+ )
368
+ user_close, asst_open = _split_header(
369
+ r0[i_u1 + len(_S_U1):i_a1], asst_header, what="assistant"
370
+ )
371
+ asst_close, steady_user_open = _split_header(
372
+ r0[i_a1 + len(_S_A1):i_u2], user_header, what="steady-state user"
373
+ )
374
+ if steady_user_open != user_open:
375
+ raise SceneGrammarError(
376
+ f"template autopsy: first-turn user header {user_open!r} differs "
377
+ f"from steady-state {steady_user_open!r}; first-turn-special "
378
+ f"templates are not stitchable"
379
+ )
380
+ tail = r0[i_u2 + len(_S_U2):]
381
+ if tail != user_close:
382
+ raise SceneGrammarError(
383
+ f"template autopsy: trailing user close {tail!r} differs from "
384
+ f"mid-conversation close {user_close!r}"
385
+ )
386
+
387
+ # Generation prompt: whatever add_generation_prompt appends, split into
388
+ # the assistant open (label-swappable) + a fixed appendix.
389
+ if not r1.startswith(r0):
390
+ raise SceneGrammarError(
391
+ "template autopsy: the generation-prompt render is not an "
392
+ "extension of the plain render"
393
+ )
394
+ gen_append = r1[len(r0):]
395
+ if not gen_append.startswith(asst_open):
396
+ raise SceneGrammarError(
397
+ f"template autopsy: generation prompt {gen_append!r} does not "
398
+ f"begin with the assistant open {asst_open!r}"
399
+ )
400
+ gen_extra = gen_append[len(asst_open):]
401
+
402
+ # The ``enable_thinking=True`` generation appendix. Sliced from its own
403
+ # probe pair (thinking mode may reshape history too, so the False-mode
404
+ # ``r0`` is not a valid prefix reference). A slicing defeat degrades to
405
+ # ``None`` — thinking-mode stitching unsupported, not scene mode lost.
406
+ gen_extra_thinking: str | None = gen_extra
407
+ if takes_thinking_kwarg:
408
+ gen_extra_thinking = None
409
+ try:
410
+ r0t = _render_probe(
411
+ tokenizer, base_msgs, add_generation_prompt=False,
412
+ enable_thinking=True,
413
+ )
414
+ r1t = _render_probe(
415
+ tokenizer, base_msgs, add_generation_prompt=True,
416
+ enable_thinking=True,
417
+ )
418
+ # ``r0t == r0`` is required, not just prefix consistency: the
419
+ # stitched history always uses the False-mode wrappers, so a
420
+ # template that reshapes *history* under the flag cannot be
421
+ # reproduced in thinking mode at all.
422
+ if r0t == r0 and r1t.startswith(r0t):
423
+ gen_append_t = r1t[len(r0t):]
424
+ if gen_append_t.startswith(asst_open):
425
+ gen_extra_thinking = gen_append_t[len(asst_open):]
426
+ except SceneGrammarError:
427
+ pass
428
+
429
+ # System shape: a real turn (sentinel precedes the first user header) or
430
+ # a fold into the first turn's content (gemma).
431
+ system: SystemShape | None = None
432
+ system_fold_sep: str | None = None
433
+ if rs is not None:
434
+ _find_once(rs, _S_SYS, what="system sentinel")
435
+ i_u1s = _find_once(rs, _S_U1, what="user sentinel (system probe)")
436
+ sys_prefix, rest = _split_header(
437
+ rs[:i_u1s], user_header, what="user (system probe)"
438
+ )
439
+ if not rest.startswith(user_open):
440
+ raise SceneGrammarError(
441
+ "template autopsy: the user header changes shape when a "
442
+ "system prompt is present; not stitchable"
443
+ )
444
+ # ``after_open`` is what sits between the user open and the first
445
+ # user content: empty for a real-system-turn family, ``system +
446
+ # sep`` for a fold family (gemma).
447
+ after_open = rest[len(user_open):]
448
+ if _S_SYS in sys_prefix:
449
+ if after_open:
450
+ raise SceneGrammarError(
451
+ "template autopsy: system content appears both before "
452
+ "and inside the first turn; not stitchable"
453
+ )
454
+ j = sys_prefix.index(_S_SYS)
455
+ system = SystemShape(
456
+ before=sys_prefix[:j],
457
+ after=sys_prefix[j + len(_S_SYS):],
458
+ )
459
+ elif after_open.startswith(_S_SYS) and sys_prefix == prelude:
460
+ system_fold_sep = after_open[len(_S_SYS):]
461
+ else:
462
+ raise SceneGrammarError(
463
+ "template autopsy: system content lands neither in a leading "
464
+ "block nor at the head of the first turn; not stitchable"
465
+ )
466
+
467
+ # Content-trim probe: does the template ``| trim`` message content?
468
+ # The padded turns sit in *history* position (a plain user turn closes
469
+ # the probe) so a last-turn-special transform can't contaminate the
470
+ # trim verdict.
471
+ r_pad = _render_probe(
472
+ tokenizer,
473
+ [
474
+ {"role": "user", "content": _S_PAD_U},
475
+ {"role": "assistant", "content": _S_PAD_A},
476
+ {"role": "user", "content": _S_U2},
477
+ ],
478
+ add_generation_prompt=False,
479
+ **render_kwargs,
480
+ )
481
+ user_trim = _S_PAD_U not in r_pad
482
+ asst_trim = _S_PAD_A not in r_pad
483
+ if user_trim != asst_trim:
484
+ raise SceneGrammarError(
485
+ "template autopsy: the template trims one seat's content but "
486
+ "not the other's; not stitchable"
487
+ )
488
+ if user_trim and _S_PAD_U.strip() not in r_pad:
489
+ raise SceneGrammarError(
490
+ "template autopsy: content transformation is not a plain trim; "
491
+ "not stitchable"
492
+ )
493
+ content_trim = user_trim
494
+ system_trim = False
495
+ if system is not None:
496
+ rs_pad = _render_probe(
497
+ tokenizer,
498
+ [
499
+ {"role": "system", "content": _S_PAD_S},
500
+ {"role": "user", "content": _S_U1},
501
+ ],
502
+ add_generation_prompt=False,
503
+ **render_kwargs,
504
+ )
505
+ system_trim = _S_PAD_S not in rs_pad
506
+ if system_trim and _S_PAD_S.strip() not in rs_pad:
507
+ raise SceneGrammarError(
508
+ "template autopsy: system-content transformation is not a "
509
+ "plain trim; not stitchable"
510
+ )
511
+
512
+ # Last-assistant-turn probe: a closed render ending on an assistant
513
+ # turn may be transformed (qwen3's empty-think insert). Compare the
514
+ # template's own [user, assistant] render against the stitched
515
+ # reconstruction from the extracted wrappers.
516
+ r_last = _render_probe(
517
+ tokenizer,
518
+ [
519
+ {"role": "user", "content": _S_U1},
520
+ {"role": "assistant", "content": _S_A1},
521
+ ],
522
+ add_generation_prompt=False,
523
+ **render_kwargs,
524
+ )
525
+ last_assistant_special = r_last != (
526
+ f"{prelude}{user_open}{_S_U1}{user_close}"
527
+ f"{asst_open}{_S_A1}{asst_close}"
528
+ )
529
+
530
+ think_open: str | None = None
531
+ think_close: str | None = None
532
+ strips = False
533
+ if think_delimiters is not None:
534
+ think_open, think_close = think_delimiters
535
+ try:
536
+ rt = _render_probe(
537
+ tokenizer,
538
+ [
539
+ {"role": "user", "content": _S_U1},
540
+ {
541
+ "role": "assistant",
542
+ "content": f"{think_open}{_S_THINK}{think_close}{_S_A1}",
543
+ },
544
+ {"role": "user", "content": _S_U2},
545
+ ],
546
+ add_generation_prompt=True,
547
+ **render_kwargs,
548
+ )
549
+ strips = _S_THINK not in rt
550
+ except SceneGrammarError:
551
+ # A template that chokes on embedded think markers loses the
552
+ # thinking *feature*, not scene mode.
553
+ think_open = think_close = None
554
+
555
+ return TurnGrammar(
556
+ model_type=model_type,
557
+ prelude=prelude,
558
+ user=_wrapper_from_open(user_open, user_header, user_close),
559
+ assistant=_wrapper_from_open(asst_open, asst_header, asst_close),
560
+ system=system,
561
+ system_fold_sep=system_fold_sep,
562
+ gen_extra=gen_extra,
563
+ gen_extra_thinking=gen_extra_thinking,
564
+ think_open=think_open,
565
+ think_close=think_close,
566
+ strips_history_thinking=strips,
567
+ content_trim=content_trim,
568
+ system_trim=system_trim,
569
+ last_assistant_special=last_assistant_special,
570
+ )
571
+
572
+
573
+ def render_scene(
574
+ grammar: TurnGrammar,
575
+ turns: list[SceneTurn],
576
+ *,
577
+ system: str | None = None,
578
+ gen_seat: Seat | None = None,
579
+ gen_label: str | None = None,
580
+ gen_thinking: bool = False,
581
+ ) -> str:
582
+ """Stitch a scene into the exact string the model should ingest.
583
+
584
+ ``turns`` may occupy seats in any order — alternation is not required,
585
+ which is the point. ``gen_seat`` appends a trailing generation header
586
+ for the turn about to be generated (``gen_label`` is its cast label);
587
+ ``None`` renders a closed transcript (the extraction/capture shape).
588
+
589
+ Tokenize the result with ``add_special_tokens=False`` — the prelude
590
+ already carries whatever BOS the template emits (the same contract as
591
+ the splice path).
592
+ """
593
+ for turn in turns:
594
+ if turn.label is not None:
595
+ validate_role(turn.label)
596
+ if turn.thinking is not None and grammar.think_open is None:
597
+ raise SceneThinkingUnsupportedError(
598
+ f"model_type {grammar.model_type!r} has no thinking "
599
+ f"delimiters; a scene turn cannot carry a thinking block"
600
+ )
601
+ if gen_label is not None:
602
+ validate_role(gen_label)
603
+
604
+ parts: list[str] = []
605
+ fold: str | None = None
606
+ if system is not None and grammar.system is not None:
607
+ sys_content = system.strip() if grammar.system_trim else system
608
+ parts.append(
609
+ f"{grammar.system.before}{sys_content}{grammar.system.after}"
610
+ )
611
+ elif system is not None and grammar.system_fold_sep is not None:
612
+ # Fold family (convention 1): system content prepends into the first
613
+ # turn, whatever its seat.
614
+ parts.append(grammar.prelude)
615
+ fold = f"{system}{grammar.system_fold_sep}"
616
+ elif system is not None:
617
+ raise SceneRenderError(
618
+ f"model_type {grammar.model_type!r} does not support system "
619
+ f"prompts (the chat template refuses the system role)"
620
+ )
621
+ else:
622
+ parts.append(grammar.prelude)
623
+
624
+ last = len(turns) - 1
625
+ if (
626
+ turns
627
+ and gen_seat is None
628
+ and turns[-1].seat == "assistant"
629
+ and grammar.last_assistant_special
630
+ ):
631
+ raise SceneRenderError(
632
+ f"model_type {grammar.model_type!r} transforms the final "
633
+ f"assistant turn of a closed render (e.g. qwen3's empty-think "
634
+ f"insert); this shape must render through the chat template"
635
+ )
636
+ for i, turn in enumerate(turns):
637
+ wrapper = grammar.seat(turn.seat)
638
+ # Trim applies to the turn *text*, before thinking/fold composition
639
+ # (gemma-3 folds the raw system content around trimmed text).
640
+ content = turn.text.strip() if grammar.content_trim else turn.text
641
+ if turn.thinking is not None:
642
+ # History policy follows the family template (a9 convention 3):
643
+ # strip families keep a thinking block only while its turn is
644
+ # the last before the generation header — "lasts one turn".
645
+ if not grammar.strips_history_thinking or i == last:
646
+ content = (
647
+ f"{grammar.think_open}{turn.thinking}"
648
+ f"{grammar.think_close}{content}"
649
+ )
650
+ if i == 0 and fold is not None:
651
+ content = f"{fold}{content}"
652
+ parts.append(f"{wrapper.open(turn.label)}{content}{wrapper.close}")
653
+
654
+ if gen_seat is not None:
655
+ wrapper = grammar.seat(gen_seat)
656
+ parts.append(wrapper.open(gen_label))
657
+ if gen_seat == "assistant":
658
+ if gen_thinking:
659
+ if grammar.gen_extra_thinking is None:
660
+ raise SceneRenderError(
661
+ f"model_type {grammar.model_type!r}: the thinking-"
662
+ f"mode generation appendix defeated the template "
663
+ f"autopsy; render with gen_thinking=False or fall "
664
+ f"back to the chat template"
665
+ )
666
+ parts.append(grammar.gen_extra_thinking)
667
+ else:
668
+ parts.append(grammar.gen_extra)
669
+ return "".join(parts)
670
+
671
+
672
+ def render_scene_raw(
673
+ turns: list[SceneTurn],
674
+ *,
675
+ system: str | None = None,
676
+ gen_seat: Seat | None = None,
677
+ gen_label: str | None = None,
678
+ ) -> str:
679
+ """Marker-mode fallback: the flat buffer generalized from one voice to N.
680
+
681
+ The base-model path and the escape hatch for families whose template
682
+ defeats the autopsy (mistral's positional markers). ``label: text``
683
+ lines, blank-line separated; thinking blocks are not rendered (a raw
684
+ surface has no delimiters to strip by, so "lasts one turn" has no
685
+ referent).
686
+ """
687
+
688
+ def display(label: str | None, seat: Seat) -> str:
689
+ if label is not None:
690
+ validate_role(label)
691
+ return render_role_label(seat, label).capitalize()
692
+ return seat.capitalize()
693
+
694
+ parts = [] if system is None else [system]
695
+ parts.extend(
696
+ f"{display(t.label, t.seat)}: {t.text}" for t in turns
697
+ )
698
+ tail = ""
699
+ if gen_seat is not None:
700
+ tail = f"\n\n{display(gen_label, gen_seat)}:"
701
+ return "\n\n".join(parts) + tail
702
+
703
+
704
+ def validate_turn_grammar(
705
+ grammar: TurnGrammar,
706
+ tokenizer: Any,
707
+ *,
708
+ system: str = "Answer briefly.",
709
+ ) -> None:
710
+ """Round-trip check: the stitcher must reproduce the template's bytes.
711
+
712
+ Stitches canonical strictly-alternating conversations (standard labels)
713
+ and byte-compares against ``apply_chat_template`` — plain, with a
714
+ generation prompt, and with a system prompt. Raises
715
+ :class:`SceneGrammarError` at the first divergence. This is the
716
+ load-bearing gate: a passing family's extraction renders are bit-identical
717
+ through the stitcher (the baseline-match contract), and a template
718
+ revision flips the family to the raw fallback instead of corrupting
719
+ silently.
720
+ """
721
+ messages = [
722
+ {"role": "user", "content": "alpha beta"},
723
+ {"role": "assistant", "content": "gamma delta"},
724
+ {"role": "user", "content": "epsilon"},
725
+ ]
726
+ turns = [
727
+ SceneTurn(seat=m["role"], text=m["content"]) # type: ignore[arg-type]
728
+ for m in messages
729
+ ]
730
+ padded = [
731
+ {"role": "user", "content": " alpha beta "},
732
+ {"role": "assistant", "content": " gamma delta "},
733
+ {"role": "user", "content": "epsilon"},
734
+ ]
735
+ padded_turns = [
736
+ SceneTurn(seat=m["role"], text=m["content"]) # type: ignore[arg-type]
737
+ for m in padded
738
+ ]
739
+ cases: list[tuple[str, list[dict[str, str]], list[SceneTurn], str | None, Seat | None]] = [
740
+ ("plain", messages, turns, None, None),
741
+ ("generation prompt", messages, turns, None, "assistant"),
742
+ # Whitespace-padded content — proves the trim probe's verdict, so a
743
+ # template with a content transform the stitcher doesn't model can
744
+ # never pass silently.
745
+ ("padded content", padded, padded_turns, None, None),
746
+ ]
747
+ if not grammar.last_assistant_special:
748
+ # A closed render ending on an assistant turn (the capture-triple /
749
+ # scoring shape) — proves the last-assistant probe's verdict.
750
+ cases.append((
751
+ "closed on assistant",
752
+ messages[:2],
753
+ turns[:2],
754
+ None,
755
+ None,
756
+ ))
757
+ if grammar.system_supported:
758
+ cases.append((
759
+ "system prompt",
760
+ [{"role": "system", "content": system}] + messages,
761
+ turns,
762
+ system,
763
+ None,
764
+ ))
765
+ cases.append((
766
+ "padded system",
767
+ [{"role": "system", "content": f" {system} "}] + padded,
768
+ padded_turns,
769
+ f" {system} ",
770
+ None,
771
+ ))
772
+ template_str = getattr(tokenizer, "chat_template", "") or ""
773
+ takes_thinking_kwarg = "enable_thinking" in template_str
774
+ render_kwargs: dict[str, Any] = (
775
+ {"enable_thinking": False} if takes_thinking_kwarg else {}
776
+ )
777
+ for name, msgs, scene_turns, sys_prompt, gen_seat in cases:
778
+ expected = _render_probe(
779
+ tokenizer, msgs, add_generation_prompt=gen_seat is not None,
780
+ **render_kwargs,
781
+ )
782
+ got = render_scene(
783
+ grammar, scene_turns, system=sys_prompt, gen_seat=gen_seat
784
+ )
785
+ if got != expected:
786
+ div = next(
787
+ (k for k, (a, b) in enumerate(zip(expected, got)) if a != b),
788
+ min(len(expected), len(got)),
789
+ )
790
+ raise SceneGrammarError(
791
+ f"round-trip validation failed ({name}) for model_type "
792
+ f"{grammar.model_type!r} at byte {div}: template "
793
+ f"{expected[div:div + 40]!r} vs stitched {got[div:div + 40]!r}"
794
+ )
795
+ # Thinking-mode generation prompt, when the template takes the kwarg
796
+ # and the autopsy recovered the variant.
797
+ if takes_thinking_kwarg and grammar.gen_extra_thinking is not None:
798
+ expected = _render_probe(
799
+ tokenizer, messages, add_generation_prompt=True,
800
+ enable_thinking=True,
801
+ )
802
+ got = render_scene(
803
+ grammar, turns, gen_seat="assistant", gen_thinking=True
804
+ )
805
+ if got != expected:
806
+ raise SceneGrammarError(
807
+ f"round-trip validation failed (thinking generation prompt) "
808
+ f"for model_type {grammar.model_type!r}: template "
809
+ f"{expected[-60:]!r} vs stitched {got[-60:]!r}"
810
+ )