typebulb 0.57.0 → 0.57.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (78) hide show
  1. package/README.md +7 -5
  2. package/SKILL.md +9 -7
  3. package/dist/agents/claude/client.js +19 -2
  4. package/dist/agents/claude/fonts/KaTeX_AMS-Regular.woff2 +0 -0
  5. package/dist/agents/claude/fonts/KaTeX_Caligraphic-Bold.woff2 +0 -0
  6. package/dist/agents/claude/fonts/KaTeX_Caligraphic-Regular.woff2 +0 -0
  7. package/dist/agents/claude/fonts/KaTeX_Fraktur-Bold.woff2 +0 -0
  8. package/dist/agents/claude/fonts/KaTeX_Fraktur-Regular.woff2 +0 -0
  9. package/dist/agents/claude/fonts/KaTeX_Main-Bold.woff2 +0 -0
  10. package/dist/agents/claude/fonts/KaTeX_Main-BoldItalic.woff2 +0 -0
  11. package/dist/agents/claude/fonts/KaTeX_Main-Italic.woff2 +0 -0
  12. package/dist/agents/claude/fonts/KaTeX_Main-Regular.woff2 +0 -0
  13. package/dist/agents/claude/fonts/KaTeX_Math-BoldItalic.woff2 +0 -0
  14. package/dist/agents/claude/fonts/KaTeX_Math-Italic.woff2 +0 -0
  15. package/dist/agents/claude/fonts/KaTeX_SansSerif-Bold.woff2 +0 -0
  16. package/dist/agents/claude/fonts/KaTeX_SansSerif-Italic.woff2 +0 -0
  17. package/dist/agents/claude/fonts/KaTeX_SansSerif-Regular.woff2 +0 -0
  18. package/dist/agents/claude/fonts/KaTeX_Script-Regular.woff2 +0 -0
  19. package/dist/agents/claude/fonts/KaTeX_Size1-Regular.woff2 +0 -0
  20. package/dist/agents/claude/fonts/KaTeX_Size2-Regular.woff2 +0 -0
  21. package/dist/agents/claude/fonts/KaTeX_Size3-Regular.woff2 +0 -0
  22. package/dist/agents/claude/fonts/KaTeX_Size4-Regular.woff2 +0 -0
  23. package/dist/agents/claude/fonts/KaTeX_Typewriter-Regular.woff2 +0 -0
  24. package/dist/agents/claude/index.html +47 -2
  25. package/dist/agents/claude/katex.min.css +1 -0
  26. package/dist/agents/claude/styles.css +24 -0
  27. package/dist/agents/codex/client.js +19 -2
  28. package/dist/agents/codex/fonts/KaTeX_AMS-Regular.woff2 +0 -0
  29. package/dist/agents/codex/fonts/KaTeX_Caligraphic-Bold.woff2 +0 -0
  30. package/dist/agents/codex/fonts/KaTeX_Caligraphic-Regular.woff2 +0 -0
  31. package/dist/agents/codex/fonts/KaTeX_Fraktur-Bold.woff2 +0 -0
  32. package/dist/agents/codex/fonts/KaTeX_Fraktur-Regular.woff2 +0 -0
  33. package/dist/agents/codex/fonts/KaTeX_Main-Bold.woff2 +0 -0
  34. package/dist/agents/codex/fonts/KaTeX_Main-BoldItalic.woff2 +0 -0
  35. package/dist/agents/codex/fonts/KaTeX_Main-Italic.woff2 +0 -0
  36. package/dist/agents/codex/fonts/KaTeX_Main-Regular.woff2 +0 -0
  37. package/dist/agents/codex/fonts/KaTeX_Math-BoldItalic.woff2 +0 -0
  38. package/dist/agents/codex/fonts/KaTeX_Math-Italic.woff2 +0 -0
  39. package/dist/agents/codex/fonts/KaTeX_SansSerif-Bold.woff2 +0 -0
  40. package/dist/agents/codex/fonts/KaTeX_SansSerif-Italic.woff2 +0 -0
  41. package/dist/agents/codex/fonts/KaTeX_SansSerif-Regular.woff2 +0 -0
  42. package/dist/agents/codex/fonts/KaTeX_Script-Regular.woff2 +0 -0
  43. package/dist/agents/codex/fonts/KaTeX_Size1-Regular.woff2 +0 -0
  44. package/dist/agents/codex/fonts/KaTeX_Size2-Regular.woff2 +0 -0
  45. package/dist/agents/codex/fonts/KaTeX_Size3-Regular.woff2 +0 -0
  46. package/dist/agents/codex/fonts/KaTeX_Size4-Regular.woff2 +0 -0
  47. package/dist/agents/codex/fonts/KaTeX_Typewriter-Regular.woff2 +0 -0
  48. package/dist/agents/codex/index.html +47 -2
  49. package/dist/agents/codex/katex.min.css +1 -0
  50. package/dist/agents/codex/styles.css +24 -0
  51. package/dist/agents/pi/client.js +19 -2
  52. package/dist/agents/pi/fonts/KaTeX_AMS-Regular.woff2 +0 -0
  53. package/dist/agents/pi/fonts/KaTeX_Caligraphic-Bold.woff2 +0 -0
  54. package/dist/agents/pi/fonts/KaTeX_Caligraphic-Regular.woff2 +0 -0
  55. package/dist/agents/pi/fonts/KaTeX_Fraktur-Bold.woff2 +0 -0
  56. package/dist/agents/pi/fonts/KaTeX_Fraktur-Regular.woff2 +0 -0
  57. package/dist/agents/pi/fonts/KaTeX_Main-Bold.woff2 +0 -0
  58. package/dist/agents/pi/fonts/KaTeX_Main-BoldItalic.woff2 +0 -0
  59. package/dist/agents/pi/fonts/KaTeX_Main-Italic.woff2 +0 -0
  60. package/dist/agents/pi/fonts/KaTeX_Main-Regular.woff2 +0 -0
  61. package/dist/agents/pi/fonts/KaTeX_Math-BoldItalic.woff2 +0 -0
  62. package/dist/agents/pi/fonts/KaTeX_Math-Italic.woff2 +0 -0
  63. package/dist/agents/pi/fonts/KaTeX_SansSerif-Bold.woff2 +0 -0
  64. package/dist/agents/pi/fonts/KaTeX_SansSerif-Italic.woff2 +0 -0
  65. package/dist/agents/pi/fonts/KaTeX_SansSerif-Regular.woff2 +0 -0
  66. package/dist/agents/pi/fonts/KaTeX_Script-Regular.woff2 +0 -0
  67. package/dist/agents/pi/fonts/KaTeX_Size1-Regular.woff2 +0 -0
  68. package/dist/agents/pi/fonts/KaTeX_Size2-Regular.woff2 +0 -0
  69. package/dist/agents/pi/fonts/KaTeX_Size3-Regular.woff2 +0 -0
  70. package/dist/agents/pi/fonts/KaTeX_Size4-Regular.woff2 +0 -0
  71. package/dist/agents/pi/fonts/KaTeX_Typewriter-Regular.woff2 +0 -0
  72. package/dist/agents/pi/index.html +47 -2
  73. package/dist/agents/pi/katex.min.css +1 -0
  74. package/dist/agents/pi/styles.css +24 -0
  75. package/dist/index.js +289 -270
  76. package/dist/render.js +18 -1
  77. package/dist/servers.js +103 -86
  78. package/package.json +1 -1
@@ -1,2 +1,47 @@
1
- <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/katex@0.16.22/dist/katex.min.css">
2
- <div id="app"></div>
1
+ <div id="app"></div>
2
+
3
+ <!-- The boot overlay: what the window shows between this HTML landing and the client being up. It
4
+ ships in the served markup, so it paints before any script runs — and its script lives HERE with
5
+ it rather than in page.ts's chrome, because getHtml re-reads this file per request while page.ts
6
+ is bundled into the running process: together, the two halves are always the same version as
7
+ each other and hot-reload as one. The client retires the overlay by removing #boot
8
+ (client/root.ts), which needs nothing from the script below. -->
9
+ <div id="boot" class="boot">
10
+ <div class="boot-title"><span class="shimmer-text shimmer-slow">Starting the agent mirror</span> 💡</div>
11
+ <div class="boot-why"></div>
12
+ </div>
13
+ <script>
14
+ (() => {
15
+ const el = document.getElementById('boot')
16
+ const why = el && el.querySelector('.boot-why')
17
+ // Markup and script ship in this one file, so a mismatch means a truncated or hand-altered stub.
18
+ // Bail rather than wedge on it; removal is the client's job and needs nothing from here.
19
+ if (!why) return
20
+ // The overlay says NOTHING while it is merely loading. The shimmering title already says "working",
21
+ // and narrating which step is in flight teaches the user nothing they can act on — a wait we cannot
22
+ // explain is better left unexplained. It speaks only when something has actually FAILED, which is
23
+ // the one thing they cannot see for themselves.
24
+ const say = text => { if (el.isConnected) why.textContent = text }
25
+ let retried = false
26
+ // A module script's FETCH failure fires on the element and never bubbles to window, hence capture.
27
+ // Untreated it is invisible: the page shimmers on over a bundle that is never coming.
28
+ addEventListener('error', e => {
29
+ const script = e.target
30
+ if (script instanceof HTMLScriptElement) {
31
+ // One silent re-fetch first — silent because a retry that works is not news. The common cause
32
+ // is transient (a mirror serving assets that were rewritten under it mid-load), and
33
+ // re-appending the script rather than reloading the page cannot loop and cannot cost the page.
34
+ if (retried) { say("The agent mirror didn't finish loading. Reload to retry."); return }
35
+ retried = true
36
+ setTimeout(() => {
37
+ const again = document.createElement('script')
38
+ again.type = 'module'
39
+ again.src = script.src.split('?')[0] + '?retry=' + Date.now() // past a cached bad response
40
+ document.body.appendChild(again)
41
+ }, 1000)
42
+ } else if (e.message) {
43
+ say('The agent mirror stopped: ' + e.message)
44
+ }
45
+ }, true)
46
+ })()
47
+ </script>
@@ -0,0 +1 @@
1
+ @font-face{font-display:block;font-family:KaTeX_AMS;font-style:normal;font-weight:400;src:url(/agents/codex/fonts/KaTeX_AMS-Regular.woff2) format("woff2"),url(/agents/codex/fonts/KaTeX_AMS-Regular.woff) format("woff"),url(/agents/codex/fonts/KaTeX_AMS-Regular.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Caligraphic;font-style:normal;font-weight:700;src:url(/agents/codex/fonts/KaTeX_Caligraphic-Bold.woff2) format("woff2"),url(/agents/codex/fonts/KaTeX_Caligraphic-Bold.woff) format("woff"),url(/agents/codex/fonts/KaTeX_Caligraphic-Bold.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Caligraphic;font-style:normal;font-weight:400;src:url(/agents/codex/fonts/KaTeX_Caligraphic-Regular.woff2) format("woff2"),url(/agents/codex/fonts/KaTeX_Caligraphic-Regular.woff) format("woff"),url(/agents/codex/fonts/KaTeX_Caligraphic-Regular.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Fraktur;font-style:normal;font-weight:700;src:url(/agents/codex/fonts/KaTeX_Fraktur-Bold.woff2) format("woff2"),url(/agents/codex/fonts/KaTeX_Fraktur-Bold.woff) format("woff"),url(/agents/codex/fonts/KaTeX_Fraktur-Bold.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Fraktur;font-style:normal;font-weight:400;src:url(/agents/codex/fonts/KaTeX_Fraktur-Regular.woff2) format("woff2"),url(/agents/codex/fonts/KaTeX_Fraktur-Regular.woff) format("woff"),url(/agents/codex/fonts/KaTeX_Fraktur-Regular.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Main;font-style:normal;font-weight:700;src:url(/agents/codex/fonts/KaTeX_Main-Bold.woff2) format("woff2"),url(/agents/codex/fonts/KaTeX_Main-Bold.woff) format("woff"),url(/agents/codex/fonts/KaTeX_Main-Bold.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Main;font-style:italic;font-weight:700;src:url(/agents/codex/fonts/KaTeX_Main-BoldItalic.woff2) format("woff2"),url(/agents/codex/fonts/KaTeX_Main-BoldItalic.woff) format("woff"),url(/agents/codex/fonts/KaTeX_Main-BoldItalic.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Main;font-style:italic;font-weight:400;src:url(/agents/codex/fonts/KaTeX_Main-Italic.woff2) format("woff2"),url(/agents/codex/fonts/KaTeX_Main-Italic.woff) format("woff"),url(/agents/codex/fonts/KaTeX_Main-Italic.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Main;font-style:normal;font-weight:400;src:url(/agents/codex/fonts/KaTeX_Main-Regular.woff2) format("woff2"),url(/agents/codex/fonts/KaTeX_Main-Regular.woff) format("woff"),url(/agents/codex/fonts/KaTeX_Main-Regular.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Math;font-style:italic;font-weight:700;src:url(/agents/codex/fonts/KaTeX_Math-BoldItalic.woff2) format("woff2"),url(/agents/codex/fonts/KaTeX_Math-BoldItalic.woff) format("woff"),url(/agents/codex/fonts/KaTeX_Math-BoldItalic.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Math;font-style:italic;font-weight:400;src:url(/agents/codex/fonts/KaTeX_Math-Italic.woff2) format("woff2"),url(/agents/codex/fonts/KaTeX_Math-Italic.woff) format("woff"),url(/agents/codex/fonts/KaTeX_Math-Italic.ttf) format("truetype")}@font-face{font-display:block;font-family:"KaTeX_SansSerif";font-style:normal;font-weight:700;src:url(/agents/codex/fonts/KaTeX_SansSerif-Bold.woff2) format("woff2"),url(/agents/codex/fonts/KaTeX_SansSerif-Bold.woff) format("woff"),url(/agents/codex/fonts/KaTeX_SansSerif-Bold.ttf) format("truetype")}@font-face{font-display:block;font-family:"KaTeX_SansSerif";font-style:italic;font-weight:400;src:url(/agents/codex/fonts/KaTeX_SansSerif-Italic.woff2) format("woff2"),url(/agents/codex/fonts/KaTeX_SansSerif-Italic.woff) format("woff"),url(/agents/codex/fonts/KaTeX_SansSerif-Italic.ttf) format("truetype")}@font-face{font-display:block;font-family:"KaTeX_SansSerif";font-style:normal;font-weight:400;src:url(/agents/codex/fonts/KaTeX_SansSerif-Regular.woff2) format("woff2"),url(/agents/codex/fonts/KaTeX_SansSerif-Regular.woff) format("woff"),url(/agents/codex/fonts/KaTeX_SansSerif-Regular.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Script;font-style:normal;font-weight:400;src:url(/agents/codex/fonts/KaTeX_Script-Regular.woff2) format("woff2"),url(/agents/codex/fonts/KaTeX_Script-Regular.woff) format("woff"),url(/agents/codex/fonts/KaTeX_Script-Regular.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Size1;font-style:normal;font-weight:400;src:url(/agents/codex/fonts/KaTeX_Size1-Regular.woff2) format("woff2"),url(/agents/codex/fonts/KaTeX_Size1-Regular.woff) format("woff"),url(/agents/codex/fonts/KaTeX_Size1-Regular.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Size2;font-style:normal;font-weight:400;src:url(/agents/codex/fonts/KaTeX_Size2-Regular.woff2) format("woff2"),url(/agents/codex/fonts/KaTeX_Size2-Regular.woff) format("woff"),url(/agents/codex/fonts/KaTeX_Size2-Regular.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Size3;font-style:normal;font-weight:400;src:url(/agents/codex/fonts/KaTeX_Size3-Regular.woff2) format("woff2"),url(/agents/codex/fonts/KaTeX_Size3-Regular.woff) format("woff"),url(/agents/codex/fonts/KaTeX_Size3-Regular.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Size4;font-style:normal;font-weight:400;src:url(/agents/codex/fonts/KaTeX_Size4-Regular.woff2) format("woff2"),url(/agents/codex/fonts/KaTeX_Size4-Regular.woff) format("woff"),url(/agents/codex/fonts/KaTeX_Size4-Regular.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Typewriter;font-style:normal;font-weight:400;src:url(/agents/codex/fonts/KaTeX_Typewriter-Regular.woff2) format("woff2"),url(/agents/codex/fonts/KaTeX_Typewriter-Regular.woff) format("woff"),url(/agents/codex/fonts/KaTeX_Typewriter-Regular.ttf) format("truetype")}.katex{font:normal 1.21em KaTeX_Main,Times New Roman,serif;line-height:1.2;position:relative;text-indent:0;text-rendering:auto}.katex *{-ms-high-contrast-adjust:none!important;border-color:currentColor}.katex .katex-version:after{content:"0.16.47"}.katex .katex-mathml{border:0;-webkit-clip-path:inset(50%);clip-path:inset(50%);height:1px;overflow:hidden;padding:0;position:absolute;width:1px}.katex .katex-html>.newline{display:block}.katex .base{position:relative;white-space:nowrap;width:-webkit-min-content;width:-moz-min-content;width:min-content}.katex .base,.katex .strut{display:inline-block}.katex .textbf{font-weight:700}.katex .textit{font-style:italic}.katex .textrm{font-family:KaTeX_Main}.katex .textsf{font-family:KaTeX_SansSerif}.katex .texttt{font-family:KaTeX_Typewriter}.katex .mathnormal{font-family:KaTeX_Math;font-style:italic}.katex .mathit{font-family:KaTeX_Main;font-style:italic}.katex .mathrm{font-style:normal}.katex .mathbf{font-family:KaTeX_Main;font-weight:700}.katex .boldsymbol{font-family:KaTeX_Math;font-style:italic;font-weight:700}.katex .amsrm,.katex .mathbb,.katex .textbb{font-family:KaTeX_AMS}.katex .mathcal{font-family:KaTeX_Caligraphic}.katex .mathfrak,.katex .textfrak{font-family:KaTeX_Fraktur}.katex .mathboldfrak,.katex .textboldfrak{font-family:KaTeX_Fraktur;font-weight:700}.katex .mathtt{font-family:KaTeX_Typewriter}.katex .mathscr,.katex .textscr{font-family:KaTeX_Script}.katex .mathsf,.katex .textsf{font-family:KaTeX_SansSerif}.katex .mathboldsf,.katex .textboldsf{font-family:KaTeX_SansSerif;font-weight:700}.katex .mathitsf,.katex .mathsfit,.katex .textitsf{font-family:KaTeX_SansSerif;font-style:italic}.katex .mainrm{font-family:KaTeX_Main;font-style:normal}.katex .vlist-t{border-collapse:collapse;display:inline-table;table-layout:fixed}.katex .vlist-r{display:table-row}.katex .vlist{display:table-cell;position:relative;vertical-align:bottom}.katex .vlist>span{display:block;height:0;position:relative}.katex .vlist>span>span{display:inline-block}.katex .vlist>span>.pstrut{overflow:hidden;width:0}.katex .vlist-t2{margin-right:-2px}.katex .vlist-s{display:table-cell;font-size:1px;min-width:2px;vertical-align:bottom;width:2px}.katex .vbox{align-items:baseline;display:inline-flex;flex-direction:column}.katex .hbox{width:100%}.katex .hbox,.katex .thinbox{display:inline-flex;flex-direction:row}.katex .thinbox{max-width:0;width:0}.katex .msupsub{text-align:left}.katex .mfrac>span>span{text-align:center}.katex .mfrac .frac-line{border-bottom-style:solid;display:inline-block;width:100%}.katex .hdashline,.katex .hline,.katex .mfrac .frac-line,.katex .overline .overline-line,.katex .rule,.katex .underline .underline-line{min-height:1px}.katex .mspace{display:inline-block}.katex .smash{display:inline;line-height:0}.katex .clap,.katex .llap,.katex .rlap{position:relative;width:0}.katex .clap>.inner,.katex .llap>.inner,.katex .rlap>.inner{position:absolute}.katex .clap>.fix,.katex .llap>.fix,.katex .rlap>.fix{display:inline-block}.katex .llap>.inner{right:0}.katex .clap>.inner,.katex .rlap>.inner{left:0}.katex .clap>.inner>span{margin-left:-50%;margin-right:50%}.katex .rule{border:0 solid;display:inline-block;position:relative}.katex .hline,.katex .overline .overline-line,.katex .underline .underline-line{border-bottom-style:solid;display:inline-block;width:100%}.katex .hdashline{border-bottom-style:dashed;display:inline-block;width:100%}.katex .sqrt>.root{margin-left:.2777777778em;margin-right:-.5555555556em}.katex .fontsize-ensurer.reset-size1.size1,.katex .sizing.reset-size1.size1{font-size:1em}.katex .fontsize-ensurer.reset-size1.size2,.katex .sizing.reset-size1.size2{font-size:1.2em}.katex .fontsize-ensurer.reset-size1.size3,.katex .sizing.reset-size1.size3{font-size:1.4em}.katex .fontsize-ensurer.reset-size1.size4,.katex .sizing.reset-size1.size4{font-size:1.6em}.katex .fontsize-ensurer.reset-size1.size5,.katex .sizing.reset-size1.size5{font-size:1.8em}.katex .fontsize-ensurer.reset-size1.size6,.katex .sizing.reset-size1.size6{font-size:2em}.katex .fontsize-ensurer.reset-size1.size7,.katex .sizing.reset-size1.size7{font-size:2.4em}.katex .fontsize-ensurer.reset-size1.size8,.katex .sizing.reset-size1.size8{font-size:2.88em}.katex .fontsize-ensurer.reset-size1.size9,.katex .sizing.reset-size1.size9{font-size:3.456em}.katex .fontsize-ensurer.reset-size1.size10,.katex .sizing.reset-size1.size10{font-size:4.148em}.katex .fontsize-ensurer.reset-size1.size11,.katex .sizing.reset-size1.size11{font-size:4.976em}.katex .fontsize-ensurer.reset-size2.size1,.katex .sizing.reset-size2.size1{font-size:.8333333333em}.katex .fontsize-ensurer.reset-size2.size2,.katex .sizing.reset-size2.size2{font-size:1em}.katex .fontsize-ensurer.reset-size2.size3,.katex .sizing.reset-size2.size3{font-size:1.1666666667em}.katex .fontsize-ensurer.reset-size2.size4,.katex .sizing.reset-size2.size4{font-size:1.3333333333em}.katex .fontsize-ensurer.reset-size2.size5,.katex .sizing.reset-size2.size5{font-size:1.5em}.katex .fontsize-ensurer.reset-size2.size6,.katex .sizing.reset-size2.size6{font-size:1.6666666667em}.katex .fontsize-ensurer.reset-size2.size7,.katex .sizing.reset-size2.size7{font-size:2em}.katex .fontsize-ensurer.reset-size2.size8,.katex .sizing.reset-size2.size8{font-size:2.4em}.katex .fontsize-ensurer.reset-size2.size9,.katex .sizing.reset-size2.size9{font-size:2.88em}.katex .fontsize-ensurer.reset-size2.size10,.katex .sizing.reset-size2.size10{font-size:3.4566666667em}.katex .fontsize-ensurer.reset-size2.size11,.katex .sizing.reset-size2.size11{font-size:4.1466666667em}.katex .fontsize-ensurer.reset-size3.size1,.katex .sizing.reset-size3.size1{font-size:.7142857143em}.katex .fontsize-ensurer.reset-size3.size2,.katex .sizing.reset-size3.size2{font-size:.8571428571em}.katex .fontsize-ensurer.reset-size3.size3,.katex .sizing.reset-size3.size3{font-size:1em}.katex .fontsize-ensurer.reset-size3.size4,.katex .sizing.reset-size3.size4{font-size:1.1428571429em}.katex .fontsize-ensurer.reset-size3.size5,.katex .sizing.reset-size3.size5{font-size:1.2857142857em}.katex .fontsize-ensurer.reset-size3.size6,.katex .sizing.reset-size3.size6{font-size:1.4285714286em}.katex .fontsize-ensurer.reset-size3.size7,.katex .sizing.reset-size3.size7{font-size:1.7142857143em}.katex .fontsize-ensurer.reset-size3.size8,.katex .sizing.reset-size3.size8{font-size:2.0571428571em}.katex .fontsize-ensurer.reset-size3.size9,.katex .sizing.reset-size3.size9{font-size:2.4685714286em}.katex .fontsize-ensurer.reset-size3.size10,.katex .sizing.reset-size3.size10{font-size:2.9628571429em}.katex .fontsize-ensurer.reset-size3.size11,.katex .sizing.reset-size3.size11{font-size:3.5542857143em}.katex .fontsize-ensurer.reset-size4.size1,.katex .sizing.reset-size4.size1{font-size:.625em}.katex .fontsize-ensurer.reset-size4.size2,.katex .sizing.reset-size4.size2{font-size:.75em}.katex .fontsize-ensurer.reset-size4.size3,.katex .sizing.reset-size4.size3{font-size:.875em}.katex .fontsize-ensurer.reset-size4.size4,.katex .sizing.reset-size4.size4{font-size:1em}.katex .fontsize-ensurer.reset-size4.size5,.katex .sizing.reset-size4.size5{font-size:1.125em}.katex .fontsize-ensurer.reset-size4.size6,.katex .sizing.reset-size4.size6{font-size:1.25em}.katex .fontsize-ensurer.reset-size4.size7,.katex .sizing.reset-size4.size7{font-size:1.5em}.katex .fontsize-ensurer.reset-size4.size8,.katex .sizing.reset-size4.size8{font-size:1.8em}.katex .fontsize-ensurer.reset-size4.size9,.katex .sizing.reset-size4.size9{font-size:2.16em}.katex .fontsize-ensurer.reset-size4.size10,.katex .sizing.reset-size4.size10{font-size:2.5925em}.katex .fontsize-ensurer.reset-size4.size11,.katex .sizing.reset-size4.size11{font-size:3.11em}.katex .fontsize-ensurer.reset-size5.size1,.katex .sizing.reset-size5.size1{font-size:.5555555556em}.katex .fontsize-ensurer.reset-size5.size2,.katex .sizing.reset-size5.size2{font-size:.6666666667em}.katex .fontsize-ensurer.reset-size5.size3,.katex .sizing.reset-size5.size3{font-size:.7777777778em}.katex .fontsize-ensurer.reset-size5.size4,.katex .sizing.reset-size5.size4{font-size:.8888888889em}.katex .fontsize-ensurer.reset-size5.size5,.katex .sizing.reset-size5.size5{font-size:1em}.katex .fontsize-ensurer.reset-size5.size6,.katex .sizing.reset-size5.size6{font-size:1.1111111111em}.katex .fontsize-ensurer.reset-size5.size7,.katex .sizing.reset-size5.size7{font-size:1.3333333333em}.katex .fontsize-ensurer.reset-size5.size8,.katex .sizing.reset-size5.size8{font-size:1.6em}.katex .fontsize-ensurer.reset-size5.size9,.katex .sizing.reset-size5.size9{font-size:1.92em}.katex .fontsize-ensurer.reset-size5.size10,.katex .sizing.reset-size5.size10{font-size:2.3044444444em}.katex .fontsize-ensurer.reset-size5.size11,.katex .sizing.reset-size5.size11{font-size:2.7644444444em}.katex .fontsize-ensurer.reset-size6.size1,.katex .sizing.reset-size6.size1{font-size:.5em}.katex .fontsize-ensurer.reset-size6.size2,.katex .sizing.reset-size6.size2{font-size:.6em}.katex .fontsize-ensurer.reset-size6.size3,.katex .sizing.reset-size6.size3{font-size:.7em}.katex .fontsize-ensurer.reset-size6.size4,.katex .sizing.reset-size6.size4{font-size:.8em}.katex .fontsize-ensurer.reset-size6.size5,.katex .sizing.reset-size6.size5{font-size:.9em}.katex .fontsize-ensurer.reset-size6.size6,.katex .sizing.reset-size6.size6{font-size:1em}.katex .fontsize-ensurer.reset-size6.size7,.katex .sizing.reset-size6.size7{font-size:1.2em}.katex .fontsize-ensurer.reset-size6.size8,.katex .sizing.reset-size6.size8{font-size:1.44em}.katex .fontsize-ensurer.reset-size6.size9,.katex .sizing.reset-size6.size9{font-size:1.728em}.katex .fontsize-ensurer.reset-size6.size10,.katex .sizing.reset-size6.size10{font-size:2.074em}.katex .fontsize-ensurer.reset-size6.size11,.katex .sizing.reset-size6.size11{font-size:2.488em}.katex .fontsize-ensurer.reset-size7.size1,.katex .sizing.reset-size7.size1{font-size:.4166666667em}.katex .fontsize-ensurer.reset-size7.size2,.katex .sizing.reset-size7.size2{font-size:.5em}.katex .fontsize-ensurer.reset-size7.size3,.katex .sizing.reset-size7.size3{font-size:.5833333333em}.katex .fontsize-ensurer.reset-size7.size4,.katex .sizing.reset-size7.size4{font-size:.6666666667em}.katex .fontsize-ensurer.reset-size7.size5,.katex .sizing.reset-size7.size5{font-size:.75em}.katex .fontsize-ensurer.reset-size7.size6,.katex .sizing.reset-size7.size6{font-size:.8333333333em}.katex .fontsize-ensurer.reset-size7.size7,.katex .sizing.reset-size7.size7{font-size:1em}.katex .fontsize-ensurer.reset-size7.size8,.katex .sizing.reset-size7.size8{font-size:1.2em}.katex .fontsize-ensurer.reset-size7.size9,.katex .sizing.reset-size7.size9{font-size:1.44em}.katex .fontsize-ensurer.reset-size7.size10,.katex .sizing.reset-size7.size10{font-size:1.7283333333em}.katex .fontsize-ensurer.reset-size7.size11,.katex .sizing.reset-size7.size11{font-size:2.0733333333em}.katex .fontsize-ensurer.reset-size8.size1,.katex .sizing.reset-size8.size1{font-size:.3472222222em}.katex .fontsize-ensurer.reset-size8.size2,.katex .sizing.reset-size8.size2{font-size:.4166666667em}.katex .fontsize-ensurer.reset-size8.size3,.katex .sizing.reset-size8.size3{font-size:.4861111111em}.katex .fontsize-ensurer.reset-size8.size4,.katex .sizing.reset-size8.size4{font-size:.5555555556em}.katex .fontsize-ensurer.reset-size8.size5,.katex .sizing.reset-size8.size5{font-size:.625em}.katex .fontsize-ensurer.reset-size8.size6,.katex .sizing.reset-size8.size6{font-size:.6944444444em}.katex .fontsize-ensurer.reset-size8.size7,.katex .sizing.reset-size8.size7{font-size:.8333333333em}.katex .fontsize-ensurer.reset-size8.size8,.katex .sizing.reset-size8.size8{font-size:1em}.katex .fontsize-ensurer.reset-size8.size9,.katex .sizing.reset-size8.size9{font-size:1.2em}.katex .fontsize-ensurer.reset-size8.size10,.katex .sizing.reset-size8.size10{font-size:1.4402777778em}.katex .fontsize-ensurer.reset-size8.size11,.katex .sizing.reset-size8.size11{font-size:1.7277777778em}.katex .fontsize-ensurer.reset-size9.size1,.katex .sizing.reset-size9.size1{font-size:.2893518519em}.katex .fontsize-ensurer.reset-size9.size2,.katex .sizing.reset-size9.size2{font-size:.3472222222em}.katex .fontsize-ensurer.reset-size9.size3,.katex .sizing.reset-size9.size3{font-size:.4050925926em}.katex .fontsize-ensurer.reset-size9.size4,.katex .sizing.reset-size9.size4{font-size:.462962963em}.katex .fontsize-ensurer.reset-size9.size5,.katex .sizing.reset-size9.size5{font-size:.5208333333em}.katex .fontsize-ensurer.reset-size9.size6,.katex .sizing.reset-size9.size6{font-size:.5787037037em}.katex .fontsize-ensurer.reset-size9.size7,.katex .sizing.reset-size9.size7{font-size:.6944444444em}.katex .fontsize-ensurer.reset-size9.size8,.katex .sizing.reset-size9.size8{font-size:.8333333333em}.katex .fontsize-ensurer.reset-size9.size9,.katex .sizing.reset-size9.size9{font-size:1em}.katex .fontsize-ensurer.reset-size9.size10,.katex .sizing.reset-size9.size10{font-size:1.2002314815em}.katex .fontsize-ensurer.reset-size9.size11,.katex .sizing.reset-size9.size11{font-size:1.4398148148em}.katex .fontsize-ensurer.reset-size10.size1,.katex .sizing.reset-size10.size1{font-size:.2410800386em}.katex .fontsize-ensurer.reset-size10.size2,.katex .sizing.reset-size10.size2{font-size:.2892960463em}.katex .fontsize-ensurer.reset-size10.size3,.katex .sizing.reset-size10.size3{font-size:.337512054em}.katex .fontsize-ensurer.reset-size10.size4,.katex .sizing.reset-size10.size4{font-size:.3857280617em}.katex .fontsize-ensurer.reset-size10.size5,.katex .sizing.reset-size10.size5{font-size:.4339440694em}.katex .fontsize-ensurer.reset-size10.size6,.katex .sizing.reset-size10.size6{font-size:.4821600771em}.katex .fontsize-ensurer.reset-size10.size7,.katex .sizing.reset-size10.size7{font-size:.5785920926em}.katex .fontsize-ensurer.reset-size10.size8,.katex .sizing.reset-size10.size8{font-size:.6943105111em}.katex .fontsize-ensurer.reset-size10.size9,.katex .sizing.reset-size10.size9{font-size:.8331726133em}.katex .fontsize-ensurer.reset-size10.size10,.katex .sizing.reset-size10.size10{font-size:1em}.katex .fontsize-ensurer.reset-size10.size11,.katex .sizing.reset-size10.size11{font-size:1.1996142719em}.katex .fontsize-ensurer.reset-size11.size1,.katex .sizing.reset-size11.size1{font-size:.2009646302em}.katex .fontsize-ensurer.reset-size11.size2,.katex .sizing.reset-size11.size2{font-size:.2411575563em}.katex .fontsize-ensurer.reset-size11.size3,.katex .sizing.reset-size11.size3{font-size:.2813504823em}.katex .fontsize-ensurer.reset-size11.size4,.katex .sizing.reset-size11.size4{font-size:.3215434084em}.katex .fontsize-ensurer.reset-size11.size5,.katex .sizing.reset-size11.size5{font-size:.3617363344em}.katex .fontsize-ensurer.reset-size11.size6,.katex .sizing.reset-size11.size6{font-size:.4019292605em}.katex .fontsize-ensurer.reset-size11.size7,.katex .sizing.reset-size11.size7{font-size:.4823151125em}.katex .fontsize-ensurer.reset-size11.size8,.katex .sizing.reset-size11.size8{font-size:.578778135em}.katex .fontsize-ensurer.reset-size11.size9,.katex .sizing.reset-size11.size9{font-size:.6945337621em}.katex .fontsize-ensurer.reset-size11.size10,.katex .sizing.reset-size11.size10{font-size:.8336012862em}.katex .fontsize-ensurer.reset-size11.size11,.katex .sizing.reset-size11.size11{font-size:1em}.katex .delimsizing.size1{font-family:KaTeX_Size1}.katex .delimsizing.size2{font-family:KaTeX_Size2}.katex .delimsizing.size3{font-family:KaTeX_Size3}.katex .delimsizing.size4{font-family:KaTeX_Size4}.katex .delimsizing.mult .delim-size1>span{font-family:KaTeX_Size1}.katex .delimsizing.mult .delim-size4>span{font-family:KaTeX_Size4}.katex .nulldelimiter{display:inline-block;width:.12em}.katex .delimcenter,.katex .op-symbol{position:relative}.katex .op-symbol.small-op{font-family:KaTeX_Size1}.katex .op-symbol.large-op{font-family:KaTeX_Size2}.katex .accent>.vlist-t,.katex .op-limits>.vlist-t{text-align:center}.katex .accent .accent-body{position:relative}.katex .accent .accent-body:not(.accent-full){width:0}.katex .overlay{display:block}.katex .mtable .vertical-separator{display:inline-block;min-width:1px}.katex .mtable .arraycolsep{display:inline-block}.katex .mtable .col-align-c>.vlist-t{text-align:center}.katex .mtable .col-align-l>.vlist-t{text-align:left}.katex .mtable .col-align-r>.vlist-t{text-align:right}.katex .svg-align{text-align:left}.katex svg{fill:currentColor;stroke:currentColor;display:block;height:inherit;position:absolute;width:100%}.katex svg path{stroke:none}.katex svg{fill-rule:nonzero;fill-opacity:1;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1}.katex img{border-style:none;max-height:none;max-width:none;min-height:0;min-width:0}.katex .stretchy{display:block;overflow:hidden;position:relative;width:100%}.katex .stretchy:after,.katex .stretchy:before{content:""}.katex .hide-tail{overflow:hidden;position:relative;width:100%}.katex .halfarrow-left{left:0;overflow:hidden;position:absolute;width:50.2%}.katex .halfarrow-right{overflow:hidden;position:absolute;right:0;width:50.2%}.katex .brace-left{left:0;overflow:hidden;position:absolute;width:25.1%}.katex .brace-center{left:25%;overflow:hidden;position:absolute;width:50%}.katex .brace-right{overflow:hidden;position:absolute;right:0;width:25.1%}.katex .x-arrow-pad{padding:0 .5em}.katex .cd-arrow-pad{padding:0 .55556em 0 .27778em}.katex .mover,.katex .munder,.katex .x-arrow{text-align:center}.katex .boxpad{padding:0 .3em}.katex .fbox,.katex .fcolorbox{border:.04em solid;box-sizing:border-box}.katex .cancel-pad{padding:0 .2em}.katex .cancel-lap{margin-left:-.2em;margin-right:-.2em}.katex .sout{border-bottom-style:solid;border-bottom-width:.08em}.katex .angl{border-right:.049em solid;border-top:.049em solid;box-sizing:border-box;margin-right:.03889em}.katex .anglpad{padding:0 .03889em}.katex .eqn-num:before{content:"(" counter(katexEqnNo) ")";counter-increment:katexEqnNo}.katex .mml-eqn-num:before{content:"(" counter(mmlEqnNo) ")";counter-increment:mmlEqnNo}.katex .mtr-glue{width:50%}.katex .cd-vert-arrow{display:inline-block;position:relative}.katex .cd-label-left{display:inline-block;position:absolute;right:calc(50% + .3em);text-align:left}.katex .cd-label-right{display:inline-block;left:calc(50% + .3em);position:absolute;text-align:right}.katex-display{display:block;margin:1em 0;text-align:center}.katex-display>.katex{display:block;text-align:center;white-space:nowrap}.katex-display>.katex>.katex-html{display:block;position:relative}.katex-display>.katex>.katex-html>.tag{position:absolute;right:0}.katex-display.leqno>.katex>.katex-html>.tag{left:0;right:auto}.katex-display.fleqn>.katex{padding-left:2em;text-align:left}body{counter-reset:katexEqnNo mmlEqnNo}
@@ -337,6 +337,30 @@ html:not([data-theme="dark"]) .turn-view > .shimmer-text {
337
337
  rides a whole buffering window). */
338
338
  .pill-busy { border-color: var(--accent); --shimmer-base: var(--panel); --shimmer-mix: 25%; }
339
339
 
340
+ /* ---- Boot overlay (index.html, markup and script both) — what the window shows between the HTML
341
+ landing and the client having a transcript. Opaque and over #app, so the empty
342
+ chrome never flashes through first. The 1.2s animation delay is the whole don't-flash-on-a-fast-load
343
+ mechanism: a normal boot is retired before this fades in, so the wait is only ever announced when
344
+ there is one. Measured, not guessed — a warm local boot lands at 590-930ms (dev, where the client
345
+ bundle is unminified and slowest), so the delay has to clear that, not merely beat a blank screen.
346
+ Geometry follows .cwd-hint, the mirror's other centred whole-window message. */
347
+ .boot {
348
+ position: fixed;
349
+ inset: 0;
350
+ background: var(--bg);
351
+ display: grid;
352
+ place-content: center;
353
+ justify-items: center;
354
+ gap: .5rem;
355
+ padding: 2rem;
356
+ text-align: center;
357
+ animation: boot-in .35s ease 1.2s both;
358
+ }
359
+ .boot-title { font-size: 1.15rem; }
360
+ /* min-height reserves the line the seconds count lands on, so naming the wait doesn't shift the title. */
361
+ .boot-why { color: var(--muted); font-size: .95rem; max-width: 32rem; min-height: 1.4em; }
362
+ @keyframes boot-in { from { opacity: 0; } to { opacity: 1; } }
363
+
340
364
  /* ── Tooltip — the styled stand-in for native `title`, and only on FIXED EXPLANATORY copy: text
341
365
  that teaches what a control does. Dynamic identifiers (a path, a model id, an mcp tool's full
342
366
  name) keep the native attribute, which is better at them: they run long, they want to wrap, and
@@ -1854,7 +1854,20 @@ ${MCt("tbStreamUrl")}
1854
1854
  } catch (err) { location.replace('about:blank'); }
1855
1855
  }, 250);
1856
1856
  });
1857
- tbOn('message', async (e) => {
1857
+ // The stream attaches during this script's own eval, in <head> \u2014 before the bulb's module (and
1858
+ // its import graph) have run, so before a single \`tb.onMessage\` handler exists. The server now
1859
+ // delivers the instant the stream attaches (it holds a send for the page it opened), so a
1860
+ // message can beat the page's own code by the width of a CDN fetch. A page that is attached but
1861
+ // has not yet run is not a page with no handlers, so hold the message until the deferred module
1862
+ // scripts have executed (DOMContentLoaded waits for them). Page-side and bounded by one load:
1863
+ // the server still never buffers, and a page that is awake handles inline as before.
1864
+ let pageAwake = document.readyState !== 'loading';
1865
+ const beforeAwake = [];
1866
+ if (!pageAwake) document.addEventListener('DOMContentLoaded', () => {
1867
+ pageAwake = true;
1868
+ for (const run of beforeAwake.splice(0)) run();
1869
+ });
1870
+ const onMessageEvent = async (e) => {
1858
1871
  // Wire envelope { id?, payload } (JSON \u2014 SSE-line-safe). tb:* payloads are the shim's reserved
1859
1872
  // namespace (TB-Interrogation.md): answered by a built-in handler, never delivered to
1860
1873
  // tb.onMessage. Each settled non-undefined return is a reply candidate \u2014 the CLI enforces the
@@ -1896,6 +1909,10 @@ ${MCt("tbStreamUrl")}
1896
1909
  if (env.id !== undefined) {
1897
1910
  try { fetch('/__send-reply', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ id: env.id, results, errors }) }); } catch {}
1898
1911
  }
1912
+ };
1913
+ tbOn('message', (e) => {
1914
+ if (pageAwake) { void onMessageEvent(e); return; }
1915
+ beforeAwake.push(() => { void onMessageEvent(e); });
1899
1916
  });
1900
1917
  }
1901
1918
  })();
@@ -2067,7 +2084,7 @@ ${a||this.currentRow()?.pending?"New conversation \u2014 not saved yet":`Session
2067
2084
  `),user:""}}stickToBottomNextRender(){this.#n=!0}#a(s,a){s.segments=[...s.segments??[s.text],a],s.text=s.segments.join(`
2068
2085
 
2069
2086
  `)}applyUser(s){let a=this.messages[this.messages.length-1];if(a&&a.role==="user"){this.#a(a,s.text),a.copy?a.copy.setText(a.text):a.text&&(a.copy=this.#u(a.text));return}this.#l({id:++this.#e,role:"user",text:s.text,thinking:"",tools:[]})}applyAssistant(s){let a=this.messages[this.messages.length-1]?.role!=="assistant",h=this.#l({id:++this.#e,role:"assistant",text:s.text,thinking:s.thinking,tools:s.tools.map(v=>({...v,isError:!1}))}),p=this.messages[this.messages.length-2],b=this.#h();if(h.turnCopy=p?.role==="assistant"&&p.turnCopy||this.#u(""),h.turnCopy.setText(b.prose),h.turnView=p?.role==="assistant"&&p.turnView||this.#f(),a&&h.turnView.adoptLiveOverride(this.liveTurnView.takeOverride()),h.turnView.setText(b.prose,b.user),this.#d(h,s.text),this.#b(),s.live)for(let v of s.tools)l5n.has(v.name)&&this.openTools.add(v.id)}#d(s,a){let h=nEe(a);h.some(p=>p.kind==="bulb")&&(s.body=h.map(p=>{if(p.kind==="md")return p.text;let b=new iie(p.source,`inline-${this.#i++}`);return this.inlineBulbs.push(b),b}))}#b(){let s=this.inlineBulbs.map(p=>p.name),a=GSt(s),h=JSt(s);this.#t=new Set(this.inlineBulbs.filter((p,b)=>a[b])),this.inlineBulbs.forEach((p,b)=>{p.setChainPosition(h[b]),p.setMounted(!a[b]||this.expandedInlineBulbs.has(p.key))})}#A(s){oEe(this.expandedInlineBulbs,s),this.#b(),this.update()}applyToolResult(s){let a=this.#p(s.id);a&&(a.result=s.content,a.isError=s.isError,a.digest=s.digest)}applyFork(s){let a=this.#g(s.events);this.#l({id:++this.#e,role:"fork",text:"",thinking:"",tools:[],fork:{count:s.count,sub:a}})}#g(s){let a=[];for(let h of s)if(h.type==="user"){let p=a[a.length-1];p&&p.role==="user"?this.#a(p,h.text):a.push({id:++this.#e,role:"user",text:h.text,thinking:"",tools:[]})}else if(h.type==="assistant")a.push({id:++this.#e,role:"assistant",text:h.text,thinking:h.thinking,tools:h.tools.map(p=>({...p,isError:!1}))});else if(h.type==="tool_result"){let p=a.flatMap(b=>b.tools).find(b=>b.id===h.id);p&&(p.result=h.content,p.isError=h.isError,p.digest=h.digest)}return a}#p(s){return this.messages.flatMap(a=>a.tools).find(a=>a.id===s)}scrollSoon(){requestAnimationFrame(()=>{this.scrollEl&&this.#n&&(this.scrollEl.scrollTop=this.scrollEl.scrollHeight)})}onScroll(){let s=this.scrollEl;s&&(this.#n=MF(s,50))}view(){return Qt({class:"messages",onScroll:()=>this.onScroll(),onMounted:s=>{this.scrollEl=s}},this.parent.ready?this.renderMessages():Qt({class:"note"},"Connecting\u2026"))}renderMessages(){let s=[],a=-1;for(let D of this.messages)D.role==="user"||s.length===0?(D.role==="user"&&a++,s.push({idx:Math.max(0,a),msgs:[D]})):s[s.length-1].msgs.push(D);let h=this.parent.echo,p=this.parent.draft,b=this.parent.working&&!h,v=s.flatMap((D,P)=>this.renderTurn(D.msgs,D.idx,b&&P===s.length-1));v.unshift(this.#m());let w=h?a+1:Math.max(0,a),I=b?s[s.length-1]?.msgs??[]:[],T=[...I].reverse().find(D=>D.role==="assistant")?.turnView,B=!!T&&!!this.#S(I,T,!0);return h&&v.push(this.#k(h,w)),p?v.push(this.#y(p,w,T,!B)):(this.#r.clear(),this.#o=void 0,this.parent.working?v.push(this.#y({text:"",thinking:"",tool:this.#v()},w,T,!B)):this.liveTurnView.reset()),v}#v(){for(let s=this.messages.length-1;s>=0;s--){let a=this.messages[s];if(a.role==="assistant")return a.tools.find(h=>h.result===void 0)?.name}}#m(){return Qt({class:"masthead",key:"masthead"},Zee({class:"masthead-logo light",src:s5n,alt:"typebulb"}),Zee({class:"masthead-logo dark",src:o5n,alt:"typebulb"}),Qt({class:"masthead-tagline"},"run and publish bulbs \u{1F4A1} your agent\u2019s session live here, bulbs rendered inline"))}#k(s,a){return Qt({class:["bubble","user",mC(a)],key:`echo-${s.length}`},this.#w(`md-echo-${s.length}`,tEe({id:-1,role:"user",text:s,thinking:"",tools:[]})))}#y(s,a,h,p=!0){let b=`draft-${s.text.length}-${s.thinking.length}`;s.text.length<this.#s&&this.#r.clear(),this.#s=s.text.length;let v=h??this.liveTurnView,w=v.raw(!0),I=w&&!!s.thinking,T=w?s.tool:void 0,B=!s.text.trim()&&!T,D=w&&(T?`${sie(T)}\u2026`:s.text.trim()||I?null:"working\u2026");return Qt({class:["bubble","assistant","draft",mC(a)],key:b},p?v.view(!0):null,I?Jye({class:"thinking",open:this.#o??!0,onToggle:P=>{this.#o=P.currentTarget.open}},Uye(B?wr({class:"shimmer-text shimmer-slow"},"thinking\u2026"):"thinking"),this.#C(s.thinking)):null,s.text.trim()?this.#x(b,s.text):null,D?Qt({class:"draft-wait shimmer-text shimmer-slow"},D):null)}#x(s,a){let h=nEe(a);return h.some(p=>p.kind==="bulb")?h.map((p,b)=>p.kind==="md"?p.text.trim()?this.#w(`${s}-md-${b}`,iD(p.text)):null:this.#I(p.source,b)):this.#w(s,iD(a))}#E(s,a){return{onScroll:h=>{let p=h.currentTarget;this.#r.set(s,{top:p.scrollTop,stuck:MF(p,50)})},onMounted:h=>{a?.(h);let p=this.#r.get(s);h.scrollTop=p&&!p.stuck?p.top:h.scrollHeight}}}#C(s){return i6({key:`think-${s.length}`,...this.#E(-1)},s)}#I(s,a){let h=_H(s),p=s.split(`
2070
- `).length;return Qt({class:"md",key:`draft-bulb-${a}`},Qt({class:"embed bulb-streaming"},Qt({class:"bulb-streaming-head"},wr("\u{1F4A1} "),wr({class:"shimmer-text shimmer-slow"},`${h?`${h} \u2014 `:""}writing\u2026`),wr({class:"bulb-streaming-count"},`${p} lines`)),Qt({class:["bulb-code","md"],key:`bulb-code-${s.length}`,...this.#E(a,b=>{b.innerHTML=rD.render(MH(s))})})))}renderTurn(s,a,h){let p=s.filter(B=>B.role==="user"||B.text||B.body),b=p.find(B=>B.role==="assistant"&&(!!B.text||!!B.body)),v=[...p].reverse().find(B=>B.role==="assistant"&&(!!B.text||!!B.body)),w=[...s].reverse().find(B=>B.role==="assistant"),I=(v??w)?.turnView;if(!I)return this.#_(s,a);let T=this.#S(s,I,h);return I.raw(h)?this.#M(s,a,T,I,h):I.summary?this.#B(a,p,b,I,h):this.#D(s,a,p,T,v,I,h)}#S(s,a,h){return a.raw(h)?s.find(p=>p.role!=="user"):s.find(p=>p.role==="assistant"&&(!!p.text||!!p.body))}#_(s,a){return s.map(h=>h.role==="fork"?this.forkStub(h,a):this.bubble(h,a))}#M(s,a,h,p,b){return s.map(v=>v.role==="fork"?this.forkStub(v,a,v===h?p:void 0,b):this.bubble(v,a,void 0,!0,v===h?p:void 0,!0,b))}#D(s,a,h,p,b,v,w){let I=h.map(T=>{let B=T.role==="user"?T.copy:T===b?T.turnCopy:void 0;return this.bubble(T,a,B??null,!0,T===p?v:void 0,!1,w)});return p||w||I.splice(h[0]?.role==="user"?1:0,0,this.#L(s,a,v)),I}#B(s,a,h,p,b){return a.flatMap(v=>v.role==="assistant"?v===h?[this.#R(v,s,p.summary,p)]:[]:[this.bubble(v,s,v.copy??null,!0,void 0,!1,b)])}#L(s,a,h){return Qt({class:["bubble","assistant",mC(a)],key:`no-prose-${a}`},h.view(!1),Qt({class:"no-prose"},p5n(s)))}#N(s,a,h,p,b,v,w){let I=h.has(p);return Qt({class:["bubble","assistant",mC(a)],key:s},v??null,Qt({class:"turn-summary",onClick:()=>{oEe(h,p),this.update()}},sEe(I),wr({class:"turn-summary-text"},b)),w??null)}forkStub(s,a,h,p=!1){let b=s.fork,v=this.expandedForks.has(s.id)?Qt({class:"fork-body"},b.sub.map(I=>this.bubble(I,a,void 0,!1))):void 0,w=[a5n(),` ${b.count} message${b.count===1?"":"s"} on an abandoned branch`];return this.#N(`fork-${s.id}`,a,this.expandedForks,s.id,w,h?.view(p),v)}bubble(s,a,h=s.copy,p=!0,b,v=!0,w=!1){let I=s.role==="assistant"&&!s.text&&!s.thinking&&s.tools.length>0;return Qt({class:["bubble",s.role,I?"tools-only":"",p?mC(a):""],key:s.id},b?b.view(w):null,v&&s.thinking?Jye({class:"thinking"},Uye("thinking"),i6(s.thinking)):null,this.#j(s),s.role==="user"?this.#O(s):null,v?s.tools.map(T=>this.tool(T)):null,this.#T(h))}#T(s){return s?Qt({class:"bubble-controls"},s.view()):null}#R(s,a,h,p){return Qt({class:["bubble","assistant",mC(a)],key:`summary-${s.id}`},p.view(!1),this.#w(`md-summary-${s.id}-${h.length}`,iD(h)),this.#T(p.copy))}#O(s){let h=[...s.text.matchAll(i5n)].map(p=>p[1]).map(p=>this.#P(p)).filter(p=>!!p);return h.length?Qt({class:"paste-thumbs"},h.map(p=>Zee({class:"paste-thumb",src:p,alt:"pasted image"}))):null}#P(s){let a=this.#c.get(s);if(!(a==="pending"||a==="failed")){if(a)return a;this.#c.set(s,"pending"),(async()=>{try{let h=await tb.server.composerPasteRead(s);this.#c.set(s,h?.ok?`data:${h.mime};base64,${h.base64}`:"failed"),h?.ok&&(this.update(),this.scrollSoon())}catch{this.#c.set(s,"failed")}})()}}#j(s){return s.body?s.body.flatMap((a,h)=>typeof a=="string"?a.trim()?[this.#w(`md-${s.id}-${h}`,iD(a))]:[]:this.#F(a)):s.text?this.#w(`md-${s.id}`,s.role==="user"?tEe(s):iD(s.text)):null}#F(s){if(!this.#t.has(s))return[s.view()];let a=this.expandedInlineBulbs.has(s.key),h=Qt({class:"md",key:`fold-${s.key}`},Qt({class:"bulb-fold",onClick:()=>this.#A(s.key)},sEe(a),wr({class:"bulb-fold-text"},`${s.name??"bulb"} \u2014 Version ${s.chainPosition}`),wr({class:"bulb-fold-app"},"\u{1F4A1}")));return a?[h,s.view()]:[h]}#w(s,a){return Qt({class:"md",key:s,onMounted:a})}tool(s){let a=this.openTools.has(s.id),h=f5n(s.input),p=YSt(s),b=h?C6t(h,this.parent.cwd):u5n(c5n(s.input));return Qt({class:["tool",s.isError?"err":""]},Qt({class:"tool-head"},Qt({class:"tool-label"},wr({class:"tool-name",...s.name.startsWith("mcp__")?{title:s.name}:{}},sie(s.name)),b?h?bC({class:"tool-sum link",title:h,onClick:v=>{v.preventDefault(),tb.server.openFile(h)}},b):wr({class:"tool-sum"},b):null),s.result===void 0?wr({class:"tool-run"},"\u2026"):null),s.result!==void 0?Qt({class:["tool-digest",a?"open":""],onClick:()=>{oEe(this.openTools,s.id),this.update()}},sEe(a),(p?d5n(p):s.digest)||"(no output)"):null,a?Qt({class:"tool-card"},this.toolBody(s),s.result!==void 0&&(s.isError||!(p||WSt(s).length&&s.result.trim()===s.digest))?i6({class:"tool-out"},s.result.slice(0,4e3)):null):null)}toolBody(s){let a=YSt(s);if(a)return Qt({class:"todo-list"},a.map(b=>Qt({class:["todo",b.status??""]},wr({class:"todo-icon"},b.status==="completed"?"\u2714":b.status==="in_progress"?"\u25FC":"\u25FB"),wr({class:"todo-text"},b.content??""))));let h=WSt(s);if(h.length)return Qt({class:"tool-in"},h.map(KSt));let p=h5n(s);if(!p){let b=Object.entries(s.input??{});return b.length?Qt({class:"tool-in"},b.map(([v,w])=>Qt({class:"tool-field"},wr({class:"tool-key"},`${v}:`),typeof w=="string"&&XSt(w)?KSt(w):i6({class:"tool-val"},typeof w=="string"?w:JSON.stringify(w,null,2))))):null}return Qt({class:"diff"},...p.flatMap((b,v)=>[p.length>1?Qt({class:"diff-step"},`edit ${v+1}/${p.length}`):null,b.old?i6({class:"diff-old"},String(b.old)):null,b.new?i6({class:"diff-new"},String(b.new)):null]))}};var cie=class extends wu{ready=!1;cwd="";sessionId=null;sessionPicker=new Zre;tokenPill=new eie;bulbsPill=new tie;diffPill=new rie;messageList=new oie;tokens={in:0,out:0,cached:0,cacheCreate:0};cost=0;stats=null;working=!1;latestModel=null;driverModel=null;busy=[];ownPid=0;pills;composer;draft=null;echo=null;#e=0;#i=!1;#t=!1;#n;#r=null;#s;#o;constructor(s){super(),this.pills=s.pills,this.composer=s.composer,this.#n=s.title,this.#s=s.overlays??[],this.#o=s.onPollTick}onAttached(){this.#t||(this.#t=!0,E6t(),this.init())}closePopups(s){this.sessionPicker!==s&&this.sessionPicker.close(),this.bulbsPill!==s&&this.bulbsPill.close(),this.diffPill!==s&&this.diffPill.close();for(let a of this.pills)a!==s&&a.close?.()}async init(){let s=await tb.server.info();this.cwd=s.cwd,this.ownPid=s.pid??0,this.#r=s.elsewhere??null,this.composer&&(this.composer.enabled=!!s.composer),this.ready=!0,this.updateTitle(),this.update(),this.pump()}updateTitle(){let s=Yye(this.cwd),a=this.sessionPicker.currentPreview(),h=fM(a,40);document.title=h&&s?`${h} \u2014 ${s}`:h||(s?`${this.#n} \u2014 ${s}`:this.#n)}refreshSessions(){this.sessionPicker.loadSessions().then(()=>this.update()).catch(()=>{})}pump(){if(this.#i)return;this.#i=!0;let s=async()=>{try{let{events:a,cursor:h,working:p,latestModel:b,composer:v,busy:w}=await tb.server.poll(this.#e);this.#e=h;for(let j of a)this.apply(j);let I=p!==this.working;this.working=p;let T=Array.isArray(w)?w:[],B=T.join(`
2087
+ `).length;return Qt({class:"md",key:`draft-bulb-${a}`},Qt({class:"embed bulb-streaming"},Qt({class:"bulb-streaming-head"},wr("\u{1F4A1} "),wr({class:"shimmer-text shimmer-slow"},`${h?`${h} \u2014 `:""}writing\u2026`),wr({class:"bulb-streaming-count"},`${p} lines`)),Qt({class:["bulb-code","md"],key:`bulb-code-${s.length}`,...this.#E(a,b=>{b.innerHTML=rD.render(MH(s))})})))}renderTurn(s,a,h){let p=s.filter(B=>B.role==="user"||B.text||B.body),b=p.find(B=>B.role==="assistant"&&(!!B.text||!!B.body)),v=[...p].reverse().find(B=>B.role==="assistant"&&(!!B.text||!!B.body)),w=[...s].reverse().find(B=>B.role==="assistant"),I=(v??w)?.turnView;if(!I)return this.#_(s,a);let T=this.#S(s,I,h);return I.raw(h)?this.#M(s,a,T,I,h):I.summary?this.#B(a,p,b,I,h):this.#D(s,a,p,T,v,I,h)}#S(s,a,h){return a.raw(h)?s.find(p=>p.role!=="user"):s.find(p=>p.role==="assistant"&&(!!p.text||!!p.body))}#_(s,a){return s.map(h=>h.role==="fork"?this.forkStub(h,a):this.bubble(h,a))}#M(s,a,h,p,b){return s.map(v=>v.role==="fork"?this.forkStub(v,a,v===h?p:void 0,b):this.bubble(v,a,void 0,!0,v===h?p:void 0,!0,b))}#D(s,a,h,p,b,v,w){let I=h.map(T=>{let B=T.role==="user"?T.copy:T===b?T.turnCopy:void 0;return this.bubble(T,a,B??null,!0,T===p?v:void 0,!1,w)});return p||w||I.splice(h[0]?.role==="user"?1:0,0,this.#L(s,a,v)),I}#B(s,a,h,p,b){return a.flatMap(v=>v.role==="assistant"?v===h?[this.#R(v,s,p.summary,p)]:[]:[this.bubble(v,s,v.copy??null,!0,void 0,!1,b)])}#L(s,a,h){return Qt({class:["bubble","assistant",mC(a)],key:`no-prose-${a}`},h.view(!1),Qt({class:"no-prose"},p5n(s)))}#N(s,a,h,p,b,v,w){let I=h.has(p);return Qt({class:["bubble","assistant",mC(a)],key:s},v??null,Qt({class:"turn-summary",onClick:()=>{oEe(h,p),this.update()}},sEe(I),wr({class:"turn-summary-text"},b)),w??null)}forkStub(s,a,h,p=!1){let b=s.fork,v=this.expandedForks.has(s.id)?Qt({class:"fork-body"},b.sub.map(I=>this.bubble(I,a,void 0,!1))):void 0,w=[a5n(),` ${b.count} message${b.count===1?"":"s"} on an abandoned branch`];return this.#N(`fork-${s.id}`,a,this.expandedForks,s.id,w,h?.view(p),v)}bubble(s,a,h=s.copy,p=!0,b,v=!0,w=!1){let I=s.role==="assistant"&&!s.text&&!s.thinking&&s.tools.length>0;return Qt({class:["bubble",s.role,I?"tools-only":"",p?mC(a):""],key:s.id},b?b.view(w):null,v&&s.thinking?Jye({class:"thinking"},Uye("thinking"),i6(s.thinking)):null,this.#j(s),s.role==="user"?this.#O(s):null,v?s.tools.map(T=>this.tool(T)):null,this.#T(h))}#T(s){return s?Qt({class:"bubble-controls"},s.view()):null}#R(s,a,h,p){return Qt({class:["bubble","assistant",mC(a)],key:`summary-${s.id}`},p.view(!1),this.#w(`md-summary-${s.id}-${h.length}`,iD(h)),this.#T(p.copy))}#O(s){let h=[...s.text.matchAll(i5n)].map(p=>p[1]).map(p=>this.#P(p)).filter(p=>!!p);return h.length?Qt({class:"paste-thumbs"},h.map(p=>Zee({class:"paste-thumb",src:p,alt:"pasted image"}))):null}#P(s){let a=this.#c.get(s);if(!(a==="pending"||a==="failed")){if(a)return a;this.#c.set(s,"pending"),(async()=>{try{let h=await tb.server.composerPasteRead(s);this.#c.set(s,h?.ok?`data:${h.mime};base64,${h.base64}`:"failed"),h?.ok&&(this.update(),this.scrollSoon())}catch{this.#c.set(s,"failed")}})()}}#j(s){return s.body?s.body.flatMap((a,h)=>typeof a=="string"?a.trim()?[this.#w(`md-${s.id}-${h}`,iD(a))]:[]:this.#F(a)):s.text?this.#w(`md-${s.id}`,s.role==="user"?tEe(s):iD(s.text)):null}#F(s){if(!this.#t.has(s))return[s.view()];let a=this.expandedInlineBulbs.has(s.key),h=Qt({class:"md",key:`fold-${s.key}`},Qt({class:"bulb-fold",onClick:()=>this.#A(s.key)},sEe(a),wr({class:"bulb-fold-text"},`${s.name??"bulb"} \u2014 Version ${s.chainPosition}`),wr({class:"bulb-fold-app"},"\u{1F4A1}")));return a?[h,s.view()]:[h]}#w(s,a){return Qt({class:"md",key:s,onMounted:a})}tool(s){let a=this.openTools.has(s.id),h=f5n(s.input),p=YSt(s),b=h?C6t(h,this.parent.cwd):u5n(c5n(s.input));return Qt({class:["tool",s.isError?"err":""]},Qt({class:"tool-head"},Qt({class:"tool-label"},wr({class:"tool-name",...s.name.startsWith("mcp__")?{title:s.name}:{}},sie(s.name)),b?h?bC({class:"tool-sum link",title:h,onClick:v=>{v.preventDefault(),tb.server.openFile(h)}},b):wr({class:"tool-sum"},b):null),s.result===void 0?wr({class:"tool-run"},"\u2026"):null),s.result!==void 0?Qt({class:["tool-digest",a?"open":""],onClick:()=>{oEe(this.openTools,s.id),this.update()}},sEe(a),(p?d5n(p):s.digest)||"(no output)"):null,a?Qt({class:"tool-card"},this.toolBody(s),s.result!==void 0&&(s.isError||!(p||WSt(s).length&&s.result.trim()===s.digest))?i6({class:"tool-out"},s.result.slice(0,4e3)):null):null)}toolBody(s){let a=YSt(s);if(a)return Qt({class:"todo-list"},a.map(b=>Qt({class:["todo",b.status??""]},wr({class:"todo-icon"},b.status==="completed"?"\u2714":b.status==="in_progress"?"\u25FC":"\u25FB"),wr({class:"todo-text"},b.content??""))));let h=WSt(s);if(h.length)return Qt({class:"tool-in"},h.map(KSt));let p=h5n(s);if(!p){let b=Object.entries(s.input??{});return b.length?Qt({class:"tool-in"},b.map(([v,w])=>Qt({class:"tool-field"},wr({class:"tool-key"},`${v}:`),typeof w=="string"&&XSt(w)?KSt(w):i6({class:"tool-val"},typeof w=="string"?w:JSON.stringify(w,null,2))))):null}return Qt({class:"diff"},...p.flatMap((b,v)=>[p.length>1?Qt({class:"diff-step"},`edit ${v+1}/${p.length}`):null,b.old?i6({class:"diff-old"},String(b.old)):null,b.new?i6({class:"diff-new"},String(b.new)):null]))}};var cie=class extends wu{ready=!1;cwd="";sessionId=null;sessionPicker=new Zre;tokenPill=new eie;bulbsPill=new tie;diffPill=new rie;messageList=new oie;tokens={in:0,out:0,cached:0,cacheCreate:0};cost=0;stats=null;working=!1;latestModel=null;driverModel=null;busy=[];ownPid=0;pills;composer;draft=null;echo=null;#e=0;#i=!1;#t=!1;#n;#r=null;#s;#o;constructor(s){super(),this.pills=s.pills,this.composer=s.composer,this.#n=s.title,this.#s=s.overlays??[],this.#o=s.onPollTick}onAttached(){this.#t||(this.#t=!0,E6t(),this.init())}closePopups(s){this.sessionPicker!==s&&this.sessionPicker.close(),this.bulbsPill!==s&&this.bulbsPill.close(),this.diffPill!==s&&this.diffPill.close();for(let a of this.pills)a!==s&&a.close?.()}async init(){let s=await tb.server.info();this.cwd=s.cwd,this.ownPid=s.pid??0,this.#r=s.elsewhere??null,this.composer&&(this.composer.enabled=!!s.composer),this.ready=!0,document.getElementById("boot")?.remove(),this.updateTitle(),this.update(),this.pump()}updateTitle(){let s=Yye(this.cwd),a=this.sessionPicker.currentPreview(),h=fM(a,40);document.title=h&&s?`${h} \u2014 ${s}`:h||(s?`${this.#n} \u2014 ${s}`:this.#n)}refreshSessions(){this.sessionPicker.loadSessions().then(()=>this.update()).catch(()=>{})}pump(){if(this.#i)return;this.#i=!0;let s=async()=>{try{let{events:a,cursor:h,working:p,latestModel:b,composer:v,busy:w}=await tb.server.poll(this.#e);this.#e=h;for(let j of a)this.apply(j);let I=p!==this.working;this.working=p;let T=Array.isArray(w)?w:[],B=T.join(`
2071
2088
  `)!==this.busy.join(`
2072
2089
  `);this.busy=T;let D=b!==this.latestModel;this.latestModel=b??null;let P=this.composer&&v?this.composer.syncFromPoll(v):!1;(a.length||I||D||P||B)&&this.update(),(a.length||P)&&this.messageList.scrollSoon(),this.#o?.()}catch(a){console.error("[mirror] poll failed",a)}setTimeout(s,600)};s()}apply(s){switch(s.type){case"cleared":this.messageList.clear(),this.tokens={in:0,out:0,cached:0,cacheCreate:0},this.cost=0;break;case"session":this.sessionId=s.sessionId,s.sessionId&&!this.sessionPicker.currentRow()?this.refreshSessions():this.updateTitle();break;case"user":this.messageList.applyUser(s);break;case"assistant":this.messageList.applyAssistant(s);break;case"tool_result":this.messageList.applyToolResult(s);break;case"fork":this.messageList.applyFork(s);break;case"usage":this.tokens={in:s.in,out:s.out,cached:s.cached,cacheCreate:s.cacheCreate},this.cost+=s.cost??0;break}}view(){return Qt({class:"app"},Qt({class:"chat"},this.diffPill.viewing?this.diffPill.docView():this.messageList.view(),this.#c(),...this.#s.map(s=>s()),this.statusbar()),this.composer?.enabled?this.composer.view():null)}#c(){let s=this.#r;return!this.ready||this.sessionId!==null||!s?null:Qt({class:"cwd-hint"},Qt({class:"cwd-hint-head"},`No sessions for ${this.cwd}`),Qt(`${s.count} session${s.count===1?"":"s"} exist for `,wr({class:"cwd-hint-dir"},s.dir)," \u2014 this mirror was likely launched from a subfolder. Relaunch it from the project root."))}statusbar(){return Qt({class:"statusbar"},Qt({class:["statusbar-actions",this.diffPill.viewing?"doc-open":""]},this.diffPill.view(),...this.pills.map(s=>s.view()),this.tokenPill.view(),this.sessionPicker.view(),this.bulbsPill.view()))}};function cEe(o,s,a){let h=o.map(p=>({item:p,rank:s(p)})).filter(p=>p.rank>=0);return h.sort((p,b)=>p.rank-b.rank),(a?h.slice(0,a):h).map(p=>p.item)}var uie=class extends wu{enabled=!1;streaming=!1;foreign=!1;driverError;sendError;input="";status=null;localNotice=null;dlg=null;dlgInput="";dlgFilter="";dlgIndex=0;queue=null;recipes;harnessCommands=[];slashQuery=null;slashIndex=0;composerHeight=90;files=[];atQuery=null;atIndex=0;atStart=0;#e=!1;#i=0;#t="";#n=null;constructor(s=[]){super(),this.recipes=s}get parent(){return this.ctx.parent}onAttached(){this.#r()}async#r(){try{let s=await tb.server.composerFiles();Array.isArray(s)&&(this.files=s,this.update())}catch{}}syncFromPoll(s){let a=s.streaming!==this.streaming||s.foreign!==this.foreign||s.error!==this.driverError;this.streaming=s.streaming,this.foreign=s.foreign,this.driverError=s.error;let h=this.parent,p=s.draft??null;(p?.text!==h.draft?.text||p?.thinking!==h.draft?.thinking||p?.tool!==h.draft?.tool)&&(h.draft=p,a=!0);let b=s.echo??null;b!==h.echo&&(h.echo=b,a=!0);let v=s.stats??null;(v?.cost!==h.stats?.cost||v?.contextTokens!==h.stats?.contextTokens||v?.contextPercent!==h.stats?.contextPercent)&&(h.stats=v,a=!0);let w=s.model??null;w!==h.driverModel&&(h.driverModel=w,a=!0),this.localNotice&&Date.now()>=this.localNotice.until&&(this.localNotice=null,a=!0),((s.status?.text??null)!==(this.status?.text??null)||s.status?.kind!==this.status?.kind)&&(this.status=s.status??null,a=!0);let I=s.queue??null;this.#s(I)!==this.#s(this.queue)&&(this.queue=I,a=!0);let T=s.dialog??null;return this.dlg&&!this.dlg.local&&(!T||T.id!==this.dlg.req.id)&&(this.dlg=null,a=!0),T&&!this.dlg&&T.id!==this.#n&&(this.#f(T),a=!0),a}#s(s){return s?JSON.stringify(s):""}async send(s=!1){let a=this.input.trim();if(!(!a||this.#e||this.foreign)){if(a.startsWith("!"))return this.runBash(a.slice(1).trim());this.atQuery=null,await this.#o("send failed \u2014 mirror unreachable",async()=>{let h=await tb.server.composerSend(a,{followUp:s});h?.ok?(this.input="",this.streaming=!0):this.sendError=h?.error??"send failed"})}}async#o(s,a){this.#e=!0,this.sendError=void 0,this.update();try{await a()}catch{this.sendError=s}finally{this.#e=!1,this.update(),this.#p()}}async stopTurn(){let s=this.queue,a=s?[...s.steering,...s.followUp]:[];try{await tb.server.composerStop()}catch{}a.length&&(this.input=a.join(`
2073
2090
  `)+(this.input?`
@@ -1,2 +1,47 @@
1
- <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/katex@0.16.22/dist/katex.min.css">
2
- <div id="app"></div>
1
+ <div id="app"></div>
2
+
3
+ <!-- The boot overlay: what the window shows between this HTML landing and the client being up. It
4
+ ships in the served markup, so it paints before any script runs — and its script lives HERE with
5
+ it rather than in page.ts's chrome, because getHtml re-reads this file per request while page.ts
6
+ is bundled into the running process: together, the two halves are always the same version as
7
+ each other and hot-reload as one. The client retires the overlay by removing #boot
8
+ (client/root.ts), which needs nothing from the script below. -->
9
+ <div id="boot" class="boot">
10
+ <div class="boot-title"><span class="shimmer-text shimmer-slow">Starting the agent mirror</span> 💡</div>
11
+ <div class="boot-why"></div>
12
+ </div>
13
+ <script>
14
+ (() => {
15
+ const el = document.getElementById('boot')
16
+ const why = el && el.querySelector('.boot-why')
17
+ // Markup and script ship in this one file, so a mismatch means a truncated or hand-altered stub.
18
+ // Bail rather than wedge on it; removal is the client's job and needs nothing from here.
19
+ if (!why) return
20
+ // The overlay says NOTHING while it is merely loading. The shimmering title already says "working",
21
+ // and narrating which step is in flight teaches the user nothing they can act on — a wait we cannot
22
+ // explain is better left unexplained. It speaks only when something has actually FAILED, which is
23
+ // the one thing they cannot see for themselves.
24
+ const say = text => { if (el.isConnected) why.textContent = text }
25
+ let retried = false
26
+ // A module script's FETCH failure fires on the element and never bubbles to window, hence capture.
27
+ // Untreated it is invisible: the page shimmers on over a bundle that is never coming.
28
+ addEventListener('error', e => {
29
+ const script = e.target
30
+ if (script instanceof HTMLScriptElement) {
31
+ // One silent re-fetch first — silent because a retry that works is not news. The common cause
32
+ // is transient (a mirror serving assets that were rewritten under it mid-load), and
33
+ // re-appending the script rather than reloading the page cannot loop and cannot cost the page.
34
+ if (retried) { say("The agent mirror didn't finish loading. Reload to retry."); return }
35
+ retried = true
36
+ setTimeout(() => {
37
+ const again = document.createElement('script')
38
+ again.type = 'module'
39
+ again.src = script.src.split('?')[0] + '?retry=' + Date.now() // past a cached bad response
40
+ document.body.appendChild(again)
41
+ }, 1000)
42
+ } else if (e.message) {
43
+ say('The agent mirror stopped: ' + e.message)
44
+ }
45
+ }, true)
46
+ })()
47
+ </script>
@@ -0,0 +1 @@
1
+ @font-face{font-display:block;font-family:KaTeX_AMS;font-style:normal;font-weight:400;src:url(/agents/pi/fonts/KaTeX_AMS-Regular.woff2) format("woff2"),url(/agents/pi/fonts/KaTeX_AMS-Regular.woff) format("woff"),url(/agents/pi/fonts/KaTeX_AMS-Regular.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Caligraphic;font-style:normal;font-weight:700;src:url(/agents/pi/fonts/KaTeX_Caligraphic-Bold.woff2) format("woff2"),url(/agents/pi/fonts/KaTeX_Caligraphic-Bold.woff) format("woff"),url(/agents/pi/fonts/KaTeX_Caligraphic-Bold.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Caligraphic;font-style:normal;font-weight:400;src:url(/agents/pi/fonts/KaTeX_Caligraphic-Regular.woff2) format("woff2"),url(/agents/pi/fonts/KaTeX_Caligraphic-Regular.woff) format("woff"),url(/agents/pi/fonts/KaTeX_Caligraphic-Regular.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Fraktur;font-style:normal;font-weight:700;src:url(/agents/pi/fonts/KaTeX_Fraktur-Bold.woff2) format("woff2"),url(/agents/pi/fonts/KaTeX_Fraktur-Bold.woff) format("woff"),url(/agents/pi/fonts/KaTeX_Fraktur-Bold.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Fraktur;font-style:normal;font-weight:400;src:url(/agents/pi/fonts/KaTeX_Fraktur-Regular.woff2) format("woff2"),url(/agents/pi/fonts/KaTeX_Fraktur-Regular.woff) format("woff"),url(/agents/pi/fonts/KaTeX_Fraktur-Regular.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Main;font-style:normal;font-weight:700;src:url(/agents/pi/fonts/KaTeX_Main-Bold.woff2) format("woff2"),url(/agents/pi/fonts/KaTeX_Main-Bold.woff) format("woff"),url(/agents/pi/fonts/KaTeX_Main-Bold.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Main;font-style:italic;font-weight:700;src:url(/agents/pi/fonts/KaTeX_Main-BoldItalic.woff2) format("woff2"),url(/agents/pi/fonts/KaTeX_Main-BoldItalic.woff) format("woff"),url(/agents/pi/fonts/KaTeX_Main-BoldItalic.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Main;font-style:italic;font-weight:400;src:url(/agents/pi/fonts/KaTeX_Main-Italic.woff2) format("woff2"),url(/agents/pi/fonts/KaTeX_Main-Italic.woff) format("woff"),url(/agents/pi/fonts/KaTeX_Main-Italic.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Main;font-style:normal;font-weight:400;src:url(/agents/pi/fonts/KaTeX_Main-Regular.woff2) format("woff2"),url(/agents/pi/fonts/KaTeX_Main-Regular.woff) format("woff"),url(/agents/pi/fonts/KaTeX_Main-Regular.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Math;font-style:italic;font-weight:700;src:url(/agents/pi/fonts/KaTeX_Math-BoldItalic.woff2) format("woff2"),url(/agents/pi/fonts/KaTeX_Math-BoldItalic.woff) format("woff"),url(/agents/pi/fonts/KaTeX_Math-BoldItalic.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Math;font-style:italic;font-weight:400;src:url(/agents/pi/fonts/KaTeX_Math-Italic.woff2) format("woff2"),url(/agents/pi/fonts/KaTeX_Math-Italic.woff) format("woff"),url(/agents/pi/fonts/KaTeX_Math-Italic.ttf) format("truetype")}@font-face{font-display:block;font-family:"KaTeX_SansSerif";font-style:normal;font-weight:700;src:url(/agents/pi/fonts/KaTeX_SansSerif-Bold.woff2) format("woff2"),url(/agents/pi/fonts/KaTeX_SansSerif-Bold.woff) format("woff"),url(/agents/pi/fonts/KaTeX_SansSerif-Bold.ttf) format("truetype")}@font-face{font-display:block;font-family:"KaTeX_SansSerif";font-style:italic;font-weight:400;src:url(/agents/pi/fonts/KaTeX_SansSerif-Italic.woff2) format("woff2"),url(/agents/pi/fonts/KaTeX_SansSerif-Italic.woff) format("woff"),url(/agents/pi/fonts/KaTeX_SansSerif-Italic.ttf) format("truetype")}@font-face{font-display:block;font-family:"KaTeX_SansSerif";font-style:normal;font-weight:400;src:url(/agents/pi/fonts/KaTeX_SansSerif-Regular.woff2) format("woff2"),url(/agents/pi/fonts/KaTeX_SansSerif-Regular.woff) format("woff"),url(/agents/pi/fonts/KaTeX_SansSerif-Regular.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Script;font-style:normal;font-weight:400;src:url(/agents/pi/fonts/KaTeX_Script-Regular.woff2) format("woff2"),url(/agents/pi/fonts/KaTeX_Script-Regular.woff) format("woff"),url(/agents/pi/fonts/KaTeX_Script-Regular.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Size1;font-style:normal;font-weight:400;src:url(/agents/pi/fonts/KaTeX_Size1-Regular.woff2) format("woff2"),url(/agents/pi/fonts/KaTeX_Size1-Regular.woff) format("woff"),url(/agents/pi/fonts/KaTeX_Size1-Regular.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Size2;font-style:normal;font-weight:400;src:url(/agents/pi/fonts/KaTeX_Size2-Regular.woff2) format("woff2"),url(/agents/pi/fonts/KaTeX_Size2-Regular.woff) format("woff"),url(/agents/pi/fonts/KaTeX_Size2-Regular.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Size3;font-style:normal;font-weight:400;src:url(/agents/pi/fonts/KaTeX_Size3-Regular.woff2) format("woff2"),url(/agents/pi/fonts/KaTeX_Size3-Regular.woff) format("woff"),url(/agents/pi/fonts/KaTeX_Size3-Regular.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Size4;font-style:normal;font-weight:400;src:url(/agents/pi/fonts/KaTeX_Size4-Regular.woff2) format("woff2"),url(/agents/pi/fonts/KaTeX_Size4-Regular.woff) format("woff"),url(/agents/pi/fonts/KaTeX_Size4-Regular.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Typewriter;font-style:normal;font-weight:400;src:url(/agents/pi/fonts/KaTeX_Typewriter-Regular.woff2) format("woff2"),url(/agents/pi/fonts/KaTeX_Typewriter-Regular.woff) format("woff"),url(/agents/pi/fonts/KaTeX_Typewriter-Regular.ttf) format("truetype")}.katex{font:normal 1.21em KaTeX_Main,Times New Roman,serif;line-height:1.2;position:relative;text-indent:0;text-rendering:auto}.katex *{-ms-high-contrast-adjust:none!important;border-color:currentColor}.katex .katex-version:after{content:"0.16.47"}.katex .katex-mathml{border:0;-webkit-clip-path:inset(50%);clip-path:inset(50%);height:1px;overflow:hidden;padding:0;position:absolute;width:1px}.katex .katex-html>.newline{display:block}.katex .base{position:relative;white-space:nowrap;width:-webkit-min-content;width:-moz-min-content;width:min-content}.katex .base,.katex .strut{display:inline-block}.katex .textbf{font-weight:700}.katex .textit{font-style:italic}.katex .textrm{font-family:KaTeX_Main}.katex .textsf{font-family:KaTeX_SansSerif}.katex .texttt{font-family:KaTeX_Typewriter}.katex .mathnormal{font-family:KaTeX_Math;font-style:italic}.katex .mathit{font-family:KaTeX_Main;font-style:italic}.katex .mathrm{font-style:normal}.katex .mathbf{font-family:KaTeX_Main;font-weight:700}.katex .boldsymbol{font-family:KaTeX_Math;font-style:italic;font-weight:700}.katex .amsrm,.katex .mathbb,.katex .textbb{font-family:KaTeX_AMS}.katex .mathcal{font-family:KaTeX_Caligraphic}.katex .mathfrak,.katex .textfrak{font-family:KaTeX_Fraktur}.katex .mathboldfrak,.katex .textboldfrak{font-family:KaTeX_Fraktur;font-weight:700}.katex .mathtt{font-family:KaTeX_Typewriter}.katex .mathscr,.katex .textscr{font-family:KaTeX_Script}.katex .mathsf,.katex .textsf{font-family:KaTeX_SansSerif}.katex .mathboldsf,.katex .textboldsf{font-family:KaTeX_SansSerif;font-weight:700}.katex .mathitsf,.katex .mathsfit,.katex .textitsf{font-family:KaTeX_SansSerif;font-style:italic}.katex .mainrm{font-family:KaTeX_Main;font-style:normal}.katex .vlist-t{border-collapse:collapse;display:inline-table;table-layout:fixed}.katex .vlist-r{display:table-row}.katex .vlist{display:table-cell;position:relative;vertical-align:bottom}.katex .vlist>span{display:block;height:0;position:relative}.katex .vlist>span>span{display:inline-block}.katex .vlist>span>.pstrut{overflow:hidden;width:0}.katex .vlist-t2{margin-right:-2px}.katex .vlist-s{display:table-cell;font-size:1px;min-width:2px;vertical-align:bottom;width:2px}.katex .vbox{align-items:baseline;display:inline-flex;flex-direction:column}.katex .hbox{width:100%}.katex .hbox,.katex .thinbox{display:inline-flex;flex-direction:row}.katex .thinbox{max-width:0;width:0}.katex .msupsub{text-align:left}.katex .mfrac>span>span{text-align:center}.katex .mfrac .frac-line{border-bottom-style:solid;display:inline-block;width:100%}.katex .hdashline,.katex .hline,.katex .mfrac .frac-line,.katex .overline .overline-line,.katex .rule,.katex .underline .underline-line{min-height:1px}.katex .mspace{display:inline-block}.katex .smash{display:inline;line-height:0}.katex .clap,.katex .llap,.katex .rlap{position:relative;width:0}.katex .clap>.inner,.katex .llap>.inner,.katex .rlap>.inner{position:absolute}.katex .clap>.fix,.katex .llap>.fix,.katex .rlap>.fix{display:inline-block}.katex .llap>.inner{right:0}.katex .clap>.inner,.katex .rlap>.inner{left:0}.katex .clap>.inner>span{margin-left:-50%;margin-right:50%}.katex .rule{border:0 solid;display:inline-block;position:relative}.katex .hline,.katex .overline .overline-line,.katex .underline .underline-line{border-bottom-style:solid;display:inline-block;width:100%}.katex .hdashline{border-bottom-style:dashed;display:inline-block;width:100%}.katex .sqrt>.root{margin-left:.2777777778em;margin-right:-.5555555556em}.katex .fontsize-ensurer.reset-size1.size1,.katex .sizing.reset-size1.size1{font-size:1em}.katex .fontsize-ensurer.reset-size1.size2,.katex .sizing.reset-size1.size2{font-size:1.2em}.katex .fontsize-ensurer.reset-size1.size3,.katex .sizing.reset-size1.size3{font-size:1.4em}.katex .fontsize-ensurer.reset-size1.size4,.katex .sizing.reset-size1.size4{font-size:1.6em}.katex .fontsize-ensurer.reset-size1.size5,.katex .sizing.reset-size1.size5{font-size:1.8em}.katex .fontsize-ensurer.reset-size1.size6,.katex .sizing.reset-size1.size6{font-size:2em}.katex .fontsize-ensurer.reset-size1.size7,.katex .sizing.reset-size1.size7{font-size:2.4em}.katex .fontsize-ensurer.reset-size1.size8,.katex .sizing.reset-size1.size8{font-size:2.88em}.katex .fontsize-ensurer.reset-size1.size9,.katex .sizing.reset-size1.size9{font-size:3.456em}.katex .fontsize-ensurer.reset-size1.size10,.katex .sizing.reset-size1.size10{font-size:4.148em}.katex .fontsize-ensurer.reset-size1.size11,.katex .sizing.reset-size1.size11{font-size:4.976em}.katex .fontsize-ensurer.reset-size2.size1,.katex .sizing.reset-size2.size1{font-size:.8333333333em}.katex .fontsize-ensurer.reset-size2.size2,.katex .sizing.reset-size2.size2{font-size:1em}.katex .fontsize-ensurer.reset-size2.size3,.katex .sizing.reset-size2.size3{font-size:1.1666666667em}.katex .fontsize-ensurer.reset-size2.size4,.katex .sizing.reset-size2.size4{font-size:1.3333333333em}.katex .fontsize-ensurer.reset-size2.size5,.katex .sizing.reset-size2.size5{font-size:1.5em}.katex .fontsize-ensurer.reset-size2.size6,.katex .sizing.reset-size2.size6{font-size:1.6666666667em}.katex .fontsize-ensurer.reset-size2.size7,.katex .sizing.reset-size2.size7{font-size:2em}.katex .fontsize-ensurer.reset-size2.size8,.katex .sizing.reset-size2.size8{font-size:2.4em}.katex .fontsize-ensurer.reset-size2.size9,.katex .sizing.reset-size2.size9{font-size:2.88em}.katex .fontsize-ensurer.reset-size2.size10,.katex .sizing.reset-size2.size10{font-size:3.4566666667em}.katex .fontsize-ensurer.reset-size2.size11,.katex .sizing.reset-size2.size11{font-size:4.1466666667em}.katex .fontsize-ensurer.reset-size3.size1,.katex .sizing.reset-size3.size1{font-size:.7142857143em}.katex .fontsize-ensurer.reset-size3.size2,.katex .sizing.reset-size3.size2{font-size:.8571428571em}.katex .fontsize-ensurer.reset-size3.size3,.katex .sizing.reset-size3.size3{font-size:1em}.katex .fontsize-ensurer.reset-size3.size4,.katex .sizing.reset-size3.size4{font-size:1.1428571429em}.katex .fontsize-ensurer.reset-size3.size5,.katex .sizing.reset-size3.size5{font-size:1.2857142857em}.katex .fontsize-ensurer.reset-size3.size6,.katex .sizing.reset-size3.size6{font-size:1.4285714286em}.katex .fontsize-ensurer.reset-size3.size7,.katex .sizing.reset-size3.size7{font-size:1.7142857143em}.katex .fontsize-ensurer.reset-size3.size8,.katex .sizing.reset-size3.size8{font-size:2.0571428571em}.katex .fontsize-ensurer.reset-size3.size9,.katex .sizing.reset-size3.size9{font-size:2.4685714286em}.katex .fontsize-ensurer.reset-size3.size10,.katex .sizing.reset-size3.size10{font-size:2.9628571429em}.katex .fontsize-ensurer.reset-size3.size11,.katex .sizing.reset-size3.size11{font-size:3.5542857143em}.katex .fontsize-ensurer.reset-size4.size1,.katex .sizing.reset-size4.size1{font-size:.625em}.katex .fontsize-ensurer.reset-size4.size2,.katex .sizing.reset-size4.size2{font-size:.75em}.katex .fontsize-ensurer.reset-size4.size3,.katex .sizing.reset-size4.size3{font-size:.875em}.katex .fontsize-ensurer.reset-size4.size4,.katex .sizing.reset-size4.size4{font-size:1em}.katex .fontsize-ensurer.reset-size4.size5,.katex .sizing.reset-size4.size5{font-size:1.125em}.katex .fontsize-ensurer.reset-size4.size6,.katex .sizing.reset-size4.size6{font-size:1.25em}.katex .fontsize-ensurer.reset-size4.size7,.katex .sizing.reset-size4.size7{font-size:1.5em}.katex .fontsize-ensurer.reset-size4.size8,.katex .sizing.reset-size4.size8{font-size:1.8em}.katex .fontsize-ensurer.reset-size4.size9,.katex .sizing.reset-size4.size9{font-size:2.16em}.katex .fontsize-ensurer.reset-size4.size10,.katex .sizing.reset-size4.size10{font-size:2.5925em}.katex .fontsize-ensurer.reset-size4.size11,.katex .sizing.reset-size4.size11{font-size:3.11em}.katex .fontsize-ensurer.reset-size5.size1,.katex .sizing.reset-size5.size1{font-size:.5555555556em}.katex .fontsize-ensurer.reset-size5.size2,.katex .sizing.reset-size5.size2{font-size:.6666666667em}.katex .fontsize-ensurer.reset-size5.size3,.katex .sizing.reset-size5.size3{font-size:.7777777778em}.katex .fontsize-ensurer.reset-size5.size4,.katex .sizing.reset-size5.size4{font-size:.8888888889em}.katex .fontsize-ensurer.reset-size5.size5,.katex .sizing.reset-size5.size5{font-size:1em}.katex .fontsize-ensurer.reset-size5.size6,.katex .sizing.reset-size5.size6{font-size:1.1111111111em}.katex .fontsize-ensurer.reset-size5.size7,.katex .sizing.reset-size5.size7{font-size:1.3333333333em}.katex .fontsize-ensurer.reset-size5.size8,.katex .sizing.reset-size5.size8{font-size:1.6em}.katex .fontsize-ensurer.reset-size5.size9,.katex .sizing.reset-size5.size9{font-size:1.92em}.katex .fontsize-ensurer.reset-size5.size10,.katex .sizing.reset-size5.size10{font-size:2.3044444444em}.katex .fontsize-ensurer.reset-size5.size11,.katex .sizing.reset-size5.size11{font-size:2.7644444444em}.katex .fontsize-ensurer.reset-size6.size1,.katex .sizing.reset-size6.size1{font-size:.5em}.katex .fontsize-ensurer.reset-size6.size2,.katex .sizing.reset-size6.size2{font-size:.6em}.katex .fontsize-ensurer.reset-size6.size3,.katex .sizing.reset-size6.size3{font-size:.7em}.katex .fontsize-ensurer.reset-size6.size4,.katex .sizing.reset-size6.size4{font-size:.8em}.katex .fontsize-ensurer.reset-size6.size5,.katex .sizing.reset-size6.size5{font-size:.9em}.katex .fontsize-ensurer.reset-size6.size6,.katex .sizing.reset-size6.size6{font-size:1em}.katex .fontsize-ensurer.reset-size6.size7,.katex .sizing.reset-size6.size7{font-size:1.2em}.katex .fontsize-ensurer.reset-size6.size8,.katex .sizing.reset-size6.size8{font-size:1.44em}.katex .fontsize-ensurer.reset-size6.size9,.katex .sizing.reset-size6.size9{font-size:1.728em}.katex .fontsize-ensurer.reset-size6.size10,.katex .sizing.reset-size6.size10{font-size:2.074em}.katex .fontsize-ensurer.reset-size6.size11,.katex .sizing.reset-size6.size11{font-size:2.488em}.katex .fontsize-ensurer.reset-size7.size1,.katex .sizing.reset-size7.size1{font-size:.4166666667em}.katex .fontsize-ensurer.reset-size7.size2,.katex .sizing.reset-size7.size2{font-size:.5em}.katex .fontsize-ensurer.reset-size7.size3,.katex .sizing.reset-size7.size3{font-size:.5833333333em}.katex .fontsize-ensurer.reset-size7.size4,.katex .sizing.reset-size7.size4{font-size:.6666666667em}.katex .fontsize-ensurer.reset-size7.size5,.katex .sizing.reset-size7.size5{font-size:.75em}.katex .fontsize-ensurer.reset-size7.size6,.katex .sizing.reset-size7.size6{font-size:.8333333333em}.katex .fontsize-ensurer.reset-size7.size7,.katex .sizing.reset-size7.size7{font-size:1em}.katex .fontsize-ensurer.reset-size7.size8,.katex .sizing.reset-size7.size8{font-size:1.2em}.katex .fontsize-ensurer.reset-size7.size9,.katex .sizing.reset-size7.size9{font-size:1.44em}.katex .fontsize-ensurer.reset-size7.size10,.katex .sizing.reset-size7.size10{font-size:1.7283333333em}.katex .fontsize-ensurer.reset-size7.size11,.katex .sizing.reset-size7.size11{font-size:2.0733333333em}.katex .fontsize-ensurer.reset-size8.size1,.katex .sizing.reset-size8.size1{font-size:.3472222222em}.katex .fontsize-ensurer.reset-size8.size2,.katex .sizing.reset-size8.size2{font-size:.4166666667em}.katex .fontsize-ensurer.reset-size8.size3,.katex .sizing.reset-size8.size3{font-size:.4861111111em}.katex .fontsize-ensurer.reset-size8.size4,.katex .sizing.reset-size8.size4{font-size:.5555555556em}.katex .fontsize-ensurer.reset-size8.size5,.katex .sizing.reset-size8.size5{font-size:.625em}.katex .fontsize-ensurer.reset-size8.size6,.katex .sizing.reset-size8.size6{font-size:.6944444444em}.katex .fontsize-ensurer.reset-size8.size7,.katex .sizing.reset-size8.size7{font-size:.8333333333em}.katex .fontsize-ensurer.reset-size8.size8,.katex .sizing.reset-size8.size8{font-size:1em}.katex .fontsize-ensurer.reset-size8.size9,.katex .sizing.reset-size8.size9{font-size:1.2em}.katex .fontsize-ensurer.reset-size8.size10,.katex .sizing.reset-size8.size10{font-size:1.4402777778em}.katex .fontsize-ensurer.reset-size8.size11,.katex .sizing.reset-size8.size11{font-size:1.7277777778em}.katex .fontsize-ensurer.reset-size9.size1,.katex .sizing.reset-size9.size1{font-size:.2893518519em}.katex .fontsize-ensurer.reset-size9.size2,.katex .sizing.reset-size9.size2{font-size:.3472222222em}.katex .fontsize-ensurer.reset-size9.size3,.katex .sizing.reset-size9.size3{font-size:.4050925926em}.katex .fontsize-ensurer.reset-size9.size4,.katex .sizing.reset-size9.size4{font-size:.462962963em}.katex .fontsize-ensurer.reset-size9.size5,.katex .sizing.reset-size9.size5{font-size:.5208333333em}.katex .fontsize-ensurer.reset-size9.size6,.katex .sizing.reset-size9.size6{font-size:.5787037037em}.katex .fontsize-ensurer.reset-size9.size7,.katex .sizing.reset-size9.size7{font-size:.6944444444em}.katex .fontsize-ensurer.reset-size9.size8,.katex .sizing.reset-size9.size8{font-size:.8333333333em}.katex .fontsize-ensurer.reset-size9.size9,.katex .sizing.reset-size9.size9{font-size:1em}.katex .fontsize-ensurer.reset-size9.size10,.katex .sizing.reset-size9.size10{font-size:1.2002314815em}.katex .fontsize-ensurer.reset-size9.size11,.katex .sizing.reset-size9.size11{font-size:1.4398148148em}.katex .fontsize-ensurer.reset-size10.size1,.katex .sizing.reset-size10.size1{font-size:.2410800386em}.katex .fontsize-ensurer.reset-size10.size2,.katex .sizing.reset-size10.size2{font-size:.2892960463em}.katex .fontsize-ensurer.reset-size10.size3,.katex .sizing.reset-size10.size3{font-size:.337512054em}.katex .fontsize-ensurer.reset-size10.size4,.katex .sizing.reset-size10.size4{font-size:.3857280617em}.katex .fontsize-ensurer.reset-size10.size5,.katex .sizing.reset-size10.size5{font-size:.4339440694em}.katex .fontsize-ensurer.reset-size10.size6,.katex .sizing.reset-size10.size6{font-size:.4821600771em}.katex .fontsize-ensurer.reset-size10.size7,.katex .sizing.reset-size10.size7{font-size:.5785920926em}.katex .fontsize-ensurer.reset-size10.size8,.katex .sizing.reset-size10.size8{font-size:.6943105111em}.katex .fontsize-ensurer.reset-size10.size9,.katex .sizing.reset-size10.size9{font-size:.8331726133em}.katex .fontsize-ensurer.reset-size10.size10,.katex .sizing.reset-size10.size10{font-size:1em}.katex .fontsize-ensurer.reset-size10.size11,.katex .sizing.reset-size10.size11{font-size:1.1996142719em}.katex .fontsize-ensurer.reset-size11.size1,.katex .sizing.reset-size11.size1{font-size:.2009646302em}.katex .fontsize-ensurer.reset-size11.size2,.katex .sizing.reset-size11.size2{font-size:.2411575563em}.katex .fontsize-ensurer.reset-size11.size3,.katex .sizing.reset-size11.size3{font-size:.2813504823em}.katex .fontsize-ensurer.reset-size11.size4,.katex .sizing.reset-size11.size4{font-size:.3215434084em}.katex .fontsize-ensurer.reset-size11.size5,.katex .sizing.reset-size11.size5{font-size:.3617363344em}.katex .fontsize-ensurer.reset-size11.size6,.katex .sizing.reset-size11.size6{font-size:.4019292605em}.katex .fontsize-ensurer.reset-size11.size7,.katex .sizing.reset-size11.size7{font-size:.4823151125em}.katex .fontsize-ensurer.reset-size11.size8,.katex .sizing.reset-size11.size8{font-size:.578778135em}.katex .fontsize-ensurer.reset-size11.size9,.katex .sizing.reset-size11.size9{font-size:.6945337621em}.katex .fontsize-ensurer.reset-size11.size10,.katex .sizing.reset-size11.size10{font-size:.8336012862em}.katex .fontsize-ensurer.reset-size11.size11,.katex .sizing.reset-size11.size11{font-size:1em}.katex .delimsizing.size1{font-family:KaTeX_Size1}.katex .delimsizing.size2{font-family:KaTeX_Size2}.katex .delimsizing.size3{font-family:KaTeX_Size3}.katex .delimsizing.size4{font-family:KaTeX_Size4}.katex .delimsizing.mult .delim-size1>span{font-family:KaTeX_Size1}.katex .delimsizing.mult .delim-size4>span{font-family:KaTeX_Size4}.katex .nulldelimiter{display:inline-block;width:.12em}.katex .delimcenter,.katex .op-symbol{position:relative}.katex .op-symbol.small-op{font-family:KaTeX_Size1}.katex .op-symbol.large-op{font-family:KaTeX_Size2}.katex .accent>.vlist-t,.katex .op-limits>.vlist-t{text-align:center}.katex .accent .accent-body{position:relative}.katex .accent .accent-body:not(.accent-full){width:0}.katex .overlay{display:block}.katex .mtable .vertical-separator{display:inline-block;min-width:1px}.katex .mtable .arraycolsep{display:inline-block}.katex .mtable .col-align-c>.vlist-t{text-align:center}.katex .mtable .col-align-l>.vlist-t{text-align:left}.katex .mtable .col-align-r>.vlist-t{text-align:right}.katex .svg-align{text-align:left}.katex svg{fill:currentColor;stroke:currentColor;display:block;height:inherit;position:absolute;width:100%}.katex svg path{stroke:none}.katex svg{fill-rule:nonzero;fill-opacity:1;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1}.katex img{border-style:none;max-height:none;max-width:none;min-height:0;min-width:0}.katex .stretchy{display:block;overflow:hidden;position:relative;width:100%}.katex .stretchy:after,.katex .stretchy:before{content:""}.katex .hide-tail{overflow:hidden;position:relative;width:100%}.katex .halfarrow-left{left:0;overflow:hidden;position:absolute;width:50.2%}.katex .halfarrow-right{overflow:hidden;position:absolute;right:0;width:50.2%}.katex .brace-left{left:0;overflow:hidden;position:absolute;width:25.1%}.katex .brace-center{left:25%;overflow:hidden;position:absolute;width:50%}.katex .brace-right{overflow:hidden;position:absolute;right:0;width:25.1%}.katex .x-arrow-pad{padding:0 .5em}.katex .cd-arrow-pad{padding:0 .55556em 0 .27778em}.katex .mover,.katex .munder,.katex .x-arrow{text-align:center}.katex .boxpad{padding:0 .3em}.katex .fbox,.katex .fcolorbox{border:.04em solid;box-sizing:border-box}.katex .cancel-pad{padding:0 .2em}.katex .cancel-lap{margin-left:-.2em;margin-right:-.2em}.katex .sout{border-bottom-style:solid;border-bottom-width:.08em}.katex .angl{border-right:.049em solid;border-top:.049em solid;box-sizing:border-box;margin-right:.03889em}.katex .anglpad{padding:0 .03889em}.katex .eqn-num:before{content:"(" counter(katexEqnNo) ")";counter-increment:katexEqnNo}.katex .mml-eqn-num:before{content:"(" counter(mmlEqnNo) ")";counter-increment:mmlEqnNo}.katex .mtr-glue{width:50%}.katex .cd-vert-arrow{display:inline-block;position:relative}.katex .cd-label-left{display:inline-block;position:absolute;right:calc(50% + .3em);text-align:left}.katex .cd-label-right{display:inline-block;left:calc(50% + .3em);position:absolute;text-align:right}.katex-display{display:block;margin:1em 0;text-align:center}.katex-display>.katex{display:block;text-align:center;white-space:nowrap}.katex-display>.katex>.katex-html{display:block;position:relative}.katex-display>.katex>.katex-html>.tag{position:absolute;right:0}.katex-display.leqno>.katex>.katex-html>.tag{left:0;right:auto}.katex-display.fleqn>.katex{padding-left:2em;text-align:left}body{counter-reset:katexEqnNo mmlEqnNo}
@@ -337,6 +337,30 @@ html:not([data-theme="dark"]) .turn-view > .shimmer-text {
337
337
  rides a whole buffering window). */
338
338
  .pill-busy { border-color: var(--accent); --shimmer-base: var(--panel); --shimmer-mix: 25%; }
339
339
 
340
+ /* ---- Boot overlay (index.html, markup and script both) — what the window shows between the HTML
341
+ landing and the client having a transcript. Opaque and over #app, so the empty
342
+ chrome never flashes through first. The 1.2s animation delay is the whole don't-flash-on-a-fast-load
343
+ mechanism: a normal boot is retired before this fades in, so the wait is only ever announced when
344
+ there is one. Measured, not guessed — a warm local boot lands at 590-930ms (dev, where the client
345
+ bundle is unminified and slowest), so the delay has to clear that, not merely beat a blank screen.
346
+ Geometry follows .cwd-hint, the mirror's other centred whole-window message. */
347
+ .boot {
348
+ position: fixed;
349
+ inset: 0;
350
+ background: var(--bg);
351
+ display: grid;
352
+ place-content: center;
353
+ justify-items: center;
354
+ gap: .5rem;
355
+ padding: 2rem;
356
+ text-align: center;
357
+ animation: boot-in .35s ease 1.2s both;
358
+ }
359
+ .boot-title { font-size: 1.15rem; }
360
+ /* min-height reserves the line the seconds count lands on, so naming the wait doesn't shift the title. */
361
+ .boot-why { color: var(--muted); font-size: .95rem; max-width: 32rem; min-height: 1.4em; }
362
+ @keyframes boot-in { from { opacity: 0; } to { opacity: 1; } }
363
+
340
364
  /* ── Tooltip — the styled stand-in for native `title`, and only on FIXED EXPLANATORY copy: text
341
365
  that teaches what a control does. Dynamic identifiers (a path, a model id, an mcp tool's full
342
366
  name) keep the native attribute, which is better at them: they run long, they want to wrap, and