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