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/cli/parsers.py ADDED
@@ -0,0 +1,1478 @@
1
+ """Argparse builders for the drowse CLI."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import argparse
6
+
7
+
8
+ # ---------------------------------------------------------------------------
9
+ # Shared helpers
10
+ # ---------------------------------------------------------------------------
11
+
12
+ def _positive_int(value: str) -> int:
13
+ parsed = int(value)
14
+ if parsed <= 0:
15
+ raise argparse.ArgumentTypeError("must be a positive integer")
16
+ return parsed
17
+
18
+
19
+ def _nonnegative_int(value: str) -> int:
20
+ parsed = int(value)
21
+ if parsed < 0:
22
+ raise argparse.ArgumentTypeError("must be a non-negative integer")
23
+ return parsed
24
+
25
+
26
+ def _bounded_int(lo: int, hi: int):
27
+ def parse(value: str) -> int:
28
+ parsed = int(value)
29
+ if not lo <= parsed <= hi:
30
+ raise argparse.ArgumentTypeError(f"must be in [{lo}, {hi}]")
31
+ return parsed
32
+
33
+ return parse
34
+
35
+
36
+ def _add_config_args(p: argparse.ArgumentParser) -> None:
37
+ p.add_argument("-c", "--config", action="append", default=None, metavar="PATH",
38
+ help="Load setup YAML (repeatable; later overrides earlier)")
39
+ p.add_argument("-s", "--strict", action="store_true",
40
+ help="With -c: fail hard on missing vectors")
41
+
42
+
43
+ def _add_logit_args(p: argparse.ArgumentParser) -> None:
44
+ """Logit-capture options for model-backed CLI surfaces.
45
+
46
+ Phase 1 of the logit pass: ``--top-k-alts`` sets the session-level
47
+ default for ``SamplingConfig.return_top_k`` — the number of top-K
48
+ alternatives the engine decodes per generated token (with text). K=0
49
+ (the default) means "logprob only", a near-free addition on top of
50
+ the existing log_softmax in the loom path. K>0 enables the
51
+ distributional surfaces (drilldown logits tab, inline surprise tint,
52
+ NodeCompareDrawer logit columns); ~60 KB/turn on the wire at K=8.
53
+ Per-call ``SamplingConfig.return_top_k > 0`` overrides; K=0 inherits.
54
+ YAML equivalent: ``return_top_k:`` nonnegative int.
55
+ """
56
+ p.add_argument(
57
+ "--top-k-alts", dest="top_k_alts", type=_nonnegative_int,
58
+ default=None, metavar="N",
59
+ help="Session default for top-K alternatives capture. "
60
+ "0 (default) = chosen-token logprob only; N>0 ships top-N "
61
+ "decoded alternatives per token for distributional surfaces. "
62
+ "Unset = inherit YAML ``return_top_k:`` / session default.",
63
+ )
64
+
65
+
66
+ # ---------------------------------------------------------------------------
67
+ # Top-level parsers
68
+ # ---------------------------------------------------------------------------
69
+
70
+ # Verb table for ``drowse manifold <verb>`` — the *compute* surface. A
71
+ # steering vector is the K=2 case of a flat affine subspace, so the former
72
+ # ``subspace`` verbs (extract / bake / compare / why) fold into the one
73
+ # ``manifold`` verb alongside the full steering-manifold authoring tree.
74
+ # This table is the source of truth for both parser registration order and
75
+ # the bare-verb help block.
76
+ _MANIFOLD_VERBS: list[tuple[str, str]] = [
77
+ ("extract", "Extract a steering vector (a 2-node flat subspace)"),
78
+ ("generate", "Author a discover-mode manifold from a concept list"),
79
+ ("from-template", "Author a discover manifold from a standalone template"),
80
+ ("fit", "Fit an authored or discover-mode manifold"),
81
+ ("bake", "Bake existing vectors into a new manifold"),
82
+ ("merge", "Union discover-mode manifolds' nodes into a new manifold"),
83
+ ("transfer", "Transfer a manifold to another model via Procrustes"),
84
+ ("compare", "Cosine similarity between steering vectors"),
85
+ ("why", "Show which layers contribute most to a steering vector"),
86
+ ]
87
+
88
+ # Verb table for ``drowse pack <verb>`` — the *lifecycle* surface (install /
89
+ # share / inspect / remove). These were the lifecycle leaves of the former
90
+ # ``manifold`` verb; they address an on-disk manifold by ``(namespace, name)``
91
+ # and never load a model.
92
+ _PACK_VERBS: list[tuple[str, str]] = [
93
+ ("ls", "List installed manifolds"),
94
+ ("show", "Show a manifold's nodes and fitted models"),
95
+ ("install", "Install a manifold from HF or a local folder"),
96
+ ("search", "Search the HuggingFace hub for manifolds"),
97
+ ("push", "Push a manifold to HF as a model repo"),
98
+ ("rm", "Fully remove a manifold folder"),
99
+ ("clear", "Delete per-model fitted tensors for a manifold"),
100
+ ("refresh", "Re-pull / re-materialize a manifold from its source"),
101
+ ("export", "Export a manifold as GGUF or .drowse"),
102
+ ]
103
+
104
+ _EXPERIMENT_VERBS: list[tuple[str, str]] = [
105
+ ("fan", "Run an alpha grid as one experiment"),
106
+ ("transcript", "Replay or inspect saved transcript paths"),
107
+ ("naturalness", "Score a steered generation's behavior-manifold naturalness"),
108
+ ]
109
+
110
+ # Verb table for ``drowse template <verb>`` — the standalone templated-completion
111
+ # artifact (a slot + candidate values + multi-turn contexts). Lifecycle verbs
112
+ # (create/ls/show/rm) are pure-IO; ``score`` loads a model for the restricted-
113
+ # choice logprob read.
114
+ _TEMPLATE_VERBS: list[tuple[str, str]] = [
115
+ ("create", "Author a template (slot + values + multi-turn contexts)"),
116
+ ("ls", "List installed templates"),
117
+ ("show", "Show a template's slot, values, and contexts"),
118
+ ("score", "Score the value distribution against each context (loads a model)"),
119
+ ("rm", "Remove a template folder"),
120
+ ]
121
+
122
+ # Verb table for ``drowse lens <verb>`` — the per-model Jacobian lens
123
+ # (Gurnee et al. 2026): per-layer transport ``J_l = E[∂h_final/∂h_l]`` +
124
+ # vocabulary readout. ``fit`` loads a model and runs the only backward
125
+ # passes in drowse; ``top``/``decompose`` load a model for one forward;
126
+ # lifecycle verbs are source-aware: local payloads live under DROWSE_HOME,
127
+ # while external payloads remain in provider caches behind pinned bindings.
128
+ _LENS_VERBS: list[tuple[str, str]] = [
129
+ ("fit", "Fit the model's Jacobian lens over a text corpus"),
130
+ ("fetch", "Fetch an external lens into its provider cache"),
131
+ ("ls", "List local and external lens sources for a model"),
132
+ ("show", "Show the active or selected lens source"),
133
+ ("use", "Select an already available lens source"),
134
+ ("top", "Lens readout on a prompt: top vocabulary tokens per layer"),
135
+ ("decompose", "Split a steerable direction into its J-space component"),
136
+ ("rm", "Remove a local lens or forget an external binding"),
137
+ ]
138
+
139
+ _SAE_VERBS: list[tuple[str, str]] = [
140
+ ("train", "Train a local residual-post sparse autoencoder"),
141
+ ("fetch", "Fetch an external SAE into its provider cache"),
142
+ ("ls", "List local and external SAE sources for a model"),
143
+ ("show", "Show the active or selected SAE source"),
144
+ ("use", "Select an already available SAE source"),
145
+ ("rm", "Remove a local SAE or forget an external binding"),
146
+ ]
147
+
148
+
149
+ def _add_dls_arg(p: argparse.ArgumentParser) -> None:
150
+ """The ``--no-dls`` opt-out, shared by every fit-capable surface.
151
+
152
+ ``manifold extract`` / ``manifold fit`` carry this alone: the rest of
153
+ :func:`_add_injection_args` is generation-time compilation state, which
154
+ an artifact-authoring verb has no use for.
155
+ """
156
+ p.add_argument(
157
+ "--no-dls", dest="no_dls", action="store_true",
158
+ help="Keep every extracted layer instead of dropping layers whose "
159
+ "fitted poles do not straddle the neutral baseline.",
160
+ )
161
+
162
+
163
+ def _add_injection_args(p: argparse.ArgumentParser) -> None:
164
+ """Steering and extraction options for model-backed CLI surfaces.
165
+
166
+ ``None`` defaults flow through to the YAML override layer (or ultimately
167
+ to the session defaults: Mahalanobis projection + DLS on).
168
+ """
169
+ _add_dls_arg(p)
170
+ p.add_argument(
171
+ "--compile", dest="compile", action="store_true",
172
+ help="Enable ``torch.compile`` on CUDA or MPS. Off by default because "
173
+ "of its upfront cost and architecture-specific compiler failures. "
174
+ "Unsteered and static-affine generations, including live probes, "
175
+ "use the persistent compiled path; dynamic or transient-hook "
176
+ "work falls back to eager. CPU is a no-op. YAML equivalent: "
177
+ "``compile: true``.",
178
+ )
179
+ p.add_argument(
180
+ "--cuda-graphs", dest="cuda_graphs", action="store_true",
181
+ help="Enable ``transformers.StaticCache`` + CUDA-graph capture "
182
+ "for additional decode speedup (1.5–2.5× on small models "
183
+ "on top of plain ``--compile``). Off by default for the "
184
+ "same reason as ``--compile``. Requires ``--compile`` to "
185
+ "be useful — when on, ``torch.compile(mode=\"reduce-"
186
+ "overhead\")`` captures decode CUDA graphs internally. "
187
+ "Auto-skipped on MPS/CPU and on architectures whose "
188
+ "StaticCache constructor fails (logged once at session "
189
+ "init). YAML equivalent: ``cuda_graphs: true``.",
190
+ )
191
+
192
+
193
+ def _build_serve_parser(parser: argparse.ArgumentParser) -> None:
194
+ # When a -c/--config YAML with model: set is supplied, the positional
195
+ # can be omitted. Handled in _run_serve via the composed config.
196
+ parser.add_argument("model", nargs="?", default=None,
197
+ help="HuggingFace model ID or local path")
198
+ parser.add_argument(
199
+ "-q", "--quantize",
200
+ choices=["4bit", "8bit"],
201
+ default=None,
202
+ help="Quantization mode (default: bf16/fp16)",
203
+ )
204
+ parser.add_argument(
205
+ "-d", "--device",
206
+ default="auto",
207
+ help="Device: auto (detect), cuda, mps, or cpu (default: auto)",
208
+ )
209
+ parser.add_argument(
210
+ "-p", "--probes",
211
+ nargs="*",
212
+ default=None,
213
+ help="Probe categories: all, none, epistemic, alignment, register, cultural (default: all)",
214
+ )
215
+ parser.add_argument("-H", "--host", default="127.0.0.1", help="Bind address (non-loopback requires an API key)")
216
+ parser.add_argument(
217
+ "-P", "--port", type=_bounded_int(1, 65535), default=8000,
218
+ help="Bind port",
219
+ )
220
+ parser.add_argument("-S", "--steer", default=None, metavar="EXPR",
221
+ help='Default steering expression, e.g. "0.5 honest + 0.3 warm"')
222
+ parser.add_argument("-C", "--cors", action="append", default=[], metavar="ORIGIN",
223
+ help="CORS allowed origin (repeatable)")
224
+ parser.add_argument("-k", "--api-key", default=None, metavar="KEY",
225
+ help="Require Bearer token auth; falls back to $DROWSE_API_KEY")
226
+ parser.add_argument("--no-web", dest="no_web", action="store_true",
227
+ help="Skip the analytics dashboard mount at / "
228
+ "(API-only mode for production / proxied deployments)")
229
+ _add_injection_args(parser)
230
+ _add_logit_args(parser)
231
+ _add_config_args(parser)
232
+
233
+
234
+ # --- pack subtree --------------------------------------------------------
235
+
236
+ # --- subspace / manifold subtree -----------------------------------------
237
+
238
+ def _build_vector_extract(p: argparse.ArgumentParser) -> None:
239
+ p.add_argument("concept", nargs="+",
240
+ help="Either one concept (e.g. 'happy.sad') or two poles (e.g. 'happy' 'sad')")
241
+ p.add_argument("-m", "--model", default=None, metavar="MODEL_ID")
242
+ p.add_argument("-f", "--force", action="store_true")
243
+ p.add_argument(
244
+ "--sae", default=None, metavar="RELEASE",
245
+ help="Extract via a SAELens SAE release. No implicit default — you "
246
+ "must name a release.",
247
+ )
248
+ p.add_argument(
249
+ "--role", default=None, metavar="SLUG",
250
+ help="Role-augmented extraction: render the contrast pairs under a "
251
+ "chat template whose assistant-role label is replaced by SLUG "
252
+ "(e.g. 'pirate'), so the fit lives in role-baselined activation "
253
+ "space. The role bakes into the generated node corpora and the "
254
+ "fit writes the canonical tensor and returns its "
255
+ "``:role-<slug>`` selector. Slug must match ``[a-z0-9._-]+``. "
256
+ "Mutually exclusive with ``--sae``. Mistral-3 families don't "
257
+ "carry a substitutable role label and raise at runtime.",
258
+ )
259
+ p.add_argument(
260
+ "--kind", choices=("abstract", "concrete", "custom"), default="abstract",
261
+ help=(
262
+ "Conceptual kind for both poles (default: abstract). Selects the "
263
+ "generation system template + elicitation role label: abstract -> "
264
+ "'someone {c}', concrete -> '{art} {c}', custom -> the --system "
265
+ "template (no role swap). Same knob `manifold generate` carries."
266
+ ),
267
+ )
268
+ p.add_argument(
269
+ "--system", dest="custom_system", default=None, metavar="TEMPLATE",
270
+ help=(
271
+ "Custom elicitation system prompt for --kind custom; use {c} for "
272
+ "the concept. The framing rides the system prompt and the corpus "
273
+ "pools in standard-assistant space, so it works on every model "
274
+ "family. Required when --kind custom."
275
+ ),
276
+ )
277
+ p.add_argument(
278
+ "--namespace", default=None, metavar="NS",
279
+ help="Destination namespace for the extracted concept manifold. "
280
+ "Unset lands under "
281
+ "``~/.drowse/manifolds/local/<canonical>/``. Any other "
282
+ "value relocates to "
283
+ "``manifolds/<namespace>/<canonical>/``. Parity with the "
284
+ "webui ExtractDrawer's namespace control and with "
285
+ "``manifold`` / ``discover``'s NS slot.",
286
+ )
287
+ _add_dls_arg(p)
288
+ p.set_defaults(quantize=None, device="auto", probes=None)
289
+
290
+
291
+ def _build_vector_merge(p: argparse.ArgumentParser) -> None:
292
+ p.add_argument("name", help="New manifold name (written under local/)")
293
+ p.add_argument(
294
+ "expression",
295
+ help=(
296
+ 'Merge expression, e.g. "0.3 ns/a + 0.4 ns/b" or '
297
+ '"0.5 ns/a~ns/b" for projection-removal.'
298
+ ),
299
+ )
300
+ p.add_argument("-f", "--force", action="store_true")
301
+ p.add_argument("-s", "--strict", action="store_true")
302
+ p.add_argument("-m", "--model", default=None, metavar="MODEL_ID")
303
+
304
+
305
+ def _build_vector_compare(p: argparse.ArgumentParser) -> None:
306
+ p.add_argument("concepts", nargs="+",
307
+ help="One or more concept selectors (names, tag:x, namespace:x, all)")
308
+ p.add_argument("-m", "--model", required=True, metavar="MODEL_ID",
309
+ help="Model id (used to locate baked tensors)")
310
+ p.add_argument("-v", "--verbose", action="store_true",
311
+ help="Show per-layer breakdown (2-arg pairwise mode)")
312
+ p.add_argument("-j", "--json", dest="json_output", action="store_true",
313
+ help="Emit machine-readable JSON")
314
+ p.add_argument(
315
+ "--ridge-scale", type=float, default=1.0, metavar="FLOAT",
316
+ help=(
317
+ "Ridge multiplier on the regularized covariance "
318
+ "(λ_L = (||X_L||_F²/(N·D)) × ridge_scale); default 1.0 (mean "
319
+ "diagonal of the un-regularized sample covariance). Compare is "
320
+ "Mahalanobis-only — it reads cached neutral activations + layer "
321
+ "means under ~/.drowse/models/<id>/ to build the per-layer "
322
+ "whitener and fails if the cache is missing."
323
+ ),
324
+ )
325
+
326
+
327
+ def _build_vector_why(p: argparse.ArgumentParser) -> None:
328
+ p.add_argument("concept", help="Concept selector (name or ns/name)")
329
+ p.add_argument("-m", "--model", required=True, metavar="MODEL_ID",
330
+ help="Model id (used to locate the baked tensor)")
331
+ p.add_argument("-j", "--json", dest="json_output", action="store_true",
332
+ help="Emit machine-readable JSON (full per-layer detail)")
333
+
334
+
335
+ def _build_manifold_fit(fit: argparse.ArgumentParser) -> None:
336
+ """``drowse manifold fit`` — fit an authored *or* discover-mode manifold.
337
+
338
+ The 4.0 fold of the former ``fit`` (authored folder positional) and
339
+ ``discover`` (name → folder + hyperparam overrides) verbs into one.
340
+ The positional is a name-or-folder (``_run_manifold_fit`` resolves it),
341
+ and the discover hyperparam knobs are accepted but apply only when the
342
+ resolved folder is discover-mode (``pca`` / ``spectral``); supplying any
343
+ of them against an authored folder is an error.
344
+ """
345
+ fit.add_argument(
346
+ "target", help="manifold name or folder path",
347
+ )
348
+ fit.add_argument("-m", "--model", default=None, metavar="MODEL_ID")
349
+ fit.add_argument("-f", "--force", action="store_true")
350
+ fit.add_argument(
351
+ "--layers", default=None, metavar="L1,L2,...|workspace|all",
352
+ help="Fit only selected transformer layers (default: all; workspace "
353
+ "uses the 40–90%% depth band)",
354
+ )
355
+ fit.add_argument(
356
+ "--sae", default=None, metavar="RELEASE",
357
+ help="Fit in an SAELens SAE feature space; centroids are reconstructed "
358
+ "through the SAE before the fit.",
359
+ )
360
+ # Discover-mode hyperparam overrides. Written into ``manifold.json``
361
+ # before the fit; rejected against an authored folder.
362
+ fit.add_argument(
363
+ "--method", choices=("pca", "spectral", "auto"), default=None,
364
+ help="Discover-mode: override the folder's fit_mode. 'auto' picks "
365
+ "flat (pca) vs curved (spectral) by GCV and detects periodic "
366
+ "axes via persistent homology (default: keep folder's setting)",
367
+ )
368
+ fit.add_argument(
369
+ "--max-dim", dest="max_dim", type=_positive_int, default=None, metavar="N",
370
+ help="Discover-mode: cap intrinsic dimension "
371
+ "(default: 8 for PCA, 8 for spectral)",
372
+ )
373
+ fit.add_argument(
374
+ "--min-dim", dest="min_dim", type=_positive_int, default=None, metavar="N",
375
+ help="Discover spectral: floor the intrinsic dimension the "
376
+ "eigenvalue-ratio cliff picks (the cliff undershoots when one "
377
+ "mode dominates — set --min-dim == --max-dim to pin the dim "
378
+ "exactly, e.g. PAD's 3). Valid only for spectral/auto fits.",
379
+ )
380
+ fit.add_argument(
381
+ "--var-threshold", dest="var_threshold", type=float, default=None,
382
+ metavar="T",
383
+ help="Discover PCA: smallest cumulative-variance prefix that "
384
+ "crosses T is picked (default: 0.70)",
385
+ )
386
+ fit.add_argument(
387
+ "--k-nn", dest="k_nn", type=_positive_int, default=None, metavar="K",
388
+ help="Discover spectral: number of nearest neighbors in the k-NN "
389
+ "graph (default: max(5, ceil(log K)))",
390
+ )
391
+ fit.add_argument(
392
+ "--bandwidth", type=float, default=None, metavar="SIGMA",
393
+ help="Discover spectral: heat-kernel bandwidth "
394
+ "(default: median k-NN distance)",
395
+ )
396
+ fit.add_argument(
397
+ "--max-subspace-dim", dest="max_subspace_dim", type=_positive_int,
398
+ default=None,
399
+ metavar="R",
400
+ help="Discover spectral (curved) only: per-layer RBF subspace dim "
401
+ "cap (default 64). Smaller values give finer-grained steering "
402
+ "control at large K — each axis the RBF can move along is an "
403
+ "axis subspace_inject can displace, so fewer axes = smaller "
404
+ "per-α effect = wider coherence regime. Valid only for spectral/auto "
405
+ "(a flat fit's subspace dim is its layout dim — use --max-dim).",
406
+ )
407
+ fit.add_argument(
408
+ "--smoothing", dest="smoothing", default=None, metavar="LAMBDA",
409
+ help="Discover spectral/auto (curved): penalized-RBF smoothing — "
410
+ "'auto' (GCV-selected, the default), '0' (exact interpolation), "
411
+ "or a float λ. Valid only for spectral/auto (no PCA RBF surface).",
412
+ )
413
+ fit.add_argument(
414
+ "--persistence-frac", dest="persistence_frac", type=float,
415
+ default=None, metavar="F",
416
+ help="Discover auto: H1 loop-significance threshold as a fraction of "
417
+ "the connectivity scale (default 0.5); higher = stricter periodic "
418
+ "detection. Valid only for --method auto.",
419
+ )
420
+ _add_dls_arg(fit)
421
+ fit.set_defaults(quantize=None, device="auto", probes=None)
422
+
423
+
424
+ def _build_manifold_generate(generate: argparse.ArgumentParser) -> None:
425
+ generate.add_argument("name", help="Manifold name (use ns/name for non-local)")
426
+ generate.add_argument(
427
+ "--concepts", nargs="+", required=True, metavar="CONCEPT",
428
+ help="Concept slugs to generate corpora for (>= 2)",
429
+ )
430
+ generate.add_argument(
431
+ "--kind", choices=("abstract", "concrete", "custom"), default="abstract",
432
+ help=(
433
+ "Conceptual kind for every node (default: abstract). Selects the "
434
+ "generation system template + elicitation role label: abstract -> "
435
+ "'someone {c}', concrete -> '{art} {c}', custom -> the --system "
436
+ "template (no role swap)."
437
+ ),
438
+ )
439
+ generate.add_argument(
440
+ "--system", dest="custom_system", default=None, metavar="TEMPLATE",
441
+ help=(
442
+ "Custom elicitation system prompt for --kind custom; use {c} for "
443
+ "the concept (e.g. \"You are the month of {c}; speak as that "
444
+ "month.\"). The framing rides the system prompt and the corpus "
445
+ "pools in standard-assistant space, so it works on every model "
446
+ "family. Required when --kind custom."
447
+ ),
448
+ )
449
+ generate.add_argument(
450
+ "--samples-per-prompt", dest="samples_per_prompt",
451
+ type=_positive_int, default=1, metavar="K",
452
+ help="In-character responses generated per baseline prompt (default: 1)",
453
+ )
454
+ generate.add_argument(
455
+ "--description", default="", metavar="TEXT",
456
+ help="Human-readable description for the manifold folder",
457
+ )
458
+ generate.add_argument(
459
+ "--seed", type=int, default=None, metavar="INT",
460
+ help="Seed the response generation for reproducible corpora "
461
+ "(default: unseeded)",
462
+ )
463
+ generate.add_argument(
464
+ "--role-per-node", dest="role_per_node", action="store_true",
465
+ help=(
466
+ "Role-augmented (persona) manifold: use each --concepts slug "
467
+ "as that node's assistant-role substitution at fit time. The "
468
+ "fitted manifold lives in persona-baseline activation space "
469
+ "and steering through it implies the nearest node's role at "
470
+ "decode time (role-paired manifold steering). Slugs must "
471
+ "match [a-z0-9._-]+; family must carry a substitutable role "
472
+ "header (Qwen / Gemma / Llama / GLM / gpt-oss / talkie — "
473
+ "Mistral-3 raises at fit time)."
474
+ ),
475
+ )
476
+ generate.add_argument(
477
+ "-f", "--force", action="store_true",
478
+ help="Overwrite an existing manifold folder",
479
+ )
480
+ generate.add_argument("-m", "--model", default=None, metavar="MODEL_ID")
481
+ generate.set_defaults(quantize=None, device="auto", probes=None)
482
+
483
+
484
+ def _build_manifold_from_template(p: argparse.ArgumentParser) -> None:
485
+ p.add_argument("template", help="Template name (or ns/name) to derive from")
486
+ p.add_argument(
487
+ "--name", default=None, metavar="MANIFOLD",
488
+ help="Manifold name to write (default: the template name; use ns/name "
489
+ "for a non-local namespace).",
490
+ )
491
+ p.add_argument(
492
+ "--fit-mode", dest="fit_mode",
493
+ choices=("pca", "spectral", "auto"), default="auto",
494
+ help="Discover fit mode written into the folder (default: auto — picks "
495
+ "flat/curved + detects periodic axes, the right default for cyclic "
496
+ "categories like days/months).",
497
+ )
498
+ p.add_argument(
499
+ "--max-dim", dest="max_dim", type=_positive_int, default=None, metavar="N",
500
+ help="Cap the discovered intrinsic dimension (optional).",
501
+ )
502
+ p.add_argument(
503
+ "--var-threshold", dest="var_threshold", type=float, default=None,
504
+ metavar="T", help="PCA cumulative-variance threshold for dim selection.",
505
+ )
506
+ p.add_argument(
507
+ "--description", default="", metavar="TEXT",
508
+ help="Human-readable description for the manifold folder",
509
+ )
510
+ p.add_argument(
511
+ "-f", "--force", action="store_true",
512
+ help="Overwrite an existing manifold folder",
513
+ )
514
+
515
+
516
+ def _build_manifold_merge(merge: argparse.ArgumentParser) -> None:
517
+ merge.add_argument("name", help="New manifold name (or ns/name)")
518
+ merge.add_argument(
519
+ "sources", nargs="+", metavar="SOURCE",
520
+ help="Two or more discover-mode source manifolds (name or ns/name)",
521
+ )
522
+ merge.add_argument(
523
+ "--description", default="", metavar="TEXT",
524
+ help="Human-readable description for the merged manifold folder",
525
+ )
526
+ merge.add_argument(
527
+ "--method", choices=("pca", "spectral", "auto"), default=None,
528
+ help="Override the merged fit_mode (default: the sources' shared "
529
+ "mode; required when sources disagree)",
530
+ )
531
+ merge.add_argument(
532
+ "-f", "--force", action="store_true",
533
+ help="Overwrite an existing manifold folder",
534
+ )
535
+
536
+
537
+ def _build_manifold_transfer(transfer: argparse.ArgumentParser) -> None:
538
+ transfer.add_argument("name", help="Manifold name (or ns/name)")
539
+ transfer.add_argument(
540
+ "--from", dest="src_model", required=True, metavar="SRC_MODEL",
541
+ help="Source model id (where the manifold was fitted)",
542
+ )
543
+ transfer.add_argument(
544
+ "--to", dest="tgt_model", required=True, metavar="TGT_MODEL",
545
+ help="Target model id (where the transferred manifold will live)",
546
+ )
547
+ transfer.add_argument(
548
+ "-f", "--force", action="store_true",
549
+ help="Recompute alignment + transfer even when cached",
550
+ )
551
+ transfer.add_argument(
552
+ "-j", "--json", dest="json_output", action="store_true",
553
+ help="Emit machine-readable JSON (path + quality summary)",
554
+ )
555
+
556
+
557
+ # --- pack lifecycle leaf builders ----------------------------------------
558
+
559
+ def _build_pack_ls(ls: argparse.ArgumentParser) -> None:
560
+ ls.add_argument("--namespace", default=None, metavar="NS",
561
+ help="Restrict to a single namespace")
562
+ ls.add_argument("-j", "--json", dest="json_output", action="store_true")
563
+ ls.add_argument("-v", "--verbose", action="store_true",
564
+ help="Include descriptions in the table output")
565
+
566
+
567
+ def _build_pack_show(show: argparse.ArgumentParser) -> None:
568
+ show.add_argument("name", help="Manifold name (or ns/name)")
569
+ show.add_argument("-j", "--json", dest="json_output", action="store_true")
570
+
571
+
572
+ def _build_pack_install(install: argparse.ArgumentParser) -> None:
573
+ install.add_argument(
574
+ "target",
575
+ help="<ns>/<name>[@revision], manifold folder, or .drowse path",
576
+ )
577
+ install.add_argument(
578
+ "-a", "--as", dest="as_target", default=None, metavar="NS/NAME",
579
+ help="Relocate the installed manifold under a different "
580
+ "namespace/name (must be fully qualified)",
581
+ )
582
+ install.add_argument(
583
+ "-f", "--force", action="store_true",
584
+ help="Overwrite an existing installation",
585
+ )
586
+
587
+
588
+ def _build_pack_search(search: argparse.ArgumentParser) -> None:
589
+ search.add_argument(
590
+ "query", nargs="?", default="",
591
+ help="Search text (matched against HF model ids)",
592
+ )
593
+ search.add_argument(
594
+ "-j", "--json", dest="json_output", action="store_true",
595
+ help="Emit machine-readable JSON instead of a table",
596
+ )
597
+ search.add_argument(
598
+ "-v", "--verbose", action="store_true",
599
+ help="Include descriptions in the table output",
600
+ )
601
+
602
+
603
+ def _build_pack_push(push: argparse.ArgumentParser) -> None:
604
+ push.add_argument("selector", help="Single manifold (name or ns/name)")
605
+ push.add_argument(
606
+ "-a", "--as", dest="as_target", default=None, metavar="OWNER/NAME",
607
+ help="Target HF coord (default: <whoami>/<name>)",
608
+ )
609
+ push.add_argument(
610
+ "-m", "--model", default=None, metavar="MODEL_ID",
611
+ help="Restrict the pushed tensors to one base model",
612
+ )
613
+ # Long-only, deliberately: `-p` is `--probes` and `-d` is `--device`
614
+ # everywhere else in the tree, and `pack push` is the one verb that
615
+ # publishes. Muscle memory must not flip visibility or skip the upload.
616
+ push.add_argument(
617
+ "--private", action="store_true",
618
+ help="Create the target repo as private",
619
+ )
620
+ push.add_argument(
621
+ "--dry-run", action="store_true",
622
+ help="Resolve the coord and report what would be pushed",
623
+ )
624
+ push.add_argument(
625
+ "--variant", choices=["raw", "sae", "all"], default="raw",
626
+ help="Which tensor variant(s) to push. Default: raw. (SAE variants "
627
+ "carry stronger provenance, so sharing them is opt-in.)",
628
+ )
629
+
630
+
631
+ def _build_pack_rm(rm: argparse.ArgumentParser) -> None:
632
+ rm.add_argument("selector", help="Manifold name (or ns/name)")
633
+ rm.add_argument(
634
+ "-y", "--yes", action="store_true",
635
+ help="Confirm removal (required — removal is irrecoverable outside "
636
+ "the bundled default/ namespace)",
637
+ )
638
+
639
+
640
+ def _build_pack_clear(clear: argparse.ArgumentParser) -> None:
641
+ clear.add_argument("selector", help="Manifold name (or ns/name)")
642
+ clear.add_argument(
643
+ "-m", "--model", default=None, metavar="MODEL_ID",
644
+ help="Scope to one model's tensors only (default: all models)",
645
+ )
646
+ clear.add_argument(
647
+ "--variant", choices=["raw", "sae", "all"], default="all",
648
+ help="Which tensor variant(s) to delete. Default: all.",
649
+ )
650
+
651
+
652
+ def _build_pack_refresh(refresh: argparse.ArgumentParser) -> None:
653
+ refresh.add_argument("selector", help="Manifold name (or ns/name)")
654
+ refresh.add_argument(
655
+ "-m", "--model", default=None, metavar="MODEL_ID",
656
+ help="Scope to one model: clear its fitted tensor pair so it re-fits "
657
+ "on next use (does not re-pull from source). Default: all-source "
658
+ "re-pull.",
659
+ )
660
+
661
+
662
+ def _build_pack_export(export: argparse.ArgumentParser) -> None:
663
+ export_fmt = export.add_subparsers(dest="format", required=True)
664
+ gguf = export_fmt.add_parser(
665
+ "gguf", help="Export a folded manifold to llama.cpp GGUF",
666
+ )
667
+ gguf.add_argument("name", help="Manifold name (or ns/name)")
668
+ gguf.add_argument("-m", "--model", default=None, metavar="MODEL_ID")
669
+ gguf.add_argument("-o", "--output", default=None, metavar="PATH")
670
+ gguf.add_argument("--model-hint", default=None, metavar="HINT")
671
+ archive = export_fmt.add_parser(
672
+ "archive",
673
+ help="Export a manifold and referenced template as .drowse",
674
+ )
675
+ archive.add_argument("name", help="Manifold name (or ns/name)")
676
+ archive.add_argument("-o", "--output", default=None, metavar="FILE")
677
+
678
+
679
+ # --- manifold (compute) + pack (lifecycle) parser wiring -----------------
680
+
681
+ # Long-form ``description=`` blocks per manifold compute verb (the verb's
682
+ # ``-h`` carries these; the short ``help=`` lives in ``_MANIFOLD_VERBS``).
683
+ _MANIFOLD_DESCRIPTIONS: dict[str, str] = {
684
+ "extract": "Extract a steering vector (a 2-node flat `pca` manifold).",
685
+ "generate": (
686
+ "For every concept, have the loaded model answer the shared "
687
+ "baseline prompts *in character* (the concept rides the system "
688
+ "prompt + a kind-derived elicitation role), writing one corpus per "
689
+ "node. Writes a fresh discover-mode manifold folder under "
690
+ "~/.drowse/manifolds/<ns>/<name>/ ready for `drowse manifold fit` "
691
+ "to fit. The shared baseline prompts hold the topic common-mode "
692
+ "across nodes, so the per-concept centroids stay comparable "
693
+ "(response[i] aligns to baseline prompt[i % k])."
694
+ ),
695
+ "from-template": (
696
+ "Author a discover manifold whose node corpora derive from a standalone "
697
+ "template (`drowse template create`). Resolves the template, expands its "
698
+ "values x contexts into per-value node corpora (the slot-filled assistant "
699
+ "turns), and writes a discover folder that stores the corpus and "
700
+ "`template_ref`-erences the template — so the fit resolves the template's "
701
+ "multi-turn contexts as elicitation prefixes. Deterministic (no model "
702
+ "load); run `drowse manifold fit <name> -m MODEL` next. fit_mode auto "
703
+ "suits cyclic categories (days/months) — the fit detects the loop."
704
+ ),
705
+ "fit": (
706
+ "Pool per-node centroids, fit a per-layer PCA subspace (+ RBF "
707
+ "interpolant for curved manifolds), and write the per-model manifold "
708
+ "tensor into the folder. The positional is a manifold name OR a "
709
+ "folder path. Authored folders supply their own coords; discover-mode "
710
+ "folders (fit_mode pca/spectral, usually authored by `drowse manifold "
711
+ "generate`) derive coords per-model and accept the --method / "
712
+ "--max-dim / --var-threshold / --k-nn / --bandwidth / "
713
+ "--max-subspace-dim hyperparam overrides (written into manifold.json "
714
+ "before the fit; rejected against an authored folder)."
715
+ ),
716
+ "bake": (
717
+ "Bake a steering expression into a corpus-less manifold under local/ "
718
+ "(the merge op): a linear combination / projection of existing fitted "
719
+ "vectors, written as a fit_mode=baked manifold."
720
+ ),
721
+ "merge": (
722
+ "Union the *nodes* of two or more discover-mode source manifolds into "
723
+ "a fresh, unfitted discover folder, then run `drowse manifold fit "
724
+ "<merged>` to fit it. The corpus analogue of `manifold bake` — but on "
725
+ "node corpora rather than steering directions. Restricted to "
726
+ "discover-mode sources (authored manifolds carry user-declared "
727
+ "geometry that isn't mergeable without a shared coordinate system). "
728
+ "Label collisions across sources raise; rename one side before merging."
729
+ ),
730
+ "transfer": (
731
+ "Transfer a fitted manifold from a source model to a target model by "
732
+ "fitting a per-layer Procrustes alignment between their cached neutral "
733
+ "activations and mapping the fitted subspace into target space. "
734
+ "Writes the transferred tensor at the target's `_from-<safe_src>` "
735
+ "variant path."
736
+ ),
737
+ "compare": "Cosine similarity between steering vectors (Mahalanobis).",
738
+ "why": (
739
+ "Per-layer ‖baked‖ histogram (16 buckets) showing which layers "
740
+ "contribute most to a steering vector."
741
+ ),
742
+ }
743
+
744
+ _MANIFOLD_BUILDERS = {
745
+ "extract": _build_vector_extract,
746
+ "generate": _build_manifold_generate,
747
+ "from-template": _build_manifold_from_template,
748
+ "fit": _build_manifold_fit,
749
+ "bake": _build_vector_merge,
750
+ "merge": _build_manifold_merge,
751
+ "transfer": _build_manifold_transfer,
752
+ "compare": _build_vector_compare,
753
+ "why": _build_vector_why,
754
+ }
755
+
756
+ _PACK_DESCRIPTIONS: dict[str, str] = {
757
+ "ls": "List local manifolds under ~/.drowse/manifolds/.",
758
+ "show": (
759
+ "Print one manifold's domain, node coordinates, and per-model fitted "
760
+ "tensors."
761
+ ),
762
+ "install": (
763
+ "Pull a manifold from a HuggingFace drowse-manifold repo "
764
+ "(`<ns>/<name>[@revision]`) or copy-install a local folder path."
765
+ ),
766
+ "search": "Search HF for `drowse-manifold`-tagged model repos.",
767
+ "push": (
768
+ "Push a manifold folder (corpus + fitted tensors) to HF as a "
769
+ "`drowse-manifold`-tagged model repo. The corpus is always uploaded "
770
+ "(a manifold can't re-fit without it); per-model tensors are filtered "
771
+ "by `-m`/`--variant`."
772
+ ),
773
+ "rm": (
774
+ "Remove a whole manifold folder. Bundled manifolds (`default/` "
775
+ "namespace) re-materialize on next session init."
776
+ ),
777
+ "clear": (
778
+ "Delete a manifold's per-model fitted tensors (they re-fit on next "
779
+ "use) while keeping `manifold.json` + the node corpus."
780
+ ),
781
+ "refresh": (
782
+ "Re-pull a manifold from its source: `local` is skipped, "
783
+ "`bundled`/`default/` re-materializes from package data, `hf://` "
784
+ "re-pulls. With `-m/--model`, instead does a scoped refresh — drops "
785
+ "just that model's fitted tensor pair so it re-fits on next use, "
786
+ "without re-pulling from the source."
787
+ ),
788
+ "export": (
789
+ "Export either a folded 2-node ``pca`` manifold as a llama.cpp GGUF, "
790
+ "or one complete manifold closure as a validated ``.drowse``. The "
791
+ "archive form preserves the manifold folder and includes its exact "
792
+ "referenced template when present. Checksums establish integrity, not "
793
+ "publisher identity."
794
+ ),
795
+ }
796
+
797
+ _PACK_BUILDERS = {
798
+ "ls": _build_pack_ls,
799
+ "show": _build_pack_show,
800
+ "install": _build_pack_install,
801
+ "search": _build_pack_search,
802
+ "push": _build_pack_push,
803
+ "rm": _build_pack_rm,
804
+ "clear": _build_pack_clear,
805
+ "refresh": _build_pack_refresh,
806
+ "export": _build_pack_export,
807
+ }
808
+
809
+
810
+ def _build_template_create(p: argparse.ArgumentParser) -> None:
811
+ p.add_argument("name", help="Template name (use ns/name for non-local)")
812
+ p.add_argument(
813
+ "--slot", required=True, metavar="TOKEN",
814
+ help="The placeholder substituted per value, e.g. '[DAY]'. Must appear "
815
+ "exactly once in each context's final assistant turn and in no "
816
+ "history turn.",
817
+ )
818
+ p.add_argument(
819
+ "--values", nargs="+", required=True, metavar="VALUE",
820
+ help="Candidate slot values (>= 2). The raw value is substituted into "
821
+ "the text; its slug is the node label ('New York' -> 'new_york').",
822
+ )
823
+ p.add_argument(
824
+ "--contexts", dest="contexts_file", required=True, metavar="PATH",
825
+ help="JSON file: a list of contexts. Each is either "
826
+ "{\"turns\": [{\"role\", \"content\"}...], \"assistant\": \"...slot...\"} "
827
+ "for multi-turn, or the single-turn sugar "
828
+ "{\"user\": ..., \"assistant\": \"...slot...\"}. The slotted "
829
+ "assistant turn carries the slot.",
830
+ )
831
+ p.add_argument(
832
+ "--description", default="", metavar="TEXT",
833
+ help="Human-readable description for the template folder",
834
+ )
835
+ p.add_argument(
836
+ "-f", "--force", action="store_true",
837
+ help="Overwrite an existing template folder",
838
+ )
839
+
840
+
841
+ def _build_template_ls(p: argparse.ArgumentParser) -> None:
842
+ p.add_argument("-j", "--json", dest="json_output", action="store_true", help="JSON output")
843
+
844
+
845
+ def _build_template_show(p: argparse.ArgumentParser) -> None:
846
+ p.add_argument("name", help="Template name (or ns/name)")
847
+ p.add_argument("-j", "--json", dest="json_output", action="store_true", help="JSON output")
848
+
849
+
850
+ def _build_template_rm(p: argparse.ArgumentParser) -> None:
851
+ p.add_argument("name", help="Template name (or ns/name)")
852
+ p.add_argument("-y", "--yes", action="store_true", help="Skip confirmation")
853
+
854
+
855
+ def _build_template_score(p: argparse.ArgumentParser) -> None:
856
+ p.add_argument("name", help="Template name (or ns/name)")
857
+ p.add_argument(
858
+ "-m", "--model", required=True, metavar="MODEL_ID",
859
+ help="Model to score against",
860
+ )
861
+ p.add_argument(
862
+ "-S", "--steer", default=None, metavar="EXPR",
863
+ help="Optional steering expression — score the completion distribution "
864
+ "under steering (the distributional before/after read).",
865
+ )
866
+ p.add_argument(
867
+ "--by", choices=("sum", "mean"), default="sum",
868
+ help="Rank/highlight statistic: 'sum' (joint logprob, length-biased to "
869
+ "short completions) or 'mean' (length-normalized). Default sum.",
870
+ )
871
+ p.add_argument("-d", "--device", default="auto",
872
+ help="Device: auto (detect), cuda, mps, or cpu")
873
+ p.add_argument("-q", "--quantize", choices=["4bit", "8bit"], default=None,
874
+ help="Quantization mode (default: bf16/fp16)")
875
+ p.add_argument("-j", "--json", dest="json_output", action="store_true", help="JSON output")
876
+
877
+
878
+ _TEMPLATE_DESCRIPTIONS: dict[str, str] = {
879
+ "create": (
880
+ "Author a standalone template artifact under "
881
+ "~/.drowse/templates/<ns>/<name>/. A template is a slot token, a set of "
882
+ "candidate values, and one or more multi-turn contexts whose final "
883
+ "assistant turn carries the slot. Two consumers read it: the completion "
884
+ "scorer (`template score`) reports the restricted-choice logprob "
885
+ "distribution over the values, and a manifold can `template_ref` it to "
886
+ "pool each value's slot-filled centroid into a node. The right tool for "
887
+ "categories you reference rather than embody — days, months, durations — "
888
+ "where 'someone {c}' makes no sense. Deterministic (no model load)."
889
+ ),
890
+ "ls": "List local templates under ~/.drowse/templates/.",
891
+ "show": "Print one template's slot, values, and contexts.",
892
+ "score": (
893
+ "Score the value distribution against each of the template's contexts: "
894
+ "for every context, the model's restricted-choice probability over the "
895
+ "candidate slot-fills (the logit counterpart to a manifold fit). Reports "
896
+ "both the joint (sum) and length-normalized (mean) views. With "
897
+ "`-S/--steer`, scores under a steering expression so you can read how "
898
+ "steering reshapes the distribution — did it shift, not just the argmax?"
899
+ ),
900
+ "rm": "Remove a whole template folder.",
901
+ }
902
+
903
+ _TEMPLATE_BUILDERS = {
904
+ "create": _build_template_create,
905
+ "ls": _build_template_ls,
906
+ "show": _build_template_show,
907
+ "score": _build_template_score,
908
+ "rm": _build_template_rm,
909
+ }
910
+
911
+
912
+ # --- lens subtree ---------------------------------------------------------
913
+
914
+ def _build_lens_fit(p: argparse.ArgumentParser) -> None:
915
+ p.add_argument("model", help="HuggingFace model ID or local path")
916
+ corpus = p.add_mutually_exclusive_group()
917
+ corpus.add_argument(
918
+ "--corpus", default=None, metavar="FILE",
919
+ help="Text corpus: one document per line (a JSONL line with a 'text' "
920
+ "field also works). With neither this nor --hf-corpus, stream "
921
+ "the default web-text sample "
922
+ "(HuggingFaceFW/fineweb-edu:sample-10BT) via the `datasets` "
923
+ "library (pip install 'drowse.ai[hf]').",
924
+ )
925
+ corpus.add_argument(
926
+ "--hf-corpus", action="append", default=None,
927
+ metavar="REPO[:CONFIG][@REV][,KEY=VALUE...]",
928
+ help="Stream the first N non-empty documents of a Hugging Face "
929
+ "dataset's train split instead, pinned to the commit REV "
930
+ "resolves to (default: main) and to CONFIG (default: the "
931
+ "dataset's default). Options: text_field=F (default text); "
932
+ "files=K reads round-robin from K of its data files, ordered by "
933
+ "a seed=S hash of their paths, to spread the sample over a "
934
+ "dataset whose rows are not shuffled. Repeat the flag to mix "
935
+ "corpora by weight=W (default 1). The pins are recorded in the "
936
+ "corpus spec, and a larger --prompts later resumes by prefix.",
937
+ )
938
+ p.add_argument(
939
+ "--prompts", type=_positive_int, default=100, metavar="N",
940
+ help="Number of corpus documents to average over (default 100 — "
941
+ "quality saturates quickly; the paper used 1000)",
942
+ )
943
+ p.add_argument(
944
+ "--seq-len", type=_positive_int, default=None, metavar="T",
945
+ help="Truncate each document to this many tokens (default 128)",
946
+ )
947
+ p.add_argument(
948
+ "--dim-batch", type=_positive_int, default=None, metavar="K",
949
+ help="Output dims per backward pass (default 8). Total backward work "
950
+ "is K-invariant — the knob trades memory for per-pass overhead "
951
+ "and barely moves wall time; halves automatically on OOM.",
952
+ )
953
+ p.add_argument(
954
+ "--prompt-batch", type=_positive_int, default=None, metavar="B",
955
+ help="Corpus prompts per autograd graph (default: 4 on CPU/CUDA, 2 on "
956
+ "MPS). Preserves equal-prompt estimator weighting; backs off "
957
+ "independently on OOM.",
958
+ )
959
+ p.add_argument(
960
+ "--checkpoint-every", type=_positive_int, default=None, metavar="N",
961
+ help="Write a self-contained resumable checkpoint every N usable "
962
+ "prompts (default 25); the full artifact is written durably once "
963
+ "at finalization.",
964
+ )
965
+ p.add_argument(
966
+ "--layers", default=None, metavar="L1,L2,...|workspace|all",
967
+ help="Fit only these source layers (default: every layer below the "
968
+ "final one). Restricting to the workspace band — roughly the "
969
+ "40-90%% depth the jlens/<word> atoms use — skips the backward "
970
+ "work below the lowest requested layer and shrinks the artifact; "
971
+ "readout surfaces then cover only the fitted layers. Pass "
972
+ "`workspace` as shorthand for that band or `all` explicitly.",
973
+ )
974
+ estimator = p.add_mutually_exclusive_group()
975
+ estimator.add_argument(
976
+ "--relp", dest="relp", action="store_true",
977
+ help="Fit the R-lens (default): the same estimator through the "
978
+ "LRP-modified backward graph. Lands at local:relp.",
979
+ )
980
+ estimator.add_argument(
981
+ "--standard", dest="relp", action="store_false",
982
+ help="Fit the standard Jacobian lens at local:default instead of the "
983
+ "default RelP R-lens.",
984
+ )
985
+ p.set_defaults(relp=True)
986
+ p.add_argument(
987
+ "-f", "--force", action="store_true",
988
+ help="Restart from zero (default: resume a matching partial fit)",
989
+ )
990
+ p.add_argument("-d", "--device", default="auto",
991
+ help="Device: auto (detect), cuda, mps, or cpu")
992
+ p.add_argument("-q", "--quantize", choices=["4bit", "8bit"], default=None,
993
+ help="Quantization mode (default: bf16/fp16)")
994
+
995
+
996
+ def _build_lens_fetch(p: argparse.ArgumentParser) -> None:
997
+ p.add_argument("model", help="HuggingFace model ID")
998
+ p.add_argument(
999
+ "source", nargs="?", default="neuronpedia",
1000
+ help="External source: neuronpedia, workspace-r (RelP), workspace-j",
1001
+ )
1002
+ p.add_argument("--revision", default="main", help="Provider revision to resolve and pin")
1003
+ p.add_argument(
1004
+ "--repo", default=None, metavar="REPO",
1005
+ help="Override the provider repository (default: the source's own)",
1006
+ )
1007
+ p.add_argument("-f", "--force", action="store_true", help="Refresh the binding")
1008
+ p.add_argument("-j", "--json", dest="json_output", action="store_true")
1009
+
1010
+
1011
+ def _build_lens_ls(p: argparse.ArgumentParser) -> None:
1012
+ p.add_argument("model", help="Model ID whose lens sources to list")
1013
+ p.add_argument("-j", "--json", dest="json_output", action="store_true")
1014
+
1015
+
1016
+ def _build_lens_use(p: argparse.ArgumentParser) -> None:
1017
+ p.add_argument("model", help="Model ID whose active lens to change")
1018
+ p.add_argument(
1019
+ "source", help="local:NAME or a fetched binding (neuronpedia, workspace-r, workspace-j)",
1020
+ )
1021
+
1022
+
1023
+ def _build_lens_show(p: argparse.ArgumentParser) -> None:
1024
+ p.add_argument("model", help="Model ID whose lens artifact to inspect")
1025
+ p.add_argument("source", nargs="?", default=None,
1026
+ help="Source to inspect (default: active)")
1027
+ p.add_argument("-j", "--json", dest="json_output", action="store_true", help="JSON output")
1028
+
1029
+
1030
+ def _build_lens_top(p: argparse.ArgumentParser) -> None:
1031
+ p.add_argument("model", help="HuggingFace model ID or local path")
1032
+ p.add_argument("prompt", help="Raw prompt to read out (no chat template)")
1033
+ p.add_argument(
1034
+ "-k", "--top-k", type=_positive_int, default=8, metavar="K",
1035
+ help="Tokens per (layer, position) readout (default 8)",
1036
+ )
1037
+ p.add_argument(
1038
+ "--layers", default=None, metavar="L1,L2,...|sample|workspace|all",
1039
+ help="Comma-separated layer indices or a layer mode (default: all fitted layers)",
1040
+ )
1041
+ p.add_argument(
1042
+ "--position", type=int, action="append", default=None, metavar="P",
1043
+ help="Token position to read (repeatable; negative from the end; "
1044
+ "default: final position)",
1045
+ )
1046
+ p.add_argument("-d", "--device", default="auto",
1047
+ help="Device: auto (detect), cuda, mps, or cpu")
1048
+ p.add_argument("-q", "--quantize", choices=["4bit", "8bit"], default=None,
1049
+ help="Quantization mode (default: bf16/fp16)")
1050
+ p.add_argument("-j", "--json", dest="json_output", action="store_true", help="JSON output")
1051
+
1052
+
1053
+ def _build_lens_decompose(p: argparse.ArgumentParser) -> None:
1054
+ p.add_argument(
1055
+ "selector",
1056
+ help="Steerable direction to split (concept name, ns/name, or "
1057
+ "jlens/<word>)",
1058
+ )
1059
+ p.add_argument(
1060
+ "-m", "--model", required=True, metavar="MODEL_ID",
1061
+ help="Model whose lens + fitted direction to use",
1062
+ )
1063
+ p.add_argument(
1064
+ "-k", "--top-k", type=_positive_int, default=16, metavar="K",
1065
+ help="Sparsity budget: atoms in the J-space component (default 16)",
1066
+ )
1067
+ p.add_argument(
1068
+ "--layers", default=None, metavar="L1,L2,...|workspace|all",
1069
+ help="Comma-separated layer indices or a layer mode (default: every "
1070
+ "fitted layer the direction covers)",
1071
+ )
1072
+ p.add_argument("-d", "--device", default="auto",
1073
+ help="Device: auto (detect), cuda, mps, or cpu")
1074
+ p.add_argument("-q", "--quantize", choices=["4bit", "8bit"], default=None,
1075
+ help="Quantization mode (default: bf16/fp16)")
1076
+ p.add_argument("-j", "--json", dest="json_output", action="store_true", help="JSON output")
1077
+
1078
+
1079
+ def _build_lens_rm(p: argparse.ArgumentParser) -> None:
1080
+ p.add_argument("model", help="Model ID whose lens artifact to remove")
1081
+ p.add_argument("source", nargs="?", default=None,
1082
+ help="local:NAME or neuronpedia (default: active)")
1083
+ p.add_argument("-y", "--yes", action="store_true", help="Skip confirmation")
1084
+
1085
+
1086
+ _LENS_DESCRIPTIONS: dict[str, str] = {
1087
+ "fit": (
1088
+ "Fit the per-model Jacobian lens: J_l = E[dh_final/dh_l], the average "
1089
+ "first-order effect of each layer's residual on the final-layer "
1090
+ "residual over a web-text corpus. One forward + ceil(d_model/dim_batch) "
1091
+ "backward passes per document — the only backward passes in drowse. "
1092
+ "The artifact lands under ~/.drowse/models/<model>/jlens/local/default "
1093
+ "as an atomic manifest plus fp32 per-layer shards (~1-3 GB total) "
1094
+ "and backs `lens top`, `lens decompose`, the "
1095
+ "jlens/<word> steering atoms, and @when:jlens/<word> gates. "
1096
+ "Interrupted fits checkpoint and resume by default."
1097
+ ),
1098
+ "fetch": (
1099
+ "Fetch an official external Jacobian lens into its provider-owned "
1100
+ "cache, pin the repository and base-model revisions, and write only a "
1101
+ "small Drowse binding. No provider payload is copied into DROWSE_HOME."
1102
+ ),
1103
+ "ls": "List Drowse-owned local lenses and external cache bindings.",
1104
+ "show": "Print a lens source's layers, prompts, corpus, provenance, and size.",
1105
+ "use": "Select a fetched/fitted source without downloading or copying it.",
1106
+ "top": (
1107
+ "Run one forward pass on a raw prompt and decode selected layers' "
1108
+ "residuals through the lens: softmax(W_U · norm(J_l h)) — the tokens "
1109
+ "the activation is disposed to make the model say. The window into "
1110
+ "unverbalized intermediate computation (Gurnee et al. 2026)."
1111
+ ),
1112
+ "decompose": (
1113
+ "Split a steerable direction into its J-space component: the best "
1114
+ "sparse nonnegative combination of k J-lens token vectors, per layer. "
1115
+ "Reports the variance share (how *verbalizable* the direction is — "
1116
+ "concept vectors typically carry only ~6-15% of their variance in the "
1117
+ "workspace) and the contributing tokens."
1118
+ ),
1119
+ "rm": "Delete a local lens or forget an external binding without touching its provider cache.",
1120
+ }
1121
+
1122
+ _LENS_BUILDERS = {
1123
+ "fit": _build_lens_fit,
1124
+ "fetch": _build_lens_fetch,
1125
+ "ls": _build_lens_ls,
1126
+ "show": _build_lens_show,
1127
+ "use": _build_lens_use,
1128
+ "top": _build_lens_top,
1129
+ "decompose": _build_lens_decompose,
1130
+ "rm": _build_lens_rm,
1131
+ }
1132
+
1133
+
1134
+ def _build_manifold_parser(parser: argparse.ArgumentParser) -> None:
1135
+ """``drowse manifold`` — the steering-vector / manifold compute verbs."""
1136
+ sub = parser.add_subparsers(dest="manifold_cmd", required=False, metavar="VERB")
1137
+ for verb, desc in _MANIFOLD_VERBS:
1138
+ child = sub.add_parser(
1139
+ verb, help=desc,
1140
+ description=_MANIFOLD_DESCRIPTIONS.get(verb, desc),
1141
+ )
1142
+ _MANIFOLD_BUILDERS[verb](child)
1143
+
1144
+
1145
+ def _build_pack_parser(parser: argparse.ArgumentParser) -> None:
1146
+ """``drowse pack`` — the manifold lifecycle (install/share/inspect) verbs."""
1147
+ sub = parser.add_subparsers(dest="pack_cmd", required=False, metavar="VERB")
1148
+ for verb, desc in _PACK_VERBS:
1149
+ child = sub.add_parser(
1150
+ verb, help=desc,
1151
+ description=_PACK_DESCRIPTIONS.get(verb, desc),
1152
+ )
1153
+ _PACK_BUILDERS[verb](child)
1154
+
1155
+
1156
+ def _build_template_parser(parser: argparse.ArgumentParser) -> None:
1157
+ """``drowse template`` — the standalone templated-completion artifact."""
1158
+ sub = parser.add_subparsers(dest="template_cmd", required=False, metavar="VERB")
1159
+ for verb, desc in _TEMPLATE_VERBS:
1160
+ child = sub.add_parser(
1161
+ verb, help=desc,
1162
+ description=_TEMPLATE_DESCRIPTIONS.get(verb, desc),
1163
+ )
1164
+ _TEMPLATE_BUILDERS[verb](child)
1165
+
1166
+
1167
+ def _build_lens_parser(parser: argparse.ArgumentParser) -> None:
1168
+ """``drowse lens`` — the per-model Jacobian-lens artifact."""
1169
+ sub = parser.add_subparsers(dest="lens_cmd", required=False, metavar="VERB")
1170
+ for verb, desc in _LENS_VERBS:
1171
+ child = sub.add_parser(
1172
+ verb, help=desc,
1173
+ description=_LENS_DESCRIPTIONS.get(verb, desc),
1174
+ )
1175
+ _LENS_BUILDERS[verb](child)
1176
+
1177
+
1178
+ def _build_sae_parser(parser: argparse.ArgumentParser) -> None:
1179
+ """``drowse sae`` — local/external sparse-autoencoder sources."""
1180
+ sub = parser.add_subparsers(dest="sae_cmd", required=False, metavar="VERB")
1181
+ for verb, desc in _SAE_VERBS:
1182
+ child = sub.add_parser(verb, help=desc)
1183
+ child.add_argument("model", help="HuggingFace model ID or local path")
1184
+ if verb == "train":
1185
+ child.add_argument("name", help="Local SAE name")
1186
+ child.add_argument("--corpus", default=None, metavar="FILE",
1187
+ help="One text document per line; default: FineWeb-Edu")
1188
+ child.add_argument("--layer", type=_nonnegative_int, default=None,
1189
+ help="Residual-post layer (default: nearest 65%% depth)")
1190
+ child.add_argument("--tokens", type=_positive_int, default=1_000_000, metavar="N")
1191
+ child.add_argument("--seq-len", type=_positive_int, default=128, metavar="T")
1192
+ child.add_argument("--batch-size", type=_positive_int, default=8, metavar="B")
1193
+ child.add_argument("--width", type=_positive_int, default=None, metavar="N")
1194
+ child.add_argument("--expansion", type=_positive_int, default=8, metavar="K")
1195
+ child.add_argument("--learning-rate", type=float, default=3e-4, metavar="LR")
1196
+ child.add_argument("--l1", type=float, default=1e-3, metavar="LAMBDA")
1197
+ child.add_argument("--dead-threshold", type=float, default=1e-6, metavar="T")
1198
+ child.add_argument("--seed", type=int, default=0)
1199
+ child.add_argument("-f", "--force", action="store_true")
1200
+ child.add_argument("-d", "--device", default="auto")
1201
+ child.add_argument("-q", "--quantize", choices=["4bit", "8bit"], default=None)
1202
+ child.add_argument("-j", "--json", dest="json_output", action="store_true")
1203
+ elif verb == "fetch":
1204
+ # Pure IO, like ``lens fetch``: the provider's SAE weights land in
1205
+ # the Hugging Face cache and Drowse writes a small binding. The
1206
+ # base model is never loaded, so there is no ``-d``/``-q``.
1207
+ child.add_argument("source", help="saelens:RELEASE")
1208
+ child.add_argument("--layer", type=_nonnegative_int, default=None,
1209
+ help="Explicit covered hook layer (default: nearest 65%% depth)")
1210
+ child.add_argument(
1211
+ "--revision", default=None, metavar="REV",
1212
+ help="Provider revision to resolve and pin (default: the "
1213
+ "release's own resolved commit)",
1214
+ )
1215
+ child.add_argument("-j", "--json", dest="json_output", action="store_true")
1216
+ elif verb == "show":
1217
+ child.add_argument("source", nargs="?", default=None,
1218
+ help="local:NAME or saelens:RELEASE (default: active)")
1219
+ child.add_argument("-j", "--json", dest="json_output", action="store_true")
1220
+ elif verb == "rm":
1221
+ # No ``-j``: removal reports one line of prose, matching
1222
+ # ``lens rm``. (``show`` needs JSON; ``rm`` never emitted any.)
1223
+ child.add_argument("source", nargs="?", default=None,
1224
+ help="local:NAME or saelens:RELEASE (default: active)")
1225
+ child.add_argument("-y", "--yes", action="store_true")
1226
+ elif verb == "use":
1227
+ child.add_argument("source", help="local:NAME or saelens:RELEASE")
1228
+ else: # ls
1229
+ child.add_argument("-j", "--json", dest="json_output", action="store_true")
1230
+
1231
+
1232
+ # --- config subtree ------------------------------------------------------
1233
+
1234
+ def _build_config_parser(parser: argparse.ArgumentParser) -> None:
1235
+ sub = parser.add_subparsers(dest="config_cmd", required=False, metavar="VERB")
1236
+
1237
+ show = sub.add_parser("show", help="Print the effective merged config")
1238
+ show.add_argument("-c", "--config", action="append", default=None, metavar="PATH",
1239
+ help="Extra YAML files to compose on top of ~/.drowse/config.yaml")
1240
+ show.add_argument("-m", "--model", default=None,
1241
+ help="Override model field in output")
1242
+ show.add_argument("--no-default", action="store_true",
1243
+ help="Skip loading ~/.drowse/config.yaml")
1244
+
1245
+ validate = sub.add_parser("validate", help="Validate a config file (CI hook)")
1246
+ validate.add_argument("file", help="Path to YAML config file")
1247
+
1248
+
1249
+ # --- experiment subtree --------------------------------------------------
1250
+
1251
+ def _build_experiment_fan(p: argparse.ArgumentParser) -> None:
1252
+ p.add_argument("model", help="HuggingFace model ID or local path")
1253
+ p.add_argument("prompt", help="Prompt to fan out")
1254
+ p.add_argument(
1255
+ "-g", "--grid",
1256
+ action="append",
1257
+ required=True,
1258
+ metavar="CONCEPT=ALPHAS",
1259
+ help=(
1260
+ "Alpha grid term, repeatable. Example: "
1261
+ "happy.sad=-0.4,0,0.4"
1262
+ ),
1263
+ )
1264
+ p.add_argument(
1265
+ "-S", "--steer",
1266
+ dest="base_steering",
1267
+ default=None,
1268
+ metavar="EXPR",
1269
+ help="Fixed steering expression composed under each grid row",
1270
+ )
1271
+ # Historical spelling, same dest — kept working, kept out of --help so
1272
+ # `-S/--steer` reads identically on every verb that takes one.
1273
+ p.add_argument(
1274
+ "--base-steering",
1275
+ dest="base_steering",
1276
+ default=None,
1277
+ metavar="EXPR",
1278
+ help=argparse.SUPPRESS,
1279
+ )
1280
+ p.add_argument("-q", "--quantize", choices=["4bit", "8bit"], default=None)
1281
+ p.add_argument("-d", "--device", default="auto")
1282
+ p.add_argument("-p", "--probes", nargs="*", default=None)
1283
+ # ``None`` (not 256) so ``_load_effective_config`` can tell "unset" from
1284
+ # an explicit ``--max-tokens 256``; the runner supplies 256 after the
1285
+ # config merge.
1286
+ p.add_argument("--max-tokens", type=_positive_int, default=None,
1287
+ help="Max generation tokens per grid row (default: 256)")
1288
+ p.add_argument("-j", "--json", dest="json_output", action="store_true")
1289
+ _add_injection_args(p)
1290
+ _add_logit_args(p)
1291
+ _add_config_args(p)
1292
+
1293
+
1294
+ def _build_experiment_transcript_parser(parser: argparse.ArgumentParser) -> None:
1295
+ """``drowse experiment transcript`` — replay saved tree paths."""
1296
+ sub = parser.add_subparsers(dest="transcript_cmd", required=False, metavar="VERB")
1297
+
1298
+ run = sub.add_parser(
1299
+ "run",
1300
+ help="Replay a transcript on the current session and report readings",
1301
+ description=(
1302
+ "Load a YAML transcript, replay each user turn with the recorded "
1303
+ "recipe, and report per-turn readings against the recorded ones."
1304
+ ),
1305
+ )
1306
+ run.add_argument("path", help="Path to a drowse_transcript YAML file")
1307
+ # Override the model arg shape so transcript replay can fall back to
1308
+ # the embedded ``model_id`` header (the common case) instead of
1309
+ # forcing the user to repeat it on the command line. When the
1310
+ # transcript also lacks ``model_id`` the runner fails with a clear
1311
+ # message; that's caught early so we don't load a model just to
1312
+ # complain about it after.
1313
+ run.add_argument(
1314
+ "model",
1315
+ nargs="?",
1316
+ default=None,
1317
+ help="HuggingFace model ID or local path (defaults to transcript's `model_id`)",
1318
+ )
1319
+ run.add_argument(
1320
+ "-q", "--quantize",
1321
+ choices=["4bit", "8bit"],
1322
+ default=None,
1323
+ help="Quantization mode (default: bf16/fp16)",
1324
+ )
1325
+ run.add_argument(
1326
+ "-d", "--device",
1327
+ default="auto",
1328
+ help="Device: auto (detect), cuda, mps, or cpu (default: auto)",
1329
+ )
1330
+ run.add_argument(
1331
+ "-p", "--probes",
1332
+ nargs="*",
1333
+ default=None,
1334
+ help="Probe categories (default: all)",
1335
+ )
1336
+ run.add_argument(
1337
+ # ``None`` = unset, so YAML ``max_tokens:`` can fill it and an
1338
+ # explicit value survives the config merge; the runner floors it
1339
+ # at 256 afterwards.
1340
+ "--max-tokens", type=_positive_int, default=None,
1341
+ help="Default max generation tokens per replay turn (default: 256)",
1342
+ )
1343
+ _add_injection_args(run)
1344
+ _add_config_args(run)
1345
+ # ``--strict`` reuses the ``-s/--strict`` flag added by
1346
+ # ``_add_config_args`` — same name, but here it gates "refuse on
1347
+ # probe drift" instead of "fail hard on missing vectors". Both
1348
+ # interpretations share the spirit of the flag.
1349
+
1350
+
1351
+ def _build_experiment_naturalness(p: argparse.ArgumentParser) -> None:
1352
+ """``drowse experiment naturalness`` — behavior-manifold naturalness eval.
1353
+
1354
+ Fits a behavior-space manifold from the manifold pack's node corpus
1355
+ (each node's mean next-token distribution, mapped to Hellinger
1356
+ space), runs a steered generation, re-runs the model over the
1357
+ generated text to recover its behavioral trajectory, and reports the
1358
+ mean / max Bhattacharyya distance of that trajectory to the behavior
1359
+ manifold — low is natural, high flags off-manifold "teleportation".
1360
+ """
1361
+ p.add_argument("model", help="HuggingFace model ID or local path")
1362
+ p.add_argument("prompt", help="Prompt to generate from")
1363
+ p.add_argument(
1364
+ "--manifold", required=True, metavar="FOLDER",
1365
+ help="Manifold folder whose node corpus seeds the behavior manifold",
1366
+ )
1367
+ p.add_argument(
1368
+ "-S", "--steer", required=True, metavar="EXPR",
1369
+ help="Steering expression to evaluate (e.g. 'mood%%0.5')",
1370
+ )
1371
+ p.add_argument(
1372
+ "--compare-linear", dest="compare_linear", action="store_true",
1373
+ help="Also score a linear-chord steering baseline (the manifold "
1374
+ "term must be a single '%%' term)",
1375
+ )
1376
+ # ``None`` = unset (see ``experiment fan``); the runner floors it at 128
1377
+ # after the config merge.
1378
+ p.add_argument("--max-tokens", type=_positive_int, default=None,
1379
+ help="Max generation tokens per scored run (default: 128)")
1380
+ p.add_argument("-q", "--quantize", choices=["4bit", "8bit"], default=None)
1381
+ p.add_argument("-d", "--device", default="auto")
1382
+ p.add_argument("-p", "--probes", nargs="*", default=None)
1383
+ p.add_argument("-j", "--json", dest="json_output", action="store_true")
1384
+ _add_injection_args(p)
1385
+ _add_config_args(p)
1386
+
1387
+
1388
+ _EXPERIMENT_BUILDERS = {
1389
+ "fan": _build_experiment_fan,
1390
+ "transcript": _build_experiment_transcript_parser,
1391
+ "naturalness": _build_experiment_naturalness,
1392
+ }
1393
+
1394
+
1395
+ def _build_experiment_parser(parser: argparse.ArgumentParser) -> None:
1396
+ sub = parser.add_subparsers(dest="experiment_cmd", required=False, metavar="VERB")
1397
+ for verb, desc in _EXPERIMENT_VERBS:
1398
+ child = sub.add_parser(verb, help=desc, description=desc)
1399
+ _EXPERIMENT_BUILDERS[verb](child)
1400
+
1401
+
1402
+ def _build_root_parser() -> argparse.ArgumentParser:
1403
+ root = argparse.ArgumentParser(
1404
+ prog="drowse",
1405
+ description="Activation steering + trait monitoring for local HuggingFace models",
1406
+ formatter_class=argparse.RawDescriptionHelpFormatter,
1407
+ epilog="Run `drowse <verb> -h` for verb-specific options.",
1408
+ )
1409
+ sub = root.add_subparsers(dest="command", required=False, metavar="VERB")
1410
+
1411
+ # Each ``help=`` here is the single source of truth — it lands in
1412
+ # the auto-generated ``positional arguments`` table on ``drowse -h``.
1413
+ # Keep it short enough to fit one line at the typical terminal
1414
+ # width; the verb's own ``-h`` carries the long-form description.
1415
+ serve = sub.add_parser(
1416
+ "serve",
1417
+ help="Start the OpenAI + Ollama API server + analytics dashboard at /",
1418
+ description="Start the OpenAI + Ollama compatible API server",
1419
+ )
1420
+ _build_serve_parser(serve)
1421
+
1422
+ manifold = sub.add_parser(
1423
+ "manifold",
1424
+ help=(
1425
+ "Manifold compute "
1426
+ "(extract/generate/from-template/fit/bake/merge/transfer/compare/why)"
1427
+ ),
1428
+ description="Steering-vector / manifold authoring, fitting, and analysis",
1429
+ )
1430
+ _build_manifold_parser(manifold)
1431
+
1432
+ pack = sub.add_parser(
1433
+ "pack",
1434
+ help="Manifold lifecycle (ls/show/install/search/push/rm/clear/refresh/export)",
1435
+ description="Manifold install / share / inspect / removal lifecycle",
1436
+ )
1437
+ _build_pack_parser(pack)
1438
+
1439
+ cfg = sub.add_parser(
1440
+ "config",
1441
+ help="Inspect and validate drowse config files",
1442
+ description="Inspect/validate config",
1443
+ )
1444
+ _build_config_parser(cfg)
1445
+
1446
+ experiment = sub.add_parser(
1447
+ "experiment",
1448
+ help="Run and replay experiment trees",
1449
+ description="Run and replay experiment trees",
1450
+ )
1451
+ _build_experiment_parser(experiment)
1452
+
1453
+ template = sub.add_parser(
1454
+ "template",
1455
+ help="Templated completions (create/ls/show/score/rm)",
1456
+ description="Standalone templated-completion artifact: author, inspect, "
1457
+ "and score the restricted-choice value distribution",
1458
+ )
1459
+ _build_template_parser(template)
1460
+
1461
+ lens = sub.add_parser(
1462
+ "lens",
1463
+ help="Jacobian lens (fit/fetch/ls/show/use/top/decompose/rm)",
1464
+ description="Per-model Jacobian lens: fit the residual→output "
1465
+ "transport, read out what intermediate activations are "
1466
+ "disposed to say, and split directions into their "
1467
+ "verbalizable (J-space) component",
1468
+ )
1469
+ _build_lens_parser(lens)
1470
+
1471
+ sae = sub.add_parser(
1472
+ "sae",
1473
+ help="Sparse autoencoders (train/fetch/ls/show/use/rm)",
1474
+ description="Train, fetch, select, and inspect per-model sparse-autoencoder sources",
1475
+ )
1476
+ _build_sae_parser(sae)
1477
+
1478
+ return root